setup_loopback.sh 2.6 KB

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