test_vxlan_fdb_changelink.sh 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. ALL_TESTS="
  4. test_set_remote
  5. test_change_mc_remote
  6. "
  7. source lib.sh
  8. check_remotes()
  9. {
  10. local what=$1; shift
  11. local N=$(bridge fdb sh dev vx | grep 00:00:00:00:00:00 | wc -l)
  12. ((N == 2))
  13. check_err $? "expected 2 remotes after $what, got $N"
  14. }
  15. # Check FDB default-remote handling across "ip link set".
  16. test_set_remote()
  17. {
  18. RET=0
  19. adf_ip_link_add vx up type vxlan id 2000 dstport 4789
  20. bridge fdb ap dev vx 00:00:00:00:00:00 dst 192.0.2.20 self permanent
  21. bridge fdb ap dev vx 00:00:00:00:00:00 dst 192.0.2.30 self permanent
  22. check_remotes "fdb append"
  23. ip link set dev vx type vxlan remote 192.0.2.30
  24. check_remotes "link set"
  25. log_test 'FDB default-remote handling across "ip link set"'
  26. }
  27. fmt_remote()
  28. {
  29. local addr=$1; shift
  30. if [[ $addr == 224.* ]]; then
  31. echo "group $addr"
  32. else
  33. echo "remote $addr"
  34. fi
  35. }
  36. change_remote()
  37. {
  38. local remote=$1; shift
  39. ip link set dev vx type vxlan $(fmt_remote $remote) dev v1
  40. }
  41. check_membership()
  42. {
  43. local check_vec=("$@")
  44. local memberships
  45. memberships=$(
  46. netstat -n --groups |
  47. sed -n '/^v1\b/p' |
  48. grep -o '[^ ]*$'
  49. )
  50. check_err $? "Couldn't obtain group memberships"
  51. local item
  52. for item in "${check_vec[@]}"; do
  53. eval "local $item"
  54. echo "$memberships" | grep -q "\b$group\b"
  55. check_err_fail $fail $? "$group is_ex reported in IGMP query response"
  56. done
  57. }
  58. test_change_mc_remote()
  59. {
  60. check_command netstat || return
  61. adf_ip_link_add v1 up type veth peer name v2
  62. adf_ip_link_set_up v2
  63. RET=0
  64. adf_ip_link_add vx up type vxlan dstport 4789 \
  65. local 192.0.2.1 $(fmt_remote 224.1.1.1) dev v1 vni 1000
  66. check_membership "group=224.1.1.1 fail=0" \
  67. "group=224.1.1.2 fail=1" \
  68. "group=224.1.1.3 fail=1"
  69. log_test "MC group report after VXLAN creation"
  70. RET=0
  71. change_remote 224.1.1.2
  72. check_membership "group=224.1.1.1 fail=1" \
  73. "group=224.1.1.2 fail=0" \
  74. "group=224.1.1.3 fail=1"
  75. log_test "MC group report after changing VXLAN remote MC->MC"
  76. RET=0
  77. change_remote 192.0.2.2
  78. check_membership "group=224.1.1.1 fail=1" \
  79. "group=224.1.1.2 fail=1" \
  80. "group=224.1.1.3 fail=1"
  81. log_test "MC group report after changing VXLAN remote MC->UC"
  82. }
  83. trap defer_scopes_cleanup EXIT
  84. tests_run
  85. exit $EXIT_STATUS