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