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 8# shellcheck disable=SC1091,SC2034,SC2154,SC2317 9source lib.sh 10 11ALL_TESTS=" 12 vlan_range_neigh_suppress 13 vlan_range_mcast_max_groups 14 vlan_range_mcast_n_groups 15 vlan_range_mcast_enabled 16 vlan_range_pvid 17" 18 19setup_prepare() 20{ 21 setup_ns NS 22 defer cleanup_all_ns 23 24 ip -n "$NS" link add name br0 type bridge vlan_filtering 1 \ 25 vlan_default_pvid 0 mcast_snooping 1 mcast_vlan_snooping 1 26 ip -n "$NS" link set dev br0 up 27 28 ip -n "$NS" link add name dummy0 type dummy 29 ip -n "$NS" link set dev dummy0 master br0 30 ip -n "$NS" link set dev dummy0 up 31} 32 33vlan_range_neigh_suppress() 34{ 35 RET=0 36 37 # Add two new consecutive VLANs for range grouping test 38 bridge -n "$NS" vlan add vid 10 dev dummy0 39 defer bridge -n "$NS" vlan del vid 10 dev dummy0 40 41 bridge -n "$NS" vlan add vid 11 dev dummy0 42 defer bridge -n "$NS" vlan del vid 11 dev dummy0 43 44 # Configure different neigh_suppress values and verify no range grouping 45 bridge -n "$NS" vlan set vid 10 dev dummy0 neigh_suppress on 46 check_err $? "Failed to set neigh_suppress for VLAN 10" 47 48 bridge -n "$NS" vlan set vid 11 dev dummy0 neigh_suppress off 49 check_err $? "Failed to set neigh_suppress for VLAN 11" 50 51 # Verify VLANs are not shown as a range, but individual entries exist 52 bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" 53 check_fail $? "VLANs with different neigh_suppress incorrectly grouped" 54 55 bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+10$|^\s+10$" 56 check_err $? "VLAN 10 individual entry not found" 57 58 bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+11$|^\s+11$" 59 check_err $? "VLAN 11 individual entry not found" 60 61 # Configure same neigh_suppress value and verify range grouping 62 bridge -n "$NS" vlan set vid 11 dev dummy0 neigh_suppress on 63 check_err $? "Failed to set neigh_suppress for VLAN 11" 64 65 bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" 66 check_err $? "VLANs with same neigh_suppress not grouped" 67 68 log_test "VLAN range grouping with neigh_suppress" 69} 70 71vlan_range_mcast_max_groups() 72{ 73 RET=0 74 75 # Add two new consecutive VLANs for range grouping test 76 bridge -n "$NS" vlan add vid 10 dev dummy0 77 defer bridge -n "$NS" vlan del vid 10 dev dummy0 78 79 bridge -n "$NS" vlan add vid 11 dev dummy0 80 defer bridge -n "$NS" vlan del vid 11 dev dummy0 81 82 # Configure different mcast_max_groups values and verify no range grouping 83 bridge -n "$NS" vlan set vid 10 dev dummy0 mcast_max_groups 100 84 check_err $? "Failed to set mcast_max_groups for VLAN 10" 85 86 bridge -n "$NS" vlan set vid 11 dev dummy0 mcast_max_groups 200 87 check_err $? "Failed to set mcast_max_groups for VLAN 11" 88 89 # Verify VLANs are not shown as a range, but individual entries exist 90 bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" 91 check_fail $? "VLANs with different mcast_max_groups incorrectly grouped" 92 93 bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+10$|^\s+10$" 94 check_err $? "VLAN 10 individual entry not found" 95 96 bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+11$|^\s+11$" 97 check_err $? "VLAN 11 individual entry not found" 98 99 # Configure same mcast_max_groups value and verify range grouping 100 bridge -n "$NS" vlan set vid 11 dev dummy0 mcast_max_groups 100 101 check_err $? "Failed to set mcast_max_groups for VLAN 11" 102 103 bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" 104 check_err $? "VLANs with same mcast_max_groups not grouped" 105 106 log_test "VLAN range grouping with mcast_max_groups" 107} 108 109vlan_range_mcast_n_groups() 110{ 111 RET=0 112 113 # Add two new consecutive VLANs for range grouping test 114 bridge -n "$NS" vlan add vid 10 dev dummy0 115 defer bridge -n "$NS" vlan del vid 10 dev dummy0 116 117 bridge -n "$NS" vlan add vid 11 dev dummy0 118 defer bridge -n "$NS" vlan del vid 11 dev dummy0 119 120 # Add different numbers of multicast groups to each VLAN 121 bridge -n "$NS" mdb add dev br0 port dummy0 grp 239.1.1.1 vid 10 122 check_err $? "Failed to add mdb entry to VLAN 10" 123 defer bridge -n "$NS" mdb del dev br0 port dummy0 grp 239.1.1.1 vid 10 124 125 bridge -n "$NS" mdb add dev br0 port dummy0 grp 239.1.1.2 vid 10 126 check_err $? "Failed to add second mdb entry to VLAN 10" 127 defer bridge -n "$NS" mdb del dev br0 port dummy0 grp 239.1.1.2 vid 10 128 129 bridge -n "$NS" mdb add dev br0 port dummy0 grp 239.1.1.1 vid 11 130 check_err $? "Failed to add mdb entry to VLAN 11" 131 defer bridge -n "$NS" mdb del dev br0 port dummy0 grp 239.1.1.1 vid 11 132 133 # Verify VLANs are not shown as a range due to different mcast_n_groups 134 bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" 135 check_fail $? "VLANs with different mcast_n_groups incorrectly grouped" 136 137 bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+10$|^\s+10$" 138 check_err $? "VLAN 10 individual entry not found" 139 140 bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+11$|^\s+11$" 141 check_err $? "VLAN 11 individual entry not found" 142 143 # Add another group to VLAN 11 to match VLAN 10's count 144 bridge -n "$NS" mdb add dev br0 port dummy0 grp 239.1.1.2 vid 11 145 check_err $? "Failed to add second mdb entry to VLAN 11" 146 defer bridge -n "$NS" mdb del dev br0 port dummy0 grp 239.1.1.2 vid 11 147 148 bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" 149 check_err $? "VLANs with same mcast_n_groups not grouped" 150 151 log_test "VLAN range grouping with mcast_n_groups" 152} 153 154vlan_range_mcast_enabled() 155{ 156 RET=0 157 158 # Add two new consecutive VLANs for range grouping test 159 bridge -n "$NS" vlan add vid 10 dev br0 self 160 defer bridge -n "$NS" vlan del vid 10 dev br0 self 161 162 bridge -n "$NS" vlan add vid 11 dev br0 self 163 defer bridge -n "$NS" vlan del vid 11 dev br0 self 164 165 bridge -n "$NS" vlan add vid 10 dev dummy0 166 defer bridge -n "$NS" vlan del vid 10 dev dummy0 167 168 bridge -n "$NS" vlan add vid 11 dev dummy0 169 defer bridge -n "$NS" vlan del vid 11 dev dummy0 170 171 # Configure different mcast_snooping for bridge VLANs 172 # Port VLANs inherit BR_VLFLAG_MCAST_ENABLED from bridge VLANs 173 bridge -n "$NS" vlan global set dev br0 vid 10 mcast_snooping 1 174 bridge -n "$NS" vlan global set dev br0 vid 11 mcast_snooping 0 175 176 # Verify port VLANs are not grouped due to different mcast_enabled 177 bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" 178 check_fail $? "VLANs with different mcast_enabled incorrectly grouped" 179 180 bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+10$|^\s+10$" 181 check_err $? "VLAN 10 individual entry not found" 182 183 bridge -n "$NS" -d vlan show dev dummy0 | grep -Eq "^\S+\s+11$|^\s+11$" 184 check_err $? "VLAN 11 individual entry not found" 185 186 # Configure same mcast_snooping and verify range grouping 187 bridge -n "$NS" vlan global set dev br0 vid 11 mcast_snooping 1 188 189 bridge -n "$NS" -d vlan show dev dummy0 | grep -q "10-11" 190 check_err $? "VLANs with same mcast_enabled not grouped" 191 192 log_test "VLAN range grouping with mcast_enabled" 193} 194 195vlan_range_pvid() 196{ 197 RET=0 198 199 ip -n "$NS" link set dev br0 type bridge vlan_default_pvid 1 200 check_err $? "Failed to configure default PVID" 201 defer ip -n "$NS" link set dev br0 type bridge vlan_default_pvid 0 202 203 bridge -n "$NS" vlan add vid 2 dev dummy0 untagged 204 check_err $? "Failed to add VLAN 2" 205 defer bridge -n "$NS" vlan del vid 2 dev dummy0 206 207 bridge -n "$NS" -d vlan show dev dummy0 | 208 grep -Eq '(^|[[:space:]])2([[:space:]]|$)' 209 check_err $? "VLAN following PVID is missing from detailed dump" 210 211 bridge -n "$NS" -d vlan show dev dummy0 | grep -q "1-2" 212 check_fail $? "PVID was incorrectly included in a VLAN range" 213 214 log_test "PVID is isolated from VLAN dump ranges" 215} 216 217# Verify the newest tested option is supported 218if ! bridge vlan help 2>&1 | grep -q "neigh_suppress"; then 219 echo "SKIP: iproute2 too old, missing per-VLAN neighbor suppression support" 220 exit "$ksft_skip" 221fi 222 223trap defer_scopes_cleanup EXIT 224setup_prepare 225tests_run 226 227exit "$EXIT_STATUS" 228