flowparser-sflow 0.3.0

Parser for sFlow v5 datagrams
Documentation
use nom::IResult;
use nom::number::complete::{be_u32, be_u64};
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct GenericInterface {
    pub if_index: u32,
    pub if_type: u32,
    pub if_speed: u64,
    pub if_direction: u32,
    pub if_status: u32,
    pub if_in_octets: u64,
    pub if_in_ucast_pkts: u32,
    pub if_in_multicast_pkts: u32,
    pub if_in_broadcast_pkts: u32,
    pub if_in_discards: u32,
    pub if_in_errors: u32,
    pub if_in_unknown_protos: u32,
    pub if_out_octets: u64,
    pub if_out_ucast_pkts: u32,
    pub if_out_multicast_pkts: u32,
    pub if_out_broadcast_pkts: u32,
    pub if_out_discards: u32,
    pub if_out_errors: u32,
    pub if_promiscuous_mode: u32,
}

pub(crate) fn parse_generic_interface(input: &[u8]) -> IResult<&[u8], GenericInterface> {
    let (input, if_index) = be_u32(input)?;
    let (input, if_type) = be_u32(input)?;
    let (input, if_speed) = be_u64(input)?;
    let (input, if_direction) = be_u32(input)?;
    let (input, if_status) = be_u32(input)?;
    let (input, if_in_octets) = be_u64(input)?;
    let (input, if_in_ucast_pkts) = be_u32(input)?;
    let (input, if_in_multicast_pkts) = be_u32(input)?;
    let (input, if_in_broadcast_pkts) = be_u32(input)?;
    let (input, if_in_discards) = be_u32(input)?;
    let (input, if_in_errors) = be_u32(input)?;
    let (input, if_in_unknown_protos) = be_u32(input)?;
    let (input, if_out_octets) = be_u64(input)?;
    let (input, if_out_ucast_pkts) = be_u32(input)?;
    let (input, if_out_multicast_pkts) = be_u32(input)?;
    let (input, if_out_broadcast_pkts) = be_u32(input)?;
    let (input, if_out_discards) = be_u32(input)?;
    let (input, if_out_errors) = be_u32(input)?;
    let (input, if_promiscuous_mode) = be_u32(input)?;

    Ok((
        input,
        GenericInterface {
            if_index,
            if_type,
            if_speed,
            if_direction,
            if_status,
            if_in_octets,
            if_in_ucast_pkts,
            if_in_multicast_pkts,
            if_in_broadcast_pkts,
            if_in_discards,
            if_in_errors,
            if_in_unknown_protos,
            if_out_octets,
            if_out_ucast_pkts,
            if_out_multicast_pkts,
            if_out_broadcast_pkts,
            if_out_discards,
            if_out_errors,
            if_promiscuous_mode,
        },
    ))
}