xref: /linux/tools/testing/selftests/net/vlan_bridge_binding.sh (revision 1260ed77798502de9c98020040d2995008de10cc)
1*dca12e9aSPetr Machata#!/bin/bash
2*dca12e9aSPetr Machata# SPDX-License-Identifier: GPL-2.0
3*dca12e9aSPetr Machata
4*dca12e9aSPetr Machatasource lib.sh
5*dca12e9aSPetr Machata
6*dca12e9aSPetr MachataALL_TESTS="
7*dca12e9aSPetr Machata	test_binding_on
8*dca12e9aSPetr Machata	test_binding_off
9*dca12e9aSPetr Machata	test_binding_toggle_on
10*dca12e9aSPetr Machata	test_binding_toggle_off
11*dca12e9aSPetr Machata	test_binding_toggle_on_when_upper_down
12*dca12e9aSPetr Machata	test_binding_toggle_off_when_upper_down
13*dca12e9aSPetr Machata	test_binding_toggle_on_when_lower_down
14*dca12e9aSPetr Machata	test_binding_toggle_off_when_lower_down
15*dca12e9aSPetr Machata"
16*dca12e9aSPetr Machata
17*dca12e9aSPetr Machatasetup_prepare()
18*dca12e9aSPetr Machata{
19*dca12e9aSPetr Machata	local port
20*dca12e9aSPetr Machata
21*dca12e9aSPetr Machata	ip_link_add br up type bridge vlan_filtering 1
22*dca12e9aSPetr Machata
23*dca12e9aSPetr Machata	for port in d1 d2 d3; do
24*dca12e9aSPetr Machata		ip_link_add $port type veth peer name r$port
25*dca12e9aSPetr Machata		ip_link_set_up $port
26*dca12e9aSPetr Machata		ip_link_set_up r$port
27*dca12e9aSPetr Machata		ip_link_set_master $port br
28*dca12e9aSPetr Machata	done
29*dca12e9aSPetr Machata
30*dca12e9aSPetr Machata	bridge_vlan_add vid 11 dev br self
31*dca12e9aSPetr Machata	bridge_vlan_add vid 11 dev d1 master
32*dca12e9aSPetr Machata
33*dca12e9aSPetr Machata	bridge_vlan_add vid 12 dev br self
34*dca12e9aSPetr Machata	bridge_vlan_add vid 12 dev d2 master
35*dca12e9aSPetr Machata
36*dca12e9aSPetr Machata	bridge_vlan_add vid 13 dev br self
37*dca12e9aSPetr Machata	bridge_vlan_add vid 13 dev d1 master
38*dca12e9aSPetr Machata	bridge_vlan_add vid 13 dev d2 master
39*dca12e9aSPetr Machata
40*dca12e9aSPetr Machata	bridge_vlan_add vid 14 dev br self
41*dca12e9aSPetr Machata	bridge_vlan_add vid 14 dev d1 master
42*dca12e9aSPetr Machata	bridge_vlan_add vid 14 dev d2 master
43*dca12e9aSPetr Machata	bridge_vlan_add vid 14 dev d3 master
44*dca12e9aSPetr Machata}
45*dca12e9aSPetr Machata
46*dca12e9aSPetr Machataoperstate_is()
47*dca12e9aSPetr Machata{
48*dca12e9aSPetr Machata	local dev=$1; shift
49*dca12e9aSPetr Machata	local expect=$1; shift
50*dca12e9aSPetr Machata
51*dca12e9aSPetr Machata	local operstate=$(ip -j link show $dev | jq -r .[].operstate)
52*dca12e9aSPetr Machata	if [[ $operstate == UP ]]; then
53*dca12e9aSPetr Machata		operstate=1
54*dca12e9aSPetr Machata	elif [[ $operstate == DOWN || $operstate == LOWERLAYERDOWN ]]; then
55*dca12e9aSPetr Machata		operstate=0
56*dca12e9aSPetr Machata	fi
57*dca12e9aSPetr Machata	echo -n $operstate
58*dca12e9aSPetr Machata	[[ $operstate == $expect ]]
59*dca12e9aSPetr Machata}
60*dca12e9aSPetr Machata
61*dca12e9aSPetr Machatacheck_operstate()
62*dca12e9aSPetr Machata{
63*dca12e9aSPetr Machata	local dev=$1; shift
64*dca12e9aSPetr Machata	local expect=$1; shift
65*dca12e9aSPetr Machata	local operstate
66*dca12e9aSPetr Machata
67*dca12e9aSPetr Machata	operstate=$(busywait 1000 \
68*dca12e9aSPetr Machata			operstate_is "$dev" "$expect")
69*dca12e9aSPetr Machata	check_err $? "Got operstate of $operstate, expected $expect"
70*dca12e9aSPetr Machata}
71*dca12e9aSPetr Machata
72*dca12e9aSPetr Machataadd_one_vlan()
73*dca12e9aSPetr Machata{
74*dca12e9aSPetr Machata	local link=$1; shift
75*dca12e9aSPetr Machata	local id=$1; shift
76*dca12e9aSPetr Machata
77*dca12e9aSPetr Machata	ip_link_add $link.$id link $link type vlan id $id "$@"
78*dca12e9aSPetr Machata}
79*dca12e9aSPetr Machata
80*dca12e9aSPetr Machataadd_vlans()
81*dca12e9aSPetr Machata{
82*dca12e9aSPetr Machata	add_one_vlan br 11 "$@"
83*dca12e9aSPetr Machata	add_one_vlan br 12 "$@"
84*dca12e9aSPetr Machata	add_one_vlan br 13 "$@"
85*dca12e9aSPetr Machata	add_one_vlan br 14 "$@"
86*dca12e9aSPetr Machata}
87*dca12e9aSPetr Machata
88*dca12e9aSPetr Machataset_vlans()
89*dca12e9aSPetr Machata{
90*dca12e9aSPetr Machata	ip link set dev br.11 "$@"
91*dca12e9aSPetr Machata	ip link set dev br.12 "$@"
92*dca12e9aSPetr Machata	ip link set dev br.13 "$@"
93*dca12e9aSPetr Machata	ip link set dev br.14 "$@"
94*dca12e9aSPetr Machata}
95*dca12e9aSPetr Machata
96*dca12e9aSPetr Machatadown_netdevs()
97*dca12e9aSPetr Machata{
98*dca12e9aSPetr Machata	local dev
99*dca12e9aSPetr Machata
100*dca12e9aSPetr Machata	for dev in "$@"; do
101*dca12e9aSPetr Machata		ip_link_set_down $dev
102*dca12e9aSPetr Machata	done
103*dca12e9aSPetr Machata}
104*dca12e9aSPetr Machata
105*dca12e9aSPetr Machatacheck_operstates()
106*dca12e9aSPetr Machata{
107*dca12e9aSPetr Machata	local opst_11=$1; shift
108*dca12e9aSPetr Machata	local opst_12=$1; shift
109*dca12e9aSPetr Machata	local opst_13=$1; shift
110*dca12e9aSPetr Machata	local opst_14=$1; shift
111*dca12e9aSPetr Machata
112*dca12e9aSPetr Machata	check_operstate br.11 $opst_11
113*dca12e9aSPetr Machata	check_operstate br.12 $opst_12
114*dca12e9aSPetr Machata	check_operstate br.13 $opst_13
115*dca12e9aSPetr Machata	check_operstate br.14 $opst_14
116*dca12e9aSPetr Machata}
117*dca12e9aSPetr Machata
118*dca12e9aSPetr Machatado_test_binding()
119*dca12e9aSPetr Machata{
120*dca12e9aSPetr Machata	local inject=$1; shift
121*dca12e9aSPetr Machata	local what=$1; shift
122*dca12e9aSPetr Machata	local opsts_d1=$1; shift
123*dca12e9aSPetr Machata	local opsts_d2=$1; shift
124*dca12e9aSPetr Machata	local opsts_d12=$1; shift
125*dca12e9aSPetr Machata	local opsts_d123=$1; shift
126*dca12e9aSPetr Machata
127*dca12e9aSPetr Machata	RET=0
128*dca12e9aSPetr Machata
129*dca12e9aSPetr Machata	defer_scope_push
130*dca12e9aSPetr Machata		down_netdevs d1
131*dca12e9aSPetr Machata		$inject
132*dca12e9aSPetr Machata		check_operstates $opsts_d1
133*dca12e9aSPetr Machata	defer_scope_pop
134*dca12e9aSPetr Machata
135*dca12e9aSPetr Machata	defer_scope_push
136*dca12e9aSPetr Machata		down_netdevs d2
137*dca12e9aSPetr Machata		$inject
138*dca12e9aSPetr Machata		check_operstates $opsts_d2
139*dca12e9aSPetr Machata	defer_scope_pop
140*dca12e9aSPetr Machata
141*dca12e9aSPetr Machata	defer_scope_push
142*dca12e9aSPetr Machata		down_netdevs d1 d2
143*dca12e9aSPetr Machata		$inject
144*dca12e9aSPetr Machata		check_operstates $opsts_d12
145*dca12e9aSPetr Machata	defer_scope_pop
146*dca12e9aSPetr Machata
147*dca12e9aSPetr Machata	defer_scope_push
148*dca12e9aSPetr Machata		down_netdevs d1 d2 d3
149*dca12e9aSPetr Machata		$inject
150*dca12e9aSPetr Machata		check_operstates $opsts_d123
151*dca12e9aSPetr Machata	defer_scope_pop
152*dca12e9aSPetr Machata
153*dca12e9aSPetr Machata	log_test "Test bridge_binding $what"
154*dca12e9aSPetr Machata}
155*dca12e9aSPetr Machata
156*dca12e9aSPetr Machatado_test_binding_on()
157*dca12e9aSPetr Machata{
158*dca12e9aSPetr Machata	local inject=$1; shift
159*dca12e9aSPetr Machata	local what=$1; shift
160*dca12e9aSPetr Machata
161*dca12e9aSPetr Machata	do_test_binding "$inject" "$what"	\
162*dca12e9aSPetr Machata			"0 1 1 1"		\
163*dca12e9aSPetr Machata			"1 0 1 1"		\
164*dca12e9aSPetr Machata			"0 0 0 1"		\
165*dca12e9aSPetr Machata			"0 0 0 0"
166*dca12e9aSPetr Machata}
167*dca12e9aSPetr Machata
168*dca12e9aSPetr Machatado_test_binding_off()
169*dca12e9aSPetr Machata{
170*dca12e9aSPetr Machata	local inject=$1; shift
171*dca12e9aSPetr Machata	local what=$1; shift
172*dca12e9aSPetr Machata
173*dca12e9aSPetr Machata	do_test_binding "$inject" "$what"	\
174*dca12e9aSPetr Machata			"1 1 1 1"		\
175*dca12e9aSPetr Machata			"1 1 1 1"		\
176*dca12e9aSPetr Machata			"1 1 1 1"		\
177*dca12e9aSPetr Machata			"0 0 0 0"
178*dca12e9aSPetr Machata}
179*dca12e9aSPetr Machata
180*dca12e9aSPetr Machatatest_binding_on()
181*dca12e9aSPetr Machata{
182*dca12e9aSPetr Machata	add_vlans bridge_binding on
183*dca12e9aSPetr Machata	set_vlans up
184*dca12e9aSPetr Machata	do_test_binding_on : "on"
185*dca12e9aSPetr Machata}
186*dca12e9aSPetr Machata
187*dca12e9aSPetr Machatatest_binding_off()
188*dca12e9aSPetr Machata{
189*dca12e9aSPetr Machata	add_vlans bridge_binding off
190*dca12e9aSPetr Machata	set_vlans up
191*dca12e9aSPetr Machata	do_test_binding_off : "off"
192*dca12e9aSPetr Machata}
193*dca12e9aSPetr Machata
194*dca12e9aSPetr Machatatest_binding_toggle_on()
195*dca12e9aSPetr Machata{
196*dca12e9aSPetr Machata	add_vlans bridge_binding off
197*dca12e9aSPetr Machata	set_vlans up
198*dca12e9aSPetr Machata	set_vlans type vlan bridge_binding on
199*dca12e9aSPetr Machata	do_test_binding_on : "off->on"
200*dca12e9aSPetr Machata}
201*dca12e9aSPetr Machata
202*dca12e9aSPetr Machatatest_binding_toggle_off()
203*dca12e9aSPetr Machata{
204*dca12e9aSPetr Machata	add_vlans bridge_binding on
205*dca12e9aSPetr Machata	set_vlans up
206*dca12e9aSPetr Machata	set_vlans type vlan bridge_binding off
207*dca12e9aSPetr Machata	do_test_binding_off : "on->off"
208*dca12e9aSPetr Machata}
209*dca12e9aSPetr Machata
210*dca12e9aSPetr Machatadfr_set_binding_on()
211*dca12e9aSPetr Machata{
212*dca12e9aSPetr Machata	set_vlans type vlan bridge_binding on
213*dca12e9aSPetr Machata	defer set_vlans type vlan bridge_binding off
214*dca12e9aSPetr Machata}
215*dca12e9aSPetr Machata
216*dca12e9aSPetr Machatadfr_set_binding_off()
217*dca12e9aSPetr Machata{
218*dca12e9aSPetr Machata	set_vlans type vlan bridge_binding off
219*dca12e9aSPetr Machata	defer set_vlans type vlan bridge_binding on
220*dca12e9aSPetr Machata}
221*dca12e9aSPetr Machata
222*dca12e9aSPetr Machatatest_binding_toggle_on_when_lower_down()
223*dca12e9aSPetr Machata{
224*dca12e9aSPetr Machata	add_vlans bridge_binding off
225*dca12e9aSPetr Machata	set_vlans up
226*dca12e9aSPetr Machata	do_test_binding_on dfr_set_binding_on "off->on when lower down"
227*dca12e9aSPetr Machata}
228*dca12e9aSPetr Machata
229*dca12e9aSPetr Machatatest_binding_toggle_off_when_lower_down()
230*dca12e9aSPetr Machata{
231*dca12e9aSPetr Machata	add_vlans bridge_binding on
232*dca12e9aSPetr Machata	set_vlans up
233*dca12e9aSPetr Machata	do_test_binding_off dfr_set_binding_off "on->off when lower down"
234*dca12e9aSPetr Machata}
235*dca12e9aSPetr Machata
236*dca12e9aSPetr Machatatest_binding_toggle_on_when_upper_down()
237*dca12e9aSPetr Machata{
238*dca12e9aSPetr Machata	add_vlans bridge_binding off
239*dca12e9aSPetr Machata	set_vlans type vlan bridge_binding on
240*dca12e9aSPetr Machata	set_vlans up
241*dca12e9aSPetr Machata	do_test_binding_on : "off->on when upper down"
242*dca12e9aSPetr Machata}
243*dca12e9aSPetr Machata
244*dca12e9aSPetr Machatatest_binding_toggle_off_when_upper_down()
245*dca12e9aSPetr Machata{
246*dca12e9aSPetr Machata	add_vlans bridge_binding on
247*dca12e9aSPetr Machata	set_vlans type vlan bridge_binding off
248*dca12e9aSPetr Machata	set_vlans up
249*dca12e9aSPetr Machata	do_test_binding_off : "on->off when upper down"
250*dca12e9aSPetr Machata}
251*dca12e9aSPetr Machata
252*dca12e9aSPetr Machatatrap defer_scopes_cleanup EXIT
253*dca12e9aSPetr Machatasetup_prepare
254*dca12e9aSPetr Machatatests_run
255*dca12e9aSPetr Machata
256*dca12e9aSPetr Machataexit $EXIT_STATUS
257