9898#define XFRM_SPI_IN_TO_OUT 0x1
9999#define XFRM_SPI_OUT_TO_IN 0x2
100100
101+ #define GRE_TUNL_DEV0 "gre00"
102+ #define GRE_TUNL_DEV1 "gre11"
103+
101104#define PING_ARGS "-i 0.01 -c 3 -w 10 -q"
102105
103106static int config_device (void )
@@ -216,6 +219,18 @@ static int set_ipip_encap(const char *ipproto, const char *type)
216219 return -1 ;
217220}
218221
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+
219234static int add_ipip_tunnel (enum ipip_encap encap )
220235{
221236 int err ;
@@ -356,6 +371,31 @@ static void delete_xfrm_tunnel(void)
356371 IP4_ADDR1_VETH1 , IP4_ADDR_VETH0 , XFRM_SPI_OUT_TO_IN );
357372}
358373
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+
359399static int test_ping (int family , const char * addr )
360400{
361401 SYS (fail , "%s %s %s > /dev/null" , ping_command (family ), PING_ARGS , addr );
@@ -677,6 +717,59 @@ static void test_xfrm_tunnel(void)
677717 test_tunnel_kern__destroy (skel );
678718}
679719
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+
680773#define RUN_TEST (name , ...) \
681774 ({ \
682775 if (test__start_subtest(#name)) { \
@@ -694,6 +787,10 @@ static void *test_tunnel_run_tests(void *arg)
694787 RUN_TEST (ipip_tunnel , FOU );
695788 RUN_TEST (ipip_tunnel , GUE );
696789 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 );
697794
698795 return NULL ;
699796}
0 commit comments