@@ -225,7 +225,7 @@ private static Flow buildFlow(
225
225
}
226
226
flow .protocol = Transport .fromObject (protocol );
227
227
228
- switch (flow .protocol ) {
228
+ switch (flow .protocol . getType () ) {
229
229
case Tcp , Udp , Sctp -> {
230
230
flow .sourcePort = parseIntFromObjectOrString (sourcePort .get (), "source port" );
231
231
if (flow .sourcePort < 1 || flow .sourcePort > 65535 ) {
@@ -336,12 +336,12 @@ public CommunityIdProcessor create(
336
336
*/
337
337
public static final class Flow {
338
338
339
- private static final List <Transport > TRANSPORTS_WITH_PORTS = List .of (
340
- Transport .Tcp ,
341
- Transport .Udp ,
342
- Transport .Sctp ,
343
- Transport .Icmp ,
344
- Transport .IcmpIpV6
339
+ private static final List <Transport . Type > TRANSPORTS_WITH_PORTS = List .of (
340
+ Transport .Type . Tcp ,
341
+ Transport .Type . Udp ,
342
+ Transport .Type . Sctp ,
343
+ Transport .Type . Icmp ,
344
+ Transport .Type . IcmpIpV6
345
345
);
346
346
347
347
InetAddress source ;
@@ -362,20 +362,21 @@ boolean isOrdered() {
362
362
}
363
363
364
364
byte [] toBytes () {
365
- boolean hasPort = TRANSPORTS_WITH_PORTS .contains (protocol );
365
+ Transport .Type protoType = protocol .getType ();
366
+ boolean hasPort = TRANSPORTS_WITH_PORTS .contains (protoType );
366
367
int len = source .getAddress ().length + destination .getAddress ().length + 2 + (hasPort ? 4 : 0 );
367
368
ByteBuffer bb = ByteBuffer .allocate (len );
368
369
369
370
boolean isOneWay = false ;
370
- if (protocol == Transport .Icmp || protocol == Transport .IcmpIpV6 ) {
371
+ if (protoType == Transport .Type . Icmp || protoType == Transport . Type .IcmpIpV6 ) {
371
372
// ICMP protocols populate port fields with ICMP data
372
- Integer equivalent = IcmpType .codeEquivalent (icmpType , protocol == Transport .IcmpIpV6 );
373
+ Integer equivalent = IcmpType .codeEquivalent (icmpType , protoType == Transport . Type .IcmpIpV6 );
373
374
isOneWay = equivalent == null ;
374
375
sourcePort = icmpType ;
375
376
destinationPort = equivalent == null ? icmpCode : equivalent ;
376
377
}
377
378
378
- boolean keepOrder = isOrdered () || ((protocol == Transport .Icmp || protocol == Transport .IcmpIpV6 ) && isOneWay );
379
+ boolean keepOrder = isOrdered () || ((protoType == Transport .Type . Icmp || protoType == Transport . Type .IcmpIpV6 ) && isOneWay );
379
380
bb .put (keepOrder ? source .getAddress () : destination .getAddress ());
380
381
bb .put (keepOrder ? destination .getAddress () : source .getAddress ());
381
382
bb .put (toUint16 (protocol .getTransportNumber () << 8 ));
@@ -397,68 +398,99 @@ String toCommunityId(byte[] seed) {
397
398
}
398
399
}
399
400
400
- public enum Transport {
401
- Icmp (1 ),
402
- Igmp (2 ),
403
- Tcp (6 ),
404
- Udp (17 ),
405
- Gre (47 ),
406
- IcmpIpV6 (58 ),
407
- Eigrp (88 ),
408
- Ospf (89 ),
409
- Pim (103 ),
410
- Sctp (132 );
411
-
412
- private final int transportNumber ;
401
+ static class Transport {
402
+ public enum Type {
403
+ Unknown (-1 ),
404
+ Icmp (1 ),
405
+ Igmp (2 ),
406
+ Tcp (6 ),
407
+ Udp (17 ),
408
+ Gre (47 ),
409
+ IcmpIpV6 (58 ),
410
+ Eigrp (88 ),
411
+ Ospf (89 ),
412
+ Pim (103 ),
413
+ Sctp (132 );
414
+
415
+ private final int transportNumber ;
416
+
417
+ private static final Map <String , Type > TRANSPORT_NAMES ;
418
+
419
+ static {
420
+ TRANSPORT_NAMES = new HashMap <>();
421
+ TRANSPORT_NAMES .put ("icmp" , Icmp );
422
+ TRANSPORT_NAMES .put ("igmp" , Igmp );
423
+ TRANSPORT_NAMES .put ("tcp" , Tcp );
424
+ TRANSPORT_NAMES .put ("udp" , Udp );
425
+ TRANSPORT_NAMES .put ("gre" , Gre );
426
+ TRANSPORT_NAMES .put ("ipv6-icmp" , IcmpIpV6 );
427
+ TRANSPORT_NAMES .put ("icmpv6" , IcmpIpV6 );
428
+ TRANSPORT_NAMES .put ("eigrp" , Eigrp );
429
+ TRANSPORT_NAMES .put ("ospf" , Ospf );
430
+ TRANSPORT_NAMES .put ("pim" , Pim );
431
+ TRANSPORT_NAMES .put ("sctp" , Sctp );
432
+ }
413
433
414
- private static final Map <String , Transport > TRANSPORT_NAMES ;
434
+ Type (int transportNumber ) {
435
+ this .transportNumber = transportNumber ;
436
+ }
415
437
416
- static {
417
- TRANSPORT_NAMES = new HashMap <>();
418
- TRANSPORT_NAMES .put ("icmp" , Icmp );
419
- TRANSPORT_NAMES .put ("igmp" , Igmp );
420
- TRANSPORT_NAMES .put ("tcp" , Tcp );
421
- TRANSPORT_NAMES .put ("udp" , Udp );
422
- TRANSPORT_NAMES .put ("gre" , Gre );
423
- TRANSPORT_NAMES .put ("ipv6-icmp" , IcmpIpV6 );
424
- TRANSPORT_NAMES .put ("icmpv6" , IcmpIpV6 );
425
- TRANSPORT_NAMES .put ("eigrp" , Eigrp );
426
- TRANSPORT_NAMES .put ("ospf" , Ospf );
427
- TRANSPORT_NAMES .put ("pim" , Pim );
428
- TRANSPORT_NAMES .put ("sctp" , Sctp );
438
+ public int getTransportNumber () {
439
+ return transportNumber ;
440
+ }
429
441
}
430
442
431
- Transport (int transportNumber ) {
443
+ private Type type ;
444
+ private int transportNumber ;
445
+
446
+ Transport (int transportNumber , Type type ) { // Change constructor to public
432
447
this .transportNumber = transportNumber ;
448
+ this .type = type ;
449
+ }
450
+
451
+ Transport (Type type ) { // Change constructor to public
452
+ this .transportNumber = type .getTransportNumber ();
453
+ this .type = type ;
454
+ }
455
+
456
+ public Type getType () {
457
+ return this .type ;
433
458
}
434
459
435
460
public int getTransportNumber () {
436
461
return transportNumber ;
437
462
}
438
463
439
464
public static Transport fromNumber (int transportNumber ) {
440
- return switch (transportNumber ) {
441
- case 1 -> Icmp ;
442
- case 2 -> Igmp ;
443
- case 6 -> Tcp ;
444
- case 17 -> Udp ;
445
- case 47 -> Gre ;
446
- case 58 -> IcmpIpV6 ;
447
- case 88 -> Eigrp ;
448
- case 89 -> Ospf ;
449
- case 103 -> Pim ;
450
- case 132 -> Sctp ;
451
- default -> throw new IllegalArgumentException ("unknown transport protocol number [" + transportNumber + "]" );
465
+ if (transportNumber < 0 || transportNumber >= 255 ) {
466
+ // transport numbers range https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
467
+ throw new IllegalArgumentException ("invalid transport protocol number [" + transportNumber + "]" );
468
+ }
469
+
470
+ Type type = switch (transportNumber ) {
471
+ case 1 -> Type .Icmp ;
472
+ case 2 -> Type .Igmp ;
473
+ case 6 -> Type .Tcp ;
474
+ case 17 -> Type .Udp ;
475
+ case 47 -> Type .Gre ;
476
+ case 58 -> Type .IcmpIpV6 ;
477
+ case 88 -> Type .Eigrp ;
478
+ case 89 -> Type .Ospf ;
479
+ case 103 -> Type .Pim ;
480
+ case 132 -> Type .Sctp ;
481
+ default -> Type .Unknown ;
452
482
};
483
+
484
+ return new Transport (transportNumber , type );
453
485
}
454
486
455
487
public static Transport fromObject (Object o ) {
456
488
if (o instanceof Number number ) {
457
489
return fromNumber (number .intValue ());
458
490
} else if (o instanceof String protocolStr ) {
459
491
// check if matches protocol name
460
- if (TRANSPORT_NAMES .containsKey (protocolStr .toLowerCase (Locale .ROOT ))) {
461
- return TRANSPORT_NAMES .get (protocolStr .toLowerCase (Locale .ROOT ));
492
+ if (Type . TRANSPORT_NAMES .containsKey (protocolStr .toLowerCase (Locale .ROOT ))) {
493
+ return new Transport ( Type . TRANSPORT_NAMES .get (protocolStr .toLowerCase (Locale .ROOT ) ));
462
494
}
463
495
464
496
// check if convertible to protocol number
0 commit comments