Skip to content

Commit 35c7fb1

Browse files
mikemiles-devmikemiles-dev
andauthored
fix: * Removed uneeded DataNumber Parsing for Durations. (#155)
* Explicity rename methods DurationMicros and DurationNanos into DurationMicrosNTP and DurationNanosNTP. Co-authored-by: mikemiles-dev <[email protected]>
1 parent 63796a2 commit 35c7fb1

File tree

6 files changed

+82
-81
lines changed

6 files changed

+82
-81
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "netflow_parser"
33
description = "Parser for Netflow Cisco V5, V7, V9, IPFIX"
4-
version = "0.6.3"
4+
version = "0.6.4"
55
edition = "2024"
66
authors = ["[email protected]"]
77
license = "MIT OR Apache-2.0"

RELEASES.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# 0.6.4
2+
* Removed uneeded DataNumber Parsing for Durations.
3+
* Explicity rename methods DurationMicros and DurationNanos into DurationMicrosNTP and DurationNanosNTP
4+
15
# 0.6.3
26
* Ipfix dateTimeNanoseconds and dateTimeMicroseconds use the NTP 64 bit time format #15
37
* Added NetEvent and ObservationTimeMilliseconds for V9.

src/variable_versions/data_number.rs

Lines changed: 55 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
use crate::protocol::ProtocolTypes;
2-
32
use byteorder::{BigEndian, WriteBytesExt};
4-
use nom::Err as NomErr;
5-
use nom::IResult;
6-
use nom::bytes::complete::take;
7-
use nom::error::{Error as NomError, ErrorKind};
8-
use nom::number::complete::{be_i24, be_u24, be_u32, be_u128};
9-
use nom_derive::*;
3+
use nom::{
4+
Err as NomErr, IResult,
5+
bytes::complete::take,
6+
error::{Error as NomError, ErrorKind},
7+
number::complete::{be_i24, be_u24, be_u32, be_u128},
8+
};
9+
use nom_derive::Parse;
1010
use serde::Serialize;
11-
12-
use std::convert::Into;
13-
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
14-
use std::time::Duration;
11+
use std::{
12+
net::{IpAddr, Ipv4Addr, Ipv6Addr},
13+
time::Duration,
14+
};
1515

1616
macro_rules! impl_try_from {
1717
($($t:ty => $v:ident),*; $($s:ty => $sv:ident),*) => {
@@ -173,26 +173,6 @@ impl DataNumber {
173173
}
174174
}
175175

176-
/// Convert into usize, mainly for serialization purposes
177-
impl From<DataNumber> for usize {
178-
fn from(val: DataNumber) -> Self {
179-
match val {
180-
DataNumber::U8(i) => usize::from(i),
181-
DataNumber::I8(i) => i as usize,
182-
DataNumber::U16(i) => i as usize,
183-
DataNumber::I16(i) => i as usize,
184-
DataNumber::I24(i) => i as usize,
185-
DataNumber::U24(i) => i as usize,
186-
DataNumber::U32(i) => i as usize,
187-
DataNumber::I32(i) => i as usize,
188-
DataNumber::U64(i) => i as usize,
189-
DataNumber::I64(i) => i as usize,
190-
DataNumber::U128(i) => i as usize,
191-
DataNumber::I128(i) => i as usize,
192-
}
193-
}
194-
}
195-
196176
#[derive(Debug, PartialEq, PartialOrd, Clone, Serialize)]
197177
pub struct ApplicationId {
198178
pub classification_engine_id: u8,
@@ -240,6 +220,12 @@ impl FieldValue {
240220
}
241221
}
242222

223+
fn make_ntp_time_with_unit(seconds: u32, fraction: u32, unit: u64) -> Duration {
224+
Duration::from_secs(u64::from(seconds)).saturating_add(Duration::from_micros(
225+
((u64::from(fraction)).saturating_mul(unit)) >> 32,
226+
))
227+
}
228+
243229
pub fn from_field_type(
244230
remaining: &[u8],
245231
field_type: FieldDataType,
@@ -297,40 +283,51 @@ impl FieldValue {
297283
(i, FieldValue::MacAddr(mac_addr))
298284
}
299285
FieldDataType::DurationSeconds => {
300-
let (i, data_number) = DataNumber::parse(remaining, field_length, false)?;
301-
(
302-
i,
303-
FieldValue::Duration(Duration::from_secs(
304-
<DataNumber as Into<usize>>::into(data_number) as u64,
305-
)),
306-
)
286+
let (i, value) = match field_length {
287+
4 => {
288+
let (i, seconds) = u32::parse_be(remaining)?;
289+
let dur = Duration::from_secs(seconds.into());
290+
(i, FieldValue::Duration(dur))
291+
}
292+
8 => {
293+
let (i, seconds) = u64::parse_be(remaining)?;
294+
let dur = Duration::from_secs(seconds);
295+
(i, FieldValue::Duration(dur))
296+
}
297+
_ => {
298+
return Err(NomErr::Error(NomError::new(remaining, ErrorKind::Fail)));
299+
}
300+
};
301+
(i, value)
307302
}
308303
FieldDataType::DurationMillis => {
309-
let (i, data_number) = DataNumber::parse(remaining, field_length, false)?;
310-
(
311-
i,
312-
FieldValue::Duration(Duration::from_millis(
313-
<DataNumber as Into<usize>>::into(data_number) as u64,
314-
)),
315-
)
304+
let (i, value) = match field_length {
305+
4 => {
306+
let (i, seconds) = u32::parse_be(remaining)?;
307+
let dur = Duration::from_millis(u64::from(seconds));
308+
(i, FieldValue::Duration(dur))
309+
}
310+
8 => {
311+
let (i, seconds) = u64::parse_be(remaining)?;
312+
let dur = Duration::from_millis(seconds);
313+
(i, FieldValue::Duration(dur))
314+
}
315+
_ => {
316+
return Err(NomErr::Error(NomError::new(remaining, ErrorKind::Fail)));
317+
}
318+
};
319+
(i, value)
316320
}
317-
FieldDataType::DurationMicros => {
321+
FieldDataType::DurationMicrosNTP => {
318322
let (i, seconds) = u32::parse_be(remaining)?;
319323
let (i, fraction) = u32::parse_be(i)?;
320-
let dur =
321-
Duration::from_secs(seconds as u64).saturating_add(Duration::from_micros(
322-
((u64::from(fraction)).saturating_mul(1_000_000)) >> 32,
323-
));
324+
let dur = Self::make_ntp_time_with_unit(seconds, fraction, 1_000_000);
324325
(i, FieldValue::Duration(dur))
325326
}
326-
FieldDataType::DurationNanos => {
327+
FieldDataType::DurationNanosNTP => {
327328
let (i, seconds) = u32::parse_be(remaining)?;
328329
let (i, fraction) = u32::parse_be(i)?;
329-
let dur = Duration::from_secs(u64::from(seconds)).saturating_add(
330-
Duration::from_nanos(
331-
(u64::from(fraction).saturating_mul(1_000_000_000)) >> 32,
332-
),
333-
);
330+
let dur = Self::make_ntp_time_with_unit(seconds, fraction, 1_000_000_000);
334331
(i, FieldValue::Duration(dur))
335332
}
336333
FieldDataType::ProtocolType => {
@@ -361,8 +358,8 @@ pub enum FieldDataType {
361358
Float64,
362359
DurationSeconds,
363360
DurationMillis,
364-
DurationMicros,
365-
DurationNanos,
361+
DurationMicrosNTP,
362+
DurationNanosNTP,
366363
Ip4Addr,
367364
Ip6Addr,
368365
MacAddr,

src/variable_versions/ipfix_lookup.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,10 +1101,10 @@ FlowStartSeconds = 150 => FieldDataType::DurationSeconds,
11011101
FlowEndSeconds = 151 => FieldDataType::DurationSeconds,
11021102
FlowStartMilliseconds = 152 => FieldDataType::DurationMillis,
11031103
FlowEndMilliseconds = 153 => FieldDataType::DurationMillis,
1104-
FlowStartMicroseconds = 154 => FieldDataType::DurationMicros,
1105-
FlowEndMicroseconds = 155 => FieldDataType::DurationMicros,
1106-
FlowStartNanoseconds = 156 => FieldDataType::DurationNanos,
1107-
FlowEndNanoseconds = 157 => FieldDataType::DurationNanos,
1104+
FlowStartMicroseconds = 154 => FieldDataType::DurationMicrosNTP,
1105+
FlowEndMicroseconds = 155 => FieldDataType::DurationMicrosNTP,
1106+
FlowStartNanoseconds = 156 => FieldDataType::DurationNanosNTP,
1107+
FlowEndNanoseconds = 157 => FieldDataType::DurationNanosNTP,
11081108
FlowStartDeltaMicroseconds = 158 => FieldDataType::UnsignedDataNumber,
11091109
FlowEndDeltaMicroseconds = 159 => FieldDataType::UnsignedDataNumber,
11101110
SystemInitTimeMilliseconds = 160 => FieldDataType::DurationMillis,
@@ -1215,12 +1215,12 @@ MinExportSeconds = 264 => FieldDataType::DurationSeconds,
12151215
MinFlowStartSeconds = 265 => FieldDataType::DurationSeconds,
12161216
OpaqueOctets = 266 => FieldDataType::String,
12171217
SessionScope = 267 => FieldDataType::UnsignedDataNumber,
1218-
MaxFlowEndMicroseconds = 268 => FieldDataType::DurationMicros,
1218+
MaxFlowEndMicroseconds = 268 => FieldDataType::DurationMicrosNTP,
12191219
MaxFlowEndMilliseconds = 269 => FieldDataType::DurationMillis,
1220-
MaxFlowEndNanoseconds = 270 => FieldDataType::DurationNanos,
1221-
MinFlowStartMicroseconds = 271 => FieldDataType::DurationMicros,
1220+
MaxFlowEndNanoseconds = 270 => FieldDataType::DurationNanosNTP,
1221+
MinFlowStartMicroseconds = 271 => FieldDataType::DurationMicrosNTP,
12221222
MinFlowStartMilliseconds = 272 => FieldDataType::DurationMillis,
1223-
MinFlowStartNanoseconds = 273 => FieldDataType::DurationNanos,
1223+
MinFlowStartNanoseconds = 273 => FieldDataType::DurationNanosNTP,
12241224
CollectorCertificate = 274 => FieldDataType::String,
12251225
ExporterCertificate = 275 => FieldDataType::String,
12261226
DataRecordsReliability = 276 => FieldDataType::UnsignedDataNumber,
@@ -1271,8 +1271,8 @@ AbsoluteError = 320 => FieldDataType::Float64,
12711271
RelativeError = 321 => FieldDataType::Float64,
12721272
ObservationTimeSeconds = 322 => FieldDataType::DurationSeconds,
12731273
ObservationTimeMilliseconds = 323 => FieldDataType::DurationMillis,
1274-
ObservationTimeMicroseconds = 324 => FieldDataType::DurationMicros,
1275-
ObservationTimeNanoseconds = 325 => FieldDataType::DurationNanos,
1274+
ObservationTimeMicroseconds = 324 => FieldDataType::DurationMicrosNTP,
1275+
ObservationTimeNanoseconds = 325 => FieldDataType::DurationNanosNTP,
12761276
DigestHashValue = 326 => FieldDataType::UnsignedDataNumber,
12771277
HashIppayloadOffset = 327 => FieldDataType::UnsignedDataNumber,
12781278
HashIppayloadSize = 328 => FieldDataType::UnsignedDataNumber,

src/variable_versions/snapshots/netflow_parser__variable_versions__ipfix_lookup__ipfix_lookup_tests__it_tests_field_data_type_lookup.snap

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,10 @@ expression: lookup
156156
- DurationSeconds
157157
- DurationMillis
158158
- DurationMillis
159-
- DurationMicros
160-
- DurationMicros
161-
- DurationNanos
162-
- DurationNanos
159+
- DurationMicrosNTP
160+
- DurationMicrosNTP
161+
- DurationNanosNTP
162+
- DurationNanosNTP
163163
- UnsignedDataNumber
164164
- UnsignedDataNumber
165165
- DurationMillis
@@ -270,12 +270,12 @@ expression: lookup
270270
- DurationSeconds
271271
- String
272272
- UnsignedDataNumber
273-
- DurationMicros
273+
- DurationMicrosNTP
274274
- DurationMillis
275-
- DurationNanos
276-
- DurationMicros
275+
- DurationNanosNTP
276+
- DurationMicrosNTP
277277
- DurationMillis
278-
- DurationNanos
278+
- DurationNanosNTP
279279
- String
280280
- String
281281
- UnsignedDataNumber
@@ -326,8 +326,8 @@ expression: lookup
326326
- Float64
327327
- DurationSeconds
328328
- DurationMillis
329-
- DurationMicros
330-
- DurationNanos
329+
- DurationMicrosNTP
330+
- DurationNanosNTP
331331
- UnsignedDataNumber
332332
- UnsignedDataNumber
333333
- UnsignedDataNumber

src/variable_versions/v9.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,10 @@ pub struct OptionsTemplate {
250250
/// This field gives the length (in bytes) of any Options field definitions that are contained in this options template
251251
pub options_length: u16,
252252
/// Options Scope Fields
253-
#[nom(Count = "(options_scope_length / 4) as usize")]
253+
#[nom(Count = "usize::from((options_scope_length.saturating_div(4)))")]
254254
pub scope_fields: Vec<OptionsTemplateScopeField>,
255255
/// Options Fields
256-
#[nom(Count = "(options_length / 4) as usize")]
256+
#[nom(Count = "usize::from((options_length.saturating_div(4)))")]
257257
pub option_fields: Vec<TemplateField>,
258258
}
259259

0 commit comments

Comments
 (0)