rusty_pcap/pcap_ng/blocks/
simple_packet.rs1use 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 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 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}