91022c4876eb94ab364e9ade0d271ccf1aabefce
[linux-2.6-microblaze.git] / tools / testing / selftests / bpf / xskxceiver.h
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 MAX_INTERFACES 2
34 #define MAX_INTERFACE_NAME_CHARS 16
35 #define MAX_SOCKETS 2
36 #define MAX_TEST_NAME_SIZE 32
37 #define MAX_TEARDOWN_ITER 10
38 #define PKT_HDR_SIZE (sizeof(struct ethhdr) + 2) /* Just to align the data in the packet */
39 #define MIN_PKT_SIZE 64
40 #define USLEEP_MAX 10000
41 #define SOCK_RECONF_CTR 10
42 #define BATCH_SIZE 64
43 #define POLL_TMOUT 1000
44 #define THREAD_TMOUT 3
45 #define DEFAULT_PKT_CNT (4 * 1024)
46 #define DEFAULT_UMEM_BUFFERS (DEFAULT_PKT_CNT / 4)
47 #define RX_FULL_RXQSIZE 32
48 #define UMEM_HEADROOM_TEST_SIZE 128
49 #define XSK_UMEM__INVALID_FRAME_SIZE (XSK_UMEM__DEFAULT_FRAME_SIZE + 1)
50 #define HUGEPAGE_SIZE (2 * 1024 * 1024)
51 #define PKT_DUMP_NB_TO_PRINT 16
52
53 #define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0)
54
55 enum test_mode {
56         TEST_MODE_SKB,
57         TEST_MODE_DRV,
58         TEST_MODE_ZC,
59         TEST_MODE_MAX
60 };
61
62 enum test_type {
63         TEST_TYPE_RUN_TO_COMPLETION,
64         TEST_TYPE_RUN_TO_COMPLETION_2K_FRAME,
65         TEST_TYPE_RUN_TO_COMPLETION_SINGLE_PKT,
66         TEST_TYPE_RX_POLL,
67         TEST_TYPE_TX_POLL,
68         TEST_TYPE_POLL_RXQ_TMOUT,
69         TEST_TYPE_POLL_TXQ_TMOUT,
70         TEST_TYPE_UNALIGNED,
71         TEST_TYPE_ALIGNED_INV_DESC,
72         TEST_TYPE_ALIGNED_INV_DESC_2K_FRAME,
73         TEST_TYPE_UNALIGNED_INV_DESC,
74         TEST_TYPE_UNALIGNED_INV_DESC_4K1_FRAME,
75         TEST_TYPE_HEADROOM,
76         TEST_TYPE_TEARDOWN,
77         TEST_TYPE_BIDI,
78         TEST_TYPE_STATS_RX_DROPPED,
79         TEST_TYPE_STATS_TX_INVALID_DESCS,
80         TEST_TYPE_STATS_RX_FULL,
81         TEST_TYPE_STATS_FILL_EMPTY,
82         TEST_TYPE_BPF_RES,
83         TEST_TYPE_XDP_DROP_HALF,
84         TEST_TYPE_XDP_METADATA_COUNT,
85         TEST_TYPE_MAX
86 };
87
88 static bool opt_pkt_dump;
89 static bool opt_verbose;
90
91 struct xsk_umem_info {
92         struct xsk_ring_prod fq;
93         struct xsk_ring_cons cq;
94         struct xsk_umem *umem;
95         u32 num_frames;
96         u32 frame_headroom;
97         void *buffer;
98         u32 frame_size;
99         u32 base_addr;
100         bool unaligned_mode;
101 };
102
103 struct xsk_socket_info {
104         struct xsk_ring_cons rx;
105         struct xsk_ring_prod tx;
106         struct xsk_umem_info *umem;
107         struct xsk_socket *xsk;
108         u32 outstanding_tx;
109         u32 rxqsize;
110 };
111
112 struct pkt {
113         u64 addr;
114         u32 len;
115         u32 pkt_nb;
116         bool valid;
117 };
118
119 struct pkt_stream {
120         u32 nb_pkts;
121         u32 rx_pkt_nb;
122         struct pkt *pkts;
123         bool use_addr_for_fill;
124 };
125
126 struct ifobject;
127 typedef int (*validation_func_t)(struct ifobject *ifobj);
128 typedef void *(*thread_func_t)(void *arg);
129
130 struct ifobject {
131         char ifname[MAX_INTERFACE_NAME_CHARS];
132         struct xsk_socket_info *xsk;
133         struct xsk_socket_info *xsk_arr;
134         struct xsk_umem_info *umem;
135         thread_func_t func_ptr;
136         validation_func_t validation_func;
137         struct pkt_stream *pkt_stream;
138         struct xsk_xdp_progs *xdp_progs;
139         struct bpf_map *xskmap;
140         struct bpf_program *xdp_prog;
141         enum test_mode mode;
142         int ifindex;
143         u32 bind_flags;
144         bool tx_on;
145         bool rx_on;
146         bool use_poll;
147         bool busy_poll;
148         bool use_fill_ring;
149         bool release_rx;
150         bool shared_umem;
151         bool use_metadata;
152         u8 dst_mac[ETH_ALEN];
153         u8 src_mac[ETH_ALEN];
154 };
155
156 struct test_spec {
157         struct ifobject *ifobj_tx;
158         struct ifobject *ifobj_rx;
159         struct pkt_stream *tx_pkt_stream_default;
160         struct pkt_stream *rx_pkt_stream_default;
161         struct bpf_program *xdp_prog_rx;
162         struct bpf_program *xdp_prog_tx;
163         struct bpf_map *xskmap_rx;
164         struct bpf_map *xskmap_tx;
165         u16 total_steps;
166         u16 current_step;
167         u16 nb_sockets;
168         bool fail;
169         enum test_mode mode;
170         char name[MAX_TEST_NAME_SIZE];
171 };
172
173 pthread_barrier_t barr;
174 pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER;
175 pthread_cond_t pacing_cond = PTHREAD_COND_INITIALIZER;
176
177 int pkts_in_flight;
178
179 #endif                          /* XSKXCEIVER_H_ */