0001
0002
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