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