Skip to content

Commit 214e340

Browse files
Renamed NetflowPacket to NetflowPacketResult. (#20)
Created an Error Type on NetflowPacketResult. Contains the error message and bytes that was trying to be parsed.
1 parent 009010c commit 214e340

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)