188 lines · c
1/* SPDX-License-Identifier: GPL-2.02 * 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#include "xsk_xdp_common.h"12 13#ifndef SOL_XDP14#define SOL_XDP 28315#endif16 17#ifndef AF_XDP18#define AF_XDP 4419#endif20 21#ifndef PF_XDP22#define PF_XDP AF_XDP23#endif24 25#ifndef SO_BUSY_POLL_BUDGET26#define SO_BUSY_POLL_BUDGET 7027#endif28 29#ifndef SO_PREFER_BUSY_POLL30#define SO_PREFER_BUSY_POLL 6931#endif32 33#define TEST_PASS 034#define TEST_FAILURE -135#define TEST_CONTINUE 136#define TEST_SKIP 237#define MAX_INTERFACES 238#define MAX_INTERFACE_NAME_CHARS 1639#define MAX_TEST_NAME_SIZE 4840#define MAX_TEARDOWN_ITER 1041#define PKT_HDR_SIZE (sizeof(struct ethhdr) + 2) /* Just to align the data in the packet */42#define MIN_PKT_SIZE 6443#define MAX_ETH_PKT_SIZE 151844#define MAX_ETH_JUMBO_SIZE 900045#define USLEEP_MAX 1000046#define SOCK_RECONF_CTR 1047#define DEFAULT_BATCH_SIZE 6448#define POLL_TMOUT 100049#define THREAD_TMOUT 350#define DEFAULT_PKT_CNT (4 * 1024)51#define DEFAULT_UMEM_BUFFERS (DEFAULT_PKT_CNT / 4)52#define RX_FULL_RXQSIZE 3253#define UMEM_HEADROOM_TEST_SIZE 12854#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 HUGEPAGE_SIZE (2 * 1024 * 1024)59#define PKT_DUMP_NB_TO_PRINT 1660#define RUN_ALL_TESTS UINT_MAX61#define NUM_MAC_ADDRESSES 462 63#define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0)64 65enum test_mode {66 TEST_MODE_SKB,67 TEST_MODE_DRV,68 TEST_MODE_ZC,69 TEST_MODE_ALL70};71 72struct 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 u32 fill_size;83 u32 comp_size;84 bool unaligned_mode;85};86 87struct xsk_socket_info {88 struct xsk_ring_cons rx;89 struct xsk_ring_prod tx;90 struct xsk_umem_info *umem;91 struct xsk_socket *xsk;92 struct pkt_stream *pkt_stream;93 u32 outstanding_tx;94 u32 rxqsize;95 u32 batch_size;96 u8 dst_mac[ETH_ALEN];97 u8 src_mac[ETH_ALEN];98};99 100struct pkt {101 int offset;102 u32 len;103 u32 pkt_nb;104 bool valid;105 u16 options;106};107 108struct pkt_stream {109 u32 nb_pkts;110 u32 current_pkt_nb;111 struct pkt *pkts;112 u32 max_pkt_len;113 u32 nb_rx_pkts;114 u32 nb_valid_entries;115 bool verbatim;116};117 118struct set_hw_ring {119 u32 default_tx;120 u32 default_rx;121};122 123struct ifobject;124struct test_spec;125typedef int (*validation_func_t)(struct ifobject *ifobj);126typedef void *(*thread_func_t)(void *arg);127typedef int (*test_func_t)(struct test_spec *test);128 129struct ifobject {130 char ifname[MAX_INTERFACE_NAME_CHARS];131 struct xsk_socket_info *xsk;132 struct xsk_socket_info *xsk_arr;133 struct xsk_umem_info *umem;134 thread_func_t func_ptr;135 validation_func_t validation_func;136 struct xsk_xdp_progs *xdp_progs;137 struct bpf_map *xskmap;138 struct bpf_program *xdp_prog;139 struct ethtool_ringparam ring;140 struct set_hw_ring set_ring;141 enum test_mode mode;142 int ifindex;143 int mtu;144 u32 bind_flags;145 u32 xdp_zc_max_segs;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 bool multi_buff_supp;156 bool multi_buff_zc_supp;157 bool hw_ring_size_supp;158};159 160struct test_spec {161 struct ifobject *ifobj_tx;162 struct ifobject *ifobj_rx;163 struct pkt_stream *tx_pkt_stream_default;164 struct pkt_stream *rx_pkt_stream_default;165 struct bpf_program *xdp_prog_rx;166 struct bpf_program *xdp_prog_tx;167 struct bpf_map *xskmap_rx;168 struct bpf_map *xskmap_tx;169 test_func_t test_func;170 int mtu;171 u16 total_steps;172 u16 current_step;173 u16 nb_sockets;174 bool fail;175 bool set_ring;176 enum test_mode mode;177 char name[MAX_TEST_NAME_SIZE];178};179 180pthread_barrier_t barr;181pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER;182 183int pkts_in_flight;184 185static const u8 g_mac[ETH_ALEN] = {0x55, 0x44, 0x33, 0x22, 0x11, 0x00};186 187#endif /* XSKXCEIVER_H_ */188