Skip to main content

flowparser_sflow/flow_records/
raw_packet_header.rs

1use nom::IResult;
2use nom::bytes::complete::take;
3use nom::number::complete::be_u32;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
7pub struct RawPacketHeader {
8    pub header_protocol: u32,
9    pub frame_length: u32,
10    pub stripped: u32,
11    pub header_length: u32,
12    pub header: Vec<u8>,
13}
14
15pub(crate) fn parse_raw_packet_header(input: &[u8]) -> IResult<&[u8], RawPacketHeader> {
16    let (input, header_protocol) = be_u32(input)?;
17    let (input, frame_length) = be_u32(input)?;
18    let (input, stripped) = be_u32(input)?;
19    let (input, header_length) = be_u32(input)?;
20    let (input, header) = take(header_length as usize)(input)?;
21    // Skip XDR padding to 4-byte boundary
22    let padding = (4 - (header_length as usize % 4)) % 4;
23    let (input, _) = take(padding)(input)?;
24
25    Ok((
26        input,
27        RawPacketHeader {
28            header_protocol,
29            frame_length,
30            stripped,
31            header_length,
32            header: header.to_vec(),
33        },
34    ))
35}