netstack/packets/
incoming.rs

1use std::io::{self, Read};
2use super::{RawPacket, HEADER_SIZE, Payload, PacketType};
3
4pub struct IncomingPacket {
5    buffer: RawPacket,
6    bytes_read: usize,
7}
8
9impl IncomingPacket {
10    pub fn from_raw_packet(buffer: RawPacket) -> Self {
11        Self {
12            buffer,
13            bytes_read: HEADER_SIZE,
14        }
15    }
16
17    pub fn get_sequence_number(&self) -> u64 {
18        self.buffer.get_header().sequence_number
19    }
20
21    pub fn get_ack_sequence_number(&self) -> u64 {
22        self.buffer.get_header().ack_sequence_number
23    }
24
25    pub fn get_ack_bits(&self) -> [u8; 4] {
26        self.buffer.get_header().ack_bits.clone()
27    }
28
29    pub fn get_packet_type(&self) -> Option<PacketType> {
30        PacketType::from_u8(self.buffer.get_header().packet_type)
31    }
32
33    pub fn get_body_length(&self) -> u16 {
34        self.buffer.get_header().body_length
35    }
36
37    pub fn into_payload(self) -> Payload {
38        Payload::from_raw_packet(self.buffer)
39    }
40}
41
42impl Read for IncomingPacket {
43    fn read(&mut self, buf: &mut [u8]) -> Result<usize, io::Error> {
44        let len = buf.len();
45
46        if self.bytes_read + len > self.buffer.get_buffer().len() {
47            panic!("TODO: cannot read beyond buffer");
48        }
49
50        buf.copy_from_slice(&self.buffer.get_buffer()[self.bytes_read..self.bytes_read + len]);
51        self.bytes_read += len;
52
53        Ok(len)
54    }
55}