71
71
#define IP4_ADDR2_VETH1 "172.16.1.20"
72
72
#define IP4_ADDR_TUNL_DEV0 "10.1.1.100"
73
73
#define IP4_ADDR_TUNL_DEV1 "10.1.1.200"
74
+ #define IP6_ADDR_TUNL_DEV0 "fc80::100"
75
+ #define IP6_ADDR_TUNL_DEV1 "fc80::200"
74
76
75
77
#define IP6_ADDR_VETH0 "::11"
76
78
#define IP6_ADDR1_VETH1 "::22"
101
103
#define GRE_TUNL_DEV0 "gre00"
102
104
#define GRE_TUNL_DEV1 "gre11"
103
105
106
+ #define IP6GRE_TUNL_DEV0 "ip6gre00"
107
+ #define IP6GRE_TUNL_DEV1 "ip6gre11"
108
+
104
109
#define PING_ARGS "-i 0.01 -c 3 -w 10 -q"
105
110
106
111
static int config_device (void )
@@ -396,6 +401,43 @@ static void delete_tunnel(const char *dev0, const char *dev1)
396
401
SYS_NOFAIL ("ip link delete dev %s" , dev1 );
397
402
}
398
403
404
+ static int set_ipv6_addr (const char * dev0 , const char * dev1 )
405
+ {
406
+ /* disable IPv6 DAD because it might take too long and fail tests */
407
+ SYS (fail , "ip -n at_ns0 addr add %s/96 dev veth0 nodad" , IP6_ADDR_VETH0 );
408
+ SYS (fail , "ip -n at_ns0 link set dev veth0 up" );
409
+ SYS (fail , "ip addr add %s/96 dev veth1 nodad" , IP6_ADDR1_VETH1 );
410
+ SYS (fail , "ip link set dev veth1 up" );
411
+
412
+ SYS (fail , "ip -n at_ns0 addr add dev %s %s/24" , dev0 , IP4_ADDR_TUNL_DEV0 );
413
+ SYS (fail , "ip -n at_ns0 addr add dev %s %s/96 nodad" , dev0 , IP6_ADDR_TUNL_DEV0 );
414
+ SYS (fail , "ip -n at_ns0 link set dev %s up" , dev0 );
415
+
416
+ SYS (fail , "ip addr add dev %s %s/24" , dev1 , IP4_ADDR_TUNL_DEV1 );
417
+ SYS (fail , "ip addr add dev %s %s/96 nodad" , dev1 , IP6_ADDR_TUNL_DEV1 );
418
+ SYS (fail , "ip link set dev %s up" , dev1 );
419
+ return 0 ;
420
+ fail :
421
+ return 1 ;
422
+ }
423
+
424
+ static int add_ipv6_tunnel (const char * dev0 , const char * dev1 ,
425
+ const char * type , const char * opt )
426
+ {
427
+ if (!type || !opt || !dev0 || !dev1 )
428
+ return -1 ;
429
+
430
+ SYS (fail , "ip -n at_ns0 link add dev %s type %s %s local %s remote %s" ,
431
+ dev0 , type , opt , IP6_ADDR_VETH0 , IP6_ADDR1_VETH1 );
432
+
433
+ SYS (fail , "ip link add dev %s type %s external" , dev1 , type );
434
+
435
+ return set_ipv6_addr (dev0 , dev1 );
436
+ fail :
437
+ return -1 ;
438
+ }
439
+
440
+
399
441
static int test_ping (int family , const char * addr )
400
442
{
401
443
SYS (fail , "%s %s %s > /dev/null" , ping_command (family ), PING_ARGS , addr );
@@ -423,6 +465,24 @@ static void ping_dev1(void)
423
465
close_netns (nstoken );
424
466
}
425
467
468
+ static void ping6_veth0 (void )
469
+ {
470
+ test_ping (AF_INET6 , IP6_ADDR_VETH0 );
471
+ }
472
+
473
+ static void ping6_dev1 (void )
474
+ {
475
+ struct nstoken * nstoken ;
476
+
477
+ /* ping from at_ns0 namespace test */
478
+ nstoken = open_netns ("at_ns0" );
479
+ if (!ASSERT_OK_PTR (nstoken , "setns" ))
480
+ return ;
481
+
482
+ test_ping (AF_INET , IP6_ADDR_TUNL_DEV1 );
483
+ close_netns (nstoken );
484
+ }
485
+
426
486
static int attach_tc_prog (int ifindex , int igr_fd , int egr_fd )
427
487
{
428
488
DECLARE_LIBBPF_OPTS (bpf_tc_hook , hook , .ifindex = ifindex ,
@@ -770,6 +830,48 @@ static void test_gre_tunnel(enum gre_test test)
770
830
test_tunnel_kern__destroy (skel );
771
831
}
772
832
833
+ enum ip6gre_test {
834
+ IP6GRE ,
835
+ IP6GRETAP
836
+ };
837
+
838
+ static void test_ip6gre_tunnel (enum ip6gre_test test )
839
+ {
840
+ struct test_tunnel_kern * skel ;
841
+ int set_fd , get_fd ;
842
+ int err ;
843
+
844
+ skel = test_tunnel_kern__open_and_load ();
845
+ if (!ASSERT_OK_PTR (skel , "test_tunnel_kern__open_and_load" ))
846
+ return ;
847
+
848
+ switch (test ) {
849
+ case IP6GRE :
850
+ err = add_ipv6_tunnel (IP6GRE_TUNL_DEV0 , IP6GRE_TUNL_DEV1 ,
851
+ "ip6gre" , "flowlabel 0xbcdef key 2" );
852
+ break ;
853
+ case IP6GRETAP :
854
+ err = add_ipv6_tunnel (IP6GRE_TUNL_DEV0 , IP6GRE_TUNL_DEV1 ,
855
+ "ip6gretap" , "flowlabel 0xbcdef key 2" );
856
+ break ;
857
+ }
858
+ if (!ASSERT_OK (err , "add tunnel" ))
859
+ goto done ;
860
+
861
+ set_fd = bpf_program__fd (skel -> progs .ip6gretap_set_tunnel );
862
+ get_fd = bpf_program__fd (skel -> progs .ip6gretap_get_tunnel );
863
+ if (generic_attach (IP6GRE_TUNL_DEV1 , get_fd , set_fd ))
864
+ goto done ;
865
+
866
+ ping6_veth0 ();
867
+ ping6_dev1 ();
868
+ ping_dev0 ();
869
+ ping_dev1 ();
870
+ done :
871
+ delete_tunnel (IP6GRE_TUNL_DEV0 , IP6GRE_TUNL_DEV1 );
872
+ test_tunnel_kern__destroy (skel );
873
+ }
874
+
773
875
#define RUN_TEST (name , ...) \
774
876
({ \
775
877
if (test__start_subtest(#name)) { \
@@ -791,6 +893,8 @@ static void *test_tunnel_run_tests(void *arg)
791
893
RUN_TEST (gre_tunnel , GRE_NOKEY );
792
894
RUN_TEST (gre_tunnel , GRETAP );
793
895
RUN_TEST (gre_tunnel , GRETAP_NOKEY );
896
+ RUN_TEST (ip6gre_tunnel , IP6GRE );
897
+ RUN_TEST (ip6gre_tunnel , IP6GRETAP );
794
898
795
899
return NULL ;
796
900
}
0 commit comments