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 TEST_SKIP 2 34#define MAX_INTERFACES 2 35#define MAX_INTERFACE_NAME_CHARS 16 36#define MAX_SOCKETS 2 37#define MAX_TEST_NAME_SIZE 32 38#define MAX_TEARDOWN_ITER 10 39#define PKT_HDR_SIZE (sizeof(struct ethhdr) + 2) /* Just to align the data in the packet */ 40#define MIN_PKT_SIZE 64 41#define MAX_ETH_PKT_SIZE 1518 42#define MAX_ETH_JUMBO_SIZE 9000 43#define USLEEP_MAX 10000 44#define SOCK_RECONF_CTR 10 45#define BATCH_SIZE 64 46#define POLL_TMOUT 1000 47#define THREAD_TMOUT 3 48#define DEFAULT_PKT_CNT (4 * 1024) 49#define DEFAULT_UMEM_BUFFERS (DEFAULT_PKT_CNT / 4) 50#define RX_FULL_RXQSIZE 32 51#define UMEM_HEADROOM_TEST_SIZE 128 52#define XSK_UMEM__INVALID_FRAME_SIZE (MAX_ETH_JUMBO_SIZE + 1) 53#define XSK_UMEM__LARGE_FRAME_SIZE (3 * 1024) 54#define XSK_UMEM__MAX_FRAME_SIZE (4 * 1024) 55#define XSK_DESC__INVALID_OPTION (0xffff) 56#define XSK_DESC__MAX_SKB_FRAGS 18 57#define HUGEPAGE_SIZE (2 * 1024 * 1024) 58#define PKT_DUMP_NB_TO_PRINT 16 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_UNALIGNED_INV_DESC_4K1_FRAME, 82 TEST_TYPE_HEADROOM, 83 TEST_TYPE_TEARDOWN, 84 TEST_TYPE_BIDI, 85 TEST_TYPE_STATS_RX_DROPPED, 86 TEST_TYPE_STATS_TX_INVALID_DESCS, 87 TEST_TYPE_STATS_RX_FULL, 88 TEST_TYPE_STATS_FILL_EMPTY, 89 TEST_TYPE_BPF_RES, 90 TEST_TYPE_XDP_DROP_HALF, 91 TEST_TYPE_XDP_METADATA_COUNT, 92 TEST_TYPE_XDP_METADATA_COUNT_MB, 93 TEST_TYPE_RUN_TO_COMPLETION_MB, 94 TEST_TYPE_UNALIGNED_MB, 95 TEST_TYPE_ALIGNED_INV_DESC_MB, 96 TEST_TYPE_UNALIGNED_INV_DESC_MB, 97 TEST_TYPE_TOO_MANY_FRAGS, 98 TEST_TYPE_MAX 99}; 100 101static bool opt_verbose; 102 103struct xsk_umem_info { 104 struct xsk_ring_prod fq; 105 struct xsk_ring_cons cq; 106 struct xsk_umem *umem; 107 u64 next_buffer; 108 u32 num_frames; 109 u32 frame_headroom; 110 void *buffer; 111 u32 frame_size; 112 u32 base_addr; 113 bool unaligned_mode; 114}; 115 116struct xsk_socket_info { 117 struct xsk_ring_cons rx; 118 struct xsk_ring_prod tx; 119 struct xsk_umem_info *umem; 120 struct xsk_socket *xsk; 121 u32 outstanding_tx; 122 u32 rxqsize; 123}; 124 125struct pkt { 126 int offset; 127 u32 len; 128 u32 pkt_nb; 129 bool valid; 130 u16 options; 131}; 132 133struct pkt_stream { 134 u32 nb_pkts; 135 u32 current_pkt_nb; 136 struct pkt *pkts; 137 u32 max_pkt_len; 138 bool verbatim; 139}; 140 141struct ifobject; 142typedef int (*validation_func_t)(struct ifobject *ifobj); 143typedef void *(*thread_func_t)(void *arg); 144 145struct ifobject { 146 char ifname[MAX_INTERFACE_NAME_CHARS]; 147 struct xsk_socket_info *xsk; 148 struct xsk_socket_info *xsk_arr; 149 struct xsk_umem_info *umem; 150 thread_func_t func_ptr; 151 validation_func_t validation_func; 152 struct pkt_stream *pkt_stream; 153 struct xsk_xdp_progs *xdp_progs; 154 struct bpf_map *xskmap; 155 struct bpf_program *xdp_prog; 156 enum test_mode mode; 157 int ifindex; 158 int mtu; 159 u32 bind_flags; 160 u32 xdp_zc_max_segs; 161 bool tx_on; 162 bool rx_on; 163 bool use_poll; 164 bool busy_poll; 165 bool use_fill_ring; 166 bool release_rx; 167 bool shared_umem; 168 bool use_metadata; 169 bool unaligned_supp; 170 bool multi_buff_supp; 171 bool multi_buff_zc_supp; 172 u8 dst_mac[ETH_ALEN]; 173 u8 src_mac[ETH_ALEN]; 174}; 175 176struct test_spec { 177 struct ifobject *ifobj_tx; 178 struct ifobject *ifobj_rx; 179 struct pkt_stream *tx_pkt_stream_default; 180 struct pkt_stream *rx_pkt_stream_default; 181 struct bpf_program *xdp_prog_rx; 182 struct bpf_program *xdp_prog_tx; 183 struct bpf_map *xskmap_rx; 184 struct bpf_map *xskmap_tx; 185 int mtu; 186 u16 total_steps; 187 u16 current_step; 188 u16 nb_sockets; 189 bool fail; 190 enum test_mode mode; 191 char name[MAX_TEST_NAME_SIZE]; 192}; 193 194pthread_barrier_t barr; 195pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER; 196 197int pkts_in_flight; 198 199#endif /* XSKXCEIVER_H_ */ 200