xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/bpf/xskxceiver.h (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0
2*053f45beSAndroid Build Coastguard Worker  * Copyright(c) 2020 Intel Corporation.
3*053f45beSAndroid Build Coastguard Worker  */
4*053f45beSAndroid Build Coastguard Worker 
5*053f45beSAndroid Build Coastguard Worker #ifndef XSKXCEIVER_H_
6*053f45beSAndroid Build Coastguard Worker #define XSKXCEIVER_H_
7*053f45beSAndroid Build Coastguard Worker 
8*053f45beSAndroid Build Coastguard Worker #ifndef SOL_XDP
9*053f45beSAndroid Build Coastguard Worker #define SOL_XDP 283
10*053f45beSAndroid Build Coastguard Worker #endif
11*053f45beSAndroid Build Coastguard Worker 
12*053f45beSAndroid Build Coastguard Worker #ifndef AF_XDP
13*053f45beSAndroid Build Coastguard Worker #define AF_XDP 44
14*053f45beSAndroid Build Coastguard Worker #endif
15*053f45beSAndroid Build Coastguard Worker 
16*053f45beSAndroid Build Coastguard Worker #ifndef PF_XDP
17*053f45beSAndroid Build Coastguard Worker #define PF_XDP AF_XDP
18*053f45beSAndroid Build Coastguard Worker #endif
19*053f45beSAndroid Build Coastguard Worker 
20*053f45beSAndroid Build Coastguard Worker #ifndef SO_BUSY_POLL_BUDGET
21*053f45beSAndroid Build Coastguard Worker #define SO_BUSY_POLL_BUDGET 70
22*053f45beSAndroid Build Coastguard Worker #endif
23*053f45beSAndroid Build Coastguard Worker 
24*053f45beSAndroid Build Coastguard Worker #ifndef SO_PREFER_BUSY_POLL
25*053f45beSAndroid Build Coastguard Worker #define SO_PREFER_BUSY_POLL 69
26*053f45beSAndroid Build Coastguard Worker #endif
27*053f45beSAndroid Build Coastguard Worker 
28*053f45beSAndroid Build Coastguard Worker #define TEST_PASS 0
29*053f45beSAndroid Build Coastguard Worker #define TEST_FAILURE -1
30*053f45beSAndroid Build Coastguard Worker #define TEST_CONTINUE 1
31*053f45beSAndroid Build Coastguard Worker #define MAX_INTERFACES 2
32*053f45beSAndroid Build Coastguard Worker #define MAX_INTERFACE_NAME_CHARS 16
33*053f45beSAndroid Build Coastguard Worker #define MAX_INTERFACES_NAMESPACE_CHARS 16
34*053f45beSAndroid Build Coastguard Worker #define MAX_SOCKETS 2
35*053f45beSAndroid Build Coastguard Worker #define MAX_TEST_NAME_SIZE 32
36*053f45beSAndroid Build Coastguard Worker #define MAX_TEARDOWN_ITER 10
37*053f45beSAndroid Build Coastguard Worker #define PKT_HDR_SIZE (sizeof(struct ethhdr) + sizeof(struct iphdr) + \
38*053f45beSAndroid Build Coastguard Worker 			sizeof(struct udphdr))
39*053f45beSAndroid Build Coastguard Worker #define MIN_ETH_PKT_SIZE 64
40*053f45beSAndroid Build Coastguard Worker #define ETH_FCS_SIZE 4
41*053f45beSAndroid Build Coastguard Worker #define MIN_PKT_SIZE (MIN_ETH_PKT_SIZE - ETH_FCS_SIZE)
42*053f45beSAndroid Build Coastguard Worker #define PKT_SIZE (MIN_PKT_SIZE)
43*053f45beSAndroid Build Coastguard Worker #define IP_PKT_SIZE (PKT_SIZE - sizeof(struct ethhdr))
44*053f45beSAndroid Build Coastguard Worker #define IP_PKT_VER 0x4
45*053f45beSAndroid Build Coastguard Worker #define IP_PKT_TOS 0x9
46*053f45beSAndroid Build Coastguard Worker #define UDP_PKT_SIZE (IP_PKT_SIZE - sizeof(struct iphdr))
47*053f45beSAndroid Build Coastguard Worker #define UDP_PKT_DATA_SIZE (UDP_PKT_SIZE - sizeof(struct udphdr))
48*053f45beSAndroid Build Coastguard Worker #define USLEEP_MAX 10000
49*053f45beSAndroid Build Coastguard Worker #define SOCK_RECONF_CTR 10
50*053f45beSAndroid Build Coastguard Worker #define BATCH_SIZE 64
51*053f45beSAndroid Build Coastguard Worker #define POLL_TMOUT 1000
52*053f45beSAndroid Build Coastguard Worker #define THREAD_TMOUT 3
53*053f45beSAndroid Build Coastguard Worker #define DEFAULT_PKT_CNT (4 * 1024)
54*053f45beSAndroid Build Coastguard Worker #define DEFAULT_UMEM_BUFFERS (DEFAULT_PKT_CNT / 4)
55*053f45beSAndroid Build Coastguard Worker #define UMEM_SIZE (DEFAULT_UMEM_BUFFERS * XSK_UMEM__DEFAULT_FRAME_SIZE)
56*053f45beSAndroid Build Coastguard Worker #define RX_FULL_RXQSIZE 32
57*053f45beSAndroid Build Coastguard Worker #define UMEM_HEADROOM_TEST_SIZE 128
58*053f45beSAndroid Build Coastguard Worker #define XSK_UMEM__INVALID_FRAME_SIZE (XSK_UMEM__DEFAULT_FRAME_SIZE + 1)
59*053f45beSAndroid Build Coastguard Worker 
60*053f45beSAndroid Build Coastguard Worker #define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0)
61*053f45beSAndroid Build Coastguard Worker 
62*053f45beSAndroid Build Coastguard Worker enum test_mode {
63*053f45beSAndroid Build Coastguard Worker 	TEST_MODE_SKB,
64*053f45beSAndroid Build Coastguard Worker 	TEST_MODE_DRV,
65*053f45beSAndroid Build Coastguard Worker 	TEST_MODE_ZC,
66*053f45beSAndroid Build Coastguard Worker 	TEST_MODE_MAX
67*053f45beSAndroid Build Coastguard Worker };
68*053f45beSAndroid Build Coastguard Worker 
69*053f45beSAndroid Build Coastguard Worker enum test_type {
70*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_RUN_TO_COMPLETION,
71*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_RUN_TO_COMPLETION_2K_FRAME,
72*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_RUN_TO_COMPLETION_SINGLE_PKT,
73*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_RX_POLL,
74*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_TX_POLL,
75*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_POLL_RXQ_TMOUT,
76*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_POLL_TXQ_TMOUT,
77*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_UNALIGNED,
78*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_ALIGNED_INV_DESC,
79*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_ALIGNED_INV_DESC_2K_FRAME,
80*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_UNALIGNED_INV_DESC,
81*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_HEADROOM,
82*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_TEARDOWN,
83*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_BIDI,
84*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_STATS_RX_DROPPED,
85*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_STATS_TX_INVALID_DESCS,
86*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_STATS_RX_FULL,
87*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_STATS_FILL_EMPTY,
88*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_BPF_RES,
89*053f45beSAndroid Build Coastguard Worker 	TEST_TYPE_MAX
90*053f45beSAndroid Build Coastguard Worker };
91*053f45beSAndroid Build Coastguard Worker 
92*053f45beSAndroid Build Coastguard Worker static bool opt_pkt_dump;
93*053f45beSAndroid Build Coastguard Worker static bool opt_verbose;
94*053f45beSAndroid Build Coastguard Worker 
95*053f45beSAndroid Build Coastguard Worker struct xsk_umem_info {
96*053f45beSAndroid Build Coastguard Worker 	struct xsk_ring_prod fq;
97*053f45beSAndroid Build Coastguard Worker 	struct xsk_ring_cons cq;
98*053f45beSAndroid Build Coastguard Worker 	struct xsk_umem *umem;
99*053f45beSAndroid Build Coastguard Worker 	u32 num_frames;
100*053f45beSAndroid Build Coastguard Worker 	u32 frame_headroom;
101*053f45beSAndroid Build Coastguard Worker 	void *buffer;
102*053f45beSAndroid Build Coastguard Worker 	u32 frame_size;
103*053f45beSAndroid Build Coastguard Worker 	u32 base_addr;
104*053f45beSAndroid Build Coastguard Worker 	bool unaligned_mode;
105*053f45beSAndroid Build Coastguard Worker };
106*053f45beSAndroid Build Coastguard Worker 
107*053f45beSAndroid Build Coastguard Worker struct xsk_socket_info {
108*053f45beSAndroid Build Coastguard Worker 	struct xsk_ring_cons rx;
109*053f45beSAndroid Build Coastguard Worker 	struct xsk_ring_prod tx;
110*053f45beSAndroid Build Coastguard Worker 	struct xsk_umem_info *umem;
111*053f45beSAndroid Build Coastguard Worker 	struct xsk_socket *xsk;
112*053f45beSAndroid Build Coastguard Worker 	u32 outstanding_tx;
113*053f45beSAndroid Build Coastguard Worker 	u32 rxqsize;
114*053f45beSAndroid Build Coastguard Worker };
115*053f45beSAndroid Build Coastguard Worker 
116*053f45beSAndroid Build Coastguard Worker struct pkt {
117*053f45beSAndroid Build Coastguard Worker 	u64 addr;
118*053f45beSAndroid Build Coastguard Worker 	u32 len;
119*053f45beSAndroid Build Coastguard Worker 	u32 payload;
120*053f45beSAndroid Build Coastguard Worker 	bool valid;
121*053f45beSAndroid Build Coastguard Worker };
122*053f45beSAndroid Build Coastguard Worker 
123*053f45beSAndroid Build Coastguard Worker struct pkt_stream {
124*053f45beSAndroid Build Coastguard Worker 	u32 nb_pkts;
125*053f45beSAndroid Build Coastguard Worker 	u32 rx_pkt_nb;
126*053f45beSAndroid Build Coastguard Worker 	struct pkt *pkts;
127*053f45beSAndroid Build Coastguard Worker 	bool use_addr_for_fill;
128*053f45beSAndroid Build Coastguard Worker };
129*053f45beSAndroid Build Coastguard Worker 
130*053f45beSAndroid Build Coastguard Worker struct ifobject;
131*053f45beSAndroid Build Coastguard Worker typedef int (*validation_func_t)(struct ifobject *ifobj);
132*053f45beSAndroid Build Coastguard Worker typedef void *(*thread_func_t)(void *arg);
133*053f45beSAndroid Build Coastguard Worker 
134*053f45beSAndroid Build Coastguard Worker struct ifobject {
135*053f45beSAndroid Build Coastguard Worker 	char ifname[MAX_INTERFACE_NAME_CHARS];
136*053f45beSAndroid Build Coastguard Worker 	char nsname[MAX_INTERFACES_NAMESPACE_CHARS];
137*053f45beSAndroid Build Coastguard Worker 	struct xsk_socket_info *xsk;
138*053f45beSAndroid Build Coastguard Worker 	struct xsk_socket_info *xsk_arr;
139*053f45beSAndroid Build Coastguard Worker 	struct xsk_umem_info *umem;
140*053f45beSAndroid Build Coastguard Worker 	thread_func_t func_ptr;
141*053f45beSAndroid Build Coastguard Worker 	validation_func_t validation_func;
142*053f45beSAndroid Build Coastguard Worker 	struct pkt_stream *pkt_stream;
143*053f45beSAndroid Build Coastguard Worker 	int ns_fd;
144*053f45beSAndroid Build Coastguard Worker 	int xsk_map_fd;
145*053f45beSAndroid Build Coastguard Worker 	u32 dst_ip;
146*053f45beSAndroid Build Coastguard Worker 	u32 src_ip;
147*053f45beSAndroid Build Coastguard Worker 	u32 xdp_flags;
148*053f45beSAndroid Build Coastguard Worker 	u32 bind_flags;
149*053f45beSAndroid Build Coastguard Worker 	u16 src_port;
150*053f45beSAndroid Build Coastguard Worker 	u16 dst_port;
151*053f45beSAndroid Build Coastguard Worker 	bool tx_on;
152*053f45beSAndroid Build Coastguard Worker 	bool rx_on;
153*053f45beSAndroid Build Coastguard Worker 	bool use_poll;
154*053f45beSAndroid Build Coastguard Worker 	bool busy_poll;
155*053f45beSAndroid Build Coastguard Worker 	bool use_fill_ring;
156*053f45beSAndroid Build Coastguard Worker 	bool release_rx;
157*053f45beSAndroid Build Coastguard Worker 	bool shared_umem;
158*053f45beSAndroid Build Coastguard Worker 	u8 dst_mac[ETH_ALEN];
159*053f45beSAndroid Build Coastguard Worker 	u8 src_mac[ETH_ALEN];
160*053f45beSAndroid Build Coastguard Worker };
161*053f45beSAndroid Build Coastguard Worker 
162*053f45beSAndroid Build Coastguard Worker struct test_spec {
163*053f45beSAndroid Build Coastguard Worker 	struct ifobject *ifobj_tx;
164*053f45beSAndroid Build Coastguard Worker 	struct ifobject *ifobj_rx;
165*053f45beSAndroid Build Coastguard Worker 	struct pkt_stream *tx_pkt_stream_default;
166*053f45beSAndroid Build Coastguard Worker 	struct pkt_stream *rx_pkt_stream_default;
167*053f45beSAndroid Build Coastguard Worker 	u16 total_steps;
168*053f45beSAndroid Build Coastguard Worker 	u16 current_step;
169*053f45beSAndroid Build Coastguard Worker 	u16 nb_sockets;
170*053f45beSAndroid Build Coastguard Worker 	bool fail;
171*053f45beSAndroid Build Coastguard Worker 	enum test_mode mode;
172*053f45beSAndroid Build Coastguard Worker 	char name[MAX_TEST_NAME_SIZE];
173*053f45beSAndroid Build Coastguard Worker };
174*053f45beSAndroid Build Coastguard Worker 
175*053f45beSAndroid Build Coastguard Worker pthread_barrier_t barr;
176*053f45beSAndroid Build Coastguard Worker pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER;
177*053f45beSAndroid Build Coastguard Worker pthread_cond_t pacing_cond = PTHREAD_COND_INITIALIZER;
178*053f45beSAndroid Build Coastguard Worker 
179*053f45beSAndroid Build Coastguard Worker int pkts_in_flight;
180*053f45beSAndroid Build Coastguard Worker 
181*053f45beSAndroid Build Coastguard Worker #endif				/* XSKXCEIVER_H_ */
182