xref: /linux/tools/testing/selftests/net/protodown.sh (revision 00599d4841790d05401820a96cf7edb193888b00)
1*c0375944SIdo Schimmel#!/bin/bash
2*c0375944SIdo Schimmel# SPDX-License-Identifier: GPL-2.0
3*c0375944SIdo Schimmel#
4*c0375944SIdo Schimmel# Test the protodown mechanism. Verify basic protodown toggling, protodown
5*c0375944SIdo Schimmel# reasons, operational state when the lower device carrier changes, and correct
6*c0375944SIdo Schimmel# operational state when the lower device has no carrier.
7*c0375944SIdo Schimmel
8*c0375944SIdo Schimmel# shellcheck disable=SC1091,SC2034,SC2154,SC2317
9*c0375944SIdo Schimmelsource lib.sh
10*c0375944SIdo Schimmel
11*c0375944SIdo Schimmelrequire_command jq
12*c0375944SIdo Schimmel
13*c0375944SIdo SchimmelALL_TESTS="
14*c0375944SIdo Schimmel	protodown_basic_macvlan
15*c0375944SIdo Schimmel	protodown_basic_vxlan
16*c0375944SIdo Schimmel	protodown_reasons
17*c0375944SIdo Schimmel	protodown_lower_toggle
18*c0375944SIdo Schimmel	protodown_lower_down
19*c0375944SIdo Schimmel"
20*c0375944SIdo Schimmel
21*c0375944SIdo Schimmeloperstate_get()
22*c0375944SIdo Schimmel{
23*c0375944SIdo Schimmel	local ns=$1; shift
24*c0375944SIdo Schimmel	local dev=$1; shift
25*c0375944SIdo Schimmel
26*c0375944SIdo Schimmel	ip -n "$ns" -j link show dev "$dev" | jq -r '.[].operstate'
27*c0375944SIdo Schimmel}
28*c0375944SIdo Schimmel
29*c0375944SIdo Schimmeloperstate_check()
30*c0375944SIdo Schimmel{
31*c0375944SIdo Schimmel	local ns=$1; shift
32*c0375944SIdo Schimmel	local dev=$1; shift
33*c0375944SIdo Schimmel	local expected=$1; shift
34*c0375944SIdo Schimmel
35*c0375944SIdo Schimmel	local current
36*c0375944SIdo Schimmel	current=$(operstate_get "$ns" "$dev")
37*c0375944SIdo Schimmel
38*c0375944SIdo Schimmel	[ "$current" = "$expected" ]
39*c0375944SIdo Schimmel}
40*c0375944SIdo Schimmel
41*c0375944SIdo Schimmelsetup_prepare()
42*c0375944SIdo Schimmel{
43*c0375944SIdo Schimmel	setup_ns NS
44*c0375944SIdo Schimmel	defer cleanup_all_ns
45*c0375944SIdo Schimmel
46*c0375944SIdo Schimmel	ip -n "$NS" link add name dummy0 up type dummy
47*c0375944SIdo Schimmel
48*c0375944SIdo Schimmel	ip -n "$NS" link add name macvlan0 link dummy0 up type macvlan mode bridge
49*c0375944SIdo Schimmel
50*c0375944SIdo Schimmel	ip -n "$NS" link add name vxlan0 up type vxlan id 10010 dstport 4789
51*c0375944SIdo Schimmel}
52*c0375944SIdo Schimmel
53*c0375944SIdo Schimmelprotodown_basic()
54*c0375944SIdo Schimmel{
55*c0375944SIdo Schimmel	local dev=$1; shift
56*c0375944SIdo Schimmel
57*c0375944SIdo Schimmel	ip -n "$NS" link set dev "$dev" protodown on
58*c0375944SIdo Schimmel	check_err $? "Failed to set protodown on"
59*c0375944SIdo Schimmel
60*c0375944SIdo Schimmel	busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" "$dev" DOWN
61*c0375944SIdo Schimmel	check_err $? "Operational state is not DOWN after setting protodown"
62*c0375944SIdo Schimmel
63*c0375944SIdo Schimmel	ip -n "$NS" link set dev "$dev" protodown off
64*c0375944SIdo Schimmel	check_err $? "Failed to set protodown off"
65*c0375944SIdo Schimmel
66*c0375944SIdo Schimmel	busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" "$dev" UP
67*c0375944SIdo Schimmel	check_err $? "Operational state is not UP after clearing protodown"
68*c0375944SIdo Schimmel}
69*c0375944SIdo Schimmel
70*c0375944SIdo Schimmelprotodown_basic_macvlan()
71*c0375944SIdo Schimmel{
72*c0375944SIdo Schimmel	RET=0
73*c0375944SIdo Schimmel
74*c0375944SIdo Schimmel	protodown_basic macvlan0
75*c0375944SIdo Schimmel
76*c0375944SIdo Schimmel	log_test "Basic protodown on/off with macvlan"
77*c0375944SIdo Schimmel}
78*c0375944SIdo Schimmel
79*c0375944SIdo Schimmelprotodown_basic_vxlan()
80*c0375944SIdo Schimmel{
81*c0375944SIdo Schimmel	RET=0
82*c0375944SIdo Schimmel
83*c0375944SIdo Schimmel	protodown_basic vxlan0
84*c0375944SIdo Schimmel
85*c0375944SIdo Schimmel	log_test "Basic protodown on/off with vxlan"
86*c0375944SIdo Schimmel}
87*c0375944SIdo Schimmel
88*c0375944SIdo Schimmelprotodown_reasons()
89*c0375944SIdo Schimmel{
90*c0375944SIdo Schimmel	RET=0
91*c0375944SIdo Schimmel
92*c0375944SIdo Schimmel	ip -n "$NS" link set dev macvlan0 protodown on
93*c0375944SIdo Schimmel
94*c0375944SIdo Schimmel	ip -n "$NS" link set dev macvlan0 protodown_reason 0 on
95*c0375944SIdo Schimmel	check_err $? "Failed to set protodown reason bit 0"
96*c0375944SIdo Schimmel
97*c0375944SIdo Schimmel	# Cannot clear protodown while reasons are active.
98*c0375944SIdo Schimmel	ip -n "$NS" link set dev macvlan0 protodown off 2>/dev/null
99*c0375944SIdo Schimmel	check_fail $? "Clearing protodown succeeded with active reasons"
100*c0375944SIdo Schimmel
101*c0375944SIdo Schimmel	ip -n "$NS" link set dev macvlan0 protodown_reason 0 off
102*c0375944SIdo Schimmel	check_err $? "Failed to clear protodown reason bit 0"
103*c0375944SIdo Schimmel
104*c0375944SIdo Schimmel	# Can clear protodown when no reasons are active.
105*c0375944SIdo Schimmel	ip -n "$NS" link set dev macvlan0 protodown off
106*c0375944SIdo Schimmel	check_err $? "Failed to clear protodown with no active reasons"
107*c0375944SIdo Schimmel
108*c0375944SIdo Schimmel	busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 UP
109*c0375944SIdo Schimmel	check_err $? "Operational state is not UP after clearing protodown"
110*c0375944SIdo Schimmel
111*c0375944SIdo Schimmel	log_test "Protodown reasons"
112*c0375944SIdo Schimmel}
113*c0375944SIdo Schimmel
114*c0375944SIdo Schimmelprotodown_lower_toggle()
115*c0375944SIdo Schimmel{
116*c0375944SIdo Schimmel	RET=0
117*c0375944SIdo Schimmel
118*c0375944SIdo Schimmel	ip -n "$NS" link set dev macvlan0 protodown on
119*c0375944SIdo Schimmel
120*c0375944SIdo Schimmel	busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 DOWN
121*c0375944SIdo Schimmel	check_err $? "Operational state is not DOWN after setting protodown"
122*c0375944SIdo Schimmel
123*c0375944SIdo Schimmel	# Toggle carrier on the lower device. The macvlan should stay DOWN
124*c0375944SIdo Schimmel	# because protodown is on.
125*c0375944SIdo Schimmel	ip -n "$NS" link set dev dummy0 carrier off
126*c0375944SIdo Schimmel	ip -n "$NS" link set dev dummy0 carrier on
127*c0375944SIdo Schimmel
128*c0375944SIdo Schimmel	busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" dummy0 UP
129*c0375944SIdo Schimmel	check_err $? "Lower device is not UP after carrier on"
130*c0375944SIdo Schimmel
131*c0375944SIdo Schimmel	busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 DOWN
132*c0375944SIdo Schimmel	check_err $? "Macvlan operational state is not DOWN despite protodown"
133*c0375944SIdo Schimmel
134*c0375944SIdo Schimmel	# Clear protodown and verify the macvlan comes back up.
135*c0375944SIdo Schimmel	ip -n "$NS" link set dev macvlan0 protodown off
136*c0375944SIdo Schimmel
137*c0375944SIdo Schimmel	busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 UP
138*c0375944SIdo Schimmel	check_err $? "Operational state is not UP after clearing protodown"
139*c0375944SIdo Schimmel
140*c0375944SIdo Schimmel	log_test "Protodown with lower device toggled"
141*c0375944SIdo Schimmel}
142*c0375944SIdo Schimmel
143*c0375944SIdo Schimmelprotodown_lower_down()
144*c0375944SIdo Schimmel{
145*c0375944SIdo Schimmel	RET=0
146*c0375944SIdo Schimmel
147*c0375944SIdo Schimmel	# Bring the lower device carrier down first.
148*c0375944SIdo Schimmel	ip -n "$NS" link set dev dummy0 carrier off
149*c0375944SIdo Schimmel
150*c0375944SIdo Schimmel	busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 LOWERLAYERDOWN
151*c0375944SIdo Schimmel	check_err $? "Macvlan is not LOWERLAYERDOWN with lower carrier off"
152*c0375944SIdo Schimmel
153*c0375944SIdo Schimmel	# Toggle protodown on and off while lower has no carrier. The macvlan
154*c0375944SIdo Schimmel	# should not transition to UP.
155*c0375944SIdo Schimmel	ip -n "$NS" link set dev macvlan0 protodown on
156*c0375944SIdo Schimmel
157*c0375944SIdo Schimmel	busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 LOWERLAYERDOWN
158*c0375944SIdo Schimmel	check_err $? "Macvlan is not LOWERLAYERDOWN after setting protodown"
159*c0375944SIdo Schimmel
160*c0375944SIdo Schimmel	ip -n "$NS" link set dev macvlan0 protodown off
161*c0375944SIdo Schimmel
162*c0375944SIdo Schimmel	busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 LOWERLAYERDOWN
163*c0375944SIdo Schimmel	check_err $? "Macvlan is not LOWERLAYERDOWN after clearing protodown"
164*c0375944SIdo Schimmel
165*c0375944SIdo Schimmel	# Bring the lower device carrier up. The macvlan should transition to
166*c0375944SIdo Schimmel	# UP.
167*c0375944SIdo Schimmel	ip -n "$NS" link set dev dummy0 carrier on
168*c0375944SIdo Schimmel
169*c0375944SIdo Schimmel	busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" dummy0 UP
170*c0375944SIdo Schimmel	check_err $? "Lower device is not UP after carrier on"
171*c0375944SIdo Schimmel
172*c0375944SIdo Schimmel	busywait "$BUSYWAIT_TIMEOUT" operstate_check "$NS" macvlan0 UP
173*c0375944SIdo Schimmel	check_err $? "Macvlan is not UP after lower device is UP"
174*c0375944SIdo Schimmel
175*c0375944SIdo Schimmel	log_test "Protodown with lower device down"
176*c0375944SIdo Schimmel}
177*c0375944SIdo Schimmel
178*c0375944SIdo Schimmeltrap defer_scopes_cleanup EXIT
179*c0375944SIdo Schimmelsetup_prepare
180*c0375944SIdo Schimmeltests_run
181*c0375944SIdo Schimmel
182*c0375944SIdo Schimmelexit "$EXIT_STATUS"
183