1*053f45beSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0 2*053f45beSAndroid Build Coastguard Worker * Copyright(c) 2020 Intel Corporation. 3*053f45beSAndroid Build Coastguard Worker */ 4*053f45beSAndroid Build Coastguard Worker 5*053f45beSAndroid Build Coastguard Worker #ifndef XSKXCEIVER_H_ 6*053f45beSAndroid Build Coastguard Worker #define XSKXCEIVER_H_ 7*053f45beSAndroid Build Coastguard Worker 8*053f45beSAndroid Build Coastguard Worker #ifndef SOL_XDP 9*053f45beSAndroid Build Coastguard Worker #define SOL_XDP 283 10*053f45beSAndroid Build Coastguard Worker #endif 11*053f45beSAndroid Build Coastguard Worker 12*053f45beSAndroid Build Coastguard Worker #ifndef AF_XDP 13*053f45beSAndroid Build Coastguard Worker #define AF_XDP 44 14*053f45beSAndroid Build Coastguard Worker #endif 15*053f45beSAndroid Build Coastguard Worker 16*053f45beSAndroid Build Coastguard Worker #ifndef PF_XDP 17*053f45beSAndroid Build Coastguard Worker #define PF_XDP AF_XDP 18*053f45beSAndroid Build Coastguard Worker #endif 19*053f45beSAndroid Build Coastguard Worker 20*053f45beSAndroid Build Coastguard Worker #ifndef SO_BUSY_POLL_BUDGET 21*053f45beSAndroid Build Coastguard Worker #define SO_BUSY_POLL_BUDGET 70 22*053f45beSAndroid Build Coastguard Worker #endif 23*053f45beSAndroid Build Coastguard Worker 24*053f45beSAndroid Build Coastguard Worker #ifndef SO_PREFER_BUSY_POLL 25*053f45beSAndroid Build Coastguard Worker #define SO_PREFER_BUSY_POLL 69 26*053f45beSAndroid Build Coastguard Worker #endif 27*053f45beSAndroid Build Coastguard Worker 28*053f45beSAndroid Build Coastguard Worker #define TEST_PASS 0 29*053f45beSAndroid Build Coastguard Worker #define TEST_FAILURE -1 30*053f45beSAndroid Build Coastguard Worker #define TEST_CONTINUE 1 31*053f45beSAndroid Build Coastguard Worker #define MAX_INTERFACES 2 32*053f45beSAndroid Build Coastguard Worker #define MAX_INTERFACE_NAME_CHARS 16 33*053f45beSAndroid Build Coastguard Worker #define MAX_INTERFACES_NAMESPACE_CHARS 16 34*053f45beSAndroid Build Coastguard Worker #define MAX_SOCKETS 2 35*053f45beSAndroid Build Coastguard Worker #define MAX_TEST_NAME_SIZE 32 36*053f45beSAndroid Build Coastguard Worker #define MAX_TEARDOWN_ITER 10 37*053f45beSAndroid Build Coastguard Worker #define PKT_HDR_SIZE (sizeof(struct ethhdr) + sizeof(struct iphdr) + \ 38*053f45beSAndroid Build Coastguard Worker sizeof(struct udphdr)) 39*053f45beSAndroid Build Coastguard Worker #define MIN_ETH_PKT_SIZE 64 40*053f45beSAndroid Build Coastguard Worker #define ETH_FCS_SIZE 4 41*053f45beSAndroid Build Coastguard Worker #define MIN_PKT_SIZE (MIN_ETH_PKT_SIZE - ETH_FCS_SIZE) 42*053f45beSAndroid Build Coastguard Worker #define PKT_SIZE (MIN_PKT_SIZE) 43*053f45beSAndroid Build Coastguard Worker #define IP_PKT_SIZE (PKT_SIZE - sizeof(struct ethhdr)) 44*053f45beSAndroid Build Coastguard Worker #define IP_PKT_VER 0x4 45*053f45beSAndroid Build Coastguard Worker #define IP_PKT_TOS 0x9 46*053f45beSAndroid Build Coastguard Worker #define UDP_PKT_SIZE (IP_PKT_SIZE - sizeof(struct iphdr)) 47*053f45beSAndroid Build Coastguard Worker #define UDP_PKT_DATA_SIZE (UDP_PKT_SIZE - sizeof(struct udphdr)) 48*053f45beSAndroid Build Coastguard Worker #define USLEEP_MAX 10000 49*053f45beSAndroid Build Coastguard Worker #define SOCK_RECONF_CTR 10 50*053f45beSAndroid Build Coastguard Worker #define BATCH_SIZE 64 51*053f45beSAndroid Build Coastguard Worker #define POLL_TMOUT 1000 52*053f45beSAndroid Build Coastguard Worker #define THREAD_TMOUT 3 53*053f45beSAndroid Build Coastguard Worker #define DEFAULT_PKT_CNT (4 * 1024) 54*053f45beSAndroid Build Coastguard Worker #define DEFAULT_UMEM_BUFFERS (DEFAULT_PKT_CNT / 4) 55*053f45beSAndroid Build Coastguard Worker #define UMEM_SIZE (DEFAULT_UMEM_BUFFERS * XSK_UMEM__DEFAULT_FRAME_SIZE) 56*053f45beSAndroid Build Coastguard Worker #define RX_FULL_RXQSIZE 32 57*053f45beSAndroid Build Coastguard Worker #define UMEM_HEADROOM_TEST_SIZE 128 58*053f45beSAndroid Build Coastguard Worker #define XSK_UMEM__INVALID_FRAME_SIZE (XSK_UMEM__DEFAULT_FRAME_SIZE + 1) 59*053f45beSAndroid Build Coastguard Worker 60*053f45beSAndroid Build Coastguard Worker #define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0) 61*053f45beSAndroid Build Coastguard Worker 62*053f45beSAndroid Build Coastguard Worker enum test_mode { 63*053f45beSAndroid Build Coastguard Worker TEST_MODE_SKB, 64*053f45beSAndroid Build Coastguard Worker TEST_MODE_DRV, 65*053f45beSAndroid Build Coastguard Worker TEST_MODE_ZC, 66*053f45beSAndroid Build Coastguard Worker TEST_MODE_MAX 67*053f45beSAndroid Build Coastguard Worker }; 68*053f45beSAndroid Build Coastguard Worker 69*053f45beSAndroid Build Coastguard Worker enum test_type { 70*053f45beSAndroid Build Coastguard Worker TEST_TYPE_RUN_TO_COMPLETION, 71*053f45beSAndroid Build Coastguard Worker TEST_TYPE_RUN_TO_COMPLETION_2K_FRAME, 72*053f45beSAndroid Build Coastguard Worker TEST_TYPE_RUN_TO_COMPLETION_SINGLE_PKT, 73*053f45beSAndroid Build Coastguard Worker TEST_TYPE_RX_POLL, 74*053f45beSAndroid Build Coastguard Worker TEST_TYPE_TX_POLL, 75*053f45beSAndroid Build Coastguard Worker TEST_TYPE_POLL_RXQ_TMOUT, 76*053f45beSAndroid Build Coastguard Worker TEST_TYPE_POLL_TXQ_TMOUT, 77*053f45beSAndroid Build Coastguard Worker TEST_TYPE_UNALIGNED, 78*053f45beSAndroid Build Coastguard Worker TEST_TYPE_ALIGNED_INV_DESC, 79*053f45beSAndroid Build Coastguard Worker TEST_TYPE_ALIGNED_INV_DESC_2K_FRAME, 80*053f45beSAndroid Build Coastguard Worker TEST_TYPE_UNALIGNED_INV_DESC, 81*053f45beSAndroid Build Coastguard Worker TEST_TYPE_HEADROOM, 82*053f45beSAndroid Build Coastguard Worker TEST_TYPE_TEARDOWN, 83*053f45beSAndroid Build Coastguard Worker TEST_TYPE_BIDI, 84*053f45beSAndroid Build Coastguard Worker TEST_TYPE_STATS_RX_DROPPED, 85*053f45beSAndroid Build Coastguard Worker TEST_TYPE_STATS_TX_INVALID_DESCS, 86*053f45beSAndroid Build Coastguard Worker TEST_TYPE_STATS_RX_FULL, 87*053f45beSAndroid Build Coastguard Worker TEST_TYPE_STATS_FILL_EMPTY, 88*053f45beSAndroid Build Coastguard Worker TEST_TYPE_BPF_RES, 89*053f45beSAndroid Build Coastguard Worker TEST_TYPE_MAX 90*053f45beSAndroid Build Coastguard Worker }; 91*053f45beSAndroid Build Coastguard Worker 92*053f45beSAndroid Build Coastguard Worker static bool opt_pkt_dump; 93*053f45beSAndroid Build Coastguard Worker static bool opt_verbose; 94*053f45beSAndroid Build Coastguard Worker 95*053f45beSAndroid Build Coastguard Worker struct xsk_umem_info { 96*053f45beSAndroid Build Coastguard Worker struct xsk_ring_prod fq; 97*053f45beSAndroid Build Coastguard Worker struct xsk_ring_cons cq; 98*053f45beSAndroid Build Coastguard Worker struct xsk_umem *umem; 99*053f45beSAndroid Build Coastguard Worker u32 num_frames; 100*053f45beSAndroid Build Coastguard Worker u32 frame_headroom; 101*053f45beSAndroid Build Coastguard Worker void *buffer; 102*053f45beSAndroid Build Coastguard Worker u32 frame_size; 103*053f45beSAndroid Build Coastguard Worker u32 base_addr; 104*053f45beSAndroid Build Coastguard Worker bool unaligned_mode; 105*053f45beSAndroid Build Coastguard Worker }; 106*053f45beSAndroid Build Coastguard Worker 107*053f45beSAndroid Build Coastguard Worker struct xsk_socket_info { 108*053f45beSAndroid Build Coastguard Worker struct xsk_ring_cons rx; 109*053f45beSAndroid Build Coastguard Worker struct xsk_ring_prod tx; 110*053f45beSAndroid Build Coastguard Worker struct xsk_umem_info *umem; 111*053f45beSAndroid Build Coastguard Worker struct xsk_socket *xsk; 112*053f45beSAndroid Build Coastguard Worker u32 outstanding_tx; 113*053f45beSAndroid Build Coastguard Worker u32 rxqsize; 114*053f45beSAndroid Build Coastguard Worker }; 115*053f45beSAndroid Build Coastguard Worker 116*053f45beSAndroid Build Coastguard Worker struct pkt { 117*053f45beSAndroid Build Coastguard Worker u64 addr; 118*053f45beSAndroid Build Coastguard Worker u32 len; 119*053f45beSAndroid Build Coastguard Worker u32 payload; 120*053f45beSAndroid Build Coastguard Worker bool valid; 121*053f45beSAndroid Build Coastguard Worker }; 122*053f45beSAndroid Build Coastguard Worker 123*053f45beSAndroid Build Coastguard Worker struct pkt_stream { 124*053f45beSAndroid Build Coastguard Worker u32 nb_pkts; 125*053f45beSAndroid Build Coastguard Worker u32 rx_pkt_nb; 126*053f45beSAndroid Build Coastguard Worker struct pkt *pkts; 127*053f45beSAndroid Build Coastguard Worker bool use_addr_for_fill; 128*053f45beSAndroid Build Coastguard Worker }; 129*053f45beSAndroid Build Coastguard Worker 130*053f45beSAndroid Build Coastguard Worker struct ifobject; 131*053f45beSAndroid Build Coastguard Worker typedef int (*validation_func_t)(struct ifobject *ifobj); 132*053f45beSAndroid Build Coastguard Worker typedef void *(*thread_func_t)(void *arg); 133*053f45beSAndroid Build Coastguard Worker 134*053f45beSAndroid Build Coastguard Worker struct ifobject { 135*053f45beSAndroid Build Coastguard Worker char ifname[MAX_INTERFACE_NAME_CHARS]; 136*053f45beSAndroid Build Coastguard Worker char nsname[MAX_INTERFACES_NAMESPACE_CHARS]; 137*053f45beSAndroid Build Coastguard Worker struct xsk_socket_info *xsk; 138*053f45beSAndroid Build Coastguard Worker struct xsk_socket_info *xsk_arr; 139*053f45beSAndroid Build Coastguard Worker struct xsk_umem_info *umem; 140*053f45beSAndroid Build Coastguard Worker thread_func_t func_ptr; 141*053f45beSAndroid Build Coastguard Worker validation_func_t validation_func; 142*053f45beSAndroid Build Coastguard Worker struct pkt_stream *pkt_stream; 143*053f45beSAndroid Build Coastguard Worker int ns_fd; 144*053f45beSAndroid Build Coastguard Worker int xsk_map_fd; 145*053f45beSAndroid Build Coastguard Worker u32 dst_ip; 146*053f45beSAndroid Build Coastguard Worker u32 src_ip; 147*053f45beSAndroid Build Coastguard Worker u32 xdp_flags; 148*053f45beSAndroid Build Coastguard Worker u32 bind_flags; 149*053f45beSAndroid Build Coastguard Worker u16 src_port; 150*053f45beSAndroid Build Coastguard Worker u16 dst_port; 151*053f45beSAndroid Build Coastguard Worker bool tx_on; 152*053f45beSAndroid Build Coastguard Worker bool rx_on; 153*053f45beSAndroid Build Coastguard Worker bool use_poll; 154*053f45beSAndroid Build Coastguard Worker bool busy_poll; 155*053f45beSAndroid Build Coastguard Worker bool use_fill_ring; 156*053f45beSAndroid Build Coastguard Worker bool release_rx; 157*053f45beSAndroid Build Coastguard Worker bool shared_umem; 158*053f45beSAndroid Build Coastguard Worker u8 dst_mac[ETH_ALEN]; 159*053f45beSAndroid Build Coastguard Worker u8 src_mac[ETH_ALEN]; 160*053f45beSAndroid Build Coastguard Worker }; 161*053f45beSAndroid Build Coastguard Worker 162*053f45beSAndroid Build Coastguard Worker struct test_spec { 163*053f45beSAndroid Build Coastguard Worker struct ifobject *ifobj_tx; 164*053f45beSAndroid Build Coastguard Worker struct ifobject *ifobj_rx; 165*053f45beSAndroid Build Coastguard Worker struct pkt_stream *tx_pkt_stream_default; 166*053f45beSAndroid Build Coastguard Worker struct pkt_stream *rx_pkt_stream_default; 167*053f45beSAndroid Build Coastguard Worker u16 total_steps; 168*053f45beSAndroid Build Coastguard Worker u16 current_step; 169*053f45beSAndroid Build Coastguard Worker u16 nb_sockets; 170*053f45beSAndroid Build Coastguard Worker bool fail; 171*053f45beSAndroid Build Coastguard Worker enum test_mode mode; 172*053f45beSAndroid Build Coastguard Worker char name[MAX_TEST_NAME_SIZE]; 173*053f45beSAndroid Build Coastguard Worker }; 174*053f45beSAndroid Build Coastguard Worker 175*053f45beSAndroid Build Coastguard Worker pthread_barrier_t barr; 176*053f45beSAndroid Build Coastguard Worker pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER; 177*053f45beSAndroid Build Coastguard Worker pthread_cond_t pacing_cond = PTHREAD_COND_INITIALIZER; 178*053f45beSAndroid Build Coastguard Worker 179*053f45beSAndroid Build Coastguard Worker int pkts_in_flight; 180*053f45beSAndroid Build Coastguard Worker 181*053f45beSAndroid Build Coastguard Worker #endif /* XSKXCEIVER_H_ */ 182