98
98
#define XFRM_SPI_IN_TO_OUT 0x1
99
99
#define XFRM_SPI_OUT_TO_IN 0x2
100
100
101
+ #define GRE_TUNL_DEV0 "gre00"
102
+ #define GRE_TUNL_DEV1 "gre11"
103
+
101
104
#define PING_ARGS "-i 0.01 -c 3 -w 10 -q"
102
105
103
106
static int config_device (void )
@@ -216,6 +219,18 @@ static int set_ipip_encap(const char *ipproto, const char *type)
216
219
return -1 ;
217
220
}
218
221
222
+ static int set_ipv4_addr (const char * dev0 , const char * dev1 )
223
+ {
224
+ SYS (fail , "ip -n at_ns0 link set dev %s up" , dev0 );
225
+ SYS (fail , "ip -n at_ns0 addr add dev %s %s/24" , dev0 , IP4_ADDR_TUNL_DEV0 );
226
+ SYS (fail , "ip link set dev %s up" , dev1 );
227
+ SYS (fail , "ip addr add dev %s %s/24" , dev1 , IP4_ADDR_TUNL_DEV1 );
228
+
229
+ return 0 ;
230
+ fail :
231
+ return 1 ;
232
+ }
233
+
219
234
static int add_ipip_tunnel (enum ipip_encap encap )
220
235
{
221
236
int err ;
@@ -356,6 +371,31 @@ static void delete_xfrm_tunnel(void)
356
371
IP4_ADDR1_VETH1 , IP4_ADDR_VETH0 , XFRM_SPI_OUT_TO_IN );
357
372
}
358
373
374
+ static int add_ipv4_tunnel (const char * dev0 , const char * dev1 ,
375
+ const char * type , const char * opt )
376
+ {
377
+ if (!type || !opt || !dev0 || !dev1 )
378
+ return -1 ;
379
+
380
+ SYS (fail , "ip -n at_ns0 link add dev %s type %s %s local %s remote %s" ,
381
+ dev0 , type , opt , IP4_ADDR_VETH0 , IP4_ADDR1_VETH1 );
382
+
383
+ SYS (fail , "ip link add dev %s type %s external" , dev1 , type );
384
+
385
+ return set_ipv4_addr (dev0 , dev1 );
386
+ fail :
387
+ return -1 ;
388
+ }
389
+
390
+ static void delete_tunnel (const char * dev0 , const char * dev1 )
391
+ {
392
+ if (!dev0 || !dev1 )
393
+ return ;
394
+
395
+ SYS_NOFAIL ("ip netns exec at_ns0 ip link delete dev %s" , dev0 );
396
+ SYS_NOFAIL ("ip link delete dev %s" , dev1 );
397
+ }
398
+
359
399
static int test_ping (int family , const char * addr )
360
400
{
361
401
SYS (fail , "%s %s %s > /dev/null" , ping_command (family ), PING_ARGS , addr );
@@ -677,6 +717,59 @@ static void test_xfrm_tunnel(void)
677
717
test_tunnel_kern__destroy (skel );
678
718
}
679
719
720
+ enum gre_test {
721
+ GRE ,
722
+ GRE_NOKEY ,
723
+ GRETAP ,
724
+ GRETAP_NOKEY ,
725
+ };
726
+
727
+ static void test_gre_tunnel (enum gre_test test )
728
+ {
729
+ struct test_tunnel_kern * skel ;
730
+ int set_fd , get_fd ;
731
+ int err ;
732
+
733
+ skel = test_tunnel_kern__open_and_load ();
734
+ if (!ASSERT_OK_PTR (skel , "test_tunnel_kern__open_and_load" ))
735
+ return ;
736
+
737
+ switch (test ) {
738
+ case GRE :
739
+ err = add_ipv4_tunnel (GRE_TUNL_DEV0 , GRE_TUNL_DEV1 , "gre" , "seq" );
740
+ set_fd = bpf_program__fd (skel -> progs .gre_set_tunnel_no_key );
741
+ get_fd = bpf_program__fd (skel -> progs .gre_get_tunnel );
742
+ break ;
743
+ case GRE_NOKEY :
744
+ err = add_ipv4_tunnel (GRE_TUNL_DEV0 , GRE_TUNL_DEV1 , "gre" , "seq key 2" );
745
+ set_fd = bpf_program__fd (skel -> progs .gre_set_tunnel );
746
+ get_fd = bpf_program__fd (skel -> progs .gre_get_tunnel );
747
+ break ;
748
+ case GRETAP :
749
+ err = add_ipv4_tunnel (GRE_TUNL_DEV0 , GRE_TUNL_DEV1 , "gretap" , "seq" );
750
+ set_fd = bpf_program__fd (skel -> progs .gre_set_tunnel_no_key );
751
+ get_fd = bpf_program__fd (skel -> progs .gre_get_tunnel );
752
+ break ;
753
+ case GRETAP_NOKEY :
754
+ err = add_ipv4_tunnel (GRE_TUNL_DEV0 , GRE_TUNL_DEV1 , "gretap" , "seq key 2" );
755
+ set_fd = bpf_program__fd (skel -> progs .gre_set_tunnel );
756
+ get_fd = bpf_program__fd (skel -> progs .gre_get_tunnel );
757
+ break ;
758
+ }
759
+ if (!ASSERT_OK (err , "add tunnel" ))
760
+ goto done ;
761
+
762
+ if (generic_attach (GRE_TUNL_DEV1 , get_fd , set_fd ))
763
+ goto done ;
764
+
765
+ ping_dev0 ();
766
+ ping_dev1 ();
767
+
768
+ done :
769
+ delete_tunnel (GRE_TUNL_DEV0 , GRE_TUNL_DEV1 );
770
+ test_tunnel_kern__destroy (skel );
771
+ }
772
+
680
773
#define RUN_TEST (name , ...) \
681
774
({ \
682
775
if (test__start_subtest(#name)) { \
@@ -694,6 +787,10 @@ static void *test_tunnel_run_tests(void *arg)
694
787
RUN_TEST (ipip_tunnel , FOU );
695
788
RUN_TEST (ipip_tunnel , GUE );
696
789
RUN_TEST (xfrm_tunnel );
790
+ RUN_TEST (gre_tunnel , GRE );
791
+ RUN_TEST (gre_tunnel , GRE_NOKEY );
792
+ RUN_TEST (gre_tunnel , GRETAP );
793
+ RUN_TEST (gre_tunnel , GRETAP_NOKEY );
697
794
698
795
return NULL ;
699
796
}
0 commit comments