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
66enum test_mode {
67 TEST_MODE_SKB,
68 TEST_MODE_DRV,
69 TEST_MODE_ZC,
70 TEST_MODE_ALL
71};
72
73struct 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
86struct 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
98struct pkt {
99 int offset;
100 u32 len;
101 u32 pkt_nb;
102 bool valid;
103 u16 options;
104};
105
106struct 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
116struct ifobject;
117struct test_spec;
118typedef int (*validation_func_t)(struct ifobject *ifobj);
119typedef void *(*thread_func_t)(void *arg);
120typedef int (*test_func_t)(struct test_spec *test);
121
122struct 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
150struct 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
169pthread_barrier_t barr;
170pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER;
171
172int pkts_in_flight;
173
174static const u8 g_mac[ETH_ALEN] = {0x55, 0x44, 0x33, 0x22, 0x11, 0x00};
175
176#endif /* XSKXCEIVER_H_ */
177

source code of linux/tools/testing/selftests/bpf/xskxceiver.h