1515
1616#include "test_utils.h"
1717#include "../libxdp_internal.h"
18- #include "xdp_dispatcher_v1 .h"
18+ #include "xdp_dispatcher .h"
1919
2020#include <xdp/libxdp.h>
2121#include <bpf/libbpf.h>
2929
3030#define PROG_RUN_PRIO 42
3131#define PROG_CHAIN_CALL_ACTIONS (1 << XDP_DROP)
32+ #define DISPATCHER_V1_FILE "xdp_dispatcher_v1.o"
33+ #define DISPATCHER_V2_FILE "xdp_dispatcher_v2.o"
34+
35+ static void print_test_result (const char * func , int ret )
36+ {
37+ fflush (stderr );
38+ fprintf (stderr , "%s:\t%s\n" , func , ret ? "FAILED" : "PASSED" );
39+ fflush (stdout );
40+ }
3241
3342int get_prog_id (int prog_fd )
3443{
@@ -43,9 +52,26 @@ int get_prog_id(int prog_fd)
4352 return info .id ;
4453}
4554
46- int load_dispatcher_v1 (int ifindex )
55+ static char * get_dispatcher_file (unsigned int dispatcher_version )
56+ {
57+ switch (dispatcher_version ) {
58+ case XDP_DISPATCHER_VERSION_V1 :
59+ return DISPATCHER_V1_FILE ;
60+
61+ case XDP_DISPATCHER_VERSION_V2 :
62+ return DISPATCHER_V2_FILE ;
63+
64+ default :
65+ break ;
66+ }
67+ return NULL ;
68+ }
69+
70+ int load_dispatcher (int ifindex , unsigned int dispatcher_version )
4771{
48- struct xdp_dispatcher_config_v1 dispatcher_config = {};
72+ struct xdp_dispatcher_config_v1 dispatcher_config_v1 = {};
73+ struct xdp_dispatcher_config_v2 dispatcher_config_v2 = {};
74+ char * dispatcher_file = get_dispatcher_file (dispatcher_version );
4975 struct bpf_object * obj_dispatcher , * obj_prog = NULL ;
5076 DECLARE_LIBBPF_OPTS (bpf_link_create_opts , opts );
5177 struct bpf_program * dispatcher_prog , * xdp_prog ;
@@ -54,10 +80,10 @@ int load_dispatcher_v1(int ifindex)
5480 const char * attach_func = "prog0" ;
5581 struct bpf_map * map ;
5682
57- if (!ifindex )
83+ if (!ifindex || ! dispatcher_file )
5884 return - ENOENT ;
5985
60- obj_dispatcher = bpf_object__open ("xdp_dispatcher_v1.o" );
86+ obj_dispatcher = bpf_object__open (dispatcher_file );
6187 if (!obj_dispatcher )
6288 return - errno ;
6389
@@ -76,22 +102,38 @@ int load_dispatcher_v1(int ifindex)
76102 }
77103
78104 dispatcher_prog = bpf_object__find_program_by_name (obj_dispatcher ,
79- "xdp_dispatcher" );
105+ "xdp_dispatcher" );
80106 if (!dispatcher_prog ) {
81107 ret = - errno ;
82108 goto out ;
83109 }
84110
85- dispatcher_config .num_progs_enabled = 1 ;
86- dispatcher_config .chain_call_actions [0 ] = PROG_CHAIN_CALL_ACTIONS ;
87- dispatcher_config .run_prios [0 ] = PROG_RUN_PRIO ;
111+ switch (dispatcher_version ) {
112+ case XDP_DISPATCHER_VERSION_V1 :
113+ dispatcher_config_v1 .num_progs_enabled = 1 ;
114+ dispatcher_config_v1 .chain_call_actions [0 ] = PROG_CHAIN_CALL_ACTIONS ;
115+ dispatcher_config_v1 .run_prios [0 ] = PROG_RUN_PRIO ;
116+
117+ ret = bpf_map__set_initial_value (map , & dispatcher_config_v1 ,
118+ sizeof (dispatcher_config_v1 ));
119+ break ;
120+
121+ case XDP_DISPATCHER_VERSION_V2 :
122+ dispatcher_config_v2 .magic = XDP_DISPATCHER_MAGIC ;
123+ dispatcher_config_v2 .num_progs_enabled = 1 ;
124+ dispatcher_config_v2 .chain_call_actions [0 ] = PROG_CHAIN_CALL_ACTIONS ;
125+ dispatcher_config_v2 .run_prios [0 ] = PROG_RUN_PRIO ;
126+ dispatcher_config_v2 .is_xdp_frags = 0 ;
127+ dispatcher_config_v2 .program_flags [0 ] = 0 ;
128+ dispatcher_config_v2 .dispatcher_version = XDP_DISPATCHER_VERSION_V2 ;
129+
130+ ret = bpf_map__set_initial_value (map , & dispatcher_config_v2 ,
131+ sizeof (dispatcher_config_v2 ));
132+ }
88133
89- ret = bpf_map__set_initial_value (map , & dispatcher_config ,
90- sizeof (dispatcher_config ));
91134 if (ret )
92135 goto out ;
93136
94-
95137 ret = bpf_object__load (obj_dispatcher );
96138 if (ret )
97139 goto out ;
@@ -190,14 +232,14 @@ int load_dispatcher_v1(int ifindex)
190232 goto out ;
191233}
192234
193- int check_old_dispatcher (int ifindex )
235+ int check_old_dispatcher (int ifindex , unsigned int dispatcher_version )
194236{
195237 struct xdp_multiprog * mp = NULL ;
196238 struct xdp_program * xdp_prog ;
197239 char buf [100 ];
198240 int ret ;
199241
200- ret = load_dispatcher_v1 (ifindex );
242+ ret = load_dispatcher (ifindex , dispatcher_version );
201243 if (ret )
202244 goto out ;
203245
@@ -276,6 +318,20 @@ static void usage(char *progname)
276318 exit (EXIT_FAILURE );
277319}
278320
321+ int check_old_dispatcher_v1 (int ifindex )
322+ {
323+ int ret = check_old_dispatcher (ifindex , XDP_DISPATCHER_VERSION_V1 );
324+ print_test_result (__func__ , ret );
325+ return ret ;
326+ }
327+
328+ int check_old_dispatcher_v2 (int ifindex )
329+ {
330+ int ret = check_old_dispatcher (ifindex , XDP_DISPATCHER_VERSION_V2 );
331+ print_test_result (__func__ , ret );
332+ return ret ;
333+ }
334+
279335int main (int argc , char * * argv )
280336{
281337 int ifindex , ret ;
@@ -294,7 +350,8 @@ int main(int argc, char **argv)
294350
295351 ifindex = if_nametoindex (argv [1 ]);
296352
297- ret = check_old_dispatcher (ifindex );
353+ ret = check_old_dispatcher_v1 (ifindex );
354+ ret = check_old_dispatcher_v2 (ifindex ) || ret ;
298355
299356 return ret ;
300- }
357+ }
0 commit comments