pcap-parser 0.17.0

Parser for the PCAP/PCAPNG format
Documentation
use nom::error::ParseError;
use nom::number::streaming::{be_u16, be_u32, le_u16, le_u32};
use nom::IResult;

pub(crate) struct PcapBE;
pub(crate) struct PcapLE;

pub(crate) trait PcapEndianness {
    fn native_u32(n: u32) -> u32;

    fn parse_u16<'a, E: ParseError<&'a [u8]>>(i: &'a [u8]) -> IResult<&'a [u8], u16, E>;
    fn parse_u32<'a, E: ParseError<&'a [u8]>>(i: &'a [u8]) -> IResult<&'a [u8], u32, E>;

    fn u32_from_bytes(i: [u8; 4]) -> u32;
}

impl PcapEndianness for PcapBE {
    #[inline]
    fn native_u32(n: u32) -> u32 {
        u32::from_be(n)
    }

    #[inline]
    fn parse_u16<'a, E: ParseError<&'a [u8]>>(i: &'a [u8]) -> IResult<&'a [u8], u16, E> {
        be_u16(i)
    }

    #[inline]
    fn parse_u32<'a, E: ParseError<&'a [u8]>>(i: &'a [u8]) -> IResult<&'a [u8], u32, E> {
        be_u32(i)
    }

    #[inline]
    fn u32_from_bytes(i: [u8; 4]) -> u32 {
        u32::from_be_bytes(i)
    }
}

impl PcapEndianness for PcapLE {
    #[inline]
    fn native_u32(n: u32) -> u32 {
        u32::from_le(n)
    }

    #[inline]
    fn parse_u16<'a, E: ParseError<&'a [u8]>>(i: &'a [u8]) -> IResult<&'a [u8], u16, E> {
        le_u16(i)
    }

    #[inline]
    fn parse_u32<'a, E: ParseError<&'a [u8]>>(i: &'a [u8]) -> IResult<&'a [u8], u32, E> {
        le_u32(i)
    }

    #[inline]
    fn u32_from_bytes(i: [u8; 4]) -> u32 {
        u32::from_le_bytes(i)
    }
}