| #!/bin/bash | |
| # SPDX-License-Identifier: GPL-2.0 | |
| # | |
| # Test bridge VLAN range grouping. VLANs are collapsed into a range entry in | |
| # the dump if they have the same per-VLAN options. These tests verify that | |
| # VLANs with different per-VLAN option values are not grouped together. | |
| # shellcheck disable=SC1091,SC2034,SC2154,SC2317 | |
| source lib.sh | |
| ALL_TESTS=" | |
| vlan_range_neigh_suppress | |
| vlan_range_mcast_max_groups | |
| vlan_range_mcast_n_groups | |
| vlan_range_mcast_enabled | |
| vlan_range_pvid | |
| " | |
| setup_prepare() | |
| { | |
| setup_ns NS | |
| defer cleanup_all_ns | |
| ip -n "$NS" link add name br0 type bridge vlan_filtering 1 \ | |
| vlan_default_pvid 0 mcast_snooping 1 mcast_vlan_snooping 1 | |
| ip -n "$NS" link set dev br0 up | |
| ip -n "$NS" link add name dummy0 type dummy | |
| ip -n "$NS" link set dev dummy0 master br0 | |
| ip -n "$NS" link set dev dummy0 up | |
| } | |
| vlan_range_neigh_suppress() | |
| { | |
| RET=0 | |
| # Add two new consecutive VLANs for range grouping test | |
| bridge -n "$NS" vlan add vid 10 dev dummy0 | |
| defer bridge -n "$NS" vlan del vid 10 dev dummy0 | |
| bridge -n "$NS" vlan add vid 11 dev dummy0 | |
| defer bridge -n "$NS" vlan del vid 11 dev dummy0 | |
| # Configure different neigh_suppress values and verify no range grouping | |
| bridge -n "$NS" vlan set vid 10 dev dummy0 neigh_suppress on | |
| check_err $? "Failed to set neigh_suppress for VLAN 10" | |
| bridge -n "$NS" vlan set vid 11 dev dummy0 neigh_suppress off | |
| check_err $? "Failed to set neigh_suppress for VLAN 11" | |
| # Verify VLANs are not shown as a range, but individual entries exist | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" | |
| check_fail $? "VLANs with different neigh_suppress incorrectly grouped" | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+10$|^\s+10$" | |
| check_err $? "VLAN 10 individual entry not found" | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+11$|^\s+11$" | |
| check_err $? "VLAN 11 individual entry not found" | |
| # Configure same neigh_suppress value and verify range grouping | |
| bridge -n "$NS" vlan set vid 11 dev dummy0 neigh_suppress on | |
| check_err $? "Failed to set neigh_suppress for VLAN 11" | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" | |
| check_err $? "VLANs with same neigh_suppress not grouped" | |
| log_test "VLAN range grouping with neigh_suppress" | |
| } | |
| vlan_range_mcast_max_groups() | |
| { | |
| RET=0 | |
| # Add two new consecutive VLANs for range grouping test | |
| bridge -n "$NS" vlan add vid 10 dev dummy0 | |
| defer bridge -n "$NS" vlan del vid 10 dev dummy0 | |
| bridge -n "$NS" vlan add vid 11 dev dummy0 | |
| defer bridge -n "$NS" vlan del vid 11 dev dummy0 | |
| # Configure different mcast_max_groups values and verify no range grouping | |
| bridge -n "$NS" vlan set vid 10 dev dummy0 mcast_max_groups 100 | |
| check_err $? "Failed to set mcast_max_groups for VLAN 10" | |
| bridge -n "$NS" vlan set vid 11 dev dummy0 mcast_max_groups 200 | |
| check_err $? "Failed to set mcast_max_groups for VLAN 11" | |
| # Verify VLANs are not shown as a range, but individual entries exist | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" | |
| check_fail $? "VLANs with different mcast_max_groups incorrectly grouped" | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+10$|^\s+10$" | |
| check_err $? "VLAN 10 individual entry not found" | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+11$|^\s+11$" | |
| check_err $? "VLAN 11 individual entry not found" | |
| # Configure same mcast_max_groups value and verify range grouping | |
| bridge -n "$NS" vlan set vid 11 dev dummy0 mcast_max_groups 100 | |
| check_err $? "Failed to set mcast_max_groups for VLAN 11" | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" | |
| check_err $? "VLANs with same mcast_max_groups not grouped" | |
| log_test "VLAN range grouping with mcast_max_groups" | |
| } | |
| vlan_range_mcast_n_groups() | |
| { | |
| RET=0 | |
| # Add two new consecutive VLANs for range grouping test | |
| bridge -n "$NS" vlan add vid 10 dev dummy0 | |
| defer bridge -n "$NS" vlan del vid 10 dev dummy0 | |
| bridge -n "$NS" vlan add vid 11 dev dummy0 | |
| defer bridge -n "$NS" vlan del vid 11 dev dummy0 | |
| # Add different numbers of multicast groups to each VLAN | |
| bridge -n "$NS" mdb add dev br0 port dummy0 grp 239.1.1.1 vid 10 | |
| check_err $? "Failed to add mdb entry to VLAN 10" | |
| defer bridge -n "$NS" mdb del dev br0 port dummy0 grp 239.1.1.1 vid 10 | |
| bridge -n "$NS" mdb add dev br0 port dummy0 grp 239.1.1.2 vid 10 | |
| check_err $? "Failed to add second mdb entry to VLAN 10" | |
| defer bridge -n "$NS" mdb del dev br0 port dummy0 grp 239.1.1.2 vid 10 | |
| bridge -n "$NS" mdb add dev br0 port dummy0 grp 239.1.1.1 vid 11 | |
| check_err $? "Failed to add mdb entry to VLAN 11" | |
| defer bridge -n "$NS" mdb del dev br0 port dummy0 grp 239.1.1.1 vid 11 | |
| # Verify VLANs are not shown as a range due to different mcast_n_groups | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" | |
| check_fail $? "VLANs with different mcast_n_groups incorrectly grouped" | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+10$|^\s+10$" | |
| check_err $? "VLAN 10 individual entry not found" | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+11$|^\s+11$" | |
| check_err $? "VLAN 11 individual entry not found" | |
| # Add another group to VLAN 11 to match VLAN 10's count | |
| bridge -n "$NS" mdb add dev br0 port dummy0 grp 239.1.1.2 vid 11 | |
| check_err $? "Failed to add second mdb entry to VLAN 11" | |
| defer bridge -n "$NS" mdb del dev br0 port dummy0 grp 239.1.1.2 vid 11 | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" | |
| check_err $? "VLANs with same mcast_n_groups not grouped" | |
| log_test "VLAN range grouping with mcast_n_groups" | |
| } | |
| vlan_range_mcast_enabled() | |
| { | |
| RET=0 | |
| # Add two new consecutive VLANs for range grouping test | |
| bridge -n "$NS" vlan add vid 10 dev br0 self | |
| defer bridge -n "$NS" vlan del vid 10 dev br0 self | |
| bridge -n "$NS" vlan add vid 11 dev br0 self | |
| defer bridge -n "$NS" vlan del vid 11 dev br0 self | |
| bridge -n "$NS" vlan add vid 10 dev dummy0 | |
| defer bridge -n "$NS" vlan del vid 10 dev dummy0 | |
| bridge -n "$NS" vlan add vid 11 dev dummy0 | |
| defer bridge -n "$NS" vlan del vid 11 dev dummy0 | |
| # Configure different mcast_snooping for bridge VLANs | |
| # Port VLANs inherit BR_VLFLAG_MCAST_ENABLED from bridge VLANs | |
| bridge -n "$NS" vlan global set dev br0 vid 10 mcast_snooping 1 | |
| bridge -n "$NS" vlan global set dev br0 vid 11 mcast_snooping 0 | |
| # Verify port VLANs are not grouped due to different mcast_enabled | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" | |
| check_fail $? "VLANs with different mcast_enabled incorrectly grouped" | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+10$|^\s+10$" | |
| check_err $? "VLAN 10 individual entry not found" | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+11$|^\s+11$" | |
| check_err $? "VLAN 11 individual entry not found" | |
| # Configure same mcast_snooping and verify range grouping | |
| bridge -n "$NS" vlan global set dev br0 vid 11 mcast_snooping 1 | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" | |
| check_err $? "VLANs with same mcast_enabled not grouped" | |
| log_test "VLAN range grouping with mcast_enabled" | |
| } | |
| vlan_range_pvid() | |
| { | |
| RET=0 | |
| ip -n "$NS" link set dev br0 type bridge vlan_default_pvid 1 | |
| check_err $? "Failed to configure default PVID" | |
| defer ip -n "$NS" link set dev br0 type bridge vlan_default_pvid 0 | |
| bridge -n "$NS" vlan add vid 2 dev dummy0 untagged | |
| check_err $? "Failed to add VLAN 2" | |
| defer bridge -n "$NS" vlan del vid 2 dev dummy0 | |
| bridge -n "$NS" -d vlan show dev dummy0 | | |
| grep -Eq '(^|[[:space:]])2([[:space:]]|$)' | |
| check_err $? "VLAN following PVID is missing from detailed dump" | |
| bridge -n "$NS" -d vlan show dev dummy0 | grep -q "1-2" | |
| check_fail $? "PVID was incorrectly included in a VLAN range" | |
| log_test "PVID is isolated from VLAN dump ranges" | |
| } | |
| # Verify the newest tested option is supported | |
| if ! bridge vlan help 2>&1 | grep -q "neigh_suppress"; then | |
| echo "SKIP: iproute2 too old, missing per-VLAN neighbor suppression support" | |
| exit "$ksft_skip" | |
| fi | |
| trap defer_scopes_cleanup EXIT | |
| setup_prepare | |
| tests_run | |
| exit "$EXIT_STATUS" |