utp_socket/
utp_packet.rs

1use bytes::{Buf, Bytes, BytesMut};
2
3pub const HEADER_SIZE: i32 = 20;
4
5#[repr(u8)]
6#[derive(Debug, PartialEq, Eq, Clone, Copy)]
7pub enum PacketType {
8    Data = 0,
9    Fin = 1,
10    State = 2,
11    Reset = 3,
12    Syn = 4,
13}
14
15// repr c instead? and just send directly over socket?
16#[derive(Debug, Clone, Copy)]
17pub struct PacketHeader {
18    pub seq_nr: u16,
19    pub ack_nr: u16,
20    pub conn_id: u16,
21    pub packet_type: PacketType,
22    pub timestamp_microseconds: u32,
23    pub timestamp_difference_microseconds: u32,
24    pub wnd_size: u32,
25    pub extension: u8,
26}
27
28impl TryFrom<&[u8]> for PacketHeader {
29    type Error = anyhow::Error;
30
31    fn try_from(mut bytes: &[u8]) -> anyhow::Result<Self> {
32        const HEADER_SIZE: usize = 20;
33        anyhow::ensure!(
34            bytes.len() >= HEADER_SIZE,
35            "Error: Packet to small to parse"
36        );
37        let first_byte = bytes.get_u8();
38        let packet_type = first_byte >> 4;
39        anyhow::ensure!(packet_type < 5, "Error: Packet type not recognized");
40        let packet_type: PacketType = unsafe { std::mem::transmute(packet_type) };
41        let version = first_byte & 0b0000_1111;
42        anyhow::ensure!(version == 1, "Error: Packet version not supported");
43        let extension = bytes.get_u8();
44        let conn_id = bytes.get_u16();
45        let timestamp_microseconds = bytes.get_u32();
46        let timestamp_difference_microseconds = bytes.get_u32();
47        let wnd_size = bytes.get_u32();
48        let seq_nr = bytes.get_u16();
49        let ack_nr = bytes.get_u16();
50
51        Ok(Self {
52            seq_nr,
53            ack_nr,
54            conn_id,
55            packet_type,
56            timestamp_microseconds,
57            timestamp_difference_microseconds,
58            wnd_size,
59            extension,
60        })
61    }
62}
63
64impl PacketHeader {
65    pub fn to_bytes(&self) -> Bytes {
66        use bytes::BufMut;
67        let mut bytes = BytesMut::new();
68
69        let mut first_byte = self.packet_type as u8;
70        first_byte <<= 4;
71        first_byte |= 0b0000_0001;
72
73        // type and version
74        bytes.put_u8(first_byte);
75        // 0 so doesn't matter for now if to_be should be used or not
76        bytes.put_u8(self.extension);
77        bytes.put_u16(self.conn_id);
78        bytes.put_u32(self.timestamp_microseconds);
79        bytes.put_u32(self.timestamp_difference_microseconds);
80        bytes.put_u32(self.wnd_size);
81        bytes.put_u16(self.seq_nr);
82        bytes.put_u16(self.ack_nr);
83        let res = bytes.freeze();
84        log::debug!("{:02x?}", &res[..]);
85        res
86    }
87}
88
89#[derive(Clone, Debug)]
90pub struct Packet {
91    pub header: PacketHeader,
92    // Todo bytes might not be necessesary here
93    pub data: Bytes,
94}
95
96impl Packet {
97    #[inline]
98    pub fn neeeds_ack(&self) -> bool {
99        self.header.packet_type == PacketType::Data
100            || self.header.packet_type == PacketType::Fin
101            || self.header.packet_type == PacketType::Syn
102    }
103
104    pub fn size(&self) -> u32 {
105        debug_assert!(self.data.len() < u32::MAX as usize);
106        HEADER_SIZE as u32 + self.data.len() as u32
107    }
108}
109
110// Not very rusty at all, stolen from libutp to test
111// impact on connection errors
112pub fn get_microseconds() -> u64 {
113    static mut OFFSET: u64 = 0;
114    static mut PREVIOUS: u64 = 0;
115
116    let mut ts = libc::timespec {
117        tv_sec: 0,
118        tv_nsec: 0,
119    };
120    let res = unsafe { libc::clock_gettime(libc::CLOCK_MONOTONIC, &mut ts) };
121
122    if res < 0 {
123        panic!("clock get time failed");
124    }
125
126    let mut now = ts.tv_sec as u64 * 1000000 + ts.tv_nsec as u64 / 1000;
127    unsafe {
128        now += OFFSET;
129        if PREVIOUS > now {
130            OFFSET += PREVIOUS - now;
131            now = PREVIOUS;
132        }
133        PREVIOUS = now;
134    }
135
136    now
137}