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