setup_loopback.sh 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. readonly FLUSH_PATH="/sys/class/net/${dev}/gro_flush_timeout"
  4. readonly IRQ_PATH="/sys/class/net/${dev}/napi_defer_hard_irqs"
  5. readonly FLUSH_TIMEOUT="$(< ${FLUSH_PATH})"
  6. readonly HARD_IRQS="$(< ${IRQ_PATH})"
  7. readonly server_ns=$(mktemp -u server-XXXXXXXX)
  8. readonly client_ns=$(mktemp -u client-XXXXXXXX)
  9. netdev_check_for_carrier() {
  10. local -r dev="$1"
  11. for i in {1..5}; do
  12. carrier="$(cat /sys/class/net/${dev}/carrier)"
  13. if [[ "${carrier}" -ne 1 ]] ; then
  14. echo "carrier not ready yet..." >&2
  15. sleep 1
  16. else
  17. echo "carrier ready" >&2
  18. break
  19. fi
  20. done
  21. echo "${carrier}"
  22. }
  23. # Assumes that there is no existing ipvlan device on the physical device
  24. setup_loopback_environment() {
  25. local dev="$1"
  26. # Fail hard if cannot turn on loopback mode for current NIC
  27. ethtool -K "${dev}" loopback on || exit 1
  28. sleep 1
  29. # Check for the carrier
  30. carrier=$(netdev_check_for_carrier ${dev})
  31. if [[ "${carrier}" -ne 1 ]] ; then
  32. echo "setup_loopback_environment failed"
  33. exit 1
  34. fi
  35. }
  36. setup_macvlan_ns(){
  37. local -r link_dev="$1"
  38. local -r ns_name="$2"
  39. local -r ns_dev="$3"
  40. local -r ns_mac="$4"
  41. local -r addr="$5"
  42. ip link add link "${link_dev}" dev "${ns_dev}" \
  43. address "${ns_mac}" type macvlan
  44. exit_code=$?
  45. if [[ "${exit_code}" -ne 0 ]]; then
  46. echo "setup_macvlan_ns failed"
  47. exit $exit_code
  48. fi
  49. [[ -e /var/run/netns/"${ns_name}" ]] || ip netns add "${ns_name}"
  50. ip link set dev "${ns_dev}" netns "${ns_name}"
  51. ip -netns "${ns_name}" link set dev "${ns_dev}" up
  52. if [[ -n "${addr}" ]]; then
  53. ip -netns "${ns_name}" addr add dev "${ns_dev}" "${addr}"
  54. fi
  55. sleep 1
  56. }
  57. cleanup_macvlan_ns(){
  58. while (( $# >= 2 )); do
  59. ns_name="$1"
  60. ns_dev="$2"
  61. ip -netns "${ns_name}" link del dev "${ns_dev}"
  62. ip netns del "${ns_name}"
  63. shift 2
  64. done
  65. }
  66. cleanup_loopback(){
  67. local -r dev="$1"
  68. ethtool -K "${dev}" loopback off
  69. sleep 1
  70. # Check for the carrier
  71. carrier=$(netdev_check_for_carrier ${dev})
  72. if [[ "${carrier}" -ne 1 ]] ; then
  73. echo "setup_loopback_environment failed"
  74. exit 1
  75. fi
  76. }
  77. setup_interrupt() {
  78. # Use timer on host to trigger the network stack
  79. # Also disable device interrupt to not depend on NIC interrupt
  80. # Reduce test flakiness caused by unexpected interrupts
  81. echo 100000 >"${FLUSH_PATH}"
  82. echo 50 >"${IRQ_PATH}"
  83. }
  84. setup_ns() {
  85. # Set up server_ns namespace and client_ns namespace
  86. setup_macvlan_ns "${dev}" ${server_ns} server "${SERVER_MAC}"
  87. setup_macvlan_ns "${dev}" ${client_ns} client "${CLIENT_MAC}"
  88. }
  89. cleanup_ns() {
  90. cleanup_macvlan_ns ${server_ns} server ${client_ns} client
  91. }
  92. setup() {
  93. setup_loopback_environment "${dev}"
  94. setup_interrupt
  95. }
  96. cleanup() {
  97. cleanup_loopback "${dev}"
  98. echo "${FLUSH_TIMEOUT}" >"${FLUSH_PATH}"
  99. echo "${HARD_IRQS}" >"${IRQ_PATH}"
  100. }