test_xsk.sh 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. # Copyright(c) 2020 Intel Corporation, Weqaar Janjua <weqaar.a.janjua@intel.com>
  4. # AF_XDP selftests based on veth
  5. #
  6. # End-to-end AF_XDP over Veth test
  7. #
  8. # Topology:
  9. # ---------
  10. # -----------
  11. # _ | Process | _
  12. # / ----------- \
  13. # / | \
  14. # / | \
  15. # ----------- | -----------
  16. # | Thread1 | | | Thread2 |
  17. # ----------- | -----------
  18. # | | |
  19. # ----------- | -----------
  20. # | xskX | | | xskY |
  21. # ----------- | -----------
  22. # | | |
  23. # ----------- | ----------
  24. # | vethX | --------- | vethY |
  25. # ----------- peer ----------
  26. #
  27. # AF_XDP is an address family optimized for high performance packet processing,
  28. # it is XDP’s user-space interface.
  29. #
  30. # An AF_XDP socket is linked to a single UMEM which is a region of virtual
  31. # contiguous memory, divided into equal-sized frames.
  32. #
  33. # Refer to AF_XDP Kernel Documentation for detailed information:
  34. # https://www.kernel.org/doc/html/latest/networking/af_xdp.html
  35. #
  36. # Prerequisites setup by script:
  37. #
  38. # Set up veth interfaces as per the topology shown ^^:
  39. # * setup two veth interfaces
  40. # ** veth<xxxx>
  41. # ** veth<yyyy>
  42. # *** xxxx and yyyy are randomly generated 4 digit numbers used to avoid
  43. # conflict with any existing interface
  44. # * tests the veth and xsk layers of the topology
  45. #
  46. # See the source xskxceiver.c for information on each test
  47. #
  48. # Kernel configuration:
  49. # ---------------------
  50. # See "config" file for recommended kernel config options.
  51. #
  52. # Turn on XDP sockets and veth support when compiling i.e.
  53. # Networking support -->
  54. # Networking options -->
  55. # [ * ] XDP sockets
  56. #
  57. # Executing Tests:
  58. # ----------------
  59. # Must run with CAP_NET_ADMIN capability.
  60. #
  61. # Run:
  62. # sudo ./test_xsk.sh
  63. #
  64. # If running from kselftests:
  65. # sudo make run_tests
  66. #
  67. # Run with verbose output:
  68. # sudo ./test_xsk.sh -v
  69. #
  70. # Set up veth interfaces and leave them up so xskxceiver can be launched in a debugger:
  71. # sudo ./test_xsk.sh -d
  72. #
  73. # Run test suite for physical device in loopback mode
  74. # sudo ./test_xsk.sh -i IFACE
  75. #
  76. # Run test suite in a specific mode only [skb,drv,zc]
  77. # sudo ./test_xsk.sh -m MODE
  78. #
  79. # List available tests
  80. # ./test_xsk.sh -l
  81. #
  82. # Run a specific test from the test suite
  83. # sudo ./test_xsk.sh -t TEST_NAME
  84. #
  85. # Display the available command line options
  86. # ./test_xsk.sh -h
  87. . xsk_prereqs.sh
  88. ETH=""
  89. while getopts "vi:dm:lt:h" flag
  90. do
  91. case "${flag}" in
  92. v) verbose=1;;
  93. d) debug=1;;
  94. i) ETH=${OPTARG};;
  95. m) MODE=${OPTARG};;
  96. l) list=1;;
  97. t) TEST=${OPTARG};;
  98. h) help=1;;
  99. esac
  100. done
  101. TEST_NAME="PREREQUISITES"
  102. URANDOM=/dev/urandom
  103. [ ! -e "${URANDOM}" ] && { echo "${URANDOM} not found. Skipping tests."; test_exit $ksft_fail; }
  104. VETH0_POSTFIX=$(cat ${URANDOM} | tr -dc '0-9' | fold -w 256 | head -n 1 | head --bytes 4)
  105. VETH0=ve${VETH0_POSTFIX}
  106. VETH1_POSTFIX=$(cat ${URANDOM} | tr -dc '0-9' | fold -w 256 | head -n 1 | head --bytes 4)
  107. VETH1=ve${VETH1_POSTFIX}
  108. MTU=1500
  109. trap ctrl_c INT
  110. function ctrl_c() {
  111. cleanup_exit ${VETH0} ${VETH1}
  112. exit 1
  113. }
  114. setup_vethPairs() {
  115. if [[ $verbose -eq 1 ]]; then
  116. echo "setting up ${VETH0}"
  117. fi
  118. ip link add ${VETH0} numtxqueues 4 numrxqueues 4 type veth peer name ${VETH1} numtxqueues 4 numrxqueues 4
  119. if [ -f /proc/net/if_inet6 ]; then
  120. echo 1 > /proc/sys/net/ipv6/conf/${VETH0}/disable_ipv6
  121. echo 1 > /proc/sys/net/ipv6/conf/${VETH1}/disable_ipv6
  122. fi
  123. if [[ $verbose -eq 1 ]]; then
  124. echo "setting up ${VETH1}"
  125. fi
  126. if [[ $busy_poll -eq 1 ]]; then
  127. echo 2 > /sys/class/net/${VETH0}/napi_defer_hard_irqs
  128. echo 200000 > /sys/class/net/${VETH0}/gro_flush_timeout
  129. echo 2 > /sys/class/net/${VETH1}/napi_defer_hard_irqs
  130. echo 200000 > /sys/class/net/${VETH1}/gro_flush_timeout
  131. fi
  132. ip link set ${VETH1} mtu ${MTU}
  133. ip link set ${VETH0} mtu ${MTU}
  134. ip link set ${VETH1} up
  135. ip link set ${VETH0} up
  136. }
  137. if [[ $list -eq 1 ]]; then
  138. ./${XSKOBJ} -l
  139. exit
  140. fi
  141. if [[ $help -eq 1 ]]; then
  142. ./${XSKOBJ}
  143. exit
  144. fi
  145. if [ ! -z $ETH ]; then
  146. VETH0=${ETH}
  147. VETH1=${ETH}
  148. else
  149. validate_root_exec
  150. validate_veth_support ${VETH0}
  151. validate_ip_utility
  152. setup_vethPairs
  153. retval=$?
  154. if [ $retval -ne 0 ]; then
  155. test_status $retval "${TEST_NAME}"
  156. cleanup_exit ${VETH0} ${VETH1}
  157. exit $retval
  158. fi
  159. fi
  160. if [[ $verbose -eq 1 ]]; then
  161. ARGS+="-v "
  162. fi
  163. if [ -n "$MODE" ]; then
  164. ARGS+="-m ${MODE} "
  165. fi
  166. if [ -n "$TEST" ]; then
  167. ARGS+="-t ${TEST} "
  168. fi
  169. retval=$?
  170. test_status $retval "${TEST_NAME}"
  171. ## START TESTS
  172. statusList=()
  173. TEST_NAME="XSK_SELFTESTS_${VETH0}_SOFTIRQ"
  174. if [[ $debug -eq 1 ]]; then
  175. echo "-i" ${VETH0} "-i" ${VETH1}
  176. exit
  177. fi
  178. exec_xskxceiver
  179. if [ -z $ETH ]; then
  180. cleanup_exit ${VETH0} ${VETH1}
  181. else
  182. cleanup_iface ${ETH} ${MTU}
  183. fi
  184. if [[ $list -eq 1 ]]; then
  185. exit
  186. fi
  187. TEST_NAME="XSK_SELFTESTS_${VETH0}_BUSY_POLL"
  188. busy_poll=1
  189. if [ -z $ETH ]; then
  190. setup_vethPairs
  191. fi
  192. exec_xskxceiver
  193. ## END TESTS
  194. if [ -z $ETH ]; then
  195. cleanup_exit ${VETH0} ${VETH1}
  196. else
  197. cleanup_iface ${ETH} ${MTU}
  198. fi
  199. failures=0
  200. echo -e "\nSummary:"
  201. for i in "${!statusList[@]}"
  202. do
  203. if [ ${statusList[$i]} -ne 0 ]; then
  204. test_status ${statusList[$i]} ${nameList[$i]}
  205. failures=1
  206. fi
  207. done
  208. if [ $failures -eq 0 ]; then
  209. echo "All tests successful!"
  210. fi