Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0
0002  * Copyright(c) 2020 Intel Corporation.
0003  */
0004 
0005 #ifndef XSKXCEIVER_H_
0006 #define XSKXCEIVER_H_
0007 
0008 #ifndef SOL_XDP
0009 #define SOL_XDP 283
0010 #endif
0011 
0012 #ifndef AF_XDP
0013 #define AF_XDP 44
0014 #endif
0015 
0016 #ifndef PF_XDP
0017 #define PF_XDP AF_XDP
0018 #endif
0019 
0020 #ifndef SO_BUSY_POLL_BUDGET
0021 #define SO_BUSY_POLL_BUDGET 70
0022 #endif
0023 
0024 #ifndef SO_PREFER_BUSY_POLL
0025 #define SO_PREFER_BUSY_POLL 69
0026 #endif
0027 
0028 #define TEST_PASS 0
0029 #define TEST_FAILURE -1
0030 #define MAX_INTERFACES 2
0031 #define MAX_INTERFACE_NAME_CHARS 7
0032 #define MAX_INTERFACES_NAMESPACE_CHARS 10
0033 #define MAX_SOCKETS 2
0034 #define MAX_TEST_NAME_SIZE 32
0035 #define MAX_TEARDOWN_ITER 10
0036 #define PKT_HDR_SIZE (sizeof(struct ethhdr) + sizeof(struct iphdr) + \
0037             sizeof(struct udphdr))
0038 #define MIN_ETH_PKT_SIZE 64
0039 #define ETH_FCS_SIZE 4
0040 #define MIN_PKT_SIZE (MIN_ETH_PKT_SIZE - ETH_FCS_SIZE)
0041 #define PKT_SIZE (MIN_PKT_SIZE)
0042 #define IP_PKT_SIZE (PKT_SIZE - sizeof(struct ethhdr))
0043 #define IP_PKT_VER 0x4
0044 #define IP_PKT_TOS 0x9
0045 #define UDP_PKT_SIZE (IP_PKT_SIZE - sizeof(struct iphdr))
0046 #define UDP_PKT_DATA_SIZE (UDP_PKT_SIZE - sizeof(struct udphdr))
0047 #define USLEEP_MAX 10000
0048 #define SOCK_RECONF_CTR 10
0049 #define BATCH_SIZE 64
0050 #define POLL_TMOUT 1000
0051 #define RECV_TMOUT 3
0052 #define DEFAULT_PKT_CNT (4 * 1024)
0053 #define DEFAULT_UMEM_BUFFERS (DEFAULT_PKT_CNT / 4)
0054 #define UMEM_SIZE (DEFAULT_UMEM_BUFFERS * XSK_UMEM__DEFAULT_FRAME_SIZE)
0055 #define RX_FULL_RXQSIZE 32
0056 #define UMEM_HEADROOM_TEST_SIZE 128
0057 #define XSK_UMEM__INVALID_FRAME_SIZE (XSK_UMEM__DEFAULT_FRAME_SIZE + 1)
0058 
0059 #define print_verbose(x...) do { if (opt_verbose) ksft_print_msg(x); } while (0)
0060 
0061 enum test_mode {
0062     TEST_MODE_SKB,
0063     TEST_MODE_DRV,
0064     TEST_MODE_MAX
0065 };
0066 
0067 enum test_type {
0068     TEST_TYPE_RUN_TO_COMPLETION,
0069     TEST_TYPE_RUN_TO_COMPLETION_2K_FRAME,
0070     TEST_TYPE_RUN_TO_COMPLETION_SINGLE_PKT,
0071     TEST_TYPE_POLL,
0072     TEST_TYPE_UNALIGNED,
0073     TEST_TYPE_ALIGNED_INV_DESC,
0074     TEST_TYPE_ALIGNED_INV_DESC_2K_FRAME,
0075     TEST_TYPE_UNALIGNED_INV_DESC,
0076     TEST_TYPE_HEADROOM,
0077     TEST_TYPE_TEARDOWN,
0078     TEST_TYPE_BIDI,
0079     TEST_TYPE_STATS_RX_DROPPED,
0080     TEST_TYPE_STATS_TX_INVALID_DESCS,
0081     TEST_TYPE_STATS_RX_FULL,
0082     TEST_TYPE_STATS_FILL_EMPTY,
0083     TEST_TYPE_BPF_RES,
0084     TEST_TYPE_MAX
0085 };
0086 
0087 static bool opt_pkt_dump;
0088 static bool opt_verbose;
0089 
0090 struct xsk_umem_info {
0091     struct xsk_ring_prod fq;
0092     struct xsk_ring_cons cq;
0093     struct xsk_umem *umem;
0094     u32 num_frames;
0095     u32 frame_headroom;
0096     void *buffer;
0097     u32 frame_size;
0098     bool unaligned_mode;
0099 };
0100 
0101 struct xsk_socket_info {
0102     struct xsk_ring_cons rx;
0103     struct xsk_ring_prod tx;
0104     struct xsk_umem_info *umem;
0105     struct xsk_socket *xsk;
0106     u32 outstanding_tx;
0107     u32 rxqsize;
0108 };
0109 
0110 struct pkt {
0111     u64 addr;
0112     u32 len;
0113     u32 payload;
0114     bool valid;
0115 };
0116 
0117 struct pkt_stream {
0118     u32 nb_pkts;
0119     u32 rx_pkt_nb;
0120     struct pkt *pkts;
0121     bool use_addr_for_fill;
0122 };
0123 
0124 struct ifobject;
0125 typedef int (*validation_func_t)(struct ifobject *ifobj);
0126 typedef void *(*thread_func_t)(void *arg);
0127 
0128 struct ifobject {
0129     char ifname[MAX_INTERFACE_NAME_CHARS];
0130     char nsname[MAX_INTERFACES_NAMESPACE_CHARS];
0131     struct xsk_socket_info *xsk;
0132     struct xsk_socket_info *xsk_arr;
0133     struct xsk_umem_info *umem;
0134     thread_func_t func_ptr;
0135     validation_func_t validation_func;
0136     struct pkt_stream *pkt_stream;
0137     int ns_fd;
0138     int xsk_map_fd;
0139     u32 dst_ip;
0140     u32 src_ip;
0141     u32 xdp_flags;
0142     u32 bind_flags;
0143     u16 src_port;
0144     u16 dst_port;
0145     bool tx_on;
0146     bool rx_on;
0147     bool use_poll;
0148     bool busy_poll;
0149     bool use_fill_ring;
0150     bool release_rx;
0151     u8 dst_mac[ETH_ALEN];
0152     u8 src_mac[ETH_ALEN];
0153 };
0154 
0155 struct test_spec {
0156     struct ifobject *ifobj_tx;
0157     struct ifobject *ifobj_rx;
0158     struct pkt_stream *pkt_stream_default;
0159     u16 total_steps;
0160     u16 current_step;
0161     u16 nb_sockets;
0162     bool fail;
0163     char name[MAX_TEST_NAME_SIZE];
0164 };
0165 
0166 pthread_barrier_t barr;
0167 pthread_mutex_t pacing_mutex = PTHREAD_MUTEX_INITIALIZER;
0168 pthread_cond_t pacing_cond = PTHREAD_COND_INITIALIZER;
0169 
0170 int pkts_in_flight;
0171 
0172 #endif              /* XSKXCEIVER_H_ */