xref: /linux/tools/testing/selftests/bpf/xskxceiver.h (revision 4b660dbd9ee2059850fd30e0df420ca7a38a1856)
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 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 #define NUM_MAC_ADDRESSES 4
63 
64 #define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0)
65 
66 enum test_mode {
67 	TEST_MODE_SKB,
68 	TEST_MODE_DRV,
69 	TEST_MODE_ZC,
70 	TEST_MODE_ALL
71 };
72 
73 struct xsk_umem_info {
74 	struct xsk_ring_prod fq;
75 	struct xsk_ring_cons cq;
76 	struct xsk_umem *umem;
77 	u64 next_buffer;
78 	u32 num_frames;
79 	u32 frame_headroom;
80 	void *buffer;
81 	u32 frame_size;
82 	u32 base_addr;
83 	bool unaligned_mode;
84 };
85 
86 struct xsk_socket_info {
87 	struct xsk_ring_cons rx;
88 	struct xsk_ring_prod tx;
89 	struct xsk_umem_info *umem;
90 	struct xsk_socket *xsk;
91 	struct pkt_stream *pkt_stream;
92 	u32 outstanding_tx;
93 	u32 rxqsize;
94 	u8 dst_mac[ETH_ALEN];
95 	u8 src_mac[ETH_ALEN];
96 };
97 
98 struct pkt {
99 	int offset;
100 	u32 len;
101 	u32 pkt_nb;
102 	bool valid;
103 	u16 options;
104 };
105 
106 struct pkt_stream {
107 	u32 nb_pkts;
108 	u32 current_pkt_nb;
109 	struct pkt *pkts;
110 	u32 max_pkt_len;
111 	u32 nb_rx_pkts;
112 	u32 nb_valid_entries;
113 	bool verbatim;
114 };
115 
116 struct ifobject;
117 struct test_spec;
118 typedef int (*validation_func_t)(struct ifobject *ifobj);
119 typedef void *(*thread_func_t)(void *arg);
120 typedef int (*test_func_t)(struct test_spec *test);
121 
122 struct ifobject {
123 	char ifname[MAX_INTERFACE_NAME_CHARS];
124 	struct xsk_socket_info *xsk;
125 	struct xsk_socket_info *xsk_arr;
126 	struct xsk_umem_info *umem;
127 	thread_func_t func_ptr;
128 	validation_func_t validation_func;
129 	struct xsk_xdp_progs *xdp_progs;
130 	struct bpf_map *xskmap;
131 	struct bpf_program *xdp_prog;
132 	enum test_mode mode;
133 	int ifindex;
134 	int mtu;
135 	u32 bind_flags;
136 	u32 xdp_zc_max_segs;
137 	bool tx_on;
138 	bool rx_on;
139 	bool use_poll;
140 	bool busy_poll;
141 	bool use_fill_ring;
142 	bool release_rx;
143 	bool shared_umem;
144 	bool use_metadata;
145 	bool unaligned_supp;
146 	bool multi_buff_supp;
147 	bool multi_buff_zc_supp;
148 };
149 
150 struct test_spec {
151 	struct ifobject *ifobj_tx;
152 	struct ifobject *ifobj_rx;
153 	struct pkt_stream *tx_pkt_stream_default;
154 	struct pkt_stream *rx_pkt_stream_default;
155 	struct bpf_program *xdp_prog_rx;
156 	struct bpf_program *xdp_prog_tx;
157 	struct bpf_map *xskmap_rx;
158 	struct bpf_map *xskmap_tx;
159 	test_func_t test_func;
160 	int mtu;
161 	u16 total_steps;
162 	u16 current_step;
163 	u16 nb_sockets;
164 	bool fail;
165 	enum test_mode mode;
166 	char name[MAX_TEST_NAME_SIZE];
167 };
168 
169 pthread_barrier_t barr;
170 pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER;
171 
172 int pkts_in_flight;
173 
174 static const u8 g_mac[ETH_ALEN] = {0x55, 0x44, 0x33, 0x22, 0x11, 0x00};
175 
176 #endif				/* XSKXCEIVER_H_ */
177