Merge tag 'riscv-for-linus-5.13-rc7' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / tools / testing / selftests / bpf / xdpxceiver.h
1 /* SPDX-License-Identifier: GPL-2.0
2  * Copyright(c) 2020 Intel Corporation.
3  */
4
5 #ifndef XDPXCEIVER_H_
6 #define XDPXCEIVER_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 #define MAX_INTERFACES 2
21 #define MAX_INTERFACE_NAME_CHARS 7
22 #define MAX_INTERFACES_NAMESPACE_CHARS 10
23 #define MAX_SOCKS 1
24 #define MAX_TEARDOWN_ITER 10
25 #define MAX_BIDI_ITER 2
26 #define MAX_BPF_ITER 2
27 #define PKT_HDR_SIZE (sizeof(struct ethhdr) + sizeof(struct iphdr) + \
28                         sizeof(struct udphdr))
29 #define MIN_PKT_SIZE 64
30 #define ETH_FCS_SIZE 4
31 #define PKT_SIZE (MIN_PKT_SIZE - ETH_FCS_SIZE)
32 #define IP_PKT_SIZE (PKT_SIZE - sizeof(struct ethhdr))
33 #define IP_PKT_VER 0x4
34 #define IP_PKT_TOS 0x9
35 #define UDP_PKT_SIZE (IP_PKT_SIZE - sizeof(struct iphdr))
36 #define UDP_PKT_DATA_SIZE (UDP_PKT_SIZE - sizeof(struct udphdr))
37 #define EOT (-1)
38 #define USLEEP_MAX 200000
39 #define SOCK_RECONF_CTR 10
40 #define BATCH_SIZE 64
41 #define POLL_TMOUT 1000
42 #define DEFAULT_PKT_CNT 10000
43 #define RX_FULL_RXQSIZE 32
44
45 #define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0)
46
47 typedef __u32 u32;
48 typedef __u16 u16;
49 typedef __u8 u8;
50
51 enum TEST_MODES {
52         TEST_MODE_UNCONFIGURED = -1,
53         TEST_MODE_SKB,
54         TEST_MODE_DRV,
55         TEST_MODE_MAX
56 };
57
58 enum TEST_TYPES {
59         TEST_TYPE_NOPOLL,
60         TEST_TYPE_POLL,
61         TEST_TYPE_TEARDOWN,
62         TEST_TYPE_BIDI,
63         TEST_TYPE_STATS,
64         TEST_TYPE_BPF_RES,
65         TEST_TYPE_MAX
66 };
67
68 enum STAT_TEST_TYPES {
69         STAT_TEST_RX_DROPPED,
70         STAT_TEST_TX_INVALID,
71         STAT_TEST_RX_FULL,
72         STAT_TEST_RX_FILL_EMPTY,
73         STAT_TEST_TYPE_MAX
74 };
75
76 static int configured_mode = TEST_MODE_UNCONFIGURED;
77 static u8 debug_pkt_dump;
78 static u32 num_frames;
79 static bool second_step;
80 static int test_type;
81
82 static int opt_pkt_count;
83 static u8 opt_verbose;
84
85 static u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
86 static u32 xdp_bind_flags = XDP_USE_NEED_WAKEUP | XDP_COPY;
87 static u8 pkt_data[XSK_UMEM__DEFAULT_FRAME_SIZE];
88 static u32 pkt_counter;
89 static long prev_pkt = -1;
90 static int sigvar;
91 static int stat_test_type;
92 static u32 rxqsize;
93 static u32 frame_headroom;
94
95 struct xsk_umem_info {
96         struct xsk_ring_prod fq;
97         struct xsk_ring_cons cq;
98         struct xsk_umem *umem;
99         void *buffer;
100 };
101
102 struct xsk_socket_info {
103         struct xsk_ring_cons rx;
104         struct xsk_ring_prod tx;
105         struct xsk_umem_info *umem;
106         struct xsk_socket *xsk;
107         unsigned long rx_npkts;
108         unsigned long tx_npkts;
109         unsigned long prev_rx_npkts;
110         unsigned long prev_tx_npkts;
111         u32 outstanding_tx;
112 };
113
114 struct flow_vector {
115         enum fvector {
116                 tx,
117                 rx,
118         } vector;
119 };
120
121 struct generic_data {
122         u32 seqnum;
123 };
124
125 struct ifobject {
126         char ifname[MAX_INTERFACE_NAME_CHARS];
127         char nsname[MAX_INTERFACES_NAMESPACE_CHARS];
128         struct xsk_socket_info *xsk;
129         struct xsk_socket_info **xsk_arr;
130         struct xsk_umem_info **umem_arr;
131         struct xsk_umem_info *umem;
132         void *(*func_ptr)(void *arg);
133         struct flow_vector fv;
134         int ns_fd;
135         int ifdict_index;
136         u32 dst_ip;
137         u32 src_ip;
138         u16 src_port;
139         u16 dst_port;
140         u8 dst_mac[ETH_ALEN];
141         u8 src_mac[ETH_ALEN];
142 };
143
144 static struct ifobject *ifdict[MAX_INTERFACES];
145 static struct ifobject *ifdict_rx;
146 static struct ifobject *ifdict_tx;
147
148 /*threads*/
149 pthread_barrier_t barr;
150 pthread_t t0, t1;
151
152 TAILQ_HEAD(head_s, pkt) head = TAILQ_HEAD_INITIALIZER(head);
153 struct head_s *head_p;
154 struct pkt {
155         char *pkt_frame;
156
157         TAILQ_ENTRY(pkt) pkt_nodes;
158 } *pkt_node_rx, *pkt_node_rx_q;
159
160 struct pkt_frame {
161         char *payload;
162 } *pkt_obj;
163
164 struct pkt_frame **pkt_buf;
165
166 #endif                          /* XDPXCEIVER_H */