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 12 #ifndef SOL_XDP 13 #define SOL_XDP 283 14 #endif 15 16 #ifndef AF_XDP 17 #define AF_XDP 44 18 #endif 19 20 #ifndef PF_XDP 21 #define PF_XDP AF_XDP 22 #endif 23 24 #ifndef SO_BUSY_POLL_BUDGET 25 #define SO_BUSY_POLL_BUDGET 70 26 #endif 27 28 #ifndef SO_PREFER_BUSY_POLL 29 #define SO_PREFER_BUSY_POLL 69 30 #endif 31 32 #define TEST_PASS 0 33 #define TEST_FAILURE -1 34 #define TEST_CONTINUE 1 35 #define TEST_SKIP 2 36 #define MAX_INTERFACES 2 37 #define MAX_INTERFACE_NAME_CHARS 16 38 #define MAX_SOCKETS 2 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 63 #define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0) 64 65 enum test_mode { 66 TEST_MODE_SKB, 67 TEST_MODE_DRV, 68 TEST_MODE_ZC, 69 TEST_MODE_ALL 70 }; 71 72 struct xsk_umem_info { 73 struct xsk_ring_prod fq; 74 struct xsk_ring_cons cq; 75 struct xsk_umem *umem; 76 u64 next_buffer; 77 u32 num_frames; 78 u32 frame_headroom; 79 void *buffer; 80 u32 frame_size; 81 u32 base_addr; 82 bool unaligned_mode; 83 }; 84 85 struct xsk_socket_info { 86 struct xsk_ring_cons rx; 87 struct xsk_ring_prod tx; 88 struct xsk_umem_info *umem; 89 struct xsk_socket *xsk; 90 u32 outstanding_tx; 91 u32 rxqsize; 92 }; 93 94 struct pkt { 95 int offset; 96 u32 len; 97 u32 pkt_nb; 98 bool valid; 99 u16 options; 100 }; 101 102 struct pkt_stream { 103 u32 nb_pkts; 104 u32 current_pkt_nb; 105 struct pkt *pkts; 106 u32 max_pkt_len; 107 bool verbatim; 108 }; 109 110 struct ifobject; 111 struct test_spec; 112 typedef int (*validation_func_t)(struct ifobject *ifobj); 113 typedef void *(*thread_func_t)(void *arg); 114 typedef int (*test_func_t)(struct test_spec *test); 115 116 struct ifobject { 117 char ifname[MAX_INTERFACE_NAME_CHARS]; 118 struct xsk_socket_info *xsk; 119 struct xsk_socket_info *xsk_arr; 120 struct xsk_umem_info *umem; 121 thread_func_t func_ptr; 122 validation_func_t validation_func; 123 struct pkt_stream *pkt_stream; 124 struct xsk_xdp_progs *xdp_progs; 125 struct bpf_map *xskmap; 126 struct bpf_program *xdp_prog; 127 enum test_mode mode; 128 int ifindex; 129 int mtu; 130 u32 bind_flags; 131 u32 xdp_zc_max_segs; 132 bool tx_on; 133 bool rx_on; 134 bool use_poll; 135 bool busy_poll; 136 bool use_fill_ring; 137 bool release_rx; 138 bool shared_umem; 139 bool use_metadata; 140 bool unaligned_supp; 141 bool multi_buff_supp; 142 bool multi_buff_zc_supp; 143 u8 dst_mac[ETH_ALEN]; 144 u8 src_mac[ETH_ALEN]; 145 }; 146 147 struct test_spec { 148 struct ifobject *ifobj_tx; 149 struct ifobject *ifobj_rx; 150 struct pkt_stream *tx_pkt_stream_default; 151 struct pkt_stream *rx_pkt_stream_default; 152 struct bpf_program *xdp_prog_rx; 153 struct bpf_program *xdp_prog_tx; 154 struct bpf_map *xskmap_rx; 155 struct bpf_map *xskmap_tx; 156 test_func_t test_func; 157 int mtu; 158 u16 total_steps; 159 u16 current_step; 160 u16 nb_sockets; 161 bool fail; 162 enum test_mode mode; 163 char name[MAX_TEST_NAME_SIZE]; 164 }; 165 166 pthread_barrier_t barr; 167 pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER; 168 169 int pkts_in_flight; 170 171 #endif /* XSKXCEIVER_H_ */ 172