lag_lib.sh 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. NAMESPACES=""
  4. # Test that a link aggregation device (bonding, team) removes the hardware
  5. # addresses that it adds on its underlying devices.
  6. test_LAG_cleanup()
  7. {
  8. local driver=$1
  9. local mode=$2
  10. local ucaddr="02:00:00:12:34:56"
  11. local addr6="fe80::78:9abc/64"
  12. local mcaddr="33:33:ff:78:9a:bc"
  13. local name
  14. ip link add dummy1 type dummy
  15. ip link add dummy2 type dummy
  16. if [ "$driver" = "bonding" ]; then
  17. name="bond1"
  18. ip link add "$name" up type bond mode "$mode"
  19. ip link set dev dummy1 master "$name"
  20. ip link set dev dummy2 master "$name"
  21. elif [ "$driver" = "team" ]; then
  22. name="team0"
  23. teamd -d -c '
  24. {
  25. "device": "'"$name"'",
  26. "runner": {
  27. "name": "'"$mode"'"
  28. },
  29. "ports": {
  30. "dummy1":
  31. {},
  32. "dummy2":
  33. {}
  34. }
  35. }
  36. '
  37. ip link set dev "$name" up
  38. else
  39. check_err 1
  40. log_test test_LAG_cleanup ": unknown driver \"$driver\""
  41. return
  42. fi
  43. # Used to test dev->uc handling
  44. ip link add mv0 link "$name" up address "$ucaddr" type macvlan
  45. # Used to test dev->mc handling
  46. ip address add "$addr6" dev "$name"
  47. # Check that addresses were added as expected
  48. (grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy1 ||
  49. grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy2) >/dev/null
  50. check_err $? "macvlan unicast address not found on a slave"
  51. # mcaddr is added asynchronously by addrconf_dad_work(), use busywait
  52. (busywait 10000 grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy1 ||
  53. grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy2) >/dev/null
  54. check_err $? "IPv6 solicited-node multicast mac address not found on a slave"
  55. ip link set dev "$name" down
  56. ip link del "$name"
  57. not grep_bridge_fdb "$ucaddr" bridge fdb show >/dev/null
  58. check_err $? "macvlan unicast address still present on a slave"
  59. not grep_bridge_fdb "$mcaddr" bridge fdb show >/dev/null
  60. check_err $? "IPv6 solicited-node multicast mac address still present on a slave"
  61. cleanup
  62. log_test "$driver cleanup mode $mode"
  63. }
  64. # Build a generic 2 node net namespace with 2 connections
  65. # between the namespaces
  66. #
  67. # +-----------+ +-----------+
  68. # | node1 | | node2 |
  69. # | | | |
  70. # | | | |
  71. # | eth0 +-------+ eth0 |
  72. # | | | |
  73. # | eth1 +-------+ eth1 |
  74. # | | | |
  75. # +-----------+ +-----------+
  76. lag_setup2x2()
  77. {
  78. local state=${1:-down}
  79. local namespaces="lag_node1 lag_node2"
  80. # create namespaces
  81. for n in ${namespaces}; do
  82. ip netns add ${n}
  83. done
  84. # wire up namespaces
  85. ip link add name lag1 type veth peer name lag1-end
  86. ip link set dev lag1 netns lag_node1 $state name eth0
  87. ip link set dev lag1-end netns lag_node2 $state name eth0
  88. ip link add name lag1 type veth peer name lag1-end
  89. ip link set dev lag1 netns lag_node1 $state name eth1
  90. ip link set dev lag1-end netns lag_node2 $state name eth1
  91. NAMESPACES="${namespaces}"
  92. }
  93. # cleanup all lag related namespaces
  94. lag_cleanup()
  95. {
  96. for n in ${NAMESPACES}; do
  97. ip netns delete ${n} >/dev/null 2>&1 || true
  98. done
  99. }
  100. SWITCH="lag_node1"
  101. CLIENT="lag_node2"
  102. CLIENTIP="172.20.2.1"
  103. SWITCHIP="172.20.2.2"
  104. lag_setup_network()
  105. {
  106. lag_setup2x2 "down"
  107. # create switch
  108. ip netns exec ${SWITCH} ip link add br0 up type bridge
  109. ip netns exec ${SWITCH} ip link set eth0 master br0 up
  110. ip netns exec ${SWITCH} ip link set eth1 master br0 up
  111. ip netns exec ${SWITCH} ip addr add ${SWITCHIP}/24 dev br0
  112. }
  113. lag_reset_network()
  114. {
  115. ip netns exec ${CLIENT} ip link del bond0
  116. ip netns exec ${SWITCH} ip link set eth0 up
  117. ip netns exec ${SWITCH} ip link set eth1 up
  118. }
  119. create_bond()
  120. {
  121. # create client
  122. ip netns exec ${CLIENT} ip link set eth0 down
  123. ip netns exec ${CLIENT} ip link set eth1 down
  124. ip netns exec ${CLIENT} ip link add bond0 type bond $@
  125. ip netns exec ${CLIENT} ip link set eth0 master bond0
  126. ip netns exec ${CLIENT} ip link set eth1 master bond0
  127. ip netns exec ${CLIENT} ip link set bond0 up
  128. ip netns exec ${CLIENT} ip addr add ${CLIENTIP}/24 dev bond0
  129. }
  130. test_bond_recovery()
  131. {
  132. RET=0
  133. create_bond $@
  134. # verify connectivity
  135. slowwait 2 ip netns exec ${CLIENT} ping ${SWITCHIP} -c 2 -W 0.1 &> /dev/null
  136. check_err $? "No connectivity"
  137. # force the links of the bond down
  138. ip netns exec ${SWITCH} ip link set eth0 down
  139. sleep 2
  140. ip netns exec ${SWITCH} ip link set eth0 up
  141. ip netns exec ${SWITCH} ip link set eth1 down
  142. # re-verify connectivity
  143. slowwait 2 ip netns exec ${CLIENT} ping ${SWITCHIP} -c 2 -W 0.1 &> /dev/null
  144. local rc=$?
  145. check_err $rc "Bond failed to recover"
  146. log_test "$1 ($2) bond recovery"
  147. lag_reset_network
  148. }