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