70
70
//!
71
71
//! ```cargo run --example netflow_udp_listener_single_threaded```
72
72
73
+ pub mod netflow_header;
73
74
pub mod protocol;
74
75
pub mod static_versions;
75
76
pub mod variable_versions;
76
77
77
78
use serde:: Serialize ;
79
+
80
+ use netflow_header:: { NetflowHeader , NetflowVersion } ;
78
81
use static_versions:: { v5:: V5 , v7:: V7 } ;
79
82
use variable_versions:: ipfix:: { IPFix , IPFixParser } ;
80
83
use variable_versions:: v9:: { V9Parser , V9 } ;
81
84
82
- use nom_derive:: { Nom , Parse } ;
83
-
84
85
#[ derive( Debug , Clone , Serialize ) ]
85
86
pub struct NetflowPacketError {
86
87
pub error_message : String ,
@@ -127,13 +128,6 @@ struct ParsedNetflow {
127
128
netflow_packet : NetflowPacketResult ,
128
129
}
129
130
130
- /// Struct is used simply to match how to handle the result of the packet
131
- #[ derive( Nom ) ]
132
- struct NetflowHeader {
133
- /// Netflow Version
134
- version : u16 ,
135
- }
136
-
137
131
/// Trait provided for all static parser versions
138
132
trait NetflowByteParserStatic {
139
133
fn parse_bytes ( packet : & [ u8 ] ) -> Result < ParsedNetflow , Box < dyn std:: error:: Error > > ;
@@ -159,13 +153,17 @@ impl NetflowParser {
159
153
& ' a mut self ,
160
154
packet : & ' a [ u8 ] ,
161
155
) -> Result < ParsedNetflow , Box < dyn std:: error:: Error > > {
162
- match NetflowHeader :: parse_be ( 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 => {
156
+ match NetflowHeader :: parse_header ( packet) {
157
+ Ok ( ( i, netflow_header) ) if netflow_header. version == NetflowVersion :: V5 => {
158
+ V5 :: parse_bytes ( i)
159
+ }
160
+ Ok ( ( i, netflow_header) ) if netflow_header. version == NetflowVersion :: V7 => {
161
+ V7 :: parse_bytes ( i)
162
+ }
163
+ Ok ( ( i, netflow_header) ) if netflow_header. version == NetflowVersion :: V9 => {
166
164
self . v9_parser . parse_bytes ( i)
167
165
}
168
- Ok ( ( i, netflow_header) ) if netflow_header. version == 10 => {
166
+ Ok ( ( i, netflow_header) ) if netflow_header. version == NetflowVersion :: IPFix => {
169
167
self . ipfix_parser . parse_bytes ( i)
170
168
}
171
169
_ => Err ( "Not Supported" . to_string ( ) . into ( ) ) ,
@@ -196,22 +194,18 @@ impl NetflowParser {
196
194
if packet. is_empty ( ) {
197
195
return vec ! [ ] ;
198
196
}
199
- match self . parse_by_version ( packet) {
200
- Ok ( parsed_netflow) => {
197
+ self . parse_by_version ( packet)
198
+ . map ( | parsed_netflow| {
201
199
let mut parsed = vec ! [ parsed_netflow. netflow_packet] ;
202
- if !parsed_netflow. remaining . is_empty ( ) {
203
- parsed. append ( & mut self . parse_bytes ( parsed_netflow. remaining . as_slice ( ) ) ) ;
204
- }
200
+ parsed. append ( & mut self . parse_bytes ( parsed_netflow. remaining . as_slice ( ) ) ) ;
205
201
parsed
206
- }
207
- Err ( parsed_error ) => {
208
- let netflow_packet_error = NetflowPacketError {
209
- error_message : parsed_error . to_string ( ) ,
202
+ } )
203
+ . unwrap_or_else ( |e| {
204
+ vec ! [ NetflowPacketResult :: Error ( NetflowPacketError {
205
+ error_message: e . to_string( ) ,
210
206
bytes: packet. to_vec( ) ,
211
- } ;
212
- vec ! [ NetflowPacketResult :: Error ( netflow_packet_error) ]
213
- }
214
- }
207
+ } ) ]
208
+ } )
215
209
}
216
210
}
217
211
0 commit comments