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#[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 bytes.put_u8(first_byte);
75 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 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
110pub 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}