xskxceiver.h 3.8 KB

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