netstack/packets/
incoming.rs1use 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}