flowparser_sflow/samples/
counter_sample.rs1use 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, Eq, 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, Eq, 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}