cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

xdpxceiver.h (3780B)


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