Skip to content

Commit c513979

Browse files
Michael MileusnichMichael Mileusnich
Michael Mileusnich
authored and
Michael Mileusnich
committed
Renamed NetflowPacket to NetflowPacketResult.
Created an Error Type on NetflowPacketResult. Contains the error message and bytes that was trying to be parsed.
1 parent 009010c commit c513979

File tree

9 files changed

+60
-23
lines changed

9 files changed

+60
-23
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.1.6"
4+
version = "0.1.7"
55
edition = "2021"
66
77
license = "MIT OR Apache-2.0"

README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ See: <https://en.wikipedia.org/wiki/NetFlow>
1111
## V5:
1212

1313
```rust
14-
use netflow_parser::{NetflowParser, NetflowPacket};
14+
use netflow_parser::{NetflowParser, NetflowPacketResult};
1515

1616
let v5_packet = [0, 5, 2, 0, 3, 0, 4, 0, 5, 0, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7,];
1717
match NetflowParser::default().parse_bytes(&v5_packet).first() {
18-
Some(NetflowPacket::V5(v5)) => assert_eq!(v5.header.version, 5),
18+
Some(NetflowPacketResult::V5(v5)) => assert_eq!(v5.header.version, 5),
19+
Some(NetflowPacketResult::Error(e)) => println!("{:?}", e),
1920
_ => (),
2021
}
2122
```
@@ -39,12 +40,12 @@ println!("{}", json!(NetflowParser::default().parse_bytes(&v5_packet)).to_string
3940
## Filtering for a specific version
4041

4142
```rust
42-
use netflow_parser::{NetflowParser, NetflowPacket};
43+
use netflow_parser::{NetflowParser, NetflowPacketResult};
4344

4445
let v5_packet = [0, 5, 2, 0, 3, 0, 4, 0, 5, 0, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7,];
4546
let parsed = NetflowParser::default().parse_bytes(&v5_packet);
4647

47-
let v5_parsed: Vec<NetflowPacket> = parsed.iter().filter(|p| p.is_v5()).map(|p| p.clone()).collect();
48+
let v5_parsed: Vec<NetflowPacketResult> = parsed.iter().filter(|p| p.is_v5()).map(|p| p.clone()).collect();
4849
```
4950

5051
## V9/IPFix notes:

RELEASES.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# 0.1.7
2+
* Renamed NetflowPacket to NetflowPacketResult.
3+
* Created an Error Type on NetflowPacketResult. Contains the error message and bytes that was trying to be parsed.
4+
15
# 0.1.6
26
* Fixed bug when parsing empty byte arrays or empty remaining slices.
37

src/lib.rs

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@
1111
//! ## V5:
1212
//!
1313
//! ```rust
14-
//! use netflow_parser::{NetflowParser, NetflowPacket};
14+
//! use netflow_parser::{NetflowParser, NetflowPacketResult};
1515
//!
1616
//! let v5_packet = [0, 5, 2, 0, 3, 0, 4, 0, 5, 0, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7,];
1717
//! match NetflowParser::default().parse_bytes(&v5_packet).first() {
18-
//! Some(NetflowPacket::V5(v5)) => assert_eq!(v5.header.version, 5),
18+
//! Some(NetflowPacketResult::V5(v5)) => assert_eq!(v5.header.version, 5),
19+
//! Some(NetflowPacketResult::Error(e)) => println!("{:?}", e),
1920
//! _ => (),
2021
//! }
2122
//! ```
@@ -39,12 +40,12 @@
3940
//! ## Filtering for a specific version
4041
//!
4142
//! ```rust
42-
//! use netflow_parser::{NetflowParser, NetflowPacket};
43+
//! use netflow_parser::{NetflowParser, NetflowPacketResult};
4344
//!
4445
//! let v5_packet = [0, 5, 2, 0, 3, 0, 4, 0, 5, 0, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7,];
4546
//! let parsed = NetflowParser::default().parse_bytes(&v5_packet);
4647
//!
47-
//! let v5_parsed: Vec<NetflowPacket> = parsed.iter().filter(|p| p.is_v5()).map(|p| p.clone()).collect();
48+
//! let v5_parsed: Vec<NetflowPacketResult> = parsed.iter().filter(|p| p.is_v5()).map(|p| p.clone()).collect();
4849
//! ```
4950
//!
5051
//! ## V9/IPFix notes:
@@ -80,9 +81,15 @@ use variable_versions::v9::{V9Parser, V9};
8081

8182
use nom_derive::{Nom, Parse};
8283

84+
#[derive(Debug, Clone, Serialize)]
85+
pub struct NetflowPacketError {
86+
pub error_message: String,
87+
pub bytes: Vec<u8>,
88+
}
89+
8390
/// Enum of supported Netflow Versions
8491
#[derive(Debug, Clone, Serialize)]
85-
pub enum NetflowPacket {
92+
pub enum NetflowPacketResult {
8693
/// Version 5
8794
V5(V5),
8895
/// Version 7
@@ -91,9 +98,11 @@ pub enum NetflowPacket {
9198
V9(V9),
9299
/// IPFix
93100
IPFix(IPFix),
101+
/// Error
102+
Error(NetflowPacketError),
94103
}
95104

96-
impl NetflowPacket {
105+
impl NetflowPacketResult {
97106
pub fn is_v5(&self) -> bool {
98107
matches!(self, Self::V5(_v))
99108
}
@@ -106,13 +115,16 @@ impl NetflowPacket {
106115
pub fn is_ipfix(&self) -> bool {
107116
matches!(self, Self::IPFix(_v))
108117
}
118+
pub fn is_error(&self) -> bool {
119+
matches!(self, Self::Error(_v))
120+
}
109121
}
110122

111123
#[derive(Debug, Clone)]
112124
struct ParsedNetflow {
113125
remaining: Vec<u8>,
114126
/// Parsed Netflow Packet
115-
netflow_packet: NetflowPacket,
127+
netflow_packet: NetflowPacketResult,
116128
}
117129

118130
/// Struct is used simply to match how to handle the result of the packet
@@ -180,7 +192,7 @@ impl NetflowParser {
180192
/// ```
181193
///
182194
#[inline]
183-
pub fn parse_bytes(&mut self, packet: &[u8]) -> Vec<NetflowPacket> {
195+
pub fn parse_bytes(&mut self, packet: &[u8]) -> Vec<NetflowPacketResult> {
184196
if packet.is_empty() {
185197
return vec![];
186198
}
@@ -193,8 +205,11 @@ impl NetflowParser {
193205
parsed
194206
}
195207
Err(parsed_error) => {
196-
dbg!("{parsed_error}", parsed_error);
197-
vec![]
208+
let netflow_packet_error = NetflowPacketError {
209+
error_message: parsed_error.to_string(),
210+
bytes: packet.to_vec(),
211+
};
212+
vec![NetflowPacketResult::Error(netflow_packet_error)]
198213
}
199214
}
200215
}
@@ -222,6 +237,12 @@ mod tests {
222237
assert_yaml_snapshot!(NetflowParser::default().parse_bytes(&packet));
223238
}
224239

240+
#[test]
241+
fn it_creates_error() {
242+
let packet = [12, 13, 14];
243+
assert_yaml_snapshot!(NetflowParser::default().parse_bytes(&packet));
244+
}
245+
225246
#[test]
226247
fn it_parses_v7() {
227248
let packet = [
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
source: src/lib.rs
3+
expression: "NetflowParser::default().parse_bytes(&packet)"
4+
---
5+
- Error:
6+
error_message: Not Supported
7+
bytes:
8+
- 12
9+
- 13
10+
- 14
11+

src/static_versions/v5.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//! - <https://www.cisco.com/en/US/technologies/tk648/tk362/technologies_white_paper09186a00800a3db9.html>
55
66
use crate::protocol::ProtocolTypes;
7-
use crate::{NetflowByteParserStatic, NetflowPacket, ParsedNetflow};
7+
use crate::{NetflowByteParserStatic, NetflowPacketResult, ParsedNetflow};
88

99
use nom::number::complete::be_u32;
1010
use nom_derive::*;
@@ -28,7 +28,7 @@ impl NetflowByteParserStatic for V5 {
2828
let parsed_packet = V5::parse_be(packet).map_err(|e| format!("{e}"))?;
2929
Ok(ParsedNetflow {
3030
remaining: parsed_packet.0.to_vec(),
31-
netflow_packet: NetflowPacket::V5(parsed_packet.1),
31+
netflow_packet: NetflowPacketResult::V5(parsed_packet.1),
3232
})
3333
}
3434
}

src/static_versions/v7.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//! - <https://www.cisco.com/en/US/technologies/tk648/tk362/technologies_white_paper09186a00800a3db9.html>
55
66
use crate::protocol::ProtocolTypes;
7-
use crate::{NetflowByteParserStatic, NetflowPacket, ParsedNetflow};
7+
use crate::{NetflowByteParserStatic, NetflowPacketResult, ParsedNetflow};
88

99
use nom::number::complete::be_u32;
1010
use nom_derive::*;
@@ -28,7 +28,7 @@ impl NetflowByteParserStatic for V7 {
2828
let parsed_packet = V7::parse_be(packet).map_err(|e| format!("{e}"))?;
2929
Ok(ParsedNetflow {
3030
remaining: parsed_packet.0.to_vec(),
31-
netflow_packet: NetflowPacket::V7(parsed_packet.1),
31+
netflow_packet: NetflowPacketResult::V7(parsed_packet.1),
3232
})
3333
}
3434
}

src/variable_versions/ipfix.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
use super::common::*;
1010
use crate::protocol::ProtocolTypes;
1111
use crate::variable_versions::ipfix_lookup::*;
12-
use crate::{NetflowByteParserVariable, NetflowPacket, ParsedNetflow};
12+
use crate::{NetflowByteParserVariable, NetflowPacketResult, ParsedNetflow};
1313

1414
use nom::bytes::complete::take;
1515
use nom::error::{Error as NomError, ErrorKind};
@@ -354,7 +354,7 @@ impl NetflowByteParserVariable for IPFixParser {
354354

355355
Ok(ParsedNetflow {
356356
remaining: remaining.to_vec(),
357-
netflow_packet: NetflowPacket::IPFix(v10_parsed),
357+
netflow_packet: NetflowPacketResult::IPFix(v10_parsed),
358358
})
359359
}
360360
}

src/variable_versions/v9.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use super::common::*;
88
use crate::protocol::ProtocolTypes;
99
use crate::variable_versions::v9_lookup::*;
10-
use crate::{NetflowByteParserVariable, NetflowPacket, ParsedNetflow};
10+
use crate::{NetflowByteParserVariable, NetflowPacketResult, ParsedNetflow};
1111

1212
use nom::bytes::complete::take;
1313
use nom::error::{Error as NomError, ErrorKind};
@@ -463,7 +463,7 @@ impl NetflowByteParserVariable for V9Parser {
463463

464464
Ok(ParsedNetflow {
465465
remaining: remaining.to_vec(),
466-
netflow_packet: NetflowPacket::V9(v9_parsed),
466+
netflow_packet: NetflowPacketResult::V9(v9_parsed),
467467
})
468468
}
469469
}

0 commit comments

Comments
 (0)