pcap_parser/pcapng/
interface_statistics.rs

1use nom::error::{ErrorKind, ParseError};
2use nom::{Err, IResult};
3
4use crate::endianness::{PcapBE, PcapEndianness, PcapLE};
5use crate::{opt_parse_options, PcapError, PcapNGOption, ISB_MAGIC};
6
7use super::*;
8
9#[derive(Debug)]
10pub struct InterfaceStatisticsBlock<'a> {
11    pub block_type: u32,
12    pub block_len1: u32,
13    pub if_id: u32,
14    pub ts_high: u32,
15    pub ts_low: u32,
16    pub options: Vec<PcapNGOption<'a>>,
17    pub block_len2: u32,
18}
19
20impl<'a, En: PcapEndianness> PcapNGBlockParser<'a, En, InterfaceStatisticsBlock<'a>>
21    for InterfaceStatisticsBlock<'a>
22{
23    const HDR_SZ: usize = 24;
24    const MAGIC: u32 = ISB_MAGIC;
25
26    fn inner_parse<E: ParseError<&'a [u8]>>(
27        block_type: u32,
28        block_len1: u32,
29        i: &'a [u8],
30        block_len2: u32,
31    ) -> IResult<&'a [u8], InterfaceStatisticsBlock<'a>, E> {
32        // caller function already tested header type(magic) and length
33        // read end of header
34        let (i, if_id) = En::parse_u32(i)?;
35        let (i, ts_high) = En::parse_u32(i)?;
36        let (i, ts_low) = En::parse_u32(i)?;
37        // caller function already tested header type(magic) and length
38        // read options
39        let (i, options) = opt_parse_options::<En, E>(i, block_len1 as usize, 24)?;
40        if block_len2 != block_len1 {
41            return Err(Err::Error(E::from_error_kind(i, ErrorKind::Verify)));
42        }
43        let block = InterfaceStatisticsBlock {
44            block_type,
45            block_len1,
46            if_id,
47            ts_high,
48            ts_low,
49            options,
50            block_len2,
51        };
52        Ok((i, block))
53    }
54}
55
56/// Parse an InterfaceStatistics Block (little-endian)
57#[inline]
58pub fn parse_interfacestatisticsblock_le(
59    i: &[u8],
60) -> IResult<&[u8], InterfaceStatisticsBlock, PcapError<&[u8]>> {
61    ng_block_parser::<InterfaceStatisticsBlock, PcapLE, _, _>()(i)
62}
63
64/// Parse an InterfaceStatistics Block (big-endian)
65#[inline]
66pub fn parse_interfacestatisticsblock_be(
67    i: &[u8],
68) -> IResult<&[u8], InterfaceStatisticsBlock, PcapError<&[u8]>> {
69    ng_block_parser::<InterfaceStatisticsBlock, PcapBE, _, _>()(i)
70}