Skip to main content

flowparser_sflow/samples/
flow_sample.rs

1use nom::IResult;
2use nom::number::complete::be_u32;
3use serde::{Deserialize, Serialize};
4
5use crate::flow_records::{FlowRecord, parse_flow_records};
6
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
8pub struct FlowSample {
9    pub sequence_number: u32,
10    pub source_id_type: u32,
11    pub source_id_index: u32,
12    pub sampling_rate: u32,
13    pub sample_pool: u32,
14    pub drops: u32,
15    pub input: u32,
16    pub output: u32,
17    pub records: Vec<FlowRecord>,
18}
19
20#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
21pub struct ExpandedFlowSample {
22    pub sequence_number: u32,
23    pub source_id_type: u32,
24    pub source_id_index: u32,
25    pub sampling_rate: u32,
26    pub sample_pool: u32,
27    pub drops: u32,
28    pub input_format: u32,
29    pub input_value: u32,
30    pub output_format: u32,
31    pub output_value: u32,
32    pub records: Vec<FlowRecord>,
33}
34
35pub(crate) fn parse_flow_sample(input: &[u8]) -> IResult<&[u8], FlowSample> {
36    let (input, sequence_number) = be_u32(input)?;
37    let (input, source_id) = be_u32(input)?;
38    let source_id_type = source_id >> 24;
39    let source_id_index = source_id & 0x00FF_FFFF;
40    let (input, sampling_rate) = be_u32(input)?;
41    let (input, sample_pool) = be_u32(input)?;
42    let (input, drops) = be_u32(input)?;
43    let (input, input_if) = be_u32(input)?;
44    let (input, output_if) = be_u32(input)?;
45    let (input, num_records) = be_u32(input)?;
46
47    let (input, records) = parse_flow_records(input, num_records)?;
48
49    Ok((
50        input,
51        FlowSample {
52            sequence_number,
53            source_id_type,
54            source_id_index,
55            sampling_rate,
56            sample_pool,
57            drops,
58            input: input_if,
59            output: output_if,
60            records,
61        },
62    ))
63}
64
65pub(crate) fn parse_expanded_flow_sample(input: &[u8]) -> IResult<&[u8], ExpandedFlowSample> {
66    let (input, sequence_number) = be_u32(input)?;
67    let (input, source_id_type) = be_u32(input)?;
68    let (input, source_id_index) = be_u32(input)?;
69    let (input, sampling_rate) = be_u32(input)?;
70    let (input, sample_pool) = be_u32(input)?;
71    let (input, drops) = be_u32(input)?;
72    let (input, input_format) = be_u32(input)?;
73    let (input, input_value) = be_u32(input)?;
74    let (input, output_format) = be_u32(input)?;
75    let (input, output_value) = be_u32(input)?;
76    let (input, num_records) = be_u32(input)?;
77
78    let (input, records) = parse_flow_records(input, num_records)?;
79
80    Ok((
81        input,
82        ExpandedFlowSample {
83            sequence_number,
84            source_id_type,
85            source_id_index,
86            sampling_rate,
87            sample_pool,
88            drops,
89            input_format,
90            input_value,
91            output_format,
92            output_value,
93            records,
94        },
95    ))
96}