flowparser_sflow/samples/
flow_sample.rs1use 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}