rusty_pcap/pcap_ng/blocks/
simple_packet.rs

1use std::{io::Read, vec};
2
3use crate::{
4    byte_order::{Endianness, ReadExt, UndertminedByteOrder},
5    pcap_ng::{
6        PcapNgParseError,
7        blocks::{Block, BlockHeader},
8        pad_length_to_32_bytes,
9    },
10};
11
12#[derive(Debug, Clone, PartialEq, Eq)]
13pub struct SimplePacket {
14    pub block_length: u32,
15    pub original_length: u32,
16    pub content: Vec<u8>,
17}
18impl Block for SimplePacket {
19    fn block_id() -> u32 {
20        3
21    }
22
23    fn minimum_size() -> usize {
24        16
25    }
26    fn read_with_header<R: Read>(
27        reader: &mut R,
28        header: &BlockHeader,
29        byte_order: Option<crate::byte_order::Endianness>,
30    ) -> Result<Self, PcapNgParseError>
31    where
32        Self: Sized,
33    {
34        header.matches_block_id::<Self>()?;
35        let byte_order = byte_order
36            .or(header.endianness_from_block::<Self>())
37            .ok_or(UndertminedByteOrder)?;
38        let original_length = reader.read_u32(byte_order)?;
39        let block_length = header.block_length_as_u32(byte_order);
40        // This might be wrong...
41        let padded_length = pad_length_to_32_bytes(original_length as usize);
42        let mut content = vec![0; padded_length];
43        reader.read_exact(&mut content)?;
44
45        // Read the footer (4 bytes)
46        reader.read_bytes::<4>()?;
47        Ok(Self {
48            block_length,
49            original_length,
50            content,
51        })
52    }
53}
54impl SimplePacket {
55    pub fn read<R: Read>(reader: &mut R, byte_order: Endianness) -> Result<Self, PcapNgParseError> {
56        let header = BlockHeader::read(reader)?;
57        Self::read_with_header::<_>(reader, &header, Some(byte_order))
58    }
59}