1 /* SPDX-License-Identifier: GPL-2.0 1 /* SPDX-License-Identifier: GPL-2.0 2 * Copyright(c) 2020 Intel Corporation. 2 * Copyright(c) 2020 Intel Corporation. 3 */ 3 */ 4 4 5 #ifndef XSKXCEIVER_H_ 5 #ifndef XSKXCEIVER_H_ 6 #define XSKXCEIVER_H_ 6 #define XSKXCEIVER_H_ 7 7 8 #include <limits.h> << 9 << 10 #include "xsk_xdp_progs.skel.h" 8 #include "xsk_xdp_progs.skel.h" 11 #include "xsk_xdp_common.h" << 12 9 13 #ifndef SOL_XDP 10 #ifndef SOL_XDP 14 #define SOL_XDP 283 11 #define SOL_XDP 283 15 #endif 12 #endif 16 13 17 #ifndef AF_XDP 14 #ifndef AF_XDP 18 #define AF_XDP 44 15 #define AF_XDP 44 19 #endif 16 #endif 20 17 21 #ifndef PF_XDP 18 #ifndef PF_XDP 22 #define PF_XDP AF_XDP 19 #define PF_XDP AF_XDP 23 #endif 20 #endif 24 21 25 #ifndef SO_BUSY_POLL_BUDGET 22 #ifndef SO_BUSY_POLL_BUDGET 26 #define SO_BUSY_POLL_BUDGET 70 23 #define SO_BUSY_POLL_BUDGET 70 27 #endif 24 #endif 28 25 29 #ifndef SO_PREFER_BUSY_POLL 26 #ifndef SO_PREFER_BUSY_POLL 30 #define SO_PREFER_BUSY_POLL 69 27 #define SO_PREFER_BUSY_POLL 69 31 #endif 28 #endif 32 29 33 #define TEST_PASS 0 30 #define TEST_PASS 0 34 #define TEST_FAILURE -1 31 #define TEST_FAILURE -1 35 #define TEST_CONTINUE 1 32 #define TEST_CONTINUE 1 36 #define TEST_SKIP 2 33 #define TEST_SKIP 2 37 #define MAX_INTERFACES 2 34 #define MAX_INTERFACES 2 38 #define MAX_INTERFACE_NAME_CHARS 16 35 #define MAX_INTERFACE_NAME_CHARS 16 39 #define MAX_TEST_NAME_SIZE 48 !! 36 #define MAX_SOCKETS 2 >> 37 #define MAX_TEST_NAME_SIZE 32 40 #define MAX_TEARDOWN_ITER 10 38 #define MAX_TEARDOWN_ITER 10 41 #define PKT_HDR_SIZE (sizeof(struct ethhdr) + 39 #define PKT_HDR_SIZE (sizeof(struct ethhdr) + 2) /* Just to align the data in the packet */ 42 #define MIN_PKT_SIZE 64 40 #define MIN_PKT_SIZE 64 43 #define MAX_ETH_PKT_SIZE 1518 << 44 #define MAX_ETH_JUMBO_SIZE 9000 << 45 #define USLEEP_MAX 10000 41 #define USLEEP_MAX 10000 46 #define SOCK_RECONF_CTR 10 42 #define SOCK_RECONF_CTR 10 47 #define DEFAULT_BATCH_SIZE 64 !! 43 #define BATCH_SIZE 64 48 #define POLL_TMOUT 1000 44 #define POLL_TMOUT 1000 49 #define THREAD_TMOUT 3 45 #define THREAD_TMOUT 3 50 #define DEFAULT_PKT_CNT (4 * 1024) 46 #define DEFAULT_PKT_CNT (4 * 1024) 51 #define DEFAULT_UMEM_BUFFERS (DEFAULT_PKT_CNT 47 #define DEFAULT_UMEM_BUFFERS (DEFAULT_PKT_CNT / 4) 52 #define RX_FULL_RXQSIZE 32 48 #define RX_FULL_RXQSIZE 32 53 #define UMEM_HEADROOM_TEST_SIZE 128 49 #define UMEM_HEADROOM_TEST_SIZE 128 54 #define XSK_UMEM__INVALID_FRAME_SIZE (MAX_ETH_ !! 50 #define XSK_UMEM__INVALID_FRAME_SIZE (XSK_UMEM__DEFAULT_FRAME_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) 51 #define HUGEPAGE_SIZE (2 * 1024 * 1024) 60 #define PKT_DUMP_NB_TO_PRINT 16 52 #define PKT_DUMP_NB_TO_PRINT 16 61 #define RUN_ALL_TESTS UINT_MAX << 62 #define NUM_MAC_ADDRESSES 4 << 63 53 64 #define print_verbose(x...) do { if (opt_verbo 54 #define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0) 65 55 66 enum test_mode { 56 enum test_mode { 67 TEST_MODE_SKB, 57 TEST_MODE_SKB, 68 TEST_MODE_DRV, 58 TEST_MODE_DRV, 69 TEST_MODE_ZC, 59 TEST_MODE_ZC, 70 TEST_MODE_ALL !! 60 TEST_MODE_MAX >> 61 }; >> 62 >> 63 enum test_type { >> 64 TEST_TYPE_RUN_TO_COMPLETION, >> 65 TEST_TYPE_RUN_TO_COMPLETION_2K_FRAME, >> 66 TEST_TYPE_RUN_TO_COMPLETION_SINGLE_PKT, >> 67 TEST_TYPE_RX_POLL, >> 68 TEST_TYPE_TX_POLL, >> 69 TEST_TYPE_POLL_RXQ_TMOUT, >> 70 TEST_TYPE_POLL_TXQ_TMOUT, >> 71 TEST_TYPE_UNALIGNED, >> 72 TEST_TYPE_ALIGNED_INV_DESC, >> 73 TEST_TYPE_ALIGNED_INV_DESC_2K_FRAME, >> 74 TEST_TYPE_UNALIGNED_INV_DESC, >> 75 TEST_TYPE_UNALIGNED_INV_DESC_4K1_FRAME, >> 76 TEST_TYPE_HEADROOM, >> 77 TEST_TYPE_TEARDOWN, >> 78 TEST_TYPE_BIDI, >> 79 TEST_TYPE_STATS_RX_DROPPED, >> 80 TEST_TYPE_STATS_TX_INVALID_DESCS, >> 81 TEST_TYPE_STATS_RX_FULL, >> 82 TEST_TYPE_STATS_FILL_EMPTY, >> 83 TEST_TYPE_BPF_RES, >> 84 TEST_TYPE_XDP_DROP_HALF, >> 85 TEST_TYPE_XDP_METADATA_COUNT, >> 86 TEST_TYPE_MAX 71 }; 87 }; 72 88 >> 89 static bool opt_verbose; >> 90 73 struct xsk_umem_info { 91 struct xsk_umem_info { 74 struct xsk_ring_prod fq; 92 struct xsk_ring_prod fq; 75 struct xsk_ring_cons cq; 93 struct xsk_ring_cons cq; 76 struct xsk_umem *umem; 94 struct xsk_umem *umem; 77 u64 next_buffer; 95 u64 next_buffer; 78 u32 num_frames; 96 u32 num_frames; 79 u32 frame_headroom; 97 u32 frame_headroom; 80 void *buffer; 98 void *buffer; 81 u32 frame_size; 99 u32 frame_size; 82 u32 base_addr; 100 u32 base_addr; 83 u32 fill_size; << 84 u32 comp_size; << 85 bool unaligned_mode; 101 bool unaligned_mode; 86 }; 102 }; 87 103 88 struct xsk_socket_info { 104 struct xsk_socket_info { 89 struct xsk_ring_cons rx; 105 struct xsk_ring_cons rx; 90 struct xsk_ring_prod tx; 106 struct xsk_ring_prod tx; 91 struct xsk_umem_info *umem; 107 struct xsk_umem_info *umem; 92 struct xsk_socket *xsk; 108 struct xsk_socket *xsk; 93 struct pkt_stream *pkt_stream; << 94 u32 outstanding_tx; 109 u32 outstanding_tx; 95 u32 rxqsize; 110 u32 rxqsize; 96 u32 batch_size; << 97 u8 dst_mac[ETH_ALEN]; << 98 u8 src_mac[ETH_ALEN]; << 99 }; 111 }; 100 112 101 struct pkt { 113 struct pkt { 102 int offset; 114 int offset; 103 u32 len; 115 u32 len; 104 u32 pkt_nb; 116 u32 pkt_nb; 105 bool valid; 117 bool valid; 106 u16 options; << 107 }; 118 }; 108 119 109 struct pkt_stream { 120 struct pkt_stream { 110 u32 nb_pkts; 121 u32 nb_pkts; 111 u32 current_pkt_nb; 122 u32 current_pkt_nb; 112 struct pkt *pkts; 123 struct pkt *pkts; 113 u32 max_pkt_len; 124 u32 max_pkt_len; 114 u32 nb_rx_pkts; << 115 u32 nb_valid_entries; << 116 bool verbatim; << 117 }; << 118 << 119 struct set_hw_ring { << 120 u32 default_tx; << 121 u32 default_rx; << 122 }; 125 }; 123 126 124 struct ifobject; 127 struct ifobject; 125 struct test_spec; << 126 typedef int (*validation_func_t)(struct ifobje 128 typedef int (*validation_func_t)(struct ifobject *ifobj); 127 typedef void *(*thread_func_t)(void *arg); 129 typedef void *(*thread_func_t)(void *arg); 128 typedef int (*test_func_t)(struct test_spec *t << 129 130 130 struct ifobject { 131 struct ifobject { 131 char ifname[MAX_INTERFACE_NAME_CHARS]; 132 char ifname[MAX_INTERFACE_NAME_CHARS]; 132 struct xsk_socket_info *xsk; 133 struct xsk_socket_info *xsk; 133 struct xsk_socket_info *xsk_arr; 134 struct xsk_socket_info *xsk_arr; 134 struct xsk_umem_info *umem; 135 struct xsk_umem_info *umem; 135 thread_func_t func_ptr; 136 thread_func_t func_ptr; 136 validation_func_t validation_func; 137 validation_func_t validation_func; >> 138 struct pkt_stream *pkt_stream; 137 struct xsk_xdp_progs *xdp_progs; 139 struct xsk_xdp_progs *xdp_progs; 138 struct bpf_map *xskmap; 140 struct bpf_map *xskmap; 139 struct bpf_program *xdp_prog; 141 struct bpf_program *xdp_prog; 140 struct ethtool_ringparam ring; << 141 struct set_hw_ring set_ring; << 142 enum test_mode mode; 142 enum test_mode mode; 143 int ifindex; 143 int ifindex; 144 int mtu; << 145 u32 bind_flags; 144 u32 bind_flags; 146 u32 xdp_zc_max_segs; << 147 bool tx_on; 145 bool tx_on; 148 bool rx_on; 146 bool rx_on; 149 bool use_poll; 147 bool use_poll; 150 bool busy_poll; 148 bool busy_poll; 151 bool use_fill_ring; 149 bool use_fill_ring; 152 bool release_rx; 150 bool release_rx; 153 bool shared_umem; 151 bool shared_umem; 154 bool use_metadata; 152 bool use_metadata; 155 bool unaligned_supp; 153 bool unaligned_supp; 156 bool multi_buff_supp; !! 154 u8 dst_mac[ETH_ALEN]; 157 bool multi_buff_zc_supp; !! 155 u8 src_mac[ETH_ALEN]; 158 bool hw_ring_size_supp; << 159 }; 156 }; 160 157 161 struct test_spec { 158 struct test_spec { 162 struct ifobject *ifobj_tx; 159 struct ifobject *ifobj_tx; 163 struct ifobject *ifobj_rx; 160 struct ifobject *ifobj_rx; 164 struct pkt_stream *tx_pkt_stream_defau 161 struct pkt_stream *tx_pkt_stream_default; 165 struct pkt_stream *rx_pkt_stream_defau 162 struct pkt_stream *rx_pkt_stream_default; 166 struct bpf_program *xdp_prog_rx; 163 struct bpf_program *xdp_prog_rx; 167 struct bpf_program *xdp_prog_tx; 164 struct bpf_program *xdp_prog_tx; 168 struct bpf_map *xskmap_rx; 165 struct bpf_map *xskmap_rx; 169 struct bpf_map *xskmap_tx; 166 struct bpf_map *xskmap_tx; 170 test_func_t test_func; << 171 int mtu; << 172 u16 total_steps; 167 u16 total_steps; 173 u16 current_step; 168 u16 current_step; 174 u16 nb_sockets; 169 u16 nb_sockets; 175 bool fail; 170 bool fail; 176 bool set_ring; << 177 enum test_mode mode; 171 enum test_mode mode; 178 char name[MAX_TEST_NAME_SIZE]; 172 char name[MAX_TEST_NAME_SIZE]; 179 }; 173 }; 180 174 181 pthread_barrier_t barr; 175 pthread_barrier_t barr; 182 pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_I 176 pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER; 183 177 184 int pkts_in_flight; 178 int pkts_in_flight; 185 << 186 static const u8 g_mac[ETH_ALEN] = {0x55, 0x44, << 187 179 188 #endif /* XSKXCEIVER_ 180 #endif /* XSKXCEIVER_H_ */ 189 181
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.