xref: /linux/tools/testing/selftests/bpf/xskxceiver.h (revision fefe5dc4afeafe896c90d5b20b605f2759343c3b)
1 /* SPDX-License-Identifier: GPL-2.0
2  * Copyright(c) 2020 Intel Corporation.
3  */
4 
5 #ifndef XSKXCEIVER_H_
6 #define XSKXCEIVER_H_
7 
8 #include <limits.h>
9 
10 #include "xsk_xdp_progs.skel.h"
11 
12 #ifndef SOL_XDP
13 #define SOL_XDP 283
14 #endif
15 
16 #ifndef AF_XDP
17 #define AF_XDP 44
18 #endif
19 
20 #ifndef PF_XDP
21 #define PF_XDP AF_XDP
22 #endif
23 
24 #ifndef SO_BUSY_POLL_BUDGET
25 #define SO_BUSY_POLL_BUDGET 70
26 #endif
27 
28 #ifndef SO_PREFER_BUSY_POLL
29 #define SO_PREFER_BUSY_POLL 69
30 #endif
31 
32 #define TEST_PASS 0
33 #define TEST_FAILURE -1
34 #define TEST_CONTINUE 1
35 #define TEST_SKIP 2
36 #define MAX_INTERFACES 2
37 #define MAX_INTERFACE_NAME_CHARS 16
38 #define MAX_SOCKETS 2
39 #define MAX_TEST_NAME_SIZE 48
40 #define MAX_TEARDOWN_ITER 10
41 #define PKT_HDR_SIZE (sizeof(struct ethhdr) + 2) /* Just to align the data in the packet */
42 #define MIN_PKT_SIZE 64
43 #define MAX_ETH_PKT_SIZE 1518
44 #define MAX_ETH_JUMBO_SIZE 9000
45 #define USLEEP_MAX 10000
46 #define SOCK_RECONF_CTR 10
47 #define BATCH_SIZE 64
48 #define POLL_TMOUT 1000
49 #define THREAD_TMOUT 3
50 #define DEFAULT_PKT_CNT (4 * 1024)
51 #define DEFAULT_UMEM_BUFFERS (DEFAULT_PKT_CNT / 4)
52 #define RX_FULL_RXQSIZE 32
53 #define UMEM_HEADROOM_TEST_SIZE 128
54 #define XSK_UMEM__INVALID_FRAME_SIZE (MAX_ETH_JUMBO_SIZE + 1)
55 #define XSK_UMEM__LARGE_FRAME_SIZE (3 * 1024)
56 #define XSK_UMEM__MAX_FRAME_SIZE (4 * 1024)
57 #define XSK_DESC__INVALID_OPTION (0xffff)
58 #define XSK_DESC__MAX_SKB_FRAGS 18
59 #define HUGEPAGE_SIZE (2 * 1024 * 1024)
60 #define PKT_DUMP_NB_TO_PRINT 16
61 #define RUN_ALL_TESTS UINT_MAX
62 
63 #define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0)
64 
65 enum test_mode {
66 	TEST_MODE_SKB,
67 	TEST_MODE_DRV,
68 	TEST_MODE_ZC,
69 	TEST_MODE_ALL
70 };
71 
72 struct xsk_umem_info {
73 	struct xsk_ring_prod fq;
74 	struct xsk_ring_cons cq;
75 	struct xsk_umem *umem;
76 	u64 next_buffer;
77 	u32 num_frames;
78 	u32 frame_headroom;
79 	void *buffer;
80 	u32 frame_size;
81 	u32 base_addr;
82 	bool unaligned_mode;
83 };
84 
85 struct xsk_socket_info {
86 	struct xsk_ring_cons rx;
87 	struct xsk_ring_prod tx;
88 	struct xsk_umem_info *umem;
89 	struct xsk_socket *xsk;
90 	u32 outstanding_tx;
91 	u32 rxqsize;
92 };
93 
94 struct pkt {
95 	int offset;
96 	u32 len;
97 	u32 pkt_nb;
98 	bool valid;
99 	u16 options;
100 };
101 
102 struct pkt_stream {
103 	u32 nb_pkts;
104 	u32 current_pkt_nb;
105 	struct pkt *pkts;
106 	u32 max_pkt_len;
107 	bool verbatim;
108 };
109 
110 struct ifobject;
111 struct test_spec;
112 typedef int (*validation_func_t)(struct ifobject *ifobj);
113 typedef void *(*thread_func_t)(void *arg);
114 typedef int (*test_func_t)(struct test_spec *test);
115 
116 struct ifobject {
117 	char ifname[MAX_INTERFACE_NAME_CHARS];
118 	struct xsk_socket_info *xsk;
119 	struct xsk_socket_info *xsk_arr;
120 	struct xsk_umem_info *umem;
121 	thread_func_t func_ptr;
122 	validation_func_t validation_func;
123 	struct pkt_stream *pkt_stream;
124 	struct xsk_xdp_progs *xdp_progs;
125 	struct bpf_map *xskmap;
126 	struct bpf_program *xdp_prog;
127 	enum test_mode mode;
128 	int ifindex;
129 	int mtu;
130 	u32 bind_flags;
131 	u32 xdp_zc_max_segs;
132 	bool tx_on;
133 	bool rx_on;
134 	bool use_poll;
135 	bool busy_poll;
136 	bool use_fill_ring;
137 	bool release_rx;
138 	bool shared_umem;
139 	bool use_metadata;
140 	bool unaligned_supp;
141 	bool multi_buff_supp;
142 	bool multi_buff_zc_supp;
143 	u8 dst_mac[ETH_ALEN];
144 	u8 src_mac[ETH_ALEN];
145 };
146 
147 struct test_spec {
148 	struct ifobject *ifobj_tx;
149 	struct ifobject *ifobj_rx;
150 	struct pkt_stream *tx_pkt_stream_default;
151 	struct pkt_stream *rx_pkt_stream_default;
152 	struct bpf_program *xdp_prog_rx;
153 	struct bpf_program *xdp_prog_tx;
154 	struct bpf_map *xskmap_rx;
155 	struct bpf_map *xskmap_tx;
156 	test_func_t test_func;
157 	int mtu;
158 	u16 total_steps;
159 	u16 current_step;
160 	u16 nb_sockets;
161 	bool fail;
162 	enum test_mode mode;
163 	char name[MAX_TEST_NAME_SIZE];
164 };
165 
166 pthread_barrier_t barr;
167 pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER;
168 
169 int pkts_in_flight;
170 
171 #endif				/* XSKXCEIVER_H_ */
172