@@ -39,9 +39,9 @@ impl TcActionTunnelKey {
39
39
#[ repr( u32 ) ]
40
40
pub enum TcTunnelKeyAction {
41
41
/// Set the tunnel key (encap).
42
- Set ,
42
+ Set = TCA_TUNNEL_KEY_ACT_SET ,
43
43
/// Release the tunnel key (decap).
44
- Release ,
44
+ Release = TCA_TUNNEL_KEY_ACT_RELEASE ,
45
45
/// Other action unknown at the time of writing.
46
46
Other ( u32 ) ,
47
47
}
@@ -51,7 +51,7 @@ impl From<u32> for TcTunnelKeyAction {
51
51
match value {
52
52
TCA_TUNNEL_KEY_ACT_SET => Self :: Set ,
53
53
TCA_TUNNEL_KEY_ACT_RELEASE => Self :: Release ,
54
- x => Self :: Other ( x ) ,
54
+ _ => Self :: Other ( value ) ,
55
55
}
56
56
}
57
57
}
@@ -117,16 +117,14 @@ impl<'a, T: AsRef<[u8]> + 'a + ?Sized> Parseable<TunnelParamsBuffer<&'a T>>
117
117
}
118
118
}
119
119
120
- pub type UdpPort = u16 ;
121
- pub type Tos = u8 ;
122
- pub type Ttl = u8 ;
123
-
124
120
pub type TimeCode = u64 ;
125
121
126
- #[ derive( Debug , PartialEq , Eq , Clone ) ]
122
+ /// Tracks times in which a filter was installed, last used, expires, and first
123
+ /// used.
124
+ #[ derive( Debug , PartialEq , Eq , Clone , Copy , Default , Ord , PartialOrd , Hash ) ]
127
125
#[ non_exhaustive]
128
126
pub struct Tcft {
129
- install : TimeCode , // time codes in seconds?
127
+ install : TimeCode ,
130
128
last_use : TimeCode ,
131
129
expires : TimeCode ,
132
130
first_use : TimeCode ,
@@ -185,15 +183,15 @@ pub enum TcActionTunnelKeyOption {
185
183
/// Encapsulation IPv6 source address.
186
184
KeyEncIpv6Src ( Ipv6Addr ) ,
187
185
/// Encapsulation destination port.
188
- KeyEncDstPort ( UdpPort ) ,
186
+ KeyEncDstPort ( u16 ) ,
189
187
/// If true, do not compute the checksum of the encapsulating packet.
190
188
KeyNoChecksum ( bool ) ,
191
189
/// Encapsulation options.
192
190
KeyEncOpts ( Options ) ,
193
191
/// Encapsulation TOS.
194
- KeyEncTos ( Tos ) ,
192
+ KeyEncTos ( u8 ) ,
195
193
/// Encapsulation TTL.
196
- KeyEncTtl ( Ttl ) ,
194
+ KeyEncTtl ( u8 ) ,
197
195
/// Flag which indicated that the "do not fragment" bit should be set in
198
196
/// the outer header.
199
197
KeyNoFrag ,
@@ -362,3 +360,266 @@ fn parse_ipv6(data: &[u8]) -> Result<Ipv6Addr, DecodeError> {
362
360
) ) )
363
361
}
364
362
}
363
+
364
+ #[ cfg( test) ]
365
+ mod tests {
366
+ use super :: * ;
367
+ use crate :: tc:: TcActionType ;
368
+
369
+ #[ test]
370
+ fn u32_from_tunnel_key_action_is_faithful_to_spec ( ) {
371
+ assert_eq ! ( TCA_TUNNEL_KEY_ACT_SET , u32 :: from( TcTunnelKeyAction :: Set ) ) ;
372
+ assert_eq ! (
373
+ TCA_TUNNEL_KEY_ACT_RELEASE ,
374
+ u32 :: from( TcTunnelKeyAction :: Release )
375
+ ) ;
376
+ let arbitrary_value = 42 ;
377
+ assert_eq ! (
378
+ arbitrary_value,
379
+ u32 :: from( TcTunnelKeyAction :: Other ( arbitrary_value) )
380
+ ) ;
381
+ }
382
+
383
+ #[ test]
384
+ fn tunnel_key_action_to_from_u32_is_identity ( ) {
385
+ assert_eq ! (
386
+ TcTunnelKeyAction :: Set ,
387
+ TcTunnelKeyAction :: from( u32 :: from( TcTunnelKeyAction :: Set ) )
388
+ ) ;
389
+ assert_eq ! (
390
+ TcTunnelKeyAction :: Release ,
391
+ TcTunnelKeyAction :: from( u32 :: from( TcTunnelKeyAction :: Release ) )
392
+ ) ;
393
+ let arbitrary_value = 42 ;
394
+ assert_eq ! (
395
+ TcTunnelKeyAction :: Other ( arbitrary_value) ,
396
+ TcTunnelKeyAction :: from( u32 :: from( TcTunnelKeyAction :: Other (
397
+ arbitrary_value
398
+ ) ) )
399
+ ) ;
400
+ }
401
+
402
+ #[ test]
403
+ fn tunnel_params_buffer_length_is_as_specified ( ) {
404
+ let params = TcTunnelParams :: default ( ) ;
405
+ assert_eq ! ( TUNNEL_PARAMS_BUF_LEN , params. buffer_len( ) ) ;
406
+ }
407
+
408
+ #[ test]
409
+ fn default_tunnel_params_emit_and_parse_is_identity ( ) {
410
+ let params = TcTunnelParams :: default ( ) ;
411
+ let mut bytes = vec ! [ 0 ; params. buffer_len( ) ] ;
412
+ params. emit ( & mut bytes) ;
413
+ let parsed = TcTunnelParams :: parse (
414
+ & TunnelParamsBuffer :: new_checked ( & bytes) . unwrap ( ) ,
415
+ )
416
+ . unwrap ( ) ;
417
+ assert_eq ! ( params, parsed) ;
418
+ }
419
+
420
+ #[ test]
421
+ fn arbitrary_tunnel_params_emit_and_parse_is_identity ( ) {
422
+ let params = TcTunnelParams {
423
+ generic : TcActionGeneric {
424
+ action : TcActionType :: Queued ,
425
+ bindcnt : 2 ,
426
+ capab : 3 ,
427
+ index : 4 ,
428
+ refcnt : 5 ,
429
+ } ,
430
+ tunnel_key_action : TcTunnelKeyAction :: Release ,
431
+ } ;
432
+ let mut bytes = vec ! [ 0 ; params. buffer_len( ) ] ;
433
+ params. emit ( & mut bytes) ;
434
+ let parsed =
435
+ TcTunnelParams :: parse ( & TunnelParamsBuffer :: new ( & bytes) ) . unwrap ( ) ;
436
+ assert_eq ! ( params, parsed) ;
437
+ }
438
+
439
+ #[ test]
440
+ fn tcft_buffer_length_is_as_specified ( ) {
441
+ let tcft = Tcft :: default ( ) ;
442
+ assert_eq ! ( TCFT_BUF_LEN , tcft. buffer_len( ) ) ;
443
+ }
444
+
445
+ #[ test]
446
+ fn default_tcft_emit_and_parse_is_identity ( ) {
447
+ let tcft = Tcft :: default ( ) ;
448
+ let mut bytes = vec ! [ 0 ; tcft. buffer_len( ) ] ;
449
+ tcft. emit ( & mut bytes) ;
450
+ let parsed =
451
+ Tcft :: parse ( & TcftBuffer :: new_checked ( & bytes) . unwrap ( ) ) . unwrap ( ) ;
452
+ assert_eq ! ( tcft, parsed) ;
453
+ }
454
+
455
+ #[ test]
456
+ fn arbitrary_tcft_emit_and_parse_is_identity ( ) {
457
+ let tcft = Tcft {
458
+ install : 1 ,
459
+ last_use : 2 ,
460
+ expires : 3 ,
461
+ first_use : 4 ,
462
+ } ;
463
+ let mut bytes = vec ! [ 0 ; tcft. buffer_len( ) ] ;
464
+ tcft. emit ( & mut bytes) ;
465
+ let parsed = Tcft :: parse ( & TcftBuffer :: new ( & bytes) ) . unwrap ( ) ;
466
+ assert_eq ! ( tcft, parsed) ;
467
+ }
468
+
469
+ #[ test]
470
+ fn tunnel_key_option_value_length_is_as_specified ( ) {
471
+ let option =
472
+ TcActionTunnelKeyOption :: KeyEncKeyId ( EncKeyId :: new_unchecked ( 1 ) ) ;
473
+ assert_eq ! ( 4 , option. value_len( ) ) ;
474
+ }
475
+
476
+ #[ test]
477
+ fn tunnel_key_option_emit_and_parse_is_identity_enc_key_id ( ) {
478
+ let option =
479
+ TcActionTunnelKeyOption :: KeyEncKeyId ( EncKeyId :: new_unchecked ( 1 ) ) ;
480
+ let mut bytes = vec ! [ 0 ; option. buffer_len( ) ] ;
481
+ option. emit ( & mut bytes) ;
482
+ let parsed =
483
+ TcActionTunnelKeyOption :: parse ( & NlaBuffer :: new ( & bytes) ) . unwrap ( ) ;
484
+ assert_eq ! ( option, parsed) ;
485
+ }
486
+
487
+ #[ test]
488
+ fn tunnel_key_option_emit_and_parse_is_identity_enc_ipv4_dst ( ) {
489
+ let option =
490
+ TcActionTunnelKeyOption :: KeyEncIpv4Dst ( Ipv4Addr :: new ( 1 , 2 , 3 , 4 ) ) ;
491
+ let mut bytes = vec ! [ 0 ; option. buffer_len( ) ] ;
492
+ option. emit ( & mut bytes) ;
493
+ let parsed =
494
+ TcActionTunnelKeyOption :: parse ( & NlaBuffer :: new ( & bytes) ) . unwrap ( ) ;
495
+ assert_eq ! ( option, parsed) ;
496
+ }
497
+
498
+ #[ test]
499
+ fn tunnel_key_option_emit_and_parse_is_identity_enc_ipv4_src ( ) {
500
+ let option =
501
+ TcActionTunnelKeyOption :: KeyEncIpv4Src ( Ipv4Addr :: new ( 1 , 2 , 3 , 4 ) ) ;
502
+ let mut bytes = vec ! [ 0 ; option. buffer_len( ) ] ;
503
+ option. emit ( & mut bytes) ;
504
+ let parsed =
505
+ TcActionTunnelKeyOption :: parse ( & NlaBuffer :: new ( & bytes) ) . unwrap ( ) ;
506
+ assert_eq ! ( option, parsed) ;
507
+ }
508
+
509
+ #[ test]
510
+ fn tunnel_key_option_emit_and_parse_is_identity_enc_ipv6_dst ( ) {
511
+ let option = TcActionTunnelKeyOption :: KeyEncIpv6Dst ( Ipv6Addr :: new (
512
+ 0x2001 , 0xdb8 , 0 , 0 , 0 , 0 , 0 , 1 ,
513
+ ) ) ;
514
+ let mut bytes = vec ! [ 0 ; option. buffer_len( ) ] ;
515
+ option. emit ( & mut bytes) ;
516
+ let parsed =
517
+ TcActionTunnelKeyOption :: parse ( & NlaBuffer :: new ( & bytes) ) . unwrap ( ) ;
518
+ assert_eq ! ( option, parsed) ;
519
+ }
520
+
521
+ #[ test]
522
+ fn tunnel_key_option_emit_and_parse_is_identity_enc_ipv6_src ( ) {
523
+ let option = TcActionTunnelKeyOption :: KeyEncIpv6Src ( Ipv6Addr :: new (
524
+ 0x2001 , 0xdb8 , 0 , 0 , 0 , 0 , 0 , 1 ,
525
+ ) ) ;
526
+ let mut bytes = vec ! [ 0 ; option. buffer_len( ) ] ;
527
+ option. emit ( & mut bytes) ;
528
+ let parsed =
529
+ TcActionTunnelKeyOption :: parse ( & NlaBuffer :: new ( & bytes) ) . unwrap ( ) ;
530
+ assert_eq ! ( option, parsed) ;
531
+ }
532
+
533
+ #[ test]
534
+ fn tunnel_key_option_emit_and_parse_is_identity_enc_dst_port ( ) {
535
+ let option = TcActionTunnelKeyOption :: KeyEncDstPort ( 1 ) ;
536
+ let mut bytes = vec ! [ 0 ; option. buffer_len( ) ] ;
537
+ option. emit ( & mut bytes) ;
538
+ let parsed =
539
+ TcActionTunnelKeyOption :: parse ( & NlaBuffer :: new ( & bytes) ) . unwrap ( ) ;
540
+ assert_eq ! ( option, parsed) ;
541
+ }
542
+
543
+ #[ test]
544
+ fn tunnel_key_option_emit_and_parse_is_identity_no_checksum ( ) {
545
+ let option = TcActionTunnelKeyOption :: KeyNoChecksum ( true ) ;
546
+ let mut bytes = vec ! [ 0 ; option. buffer_len( ) ] ;
547
+ option. emit ( & mut bytes) ;
548
+ let parsed =
549
+ TcActionTunnelKeyOption :: parse ( & NlaBuffer :: new ( & bytes) ) . unwrap ( ) ;
550
+ assert_eq ! ( option, parsed) ;
551
+ }
552
+
553
+ #[ test]
554
+ fn tunnel_key_option_emit_and_parse_is_identity_enc_opts_empty_geneve ( ) {
555
+ let option =
556
+ TcActionTunnelKeyOption :: KeyEncOpts ( Options :: Geneve ( vec ! [ ] ) ) ;
557
+ let mut bytes = vec ! [ 0 ; option. buffer_len( ) ] ;
558
+ option. emit ( & mut bytes) ;
559
+ let parsed =
560
+ TcActionTunnelKeyOption :: parse ( & NlaBuffer :: new ( & bytes) ) . unwrap ( ) ;
561
+ assert_eq ! ( option, parsed) ;
562
+ }
563
+
564
+ #[ test]
565
+ fn tunnel_key_option_emit_and_parse_is_identity_enc_opts_empty_vxlan ( ) {
566
+ let option =
567
+ TcActionTunnelKeyOption :: KeyEncOpts ( Options :: Vxlan ( vec ! [ ] ) ) ;
568
+ let mut bytes = vec ! [ 0 ; option. buffer_len( ) ] ;
569
+ option. emit ( & mut bytes) ;
570
+ let parsed =
571
+ TcActionTunnelKeyOption :: parse ( & NlaBuffer :: new ( & bytes) ) . unwrap ( ) ;
572
+ assert_eq ! ( option, parsed) ;
573
+ }
574
+
575
+ #[ test]
576
+ fn tunnel_key_option_emit_and_parse_is_identity_enc_opts_empty_erspan ( ) {
577
+ let option =
578
+ TcActionTunnelKeyOption :: KeyEncOpts ( Options :: Erspan ( vec ! [ ] ) ) ;
579
+ let mut bytes = vec ! [ 0 ; option. buffer_len( ) ] ;
580
+ option. emit ( & mut bytes) ;
581
+ let parsed =
582
+ TcActionTunnelKeyOption :: parse ( & NlaBuffer :: new ( & bytes) ) . unwrap ( ) ;
583
+ assert_eq ! ( option, parsed) ;
584
+ }
585
+
586
+ #[ test]
587
+ fn tunnel_key_option_emit_and_parse_is_identity_enc_opts_empty_gtp ( ) {
588
+ let option = TcActionTunnelKeyOption :: KeyEncOpts ( Options :: Gtp ( vec ! [ ] ) ) ;
589
+ let mut bytes = vec ! [ 0 ; option. buffer_len( ) ] ;
590
+ option. emit ( & mut bytes) ;
591
+ let parsed =
592
+ TcActionTunnelKeyOption :: parse ( & NlaBuffer :: new ( & bytes) ) . unwrap ( ) ;
593
+ assert_eq ! ( option, parsed) ;
594
+ }
595
+
596
+ #[ test]
597
+ fn tunnel_key_options_emit_and_parse_is_identity_enc_tos ( ) {
598
+ let option = TcActionTunnelKeyOption :: KeyEncTos ( 1 ) ;
599
+ let mut bytes = vec ! [ 0 ; option. buffer_len( ) ] ;
600
+ option. emit ( & mut bytes) ;
601
+ let parsed =
602
+ TcActionTunnelKeyOption :: parse ( & NlaBuffer :: new ( & bytes) ) . unwrap ( ) ;
603
+ assert_eq ! ( option, parsed) ;
604
+ }
605
+
606
+ #[ test]
607
+ fn tunnel_key_options_emit_and_parse_is_identity_enc_ttl ( ) {
608
+ let option = TcActionTunnelKeyOption :: KeyEncTtl ( 1 ) ;
609
+ let mut bytes = vec ! [ 0 ; option. buffer_len( ) ] ;
610
+ option. emit ( & mut bytes) ;
611
+ let parsed =
612
+ TcActionTunnelKeyOption :: parse ( & NlaBuffer :: new ( & bytes) ) . unwrap ( ) ;
613
+ assert_eq ! ( option, parsed) ;
614
+ }
615
+
616
+ #[ test]
617
+ fn tunnel_key_options_emit_and_parse_is_identity_no_frag ( ) {
618
+ let option = TcActionTunnelKeyOption :: KeyNoFrag ;
619
+ let mut bytes = vec ! [ 0 ; option. buffer_len( ) ] ;
620
+ option. emit ( & mut bytes) ;
621
+ let parsed =
622
+ TcActionTunnelKeyOption :: parse ( & NlaBuffer :: new ( & bytes) ) . unwrap ( ) ;
623
+ assert_eq ! ( option, parsed) ;
624
+ }
625
+ }
0 commit comments