xref: /linux/tools/testing/selftests/bpf/prog_tests/test_xsk.h (revision 24f171c7e145f43b9f187578e89b0982ce87e54c)
1*d1aec26fSBastien Curutchet (eBPF Foundation) /* SPDX-License-Identifier: GPL-2.0 */
2*d1aec26fSBastien Curutchet (eBPF Foundation) #ifndef TEST_XSK_H_
3*d1aec26fSBastien Curutchet (eBPF Foundation) #define TEST_XSK_H_
4*d1aec26fSBastien Curutchet (eBPF Foundation) 
5*d1aec26fSBastien Curutchet (eBPF Foundation) #include <linux/ethtool.h>
6*d1aec26fSBastien Curutchet (eBPF Foundation) #include <linux/if_xdp.h>
7*d1aec26fSBastien Curutchet (eBPF Foundation) 
8*d1aec26fSBastien Curutchet (eBPF Foundation) #include "../kselftest.h"
9*d1aec26fSBastien Curutchet (eBPF Foundation) #include "xsk.h"
10*d1aec26fSBastien Curutchet (eBPF Foundation) 
11*d1aec26fSBastien Curutchet (eBPF Foundation) #ifndef SO_PREFER_BUSY_POLL
12*d1aec26fSBastien Curutchet (eBPF Foundation) #define SO_PREFER_BUSY_POLL 69
13*d1aec26fSBastien Curutchet (eBPF Foundation) #endif
14*d1aec26fSBastien Curutchet (eBPF Foundation) 
15*d1aec26fSBastien Curutchet (eBPF Foundation) #ifndef SO_BUSY_POLL_BUDGET
16*d1aec26fSBastien Curutchet (eBPF Foundation) #define SO_BUSY_POLL_BUDGET 70
17*d1aec26fSBastien Curutchet (eBPF Foundation) #endif
18*d1aec26fSBastien Curutchet (eBPF Foundation) 
19*d1aec26fSBastien Curutchet (eBPF Foundation) #define TEST_PASS 0
20*d1aec26fSBastien Curutchet (eBPF Foundation) #define TEST_FAILURE -1
21*d1aec26fSBastien Curutchet (eBPF Foundation) #define TEST_CONTINUE 1
22*d1aec26fSBastien Curutchet (eBPF Foundation) #define TEST_SKIP 2
23*d1aec26fSBastien Curutchet (eBPF Foundation) 
24*d1aec26fSBastien Curutchet (eBPF Foundation) #define DEFAULT_PKT_CNT			(4 * 1024)
25*d1aec26fSBastien Curutchet (eBPF Foundation) #define DEFAULT_UMEM_BUFFERS		(DEFAULT_PKT_CNT / 4)
26*d1aec26fSBastien Curutchet (eBPF Foundation) #define HUGEPAGE_SIZE			(2 * 1024 * 1024)
27*d1aec26fSBastien Curutchet (eBPF Foundation) #define MIN_PKT_SIZE			64
28*d1aec26fSBastien Curutchet (eBPF Foundation) #define MAX_ETH_PKT_SIZE		1518
29*d1aec26fSBastien Curutchet (eBPF Foundation) #define MAX_INTERFACE_NAME_CHARS	16
30*d1aec26fSBastien Curutchet (eBPF Foundation) #define MAX_TEST_NAME_SIZE		48
31*d1aec26fSBastien Curutchet (eBPF Foundation) #define SOCK_RECONF_CTR			10
32*d1aec26fSBastien Curutchet (eBPF Foundation) #define USLEEP_MAX			10000
33*d1aec26fSBastien Curutchet (eBPF Foundation) 
34*d1aec26fSBastien Curutchet (eBPF Foundation) extern bool opt_verbose;
35*d1aec26fSBastien Curutchet (eBPF Foundation) #define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0)
36*d1aec26fSBastien Curutchet (eBPF Foundation) 
37*d1aec26fSBastien Curutchet (eBPF Foundation) 
38*d1aec26fSBastien Curutchet (eBPF Foundation) static inline u32 ceil_u32(u32 a, u32 b)
39*d1aec26fSBastien Curutchet (eBPF Foundation) {
40*d1aec26fSBastien Curutchet (eBPF Foundation) 	return (a + b - 1) / b;
41*d1aec26fSBastien Curutchet (eBPF Foundation) }
42*d1aec26fSBastien Curutchet (eBPF Foundation) 
43*d1aec26fSBastien Curutchet (eBPF Foundation) static inline u64 ceil_u64(u64 a, u64 b)
44*d1aec26fSBastien Curutchet (eBPF Foundation) {
45*d1aec26fSBastien Curutchet (eBPF Foundation) 	return (a + b - 1) / b;
46*d1aec26fSBastien Curutchet (eBPF Foundation) }
47*d1aec26fSBastien Curutchet (eBPF Foundation) 
48*d1aec26fSBastien Curutchet (eBPF Foundation) /* Simple test */
49*d1aec26fSBastien Curutchet (eBPF Foundation) enum test_mode {
50*d1aec26fSBastien Curutchet (eBPF Foundation) 	TEST_MODE_SKB,
51*d1aec26fSBastien Curutchet (eBPF Foundation) 	TEST_MODE_DRV,
52*d1aec26fSBastien Curutchet (eBPF Foundation) 	TEST_MODE_ZC,
53*d1aec26fSBastien Curutchet (eBPF Foundation) 	TEST_MODE_ALL
54*d1aec26fSBastien Curutchet (eBPF Foundation) };
55*d1aec26fSBastien Curutchet (eBPF Foundation) 
56*d1aec26fSBastien Curutchet (eBPF Foundation) struct ifobject;
57*d1aec26fSBastien Curutchet (eBPF Foundation) struct test_spec;
58*d1aec26fSBastien Curutchet (eBPF Foundation) typedef int (*validation_func_t)(struct ifobject *ifobj);
59*d1aec26fSBastien Curutchet (eBPF Foundation) typedef void *(*thread_func_t)(void *arg);
60*d1aec26fSBastien Curutchet (eBPF Foundation) typedef int (*test_func_t)(struct test_spec *test);
61*d1aec26fSBastien Curutchet (eBPF Foundation) 
62*d1aec26fSBastien Curutchet (eBPF Foundation) struct xsk_socket_info {
63*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct xsk_ring_cons rx;
64*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct xsk_ring_prod tx;
65*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct xsk_umem_info *umem;
66*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct xsk_socket *xsk;
67*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct pkt_stream *pkt_stream;
68*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 outstanding_tx;
69*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 rxqsize;
70*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 batch_size;
71*d1aec26fSBastien Curutchet (eBPF Foundation) 	u8 dst_mac[ETH_ALEN];
72*d1aec26fSBastien Curutchet (eBPF Foundation) 	u8 src_mac[ETH_ALEN];
73*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool check_consumer;
74*d1aec26fSBastien Curutchet (eBPF Foundation) };
75*d1aec26fSBastien Curutchet (eBPF Foundation) 
76*d1aec26fSBastien Curutchet (eBPF Foundation) int kick_rx(struct xsk_socket_info *xsk);
77*d1aec26fSBastien Curutchet (eBPF Foundation) int kick_tx(struct xsk_socket_info *xsk);
78*d1aec26fSBastien Curutchet (eBPF Foundation) 
79*d1aec26fSBastien Curutchet (eBPF Foundation) struct xsk_umem_info {
80*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct xsk_ring_prod fq;
81*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct xsk_ring_cons cq;
82*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct xsk_umem *umem;
83*d1aec26fSBastien Curutchet (eBPF Foundation) 	u64 next_buffer;
84*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 num_frames;
85*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 frame_headroom;
86*d1aec26fSBastien Curutchet (eBPF Foundation) 	void *buffer;
87*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 frame_size;
88*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 base_addr;
89*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 fill_size;
90*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 comp_size;
91*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool unaligned_mode;
92*d1aec26fSBastien Curutchet (eBPF Foundation) };
93*d1aec26fSBastien Curutchet (eBPF Foundation) 
94*d1aec26fSBastien Curutchet (eBPF Foundation) struct set_hw_ring {
95*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 default_tx;
96*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 default_rx;
97*d1aec26fSBastien Curutchet (eBPF Foundation) };
98*d1aec26fSBastien Curutchet (eBPF Foundation) 
99*d1aec26fSBastien Curutchet (eBPF Foundation) int hw_ring_size_reset(struct ifobject *ifobj);
100*d1aec26fSBastien Curutchet (eBPF Foundation) 
101*d1aec26fSBastien Curutchet (eBPF Foundation) struct ifobject {
102*d1aec26fSBastien Curutchet (eBPF Foundation) 	char ifname[MAX_INTERFACE_NAME_CHARS];
103*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct xsk_socket_info *xsk;
104*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct xsk_socket_info *xsk_arr;
105*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct xsk_umem_info *umem;
106*d1aec26fSBastien Curutchet (eBPF Foundation) 	thread_func_t func_ptr;
107*d1aec26fSBastien Curutchet (eBPF Foundation) 	validation_func_t validation_func;
108*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct xsk_xdp_progs *xdp_progs;
109*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct bpf_map *xskmap;
110*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct bpf_program *xdp_prog;
111*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct ethtool_ringparam ring;
112*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct set_hw_ring set_ring;
113*d1aec26fSBastien Curutchet (eBPF Foundation) 	enum test_mode mode;
114*d1aec26fSBastien Curutchet (eBPF Foundation) 	int ifindex;
115*d1aec26fSBastien Curutchet (eBPF Foundation) 	int mtu;
116*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 bind_flags;
117*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 xdp_zc_max_segs;
118*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool tx_on;
119*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool rx_on;
120*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool use_poll;
121*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool busy_poll;
122*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool use_fill_ring;
123*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool release_rx;
124*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool shared_umem;
125*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool use_metadata;
126*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool unaligned_supp;
127*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool multi_buff_supp;
128*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool multi_buff_zc_supp;
129*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool hw_ring_size_supp;
130*d1aec26fSBastien Curutchet (eBPF Foundation) };
131*d1aec26fSBastien Curutchet (eBPF Foundation) struct ifobject *ifobject_create(void);
132*d1aec26fSBastien Curutchet (eBPF Foundation) void ifobject_delete(struct ifobject *ifobj);
133*d1aec26fSBastien Curutchet (eBPF Foundation) int init_iface(struct ifobject *ifobj, thread_func_t func_ptr);
134*d1aec26fSBastien Curutchet (eBPF Foundation) 
135*d1aec26fSBastien Curutchet (eBPF Foundation) int xsk_configure_umem(struct ifobject *ifobj, struct xsk_umem_info *umem, void *buffer, u64 size);
136*d1aec26fSBastien Curutchet (eBPF Foundation) int xsk_configure_socket(struct xsk_socket_info *xsk, struct xsk_umem_info *umem,
137*d1aec26fSBastien Curutchet (eBPF Foundation) 			 struct ifobject *ifobject, bool shared);
138*d1aec26fSBastien Curutchet (eBPF Foundation) 
139*d1aec26fSBastien Curutchet (eBPF Foundation) 
140*d1aec26fSBastien Curutchet (eBPF Foundation) struct pkt {
141*d1aec26fSBastien Curutchet (eBPF Foundation) 	int offset;
142*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 len;
143*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 pkt_nb;
144*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool valid;
145*d1aec26fSBastien Curutchet (eBPF Foundation) 	u16 options;
146*d1aec26fSBastien Curutchet (eBPF Foundation) };
147*d1aec26fSBastien Curutchet (eBPF Foundation) 
148*d1aec26fSBastien Curutchet (eBPF Foundation) struct pkt_stream {
149*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 nb_pkts;
150*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 current_pkt_nb;
151*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct pkt *pkts;
152*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 max_pkt_len;
153*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 nb_rx_pkts;
154*d1aec26fSBastien Curutchet (eBPF Foundation) 	u32 nb_valid_entries;
155*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool verbatim;
156*d1aec26fSBastien Curutchet (eBPF Foundation) };
157*d1aec26fSBastien Curutchet (eBPF Foundation) 
158*d1aec26fSBastien Curutchet (eBPF Foundation) static inline bool pkt_continues(u32 options)
159*d1aec26fSBastien Curutchet (eBPF Foundation) {
160*d1aec26fSBastien Curutchet (eBPF Foundation) 	return options & XDP_PKT_CONTD;
161*d1aec26fSBastien Curutchet (eBPF Foundation) }
162*d1aec26fSBastien Curutchet (eBPF Foundation) 
163*d1aec26fSBastien Curutchet (eBPF Foundation) struct pkt_stream *pkt_stream_generate(u32 nb_pkts, u32 pkt_len);
164*d1aec26fSBastien Curutchet (eBPF Foundation) void pkt_stream_delete(struct pkt_stream *pkt_stream);
165*d1aec26fSBastien Curutchet (eBPF Foundation) void pkt_stream_reset(struct pkt_stream *pkt_stream);
166*d1aec26fSBastien Curutchet (eBPF Foundation) void pkt_stream_restore_default(struct test_spec *test);
167*d1aec26fSBastien Curutchet (eBPF Foundation) 
168*d1aec26fSBastien Curutchet (eBPF Foundation) struct test_spec {
169*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct ifobject *ifobj_tx;
170*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct ifobject *ifobj_rx;
171*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct pkt_stream *tx_pkt_stream_default;
172*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct pkt_stream *rx_pkt_stream_default;
173*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct bpf_program *xdp_prog_rx;
174*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct bpf_program *xdp_prog_tx;
175*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct bpf_map *xskmap_rx;
176*d1aec26fSBastien Curutchet (eBPF Foundation) 	struct bpf_map *xskmap_tx;
177*d1aec26fSBastien Curutchet (eBPF Foundation) 	test_func_t test_func;
178*d1aec26fSBastien Curutchet (eBPF Foundation) 	int mtu;
179*d1aec26fSBastien Curutchet (eBPF Foundation) 	u16 total_steps;
180*d1aec26fSBastien Curutchet (eBPF Foundation) 	u16 current_step;
181*d1aec26fSBastien Curutchet (eBPF Foundation) 	u16 nb_sockets;
182*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool fail;
183*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool set_ring;
184*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool adjust_tail;
185*d1aec26fSBastien Curutchet (eBPF Foundation) 	bool adjust_tail_support;
186*d1aec26fSBastien Curutchet (eBPF Foundation) 	enum test_mode mode;
187*d1aec26fSBastien Curutchet (eBPF Foundation) 	char name[MAX_TEST_NAME_SIZE];
188*d1aec26fSBastien Curutchet (eBPF Foundation) };
189*d1aec26fSBastien Curutchet (eBPF Foundation) 
190*d1aec26fSBastien Curutchet (eBPF Foundation) #define busy_poll_string(test) (test)->ifobj_tx->busy_poll ? "BUSY-POLL " : ""
191*d1aec26fSBastien Curutchet (eBPF Foundation) static inline char *mode_string(struct test_spec *test)
192*d1aec26fSBastien Curutchet (eBPF Foundation) {
193*d1aec26fSBastien Curutchet (eBPF Foundation) 	switch (test->mode) {
194*d1aec26fSBastien Curutchet (eBPF Foundation) 	case TEST_MODE_SKB:
195*d1aec26fSBastien Curutchet (eBPF Foundation) 		return "SKB";
196*d1aec26fSBastien Curutchet (eBPF Foundation) 	case TEST_MODE_DRV:
197*d1aec26fSBastien Curutchet (eBPF Foundation) 		return "DRV";
198*d1aec26fSBastien Curutchet (eBPF Foundation) 	case TEST_MODE_ZC:
199*d1aec26fSBastien Curutchet (eBPF Foundation) 		return "ZC";
200*d1aec26fSBastien Curutchet (eBPF Foundation) 	default:
201*d1aec26fSBastien Curutchet (eBPF Foundation) 		return "BOGUS";
202*d1aec26fSBastien Curutchet (eBPF Foundation) 	}
203*d1aec26fSBastien Curutchet (eBPF Foundation) }
204*d1aec26fSBastien Curutchet (eBPF Foundation) 
205*d1aec26fSBastien Curutchet (eBPF Foundation) void test_init(struct test_spec *test, struct ifobject *ifobj_tx,
206*d1aec26fSBastien Curutchet (eBPF Foundation) 	       struct ifobject *ifobj_rx, enum test_mode mode,
207*d1aec26fSBastien Curutchet (eBPF Foundation) 	       const struct test_spec *test_to_run);
208*d1aec26fSBastien Curutchet (eBPF Foundation) 
209*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_adjust_tail_grow(struct test_spec *test);
210*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_adjust_tail_grow_mb(struct test_spec *test);
211*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_adjust_tail_shrink(struct test_spec *test);
212*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_adjust_tail_shrink_mb(struct test_spec *test);
213*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_aligned_inv_desc(struct test_spec *test);
214*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_aligned_inv_desc_2k_frame(struct test_spec *test);
215*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_aligned_inv_desc_mb(struct test_spec *test);
216*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_bidirectional(struct test_spec *test);
217*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_headroom(struct test_spec *test);
218*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_hw_sw_max_ring_size(struct test_spec *test);
219*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_hw_sw_min_ring_size(struct test_spec *test);
220*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_poll_rx(struct test_spec *test);
221*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_poll_rxq_tmout(struct test_spec *test);
222*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_poll_tx(struct test_spec *test);
223*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_poll_txq_tmout(struct test_spec *test);
224*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_send_receive(struct test_spec *test);
225*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_send_receive_2k_frame(struct test_spec *test);
226*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_send_receive_mb(struct test_spec *test);
227*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_send_receive_unaligned(struct test_spec *test);
228*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_send_receive_unaligned_mb(struct test_spec *test);
229*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_single_pkt(struct test_spec *test);
230*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_stats_fill_empty(struct test_spec *test);
231*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_stats_rx_dropped(struct test_spec *test);
232*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_stats_tx_invalid_descs(struct test_spec *test);
233*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_stats_rx_full(struct test_spec *test);
234*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_teardown(struct test_spec *test);
235*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_too_many_frags(struct test_spec *test);
236*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_tx_queue_consumer(struct test_spec *test);
237*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_unaligned_inv_desc(struct test_spec *test);
238*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_unaligned_inv_desc_4001_frame(struct test_spec *test);
239*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_unaligned_inv_desc_mb(struct test_spec *test);
240*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_xdp_drop(struct test_spec *test);
241*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_xdp_metadata(struct test_spec *test);
242*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_xdp_metadata_mb(struct test_spec *test);
243*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_xdp_prog_cleanup(struct test_spec *test);
244*d1aec26fSBastien Curutchet (eBPF Foundation) int testapp_xdp_shared_umem(struct test_spec *test);
245*d1aec26fSBastien Curutchet (eBPF Foundation) 
246*d1aec26fSBastien Curutchet (eBPF Foundation) void *worker_testapp_validate_rx(void *arg);
247*d1aec26fSBastien Curutchet (eBPF Foundation) void *worker_testapp_validate_tx(void *arg);
248*d1aec26fSBastien Curutchet (eBPF Foundation) 
249*d1aec26fSBastien Curutchet (eBPF Foundation) static const struct test_spec tests[] = {
250*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "SEND_RECEIVE", .test_func = testapp_send_receive},
251*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "SEND_RECEIVE_2K_FRAME", .test_func = testapp_send_receive_2k_frame},
252*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "SEND_RECEIVE_SINGLE_PKT", .test_func = testapp_single_pkt},
253*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "POLL_RX", .test_func = testapp_poll_rx},
254*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "POLL_TX", .test_func = testapp_poll_tx},
255*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "POLL_RXQ_FULL", .test_func = testapp_poll_rxq_tmout},
256*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "POLL_TXQ_FULL", .test_func = testapp_poll_txq_tmout},
257*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "ALIGNED_INV_DESC", .test_func = testapp_aligned_inv_desc},
258*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "ALIGNED_INV_DESC_2K_FRAME_SIZE", .test_func = testapp_aligned_inv_desc_2k_frame},
259*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "UMEM_HEADROOM", .test_func = testapp_headroom},
260*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "BIDIRECTIONAL", .test_func = testapp_bidirectional},
261*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "STAT_RX_DROPPED", .test_func = testapp_stats_rx_dropped},
262*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "STAT_TX_INVALID", .test_func = testapp_stats_tx_invalid_descs},
263*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "STAT_RX_FULL", .test_func = testapp_stats_rx_full},
264*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "STAT_FILL_EMPTY", .test_func = testapp_stats_fill_empty},
265*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "XDP_PROG_CLEANUP", .test_func = testapp_xdp_prog_cleanup},
266*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "XDP_DROP_HALF", .test_func = testapp_xdp_drop},
267*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "XDP_SHARED_UMEM", .test_func = testapp_xdp_shared_umem},
268*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "XDP_METADATA_COPY", .test_func = testapp_xdp_metadata},
269*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "XDP_METADATA_COPY_MULTI_BUFF", .test_func = testapp_xdp_metadata_mb},
270*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "ALIGNED_INV_DESC_MULTI_BUFF", .test_func = testapp_aligned_inv_desc_mb},
271*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "TOO_MANY_FRAGS", .test_func = testapp_too_many_frags},
272*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "XDP_ADJUST_TAIL_SHRINK", .test_func = testapp_adjust_tail_shrink},
273*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "TX_QUEUE_CONSUMER", .test_func = testapp_tx_queue_consumer},
274*d1aec26fSBastien Curutchet (eBPF Foundation) 	};
275*d1aec26fSBastien Curutchet (eBPF Foundation) 
276*d1aec26fSBastien Curutchet (eBPF Foundation) static const struct test_spec ci_skip_tests[] = {
277*d1aec26fSBastien Curutchet (eBPF Foundation) 	/* Flaky tests */
278*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "XDP_ADJUST_TAIL_SHRINK_MULTI_BUFF", .test_func = testapp_adjust_tail_shrink_mb},
279*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "XDP_ADJUST_TAIL_GROW", .test_func = testapp_adjust_tail_grow},
280*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "XDP_ADJUST_TAIL_GROW_MULTI_BUFF", .test_func = testapp_adjust_tail_grow_mb},
281*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "SEND_RECEIVE_9K_PACKETS", .test_func = testapp_send_receive_mb},
282*d1aec26fSBastien Curutchet (eBPF Foundation) 	/* Tests with huge page dependency */
283*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "SEND_RECEIVE_UNALIGNED", .test_func = testapp_send_receive_unaligned},
284*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "UNALIGNED_INV_DESC", .test_func = testapp_unaligned_inv_desc},
285*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "UNALIGNED_INV_DESC_4001_FRAME_SIZE",
286*d1aec26fSBastien Curutchet (eBPF Foundation) 	 .test_func = testapp_unaligned_inv_desc_4001_frame},
287*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "SEND_RECEIVE_UNALIGNED_9K_PACKETS",
288*d1aec26fSBastien Curutchet (eBPF Foundation) 	 .test_func = testapp_send_receive_unaligned_mb},
289*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "UNALIGNED_INV_DESC_MULTI_BUFF", .test_func = testapp_unaligned_inv_desc_mb},
290*d1aec26fSBastien Curutchet (eBPF Foundation) 	/* Test with HW ring size dependency */
291*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "HW_SW_MIN_RING_SIZE", .test_func = testapp_hw_sw_min_ring_size},
292*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "HW_SW_MAX_RING_SIZE", .test_func = testapp_hw_sw_max_ring_size},
293*d1aec26fSBastien Curutchet (eBPF Foundation) 	/* Too long test */
294*d1aec26fSBastien Curutchet (eBPF Foundation) 	{.name = "TEARDOWN", .test_func = testapp_teardown},
295*d1aec26fSBastien Curutchet (eBPF Foundation) };
296*d1aec26fSBastien Curutchet (eBPF Foundation) 
297*d1aec26fSBastien Curutchet (eBPF Foundation) 
298*d1aec26fSBastien Curutchet (eBPF Foundation) #endif				/* TEST_XSK_H_ */
299