summaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests/net/bridge_vlan_dump.sh
blob: ad66731d2a6f3e6a79bacb383437ad87764f48dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#!/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
"

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"
}

# 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"