bridge_vlan_dump.sh 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. #
  4. # Test bridge VLAN range grouping. VLANs are collapsed into a range entry in
  5. # the dump if they have the same per-VLAN options. These tests verify that
  6. # VLANs with different per-VLAN option values are not grouped together.
  7. # shellcheck disable=SC1091,SC2034,SC2154,SC2317
  8. source lib.sh
  9. ALL_TESTS="
  10. vlan_range_neigh_suppress
  11. vlan_range_mcast_max_groups
  12. vlan_range_mcast_n_groups
  13. vlan_range_mcast_enabled
  14. "
  15. setup_prepare()
  16. {
  17. setup_ns NS
  18. defer cleanup_all_ns
  19. ip -n "$NS" link add name br0 type bridge vlan_filtering 1 \
  20. vlan_default_pvid 0 mcast_snooping 1 mcast_vlan_snooping 1
  21. ip -n "$NS" link set dev br0 up
  22. ip -n "$NS" link add name dummy0 type dummy
  23. ip -n "$NS" link set dev dummy0 master br0
  24. ip -n "$NS" link set dev dummy0 up
  25. }
  26. vlan_range_neigh_suppress()
  27. {
  28. RET=0
  29. # Add two new consecutive VLANs for range grouping test
  30. bridge -n "$NS" vlan add vid 10 dev dummy0
  31. defer bridge -n "$NS" vlan del vid 10 dev dummy0
  32. bridge -n "$NS" vlan add vid 11 dev dummy0
  33. defer bridge -n "$NS" vlan del vid 11 dev dummy0
  34. # Configure different neigh_suppress values and verify no range grouping
  35. bridge -n "$NS" vlan set vid 10 dev dummy0 neigh_suppress on
  36. check_err $? "Failed to set neigh_suppress for VLAN 10"
  37. bridge -n "$NS" vlan set vid 11 dev dummy0 neigh_suppress off
  38. check_err $? "Failed to set neigh_suppress for VLAN 11"
  39. # Verify VLANs are not shown as a range, but individual entries exist
  40. bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11"
  41. check_fail $? "VLANs with different neigh_suppress incorrectly grouped"
  42. bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+10$|^\s+10$"
  43. check_err $? "VLAN 10 individual entry not found"
  44. bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+11$|^\s+11$"
  45. check_err $? "VLAN 11 individual entry not found"
  46. # Configure same neigh_suppress value and verify range grouping
  47. bridge -n "$NS" vlan set vid 11 dev dummy0 neigh_suppress on
  48. check_err $? "Failed to set neigh_suppress for VLAN 11"
  49. bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11"
  50. check_err $? "VLANs with same neigh_suppress not grouped"
  51. log_test "VLAN range grouping with neigh_suppress"
  52. }
  53. vlan_range_mcast_max_groups()
  54. {
  55. RET=0
  56. # Add two new consecutive VLANs for range grouping test
  57. bridge -n "$NS" vlan add vid 10 dev dummy0
  58. defer bridge -n "$NS" vlan del vid 10 dev dummy0
  59. bridge -n "$NS" vlan add vid 11 dev dummy0
  60. defer bridge -n "$NS" vlan del vid 11 dev dummy0
  61. # Configure different mcast_max_groups values and verify no range grouping
  62. bridge -n "$NS" vlan set vid 10 dev dummy0 mcast_max_groups 100
  63. check_err $? "Failed to set mcast_max_groups for VLAN 10"
  64. bridge -n "$NS" vlan set vid 11 dev dummy0 mcast_max_groups 200
  65. check_err $? "Failed to set mcast_max_groups for VLAN 11"
  66. # Verify VLANs are not shown as a range, but individual entries exist
  67. bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11"
  68. check_fail $? "VLANs with different mcast_max_groups incorrectly grouped"
  69. bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+10$|^\s+10$"
  70. check_err $? "VLAN 10 individual entry not found"
  71. bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+11$|^\s+11$"
  72. check_err $? "VLAN 11 individual entry not found"
  73. # Configure same mcast_max_groups value and verify range grouping
  74. bridge -n "$NS" vlan set vid 11 dev dummy0 mcast_max_groups 100
  75. check_err $? "Failed to set mcast_max_groups for VLAN 11"
  76. bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11"
  77. check_err $? "VLANs with same mcast_max_groups not grouped"
  78. log_test "VLAN range grouping with mcast_max_groups"
  79. }
  80. vlan_range_mcast_n_groups()
  81. {
  82. RET=0
  83. # Add two new consecutive VLANs for range grouping test
  84. bridge -n "$NS" vlan add vid 10 dev dummy0
  85. defer bridge -n "$NS" vlan del vid 10 dev dummy0
  86. bridge -n "$NS" vlan add vid 11 dev dummy0
  87. defer bridge -n "$NS" vlan del vid 11 dev dummy0
  88. # Add different numbers of multicast groups to each VLAN
  89. bridge -n "$NS" mdb add dev br0 port dummy0 grp 239.1.1.1 vid 10
  90. check_err $? "Failed to add mdb entry to VLAN 10"
  91. defer bridge -n "$NS" mdb del dev br0 port dummy0 grp 239.1.1.1 vid 10
  92. bridge -n "$NS" mdb add dev br0 port dummy0 grp 239.1.1.2 vid 10
  93. check_err $? "Failed to add second mdb entry to VLAN 10"
  94. defer bridge -n "$NS" mdb del dev br0 port dummy0 grp 239.1.1.2 vid 10
  95. bridge -n "$NS" mdb add dev br0 port dummy0 grp 239.1.1.1 vid 11
  96. check_err $? "Failed to add mdb entry to VLAN 11"
  97. defer bridge -n "$NS" mdb del dev br0 port dummy0 grp 239.1.1.1 vid 11
  98. # Verify VLANs are not shown as a range due to different mcast_n_groups
  99. bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11"
  100. check_fail $? "VLANs with different mcast_n_groups incorrectly grouped"
  101. bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+10$|^\s+10$"
  102. check_err $? "VLAN 10 individual entry not found"
  103. bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+11$|^\s+11$"
  104. check_err $? "VLAN 11 individual entry not found"
  105. # Add another group to VLAN 11 to match VLAN 10's count
  106. bridge -n "$NS" mdb add dev br0 port dummy0 grp 239.1.1.2 vid 11
  107. check_err $? "Failed to add second mdb entry to VLAN 11"
  108. defer bridge -n "$NS" mdb del dev br0 port dummy0 grp 239.1.1.2 vid 11
  109. bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11"
  110. check_err $? "VLANs with same mcast_n_groups not grouped"
  111. log_test "VLAN range grouping with mcast_n_groups"
  112. }
  113. vlan_range_mcast_enabled()
  114. {
  115. RET=0
  116. # Add two new consecutive VLANs for range grouping test
  117. bridge -n "$NS" vlan add vid 10 dev br0 self
  118. defer bridge -n "$NS" vlan del vid 10 dev br0 self
  119. bridge -n "$NS" vlan add vid 11 dev br0 self
  120. defer bridge -n "$NS" vlan del vid 11 dev br0 self
  121. bridge -n "$NS" vlan add vid 10 dev dummy0
  122. defer bridge -n "$NS" vlan del vid 10 dev dummy0
  123. bridge -n "$NS" vlan add vid 11 dev dummy0
  124. defer bridge -n "$NS" vlan del vid 11 dev dummy0
  125. # Configure different mcast_snooping for bridge VLANs
  126. # Port VLANs inherit BR_VLFLAG_MCAST_ENABLED from bridge VLANs
  127. bridge -n "$NS" vlan global set dev br0 vid 10 mcast_snooping 1
  128. bridge -n "$NS" vlan global set dev br0 vid 11 mcast_snooping 0
  129. # Verify port VLANs are not grouped due to different mcast_enabled
  130. bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11"
  131. check_fail $? "VLANs with different mcast_enabled incorrectly grouped"
  132. bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+10$|^\s+10$"
  133. check_err $? "VLAN 10 individual entry not found"
  134. bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+11$|^\s+11$"
  135. check_err $? "VLAN 11 individual entry not found"
  136. # Configure same mcast_snooping and verify range grouping
  137. bridge -n "$NS" vlan global set dev br0 vid 11 mcast_snooping 1
  138. bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11"
  139. check_err $? "VLANs with same mcast_enabled not grouped"
  140. log_test "VLAN range grouping with mcast_enabled"
  141. }
  142. # Verify the newest tested option is supported
  143. if ! bridge vlan help 2>&1 | grep -q "neigh_suppress"; then
  144. echo "SKIP: iproute2 too old, missing per-VLAN neighbor suppression support"
  145. exit "$ksft_skip"
  146. fi
  147. trap defer_scopes_cleanup EXIT
  148. setup_prepare
  149. tests_run
  150. exit "$EXIT_STATUS"