1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use types::*;
use utils::ReadBytesLocal;
use flow_records::FlowRecord;
use error::Result;
use std::io::SeekFrom;
#[derive(Debug, Clone)]
pub enum SampleRecord {
FlowSample(FlowSample),
Unknown,
}
add_decoder!{
#[derive(Debug, Clone, Default)]
pub struct FlowSample {
pub sequence_number: u32,
pub sflow_data_source: SourceID,
pub sampling_rate: u32,
pub sample_pool: u32,
pub drops: u32,
pub input_id: Interface,
pub output_id: Interface,
pub flow_records: Vec<FlowRecord>,
}
}
impl ::utils::Decodeable for Vec<SampleRecord> {
fn read_and_decode(stream: &mut ReadSeeker) -> Result<Vec<SampleRecord>> {
let count = try!(stream.be_read_u32());
let mut results: Vec<SampleRecord> = Vec::new();
for _ in 0..count {
let format = try!(stream.be_read_u32());
let length = try!(stream.be_read_u32());
match format {
1 => {
let fs: FlowSample = try!(::utils::Decodeable::read_and_decode(stream));
results.push(SampleRecord::FlowSample(fs));
}
_ => {
results.push(SampleRecord::Unknown);
try!(stream.seek(SeekFrom::Current(length as i64)));
}
}
}
Ok(results)
}
}