@@ -266,19 +266,15 @@ pub struct NetflowParser {
266266}
267267
268268#[ derive( Debug , Clone ) ]
269- pub struct ParsedNetflow {
270- pub remaining : Vec < u8 > ,
271- /// Parsed Netflow Packet
272- pub result : NetflowPacket ,
273- }
274-
275- impl ParsedNetflow {
276- fn new ( remaining : & [ u8 ] , result : NetflowPacket ) -> Self {
277- Self {
278- remaining : remaining. to_vec ( ) ,
279- result,
280- }
281- }
269+ pub enum ParsedNetflow {
270+ Success {
271+ packet : NetflowPacket ,
272+ remaining : Vec < u8 > ,
273+ } ,
274+ Error {
275+ error : NetflowParseError ,
276+ } ,
277+ UnallowedVersion ,
282278}
283279
284280#[ derive( Debug , Clone , Serialize ) ]
@@ -291,7 +287,6 @@ pub struct NetflowPacketError {
291287pub enum NetflowParseError {
292288 Incomplete ( String ) ,
293289 Partial ( PartialParse ) ,
294- UnallowedVersion ( u16 ) ,
295290 UnknownVersion ( Vec < u8 > ) ,
296291}
297292
@@ -343,16 +338,19 @@ impl NetflowParser {
343338
344339 while !remaining. is_empty ( ) {
345340 match self . parse_packet_by_version ( & remaining) {
346- Ok ( parsed) => {
347- packets. push ( parsed. result ) ;
348- remaining = parsed. remaining ;
341+ ParsedNetflow :: Success {
342+ packet,
343+ remaining : new_remaining,
344+ } => {
345+ packets. push ( packet) ;
346+ remaining = new_remaining;
349347 }
350- Err ( NetflowParseError :: UnallowedVersion ( _ ) ) => {
348+ ParsedNetflow :: UnallowedVersion => {
351349 break ;
352350 }
353- Err ( e ) => {
351+ ParsedNetflow :: Error { error } => {
354352 packets. push ( NetflowPacket :: Error ( NetflowPacketError {
355- error : e ,
353+ error,
356354 remaining : remaining. to_vec ( ) ,
357355 } ) ) ;
358356 break ;
@@ -376,27 +374,28 @@ impl NetflowParser {
376374 . collect ( )
377375 }
378376
379- /// Checks the first u16 of the packet to determine the version. Parses the packet based on the version.
380- /// If the version is unknown it returns an error. If the packet is incomplete it returns an error.
381- /// If the packet is parsed successfully it returns the parsed Netflow packet and the remaining bytes.
382- fn parse_packet_by_version (
383- & mut self ,
384- packet : & [ u8 ] ,
385- ) -> Result < ParsedNetflow , NetflowParseError > {
386- let ( packet, version) = GenericNetflowHeader :: parse ( packet)
387- . map ( |( remaining, header) | ( remaining, header. version ) )
388- . map_err ( |e| NetflowParseError :: Incomplete ( e. to_string ( ) ) ) ?;
377+ fn parse_packet_by_version ( & mut self , packet : & [ u8 ] ) -> ParsedNetflow {
378+ let ( packet, version) = match GenericNetflowHeader :: parse ( packet) {
379+ Ok ( ( remaining, header) ) => ( remaining, header. version ) ,
380+ Err ( e) => {
381+ return ParsedNetflow :: Error {
382+ error : NetflowParseError :: Incomplete ( e. to_string ( ) ) ,
383+ } ;
384+ }
385+ } ;
389386
390387 if !self . allowed_versions . contains ( & version) {
391- return Err ( NetflowParseError :: UnallowedVersion ( version ) ) ;
388+ return ParsedNetflow :: UnallowedVersion ;
392389 }
393390
394391 match version {
395392 5 => V5Parser :: parse ( packet) ,
396393 7 => V7Parser :: parse ( packet) ,
397394 9 => self . v9_parser . parse ( packet) ,
398395 10 => self . ipfix_parser . parse ( packet) ,
399- _ => Err ( NetflowParseError :: UnknownVersion ( packet. to_vec ( ) ) ) ,
396+ _ => ParsedNetflow :: Error {
397+ error : NetflowParseError :: UnknownVersion ( packet. to_vec ( ) ) ,
398+ } ,
400399 }
401400 }
402401}
0 commit comments