Skip to content

Commit 50176f3

Browse files
mikemiles-devMichael Mileusnich
and
Michael Mileusnich
authored
Not reparsing version (#39)
Co-authored-by: Michael Mileusnich <[email protected]>
1 parent dac4c08 commit 50176f3

File tree

7 files changed

+24
-15
lines changed

7 files changed

+24
-15
lines changed

RELEASES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# 0.2.3
2+
* Small performance improvement by not parsing netflow version twice each packet.
23
* General Code cleanup for field_types and DataNumbers.
34

45
# 0.2.2

src/lib.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,13 @@ impl NetflowParser {
160160
packet: &'a [u8],
161161
) -> Result<ParsedNetflow, Box<dyn std::error::Error>> {
162162
match NetflowHeader::parse_be(packet) {
163-
Ok((_, netflow_header)) if netflow_header.version == 5 => V5::parse_bytes(packet),
164-
Ok((_, netflow_header)) if netflow_header.version == 7 => V7::parse_bytes(packet),
165-
Ok((_, netflow_header)) if netflow_header.version == 9 => {
166-
self.v9_parser.parse_bytes(packet)
163+
Ok((i, netflow_header)) if netflow_header.version == 5 => V5::parse_bytes(i),
164+
Ok((i, netflow_header)) if netflow_header.version == 7 => V7::parse_bytes(i),
165+
Ok((i, netflow_header)) if netflow_header.version == 9 => {
166+
self.v9_parser.parse_bytes(i)
167167
}
168-
Ok((_, netflow_header)) if netflow_header.version == 10 => {
169-
self.ipfix_parser.parse_bytes(packet)
168+
Ok((i, netflow_header)) if netflow_header.version == 10 => {
169+
self.ipfix_parser.parse_bytes(i)
170170
}
171171
_ => Err("Not Supported".to_string().into()),
172172
}

src/static_versions/v5.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ impl NetflowByteParserStatic for V5 {
3838
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Nom)]
3939
pub struct Header {
4040
/// NetFlow export format version number
41+
#[nom(Value = "5")]
4142
pub version: u16,
4243
/// Number of flows exported in this packet (1-30)
4344
pub count: u16,

src/static_versions/v7.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ impl NetflowByteParserStatic for V7 {
3838
#[derive(Debug, PartialEq, Eq, Clone, Copy, Nom, Serialize)]
3939
pub struct Header {
4040
/// NetFlow export format version number
41+
#[nom(Value = "7")]
4142
pub version: u16,
4243
/// Number of flows exported in this flow frame (protocol data unit, or PDU)
4344
pub count: u16,

src/variable_versions/common.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use nom::IResult;
88
use nom_derive::*;
99
use serde::Serialize;
1010

11+
use std::convert::Into;
1112
use std::net::{Ipv4Addr, Ipv6Addr};
1213
use std::time::Duration;
1314

@@ -25,11 +26,6 @@ pub enum DataNumber {
2526

2627
/// Convert into usize, mainly for serialization purposes
2728
impl DataNumber {
28-
pub fn get_value(self) -> usize {
29-
let result: usize = self.into();
30-
result
31-
}
32-
3329
/// Parse bytes into DataNumber Type
3430
pub fn parse(i: &[u8], field_length: u16, signed: bool) -> IResult<&[u8], DataNumber> {
3531
match field_length {
@@ -78,28 +74,36 @@ impl DataNumber {
7874
let (i, data_number) = DataNumber::parse(remaining, field_length, false)?;
7975
(
8076
i,
81-
FieldValue::Duration(Duration::from_secs(data_number.get_value() as u64)),
77+
FieldValue::Duration(Duration::from_secs(
78+
<DataNumber as Into<usize>>::into(data_number) as u64,
79+
)),
8280
)
8381
}
8482
FieldDataType::DurationMillis => {
8583
let (i, data_number) = DataNumber::parse(remaining, field_length, false)?;
8684
(
8785
i,
88-
FieldValue::Duration(Duration::from_millis(data_number.get_value() as u64)),
86+
FieldValue::Duration(Duration::from_millis(
87+
<DataNumber as Into<usize>>::into(data_number) as u64,
88+
)),
8989
)
9090
}
9191
FieldDataType::DurationMicros => {
9292
let (i, data_number) = DataNumber::parse(remaining, field_length, false)?;
9393
(
9494
i,
95-
FieldValue::Duration(Duration::from_micros(data_number.get_value() as u64)),
95+
FieldValue::Duration(Duration::from_micros(
96+
<DataNumber as Into<usize>>::into(data_number) as u64,
97+
)),
9698
)
9799
}
98100
FieldDataType::DurationNanos => {
99101
let (i, data_number) = DataNumber::parse(remaining, field_length, false)?;
100102
(
101103
i,
102-
FieldValue::Duration(Duration::from_nanos(data_number.get_value() as u64)),
104+
FieldValue::Duration(Duration::from_nanos(
105+
<DataNumber as Into<usize>>::into(data_number) as u64,
106+
)),
103107
)
104108
}
105109
FieldDataType::ProtocolType => {

src/variable_versions/ipfix.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ pub struct IPFix {
4646
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Nom)]
4747
pub struct Header {
4848
/// Version of Flow Record format that is exported in this message. The value of this field is 0x000a for the current version, incrementing by one the version that is used in the NetFlow services export version 9
49+
#[nom(Value = "10")]
4950
pub version: u16,
5051
/// Total length of the IPFIX Message, which is measured in octets, including Message Header and Sets.
5152
pub length: u16,

src/variable_versions/v9.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ fn parse_flowsets<'a>(
7070
#[derive(Debug, PartialEq, Clone, Copy, Serialize, Nom)]
7171
pub struct Header {
7272
/// The version of NetFlow records exported in this packet; for Version 9, this value is 9
73+
#[nom(Value = "9")]
7374
pub version: u16,
7475
/// Number of FlowSet records (both template and data) contained within this packet
7576
pub count: u16,

0 commit comments

Comments
 (0)