prp_ping.sh 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. ipv6=true
  4. source ./hsr_common.sh
  5. optstring="h4"
  6. usage() {
  7. echo "Usage: $0 [OPTION]"
  8. echo -e "\t-4: IPv4 only: disable IPv6 tests (default: test both IPv4 and IPv6)"
  9. }
  10. while getopts "$optstring" option;do
  11. case "$option" in
  12. "h")
  13. usage "$0"
  14. exit 0
  15. ;;
  16. "4")
  17. ipv6=false
  18. ;;
  19. "?")
  20. usage "$0"
  21. exit 1
  22. ;;
  23. esac
  24. done
  25. setup_prp_interfaces()
  26. {
  27. echo "INFO: Preparing interfaces for PRP"
  28. # Two PRP nodes, connected by two links (treated as LAN A and LAN B).
  29. #
  30. # vethA ----- vethA
  31. # prp1 prp2
  32. # vethB ----- vethB
  33. #
  34. # node1 node2
  35. # Interfaces
  36. # shellcheck disable=SC2154 # variables assigned by setup_ns
  37. ip link add vethA netns "$node1" type veth peer name vethA netns "$node2"
  38. ip link add vethB netns "$node1" type veth peer name vethB netns "$node2"
  39. # MAC addresses will be copied from LAN A interface
  40. ip -net "$node1" link set address 00:11:22:00:00:01 dev vethA
  41. ip -net "$node2" link set address 00:11:22:00:00:02 dev vethA
  42. # PRP
  43. ip -net "$node1" link add name prp1 type hsr \
  44. slave1 vethA slave2 vethB supervision 45 proto 1
  45. ip -net "$node2" link add name prp2 type hsr \
  46. slave1 vethA slave2 vethB supervision 45 proto 1
  47. # IP addresses
  48. ip -net "$node1" addr add 100.64.0.1/24 dev prp1
  49. ip -net "$node1" addr add dead:beef:0::1/64 dev prp1 nodad
  50. ip -net "$node2" addr add 100.64.0.2/24 dev prp2
  51. ip -net "$node2" addr add dead:beef:0::2/64 dev prp2 nodad
  52. # All links up
  53. ip -net "$node1" link set vethA up
  54. ip -net "$node1" link set vethB up
  55. ip -net "$node1" link set prp1 up
  56. ip -net "$node2" link set vethA up
  57. ip -net "$node2" link set vethB up
  58. ip -net "$node2" link set prp2 up
  59. }
  60. setup_vlan_interfaces()
  61. {
  62. # Interfaces
  63. ip -net "$node1" link add link prp1 name prp1.2 type vlan id 2
  64. ip -net "$node2" link add link prp2 name prp2.2 type vlan id 2
  65. # IP addresses
  66. ip -net "$node1" addr add 100.64.2.1/24 dev prp1.2
  67. ip -net "$node1" addr add dead:beef:2::1/64 dev prp1.2 nodad
  68. ip -net "$node2" addr add 100.64.2.2/24 dev prp2.2
  69. ip -net "$node2" addr add dead:beef:2::2/64 dev prp2.2 nodad
  70. # All links up
  71. ip -net "$node1" link set prp1.2 up
  72. ip -net "$node2" link set prp2.2 up
  73. }
  74. do_ping_tests()
  75. {
  76. local netid="$1"
  77. echo "INFO: Initial validation ping"
  78. do_ping "$node1" "100.64.$netid.2"
  79. do_ping "$node2" "100.64.$netid.1"
  80. stop_if_error "Initial validation failed on IPv4"
  81. do_ping "$node1" "dead:beef:$netid::2"
  82. do_ping "$node2" "dead:beef:$netid::1"
  83. stop_if_error "Initial validation failed on IPv6"
  84. echo "INFO: Longer ping test."
  85. do_ping_long "$node1" "100.64.$netid.2"
  86. do_ping_long "$node2" "100.64.$netid.1"
  87. stop_if_error "Longer ping test failed on IPv4."
  88. do_ping_long "$node1" "dead:beef:$netid::2"
  89. do_ping_long "$node2" "dead:beef:$netid::1"
  90. stop_if_error "Longer ping test failed on IPv6."
  91. }
  92. run_ping_tests()
  93. {
  94. echo "INFO: Running ping tests"
  95. do_ping_tests 0
  96. }
  97. run_vlan_ping_tests()
  98. {
  99. vlan_challenged_prp1=$(ip net exec "$node1" ethtool -k prp1 | \
  100. grep "vlan-challenged" | awk '{print $2}')
  101. vlan_challenged_prp2=$(ip net exec "$node2" ethtool -k prp2 | \
  102. grep "vlan-challenged" | awk '{print $2}')
  103. if [[ "$vlan_challenged_prp1" = "off" || \
  104. "$vlan_challenged_prp2" = "off" ]]; then
  105. echo "INFO: Running VLAN ping tests"
  106. setup_vlan_interfaces
  107. do_ping_tests 2
  108. else
  109. echo "INFO: Not Running VLAN tests as the device does not support VLAN"
  110. fi
  111. }
  112. check_prerequisites
  113. trap cleanup_all_ns EXIT
  114. setup_ns node1 node2
  115. setup_prp_interfaces
  116. run_ping_tests
  117. run_vlan_ping_tests
  118. exit $ret