| /* SPDX-License-Identifier: GPL-2.0 |
| * Copyright(c) 2020 Intel Corporation. |
| */ |
| |
| #ifndef XSKXCEIVER_H_ |
| #define XSKXCEIVER_H_ |
| |
| #include <limits.h> |
| |
| #include "xsk_xdp_progs.skel.h" |
| #include "xsk_xdp_common.h" |
| |
| #ifndef SOL_XDP |
| #define SOL_XDP 283 |
| #endif |
| |
| #ifndef AF_XDP |
| #define AF_XDP 44 |
| #endif |
| |
| #ifndef PF_XDP |
| #define PF_XDP AF_XDP |
| #endif |
| |
| #ifndef SO_BUSY_POLL_BUDGET |
| #define SO_BUSY_POLL_BUDGET 70 |
| #endif |
| |
| #ifndef SO_PREFER_BUSY_POLL |
| #define SO_PREFER_BUSY_POLL 69 |
| #endif |
| |
| #define TEST_PASS 0 |
| #define TEST_FAILURE -1 |
| #define TEST_CONTINUE 1 |
| #define TEST_SKIP 2 |
| #define MAX_INTERFACES 2 |
| #define MAX_INTERFACE_NAME_CHARS 16 |
| #define MAX_TEST_NAME_SIZE 48 |
| #define MAX_TEARDOWN_ITER 10 |
| #define PKT_HDR_SIZE (sizeof(struct ethhdr) + 2) /* Just to align the data in the packet */ |
| #define MIN_PKT_SIZE 64 |
| #define MAX_ETH_PKT_SIZE 1518 |
| #define MAX_ETH_JUMBO_SIZE 9000 |
| #define USLEEP_MAX 10000 |
| #define SOCK_RECONF_CTR 10 |
| #define BATCH_SIZE 64 |
| #define POLL_TMOUT 1000 |
| #define THREAD_TMOUT 3 |
| #define DEFAULT_PKT_CNT (4 * 1024) |
| #define DEFAULT_UMEM_BUFFERS (DEFAULT_PKT_CNT / 4) |
| #define RX_FULL_RXQSIZE 32 |
| #define UMEM_HEADROOM_TEST_SIZE 128 |
| #define XSK_UMEM__INVALID_FRAME_SIZE (MAX_ETH_JUMBO_SIZE + 1) |
| #define XSK_UMEM__LARGE_FRAME_SIZE (3 * 1024) |
| #define XSK_UMEM__MAX_FRAME_SIZE (4 * 1024) |
| #define XSK_DESC__INVALID_OPTION (0xffff) |
| #define XSK_DESC__MAX_SKB_FRAGS 18 |
| #define HUGEPAGE_SIZE (2 * 1024 * 1024) |
| #define PKT_DUMP_NB_TO_PRINT 16 |
| #define RUN_ALL_TESTS UINT_MAX |
| #define NUM_MAC_ADDRESSES 4 |
| |
| #define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0) |
| |
| enum test_mode { |
| TEST_MODE_SKB, |
| TEST_MODE_DRV, |
| TEST_MODE_ZC, |
| TEST_MODE_ALL |
| }; |
| |
| struct xsk_umem_info { |
| struct xsk_ring_prod fq; |
| struct xsk_ring_cons cq; |
| struct xsk_umem *umem; |
| u64 next_buffer; |
| u32 num_frames; |
| u32 frame_headroom; |
| void *buffer; |
| u32 frame_size; |
| u32 base_addr; |
| bool unaligned_mode; |
| }; |
| |
| struct xsk_socket_info { |
| struct xsk_ring_cons rx; |
| struct xsk_ring_prod tx; |
| struct xsk_umem_info *umem; |
| struct xsk_socket *xsk; |
| struct pkt_stream *pkt_stream; |
| u32 outstanding_tx; |
| u32 rxqsize; |
| u8 dst_mac[ETH_ALEN]; |
| u8 src_mac[ETH_ALEN]; |
| }; |
| |
| struct pkt { |
| int offset; |
| u32 len; |
| u32 pkt_nb; |
| bool valid; |
| u16 options; |
| }; |
| |
| struct pkt_stream { |
| u32 nb_pkts; |
| u32 current_pkt_nb; |
| struct pkt *pkts; |
| u32 max_pkt_len; |
| u32 nb_rx_pkts; |
| u32 nb_valid_entries; |
| bool verbatim; |
| }; |
| |
| struct ifobject; |
| struct test_spec; |
| typedef int (*validation_func_t)(struct ifobject *ifobj); |
| typedef void *(*thread_func_t)(void *arg); |
| typedef int (*test_func_t)(struct test_spec *test); |
| |
| struct ifobject { |
| char ifname[MAX_INTERFACE_NAME_CHARS]; |
| struct xsk_socket_info *xsk; |
| struct xsk_socket_info *xsk_arr; |
| struct xsk_umem_info *umem; |
| thread_func_t func_ptr; |
| validation_func_t validation_func; |
| struct xsk_xdp_progs *xdp_progs; |
| struct bpf_map *xskmap; |
| struct bpf_program *xdp_prog; |
| enum test_mode mode; |
| int ifindex; |
| int mtu; |
| u32 bind_flags; |
| u32 xdp_zc_max_segs; |
| bool tx_on; |
| bool rx_on; |
| bool use_poll; |
| bool busy_poll; |
| bool use_fill_ring; |
| bool release_rx; |
| bool shared_umem; |
| bool use_metadata; |
| bool unaligned_supp; |
| bool multi_buff_supp; |
| bool multi_buff_zc_supp; |
| }; |
| |
| struct test_spec { |
| struct ifobject *ifobj_tx; |
| struct ifobject *ifobj_rx; |
| struct pkt_stream *tx_pkt_stream_default; |
| struct pkt_stream *rx_pkt_stream_default; |
| struct bpf_program *xdp_prog_rx; |
| struct bpf_program *xdp_prog_tx; |
| struct bpf_map *xskmap_rx; |
| struct bpf_map *xskmap_tx; |
| test_func_t test_func; |
| int mtu; |
| u16 total_steps; |
| u16 current_step; |
| u16 nb_sockets; |
| bool fail; |
| enum test_mode mode; |
| char name[MAX_TEST_NAME_SIZE]; |
| }; |
| |
| pthread_barrier_t barr; |
| pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER; |
| |
| int pkts_in_flight; |
| |
| static const u8 g_mac[ETH_ALEN] = {0x55, 0x44, 0x33, 0x22, 0x11, 0x00}; |
| |
| #endif /* XSKXCEIVER_H_ */ |