xref: /linux/tools/testing/selftests/net/bridge_vlan_dump.sh (revision fab183d632628381b466a41479489541ac0e29a0)
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