xref: /linux/tools/testing/selftests/bpf/xskxceiver.h (revision 5a4332062e9e71de8e78dc1b389d21e0dd44848b)
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 #include "xsk_xdp_common.h"
12 
13 #ifndef SOL_XDP
14 #define SOL_XDP 283
15 #endif
16 
17 #ifndef AF_XDP
18 #define AF_XDP 44
19 #endif
20 
21 #ifndef PF_XDP
22 #define PF_XDP AF_XDP
23 #endif
24 
25 #ifndef SO_BUSY_POLL_BUDGET
26 #define SO_BUSY_POLL_BUDGET 70
27 #endif
28 
29 #ifndef SO_PREFER_BUSY_POLL
30 #define SO_PREFER_BUSY_POLL 69
31 #endif
32 
33 #define TEST_PASS 0
34 #define TEST_FAILURE -1
35 #define TEST_CONTINUE 1
36 #define TEST_SKIP 2
37 #define MAX_INTERFACES 2
38 #define MAX_INTERFACE_NAME_CHARS 16
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 DEFAULT_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 HUGEPAGE_SIZE (2 * 1024 * 1024)
59 #define PKT_DUMP_NB_TO_PRINT 16
60 #define RUN_ALL_TESTS UINT_MAX
61 #define NUM_MAC_ADDRESSES 4
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 	u32 fill_size;
83 	u32 comp_size;
84 	bool unaligned_mode;
85 };
86 
87 struct xsk_socket_info {
88 	struct xsk_ring_cons rx;
89 	struct xsk_ring_prod tx;
90 	struct xsk_umem_info *umem;
91 	struct xsk_socket *xsk;
92 	struct pkt_stream *pkt_stream;
93 	u32 outstanding_tx;
94 	u32 rxqsize;
95 	u32 batch_size;
96 	u8 dst_mac[ETH_ALEN];
97 	u8 src_mac[ETH_ALEN];
98 };
99 
100 struct pkt {
101 	int offset;
102 	u32 len;
103 	u32 pkt_nb;
104 	bool valid;
105 	u16 options;
106 };
107 
108 struct pkt_stream {
109 	u32 nb_pkts;
110 	u32 current_pkt_nb;
111 	struct pkt *pkts;
112 	u32 max_pkt_len;
113 	u32 nb_rx_pkts;
114 	u32 nb_valid_entries;
115 	bool verbatim;
116 };
117 
118 struct set_hw_ring {
119 	u32 default_tx;
120 	u32 default_rx;
121 };
122 
123 struct ifobject;
124 struct test_spec;
125 typedef int (*validation_func_t)(struct ifobject *ifobj);
126 typedef void *(*thread_func_t)(void *arg);
127 typedef int (*test_func_t)(struct test_spec *test);
128 
129 struct ifobject {
130 	char ifname[MAX_INTERFACE_NAME_CHARS];
131 	struct xsk_socket_info *xsk;
132 	struct xsk_socket_info *xsk_arr;
133 	struct xsk_umem_info *umem;
134 	thread_func_t func_ptr;
135 	validation_func_t validation_func;
136 	struct xsk_xdp_progs *xdp_progs;
137 	struct bpf_map *xskmap;
138 	struct bpf_program *xdp_prog;
139 	struct ethtool_ringparam ring;
140 	struct set_hw_ring set_ring;
141 	enum test_mode mode;
142 	int ifindex;
143 	int mtu;
144 	u32 bind_flags;
145 	u32 xdp_zc_max_segs;
146 	bool tx_on;
147 	bool rx_on;
148 	bool use_poll;
149 	bool busy_poll;
150 	bool use_fill_ring;
151 	bool release_rx;
152 	bool shared_umem;
153 	bool use_metadata;
154 	bool unaligned_supp;
155 	bool multi_buff_supp;
156 	bool multi_buff_zc_supp;
157 	bool hw_ring_size_supp;
158 };
159 
160 struct test_spec {
161 	struct ifobject *ifobj_tx;
162 	struct ifobject *ifobj_rx;
163 	struct pkt_stream *tx_pkt_stream_default;
164 	struct pkt_stream *rx_pkt_stream_default;
165 	struct bpf_program *xdp_prog_rx;
166 	struct bpf_program *xdp_prog_tx;
167 	struct bpf_map *xskmap_rx;
168 	struct bpf_map *xskmap_tx;
169 	test_func_t test_func;
170 	int mtu;
171 	u16 total_steps;
172 	u16 current_step;
173 	u16 nb_sockets;
174 	bool fail;
175 	bool set_ring;
176 	enum test_mode mode;
177 	char name[MAX_TEST_NAME_SIZE];
178 };
179 
180 pthread_barrier_t barr;
181 pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER;
182 
183 int pkts_in_flight;
184 
185 static const u8 g_mac[ETH_ALEN] = {0x55, 0x44, 0x33, 0x22, 0x11, 0x00};
186 
187 #endif				/* XSKXCEIVER_H_ */
188