vlan_bridge_binding.sh 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. source lib.sh
  4. ALL_TESTS="
  5. test_binding_on
  6. test_binding_off
  7. test_binding_toggle_on
  8. test_binding_toggle_off
  9. test_binding_toggle_on_when_upper_down
  10. test_binding_toggle_off_when_upper_down
  11. test_binding_toggle_on_when_lower_down
  12. test_binding_toggle_off_when_lower_down
  13. "
  14. setup_prepare()
  15. {
  16. local port
  17. adf_ip_link_add br up type bridge vlan_filtering 1
  18. for port in d1 d2 d3; do
  19. adf_ip_link_add $port type veth peer name r$port
  20. adf_ip_link_set_up $port
  21. adf_ip_link_set_up r$port
  22. adf_ip_link_set_master $port br
  23. done
  24. adf_bridge_vlan_add vid 11 dev br self
  25. adf_bridge_vlan_add vid 11 dev d1 master
  26. adf_bridge_vlan_add vid 12 dev br self
  27. adf_bridge_vlan_add vid 12 dev d2 master
  28. adf_bridge_vlan_add vid 13 dev br self
  29. adf_bridge_vlan_add vid 13 dev d1 master
  30. adf_bridge_vlan_add vid 13 dev d2 master
  31. adf_bridge_vlan_add vid 14 dev br self
  32. adf_bridge_vlan_add vid 14 dev d1 master
  33. adf_bridge_vlan_add vid 14 dev d2 master
  34. adf_bridge_vlan_add vid 14 dev d3 master
  35. }
  36. operstate_is()
  37. {
  38. local dev=$1; shift
  39. local expect=$1; shift
  40. local operstate=$(ip -j link show $dev | jq -r .[].operstate)
  41. if [[ $operstate == UP ]]; then
  42. operstate=1
  43. elif [[ $operstate == DOWN || $operstate == LOWERLAYERDOWN ]]; then
  44. operstate=0
  45. fi
  46. echo -n $operstate
  47. [[ $operstate == $expect ]]
  48. }
  49. check_operstate()
  50. {
  51. local dev=$1; shift
  52. local expect=$1; shift
  53. local operstate
  54. operstate=$(busywait 1000 \
  55. operstate_is "$dev" "$expect")
  56. check_err $? "Got operstate of $operstate, expected $expect"
  57. }
  58. add_one_vlan()
  59. {
  60. local link=$1; shift
  61. local id=$1; shift
  62. adf_ip_link_add $link.$id link $link type vlan id $id "$@"
  63. }
  64. add_vlans()
  65. {
  66. add_one_vlan br 11 "$@"
  67. add_one_vlan br 12 "$@"
  68. add_one_vlan br 13 "$@"
  69. add_one_vlan br 14 "$@"
  70. }
  71. set_vlans()
  72. {
  73. ip link set dev br.11 "$@"
  74. ip link set dev br.12 "$@"
  75. ip link set dev br.13 "$@"
  76. ip link set dev br.14 "$@"
  77. }
  78. down_netdevs()
  79. {
  80. local dev
  81. for dev in "$@"; do
  82. adf_ip_link_set_down $dev
  83. done
  84. }
  85. check_operstates()
  86. {
  87. local opst_11=$1; shift
  88. local opst_12=$1; shift
  89. local opst_13=$1; shift
  90. local opst_14=$1; shift
  91. check_operstate br.11 $opst_11
  92. check_operstate br.12 $opst_12
  93. check_operstate br.13 $opst_13
  94. check_operstate br.14 $opst_14
  95. }
  96. do_test_binding()
  97. {
  98. local inject=$1; shift
  99. local what=$1; shift
  100. local opsts_d1=$1; shift
  101. local opsts_d2=$1; shift
  102. local opsts_d12=$1; shift
  103. local opsts_d123=$1; shift
  104. RET=0
  105. defer_scope_push
  106. down_netdevs d1
  107. $inject
  108. check_operstates $opsts_d1
  109. defer_scope_pop
  110. defer_scope_push
  111. down_netdevs d2
  112. $inject
  113. check_operstates $opsts_d2
  114. defer_scope_pop
  115. defer_scope_push
  116. down_netdevs d1 d2
  117. $inject
  118. check_operstates $opsts_d12
  119. defer_scope_pop
  120. defer_scope_push
  121. down_netdevs d1 d2 d3
  122. $inject
  123. check_operstates $opsts_d123
  124. defer_scope_pop
  125. log_test "Test bridge_binding $what"
  126. }
  127. do_test_binding_on()
  128. {
  129. local inject=$1; shift
  130. local what=$1; shift
  131. do_test_binding "$inject" "$what" \
  132. "0 1 1 1" \
  133. "1 0 1 1" \
  134. "0 0 0 1" \
  135. "0 0 0 0"
  136. }
  137. do_test_binding_off()
  138. {
  139. local inject=$1; shift
  140. local what=$1; shift
  141. do_test_binding "$inject" "$what" \
  142. "1 1 1 1" \
  143. "1 1 1 1" \
  144. "1 1 1 1" \
  145. "0 0 0 0"
  146. }
  147. test_binding_on()
  148. {
  149. add_vlans bridge_binding on
  150. set_vlans up
  151. do_test_binding_on : "on"
  152. }
  153. test_binding_off()
  154. {
  155. add_vlans bridge_binding off
  156. set_vlans up
  157. do_test_binding_off : "off"
  158. }
  159. test_binding_toggle_on()
  160. {
  161. add_vlans bridge_binding off
  162. set_vlans up
  163. set_vlans type vlan bridge_binding on
  164. do_test_binding_on : "off->on"
  165. }
  166. test_binding_toggle_off()
  167. {
  168. add_vlans bridge_binding on
  169. set_vlans up
  170. set_vlans type vlan bridge_binding off
  171. do_test_binding_off : "on->off"
  172. }
  173. adf_set_binding_on()
  174. {
  175. set_vlans type vlan bridge_binding on
  176. defer set_vlans type vlan bridge_binding off
  177. }
  178. adf_set_binding_off()
  179. {
  180. set_vlans type vlan bridge_binding off
  181. defer set_vlans type vlan bridge_binding on
  182. }
  183. test_binding_toggle_on_when_lower_down()
  184. {
  185. add_vlans bridge_binding off
  186. set_vlans up
  187. do_test_binding_on adf_set_binding_on "off->on when lower down"
  188. }
  189. test_binding_toggle_off_when_lower_down()
  190. {
  191. add_vlans bridge_binding on
  192. set_vlans up
  193. do_test_binding_off adf_set_binding_off "on->off when lower down"
  194. }
  195. test_binding_toggle_on_when_upper_down()
  196. {
  197. add_vlans bridge_binding off
  198. set_vlans type vlan bridge_binding on
  199. set_vlans up
  200. do_test_binding_on : "off->on when upper down"
  201. }
  202. test_binding_toggle_off_when_upper_down()
  203. {
  204. add_vlans bridge_binding on
  205. set_vlans type vlan bridge_binding off
  206. set_vlans up
  207. do_test_binding_off : "on->off when upper down"
  208. }
  209. require_command jq
  210. trap defer_scopes_cleanup EXIT
  211. setup_prepare
  212. tests_run
  213. exit $EXIT_STATUS