Skip to main content

flowparser_sflow/samples/
counter_sample.rs

1use nom::IResult;
2use nom::number::complete::be_u32;
3use serde::{Deserialize, Serialize};
4
5use crate::counter_records::{CounterRecord, parse_counter_records};
6
7#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8pub struct CounterSample {
9    pub sequence_number: u32,
10    pub source_id_type: u32,
11    pub source_id_index: u32,
12    pub records: Vec<CounterRecord>,
13}
14
15#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
16pub struct ExpandedCounterSample {
17    pub sequence_number: u32,
18    pub source_id_type: u32,
19    pub source_id_index: u32,
20    pub records: Vec<CounterRecord>,
21}
22
23pub(crate) fn parse_counter_sample(input: &[u8]) -> IResult<&[u8], CounterSample> {
24    let (input, sequence_number) = be_u32(input)?;
25    let (input, source_id) = be_u32(input)?;
26    let source_id_type = source_id >> 24;
27    let source_id_index = source_id & 0x00FF_FFFF;
28    let (input, num_records) = be_u32(input)?;
29
30    let (input, records) = parse_counter_records(input, num_records)?;
31
32    Ok((
33        input,
34        CounterSample {
35            sequence_number,
36            source_id_type,
37            source_id_index,
38            records,
39        },
40    ))
41}
42
43pub(crate) fn parse_expanded_counter_sample(
44    input: &[u8],
45) -> IResult<&[u8], ExpandedCounterSample> {
46    let (input, sequence_number) = be_u32(input)?;
47    let (input, source_id_type) = be_u32(input)?;
48    let (input, source_id_index) = be_u32(input)?;
49    let (input, num_records) = be_u32(input)?;
50
51    let (input, records) = parse_counter_records(input, num_records)?;
52
53    Ok((
54        input,
55        ExpandedCounterSample {
56            sequence_number,
57            source_id_type,
58            source_id_index,
59            records,
60        },
61    ))
62}