xref: /linux/tools/testing/selftests/drivers/net/bonding/bond_lacp_strict.sh (revision 637315cb400eed1dbe721954fea437a61a2d65b2)
1*f17e4fccSLouis Scalbert#!/bin/bash
2*f17e4fccSLouis Scalbert# SPDX-License-Identifier: GPL-2.0
3*f17e4fccSLouis Scalbert#
4*f17e4fccSLouis Scalbert# Testing if bond lacp_strict works
5*f17e4fccSLouis Scalbert#
6*f17e4fccSLouis Scalbert#          Partner (p_ns)
7*f17e4fccSLouis Scalbert#  +--------------------------+
8*f17e4fccSLouis Scalbert#  |          bond0           |
9*f17e4fccSLouis Scalbert#  |            +             |
10*f17e4fccSLouis Scalbert#  |      eth0  |  eth1       |
11*f17e4fccSLouis Scalbert#  |        +---+---+         |
12*f17e4fccSLouis Scalbert#  |        |       |         |
13*f17e4fccSLouis Scalbert#  +--------------------------+
14*f17e4fccSLouis Scalbert#  |        | eth0  | eth1    |
15*f17e4fccSLouis Scalbert#  |        |       |         |
16*f17e4fccSLouis Scalbert#  |(br_ns) | br0   | br1     |
17*f17e4fccSLouis Scalbert#  |        |       |         |
18*f17e4fccSLouis Scalbert#  |        | eth2  | eth3    |
19*f17e4fccSLouis Scalbert#  +--------------------------+
20*f17e4fccSLouis Scalbert#  |        |       |         |
21*f17e4fccSLouis Scalbert#  |        +---+---+         |
22*f17e4fccSLouis Scalbert#  |      eth0  |  eth1       |
23*f17e4fccSLouis Scalbert#  |            +             |
24*f17e4fccSLouis Scalbert#  |          bond0           |
25*f17e4fccSLouis Scalbert#  +--------------------------+
26*f17e4fccSLouis Scalbert#         Dut (d_ns)
27*f17e4fccSLouis Scalbert
28*f17e4fccSLouis Scalbertlib_dir=$(dirname "$0")
29*f17e4fccSLouis Scalbert# shellcheck disable=SC1090
30*f17e4fccSLouis Scalbertsource "$lib_dir"/../../../net/lib.sh
31*f17e4fccSLouis Scalbert
32*f17e4fccSLouis ScalbertCOLLECTING_DISTRIBUTING_MASK=48
33*f17e4fccSLouis ScalbertCOLLECTING_DISTRIBUTING=48
34*f17e4fccSLouis ScalbertFAILED=0
35*f17e4fccSLouis Scalbert
36*f17e4fccSLouis Scalbertsetup_links()
37*f17e4fccSLouis Scalbert{
38*f17e4fccSLouis Scalbert	# shellcheck disable=SC2154
39*f17e4fccSLouis Scalbert	ip -n "${p_ns}" link add eth0 type veth peer name eth0 netns "${br_ns}"
40*f17e4fccSLouis Scalbert	ip -n "${p_ns}" link add eth1 type veth peer name eth1 netns "${br_ns}"
41*f17e4fccSLouis Scalbert	ip -n "${d_ns}" link add eth0 type veth peer name eth2 netns "${br_ns}"
42*f17e4fccSLouis Scalbert	ip -n "${d_ns}" link add eth1 type veth peer name eth3 netns "${br_ns}"
43*f17e4fccSLouis Scalbert
44*f17e4fccSLouis Scalbert	ip -n "${br_ns}" link add br0 type bridge
45*f17e4fccSLouis Scalbert	ip -n "${br_ns}" link add br1 type bridge
46*f17e4fccSLouis Scalbert
47*f17e4fccSLouis Scalbert	ip -n "${br_ns}" link set dev br0 type bridge stp_state 0
48*f17e4fccSLouis Scalbert	ip -n "${br_ns}" link set dev br1 type bridge stp_state 0
49*f17e4fccSLouis Scalbert
50*f17e4fccSLouis Scalbert	ip -n "${br_ns}" link set eth0 master br0
51*f17e4fccSLouis Scalbert	ip -n "${br_ns}" link set eth2 master br0
52*f17e4fccSLouis Scalbert	ip -n "${br_ns}" link set eth1 master br1
53*f17e4fccSLouis Scalbert	ip -n "${br_ns}" link set eth3 master br1
54*f17e4fccSLouis Scalbert
55*f17e4fccSLouis Scalbert	# Allow LACP trames forwarding on bridge ports
56*f17e4fccSLouis Scalbert	ip netns exec "${br_ns}" sh -c "echo 4 > /sys/class/net/br0/brif/eth0/group_fwd_mask"
57*f17e4fccSLouis Scalbert	ip netns exec "${br_ns}" sh -c "echo 4 > /sys/class/net/br1/brif/eth1/group_fwd_mask"
58*f17e4fccSLouis Scalbert	ip netns exec "${br_ns}" sh -c "echo 4 > /sys/class/net/br0/brif/eth2/group_fwd_mask"
59*f17e4fccSLouis Scalbert	ip netns exec "${br_ns}" sh -c "echo 4 > /sys/class/net/br1/brif/eth3/group_fwd_mask"
60*f17e4fccSLouis Scalbert
61*f17e4fccSLouis Scalbert	ip -n "${br_ns}" link set eth0 up
62*f17e4fccSLouis Scalbert	ip -n "${br_ns}" link set eth2 up
63*f17e4fccSLouis Scalbert	ip -n "${br_ns}" link set eth1 up
64*f17e4fccSLouis Scalbert	ip -n "${br_ns}" link set eth3 up
65*f17e4fccSLouis Scalbert
66*f17e4fccSLouis Scalbert	ip -n "${br_ns}" link set br0 up
67*f17e4fccSLouis Scalbert	ip -n "${br_ns}" link set br1 up
68*f17e4fccSLouis Scalbert
69*f17e4fccSLouis Scalbert	ip -n "${d_ns}" link add bond0 type bond mode 802.3ad miimon 100 \
70*f17e4fccSLouis Scalbert		lacp_rate fast min_links 1
71*f17e4fccSLouis Scalbert	ip -n "${p_ns}" link add bond0 type bond mode 802.3ad miimon 100 \
72*f17e4fccSLouis Scalbert		lacp_rate fast min_links 1
73*f17e4fccSLouis Scalbert
74*f17e4fccSLouis Scalbert	ip -n "${d_ns}" link set eth0 master bond0
75*f17e4fccSLouis Scalbert	ip -n "${d_ns}" link set eth1 master bond0
76*f17e4fccSLouis Scalbert	ip -n "${p_ns}" link set eth0 master bond0
77*f17e4fccSLouis Scalbert	ip -n "${p_ns}" link set eth1 master bond0
78*f17e4fccSLouis Scalbert
79*f17e4fccSLouis Scalbert	ip -n "${d_ns}" link set bond0 up
80*f17e4fccSLouis Scalbert	ip -n "${p_ns}" link set bond0 up
81*f17e4fccSLouis Scalbert}
82*f17e4fccSLouis Scalbert
83*f17e4fccSLouis Scalberttest_master_carrier() {
84*f17e4fccSLouis Scalbert	local expected=$1
85*f17e4fccSLouis Scalbert	local mode_name=$2
86*f17e4fccSLouis Scalbert	local carrier
87*f17e4fccSLouis Scalbert
88*f17e4fccSLouis Scalbert	carrier=$(ip netns exec "${d_ns}" cat /sys/class/net/bond0/carrier)
89*f17e4fccSLouis Scalbert	[ "$carrier" == "1" ] && carrier="up" || carrier="down"
90*f17e4fccSLouis Scalbert
91*f17e4fccSLouis Scalbert	[ "$carrier" == "$expected" ] && return
92*f17e4fccSLouis Scalbert
93*f17e4fccSLouis Scalbert	echo "FAIL: Expected carrier $expected in lacp_strict $mode_name mode, got $carrier"
94*f17e4fccSLouis Scalbert
95*f17e4fccSLouis Scalbert	RET=1
96*f17e4fccSLouis Scalbert
97*f17e4fccSLouis Scalbert}
98*f17e4fccSLouis Scalbert
99*f17e4fccSLouis Scalbertcompare_state() {
100*f17e4fccSLouis Scalbert	local actual_state=$1
101*f17e4fccSLouis Scalbert	local expected_state=$2
102*f17e4fccSLouis Scalbert	local iface=$3
103*f17e4fccSLouis Scalbert	local last_attempt=$4
104*f17e4fccSLouis Scalbert
105*f17e4fccSLouis Scalbert    [ $((actual_state & COLLECTING_DISTRIBUTING_MASK)) -eq "$expected_state" ] \
106*f17e4fccSLouis Scalbert		&& return 0
107*f17e4fccSLouis Scalbert
108*f17e4fccSLouis Scalbert	[ "$last_attempt" -ne 1 ] && return 1
109*f17e4fccSLouis Scalbert
110*f17e4fccSLouis Scalbert	printf "FAIL: Expected LACP %s actor state to " "$iface"
111*f17e4fccSLouis Scalbert	if [ "$expected_state" -eq $COLLECTING_DISTRIBUTING ]; then
112*f17e4fccSLouis Scalbert		echo "be in Collecting/Distributing state"
113*f17e4fccSLouis Scalbert	else
114*f17e4fccSLouis Scalbert		echo "have neither Collecting nor Distributing set."
115*f17e4fccSLouis Scalbert	fi
116*f17e4fccSLouis Scalbert
117*f17e4fccSLouis Scalbert	return 1
118*f17e4fccSLouis Scalbert}
119*f17e4fccSLouis Scalbert
120*f17e4fccSLouis Scalbert_test_lacp_port_state() {
121*f17e4fccSLouis Scalbert	local interface=$1
122*f17e4fccSLouis Scalbert	local expected=$2
123*f17e4fccSLouis Scalbert	local last_attempt=$3
124*f17e4fccSLouis Scalbert	local eth0_actor_state eth1_actor_state
125*f17e4fccSLouis Scalbert	local ret=0
126*f17e4fccSLouis Scalbert
127*f17e4fccSLouis Scalbert	# shellcheck disable=SC2016
128*f17e4fccSLouis Scalbert	while IFS='=' read -r k v; do
129*f17e4fccSLouis Scalbert		printf -v "$k" '%s' "$v"
130*f17e4fccSLouis Scalbert	done < <(
131*f17e4fccSLouis Scalbert		ip netns exec "${d_ns}" awk '
132*f17e4fccSLouis Scalbert		/^Slave Interface: / { iface=$3 }
133*f17e4fccSLouis Scalbert		/details actor lacp pdu:/ { ctx="actor" }
134*f17e4fccSLouis Scalbert		/details partner lacp pdu:/ { ctx="partner" }
135*f17e4fccSLouis Scalbert		/^[[:space:]]+port state: / {
136*f17e4fccSLouis Scalbert			if (ctx == "actor") {
137*f17e4fccSLouis Scalbert				gsub(":", "", iface)
138*f17e4fccSLouis Scalbert				printf "%s_%s_state=%s\n", iface, ctx, $3
139*f17e4fccSLouis Scalbert			}
140*f17e4fccSLouis Scalbert		}
141*f17e4fccSLouis Scalbert		' /proc/net/bonding/bond0
142*f17e4fccSLouis Scalbert	)
143*f17e4fccSLouis Scalbert
144*f17e4fccSLouis Scalbert	if [ "$interface" == "eth0" ] || [ "$interface" == "both" ]; then
145*f17e4fccSLouis Scalbert		compare_state "$eth0_actor_state" "$expected" eth0 "$last_attempt" || ret=1
146*f17e4fccSLouis Scalbert	fi
147*f17e4fccSLouis Scalbert
148*f17e4fccSLouis Scalbert	if [ "$interface" == "eth1" ] || [ "$interface" == "both" ]; then
149*f17e4fccSLouis Scalbert		compare_state "$eth1_actor_state" "$expected" eth1 "$last_attempt" || ret=1
150*f17e4fccSLouis Scalbert	fi
151*f17e4fccSLouis Scalbert
152*f17e4fccSLouis Scalbert	return $ret
153*f17e4fccSLouis Scalbert}
154*f17e4fccSLouis Scalbert
155*f17e4fccSLouis Scalberttest_lacp_port_state() {
156*f17e4fccSLouis Scalbert	local interface=$1
157*f17e4fccSLouis Scalbert	local expected=$2
158*f17e4fccSLouis Scalbert	local retry=$3
159*f17e4fccSLouis Scalbert	local last_attempt=0
160*f17e4fccSLouis Scalbert	local attempt=1
161*f17e4fccSLouis Scalbert	local ret=1
162*f17e4fccSLouis Scalbert
163*f17e4fccSLouis Scalbert	while [ $attempt -le $((retry + 1)) ]; do
164*f17e4fccSLouis Scalbert		[ $attempt -eq $((retry + 1)) ] && last_attempt=1
165*f17e4fccSLouis Scalbert		_test_lacp_port_state "$interface" "$expected" "$last_attempt" && return
166*f17e4fccSLouis Scalbert		((attempt++))
167*f17e4fccSLouis Scalbert		sleep 1
168*f17e4fccSLouis Scalbert	done
169*f17e4fccSLouis Scalbert
170*f17e4fccSLouis Scalbert	RET=1
171*f17e4fccSLouis Scalbert}
172*f17e4fccSLouis Scalbert
173*f17e4fccSLouis Scalbert
174*f17e4fccSLouis Scalberttrap cleanup_all_ns EXIT
175*f17e4fccSLouis Scalbertsetup_ns d_ns p_ns br_ns
176*f17e4fccSLouis Scalbertsetup_links
177*f17e4fccSLouis Scalbert
178*f17e4fccSLouis Scalbert# Initial state
179*f17e4fccSLouis ScalbertRET=0
180*f17e4fccSLouis Scalbertmode=off
181*f17e4fccSLouis Scalberttest_lacp_port_state both $COLLECTING_DISTRIBUTING 3
182*f17e4fccSLouis Scalberttest_master_carrier up $mode
183*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 and eth1 up"
184*f17e4fccSLouis Scalbert
185*f17e4fccSLouis Scalbert# partner eth0 down, eth1 up
186*f17e4fccSLouis Scalbert# (replicate eth0 state to dut eth0 by shutting a bridge port)
187*f17e4fccSLouis ScalbertRET=0
188*f17e4fccSLouis Scalbertip -n "${p_ns}" link set eth0 down
189*f17e4fccSLouis Scalbertip -n "${br_ns}" link set eth2 down
190*f17e4fccSLouis Scalberttest_lacp_port_state eth0 $FAILED 5
191*f17e4fccSLouis Scalberttest_lacp_port_state eth1 $COLLECTING_DISTRIBUTING 1
192*f17e4fccSLouis Scalberttest_master_carrier up $mode
193*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 down"
194*f17e4fccSLouis Scalbert
195*f17e4fccSLouis Scalbert# partner eth0 and eth1 down
196*f17e4fccSLouis ScalbertRET=0
197*f17e4fccSLouis Scalbertip -n "${p_ns}" link set eth1 down
198*f17e4fccSLouis Scalbertip -n "${br_ns}" link set eth3 down
199*f17e4fccSLouis Scalberttest_lacp_port_state both $FAILED 5
200*f17e4fccSLouis Scalberttest_master_carrier down $mode # down because of min_links
201*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 and eth1 down"
202*f17e4fccSLouis Scalbert
203*f17e4fccSLouis Scalbert# partner eth0 up, eth1 down
204*f17e4fccSLouis ScalbertRET=0
205*f17e4fccSLouis Scalbertip -n "${p_ns}" link set eth0 up
206*f17e4fccSLouis Scalbertip -n "${br_ns}" link set eth2 up
207*f17e4fccSLouis Scalberttest_lacp_port_state eth0 $COLLECTING_DISTRIBUTING 60
208*f17e4fccSLouis Scalberttest_lacp_port_state eth1 $FAILED 1
209*f17e4fccSLouis Scalberttest_master_carrier up $mode
210*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 up, eth1 down"
211*f17e4fccSLouis Scalbert
212*f17e4fccSLouis Scalbert# partner eth0 and eth1 up
213*f17e4fccSLouis ScalbertRET=0
214*f17e4fccSLouis Scalbertip -n "${p_ns}" link set eth1 up
215*f17e4fccSLouis Scalbertip -n "${br_ns}" link set eth3 up
216*f17e4fccSLouis Scalberttest_lacp_port_state both $COLLECTING_DISTRIBUTING 60
217*f17e4fccSLouis Scalberttest_master_carrier up $mode
218*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 and eth1 up"
219*f17e4fccSLouis Scalbert
220*f17e4fccSLouis Scalbert# partner eth0 stops LACP and eth1 up
221*f17e4fccSLouis ScalbertRET=0
222*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 0 > /sys/class/net/br0/brif/eth0/group_fwd_mask"
223*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 0 > /sys/class/net/br0/brif/eth2/group_fwd_mask"
224*f17e4fccSLouis Scalberttest_lacp_port_state eth0 $FAILED 5
225*f17e4fccSLouis Scalberttest_lacp_port_state eth1 $COLLECTING_DISTRIBUTING 1
226*f17e4fccSLouis Scalberttest_master_carrier up $mode
227*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 stopped sending LACP"
228*f17e4fccSLouis Scalbert
229*f17e4fccSLouis Scalbert# partner eth0 and eth1 stop LACP
230*f17e4fccSLouis ScalbertRET=0
231*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 0 > /sys/class/net/br1/brif/eth1/group_fwd_mask"
232*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 0 > /sys/class/net/br1/brif/eth3/group_fwd_mask"
233*f17e4fccSLouis Scalberttest_lacp_port_state both $FAILED 5
234*f17e4fccSLouis Scalberttest_master_carrier up $mode
235*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 and eth1 stopped sending LACP"
236*f17e4fccSLouis Scalbert
237*f17e4fccSLouis Scalbert# switch to lacp_strict on
238*f17e4fccSLouis ScalbertRET=0
239*f17e4fccSLouis Scalbertmode=on
240*f17e4fccSLouis Scalbertip -n "${d_ns}" link set dev bond0 type bond lacp_strict $mode
241*f17e4fccSLouis Scalberttest_lacp_port_state both $FAILED 1
242*f17e4fccSLouis Scalberttest_master_carrier down $mode
243*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 and eth1 stopped sending LACP"
244*f17e4fccSLouis Scalbert
245*f17e4fccSLouis Scalbert# switch back to lacp_strict off mode
246*f17e4fccSLouis ScalbertRET=0
247*f17e4fccSLouis Scalbertmode=off
248*f17e4fccSLouis Scalbertip -n "${d_ns}" link set dev bond0 type bond lacp_strict $mode
249*f17e4fccSLouis Scalberttest_lacp_port_state both $FAILED 1
250*f17e4fccSLouis Scalberttest_master_carrier up $mode
251*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 and eth1 stopped sending LACP"
252*f17e4fccSLouis Scalbert
253*f17e4fccSLouis Scalbert# eth0 recovers LACP
254*f17e4fccSLouis ScalbertRET=0
255*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 4 > /sys/class/net/br0/brif/eth0/group_fwd_mask"
256*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 4 > /sys/class/net/br0/brif/eth2/group_fwd_mask"
257*f17e4fccSLouis Scalberttest_lacp_port_state eth0 $COLLECTING_DISTRIBUTING 60
258*f17e4fccSLouis Scalberttest_lacp_port_state eth1 $FAILED 1
259*f17e4fccSLouis Scalberttest_master_carrier up $mode
260*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 recovered and eth1 stopped sending LACP"
261*f17e4fccSLouis Scalbert
262*f17e4fccSLouis Scalbert# eth1 recovers LACP
263*f17e4fccSLouis ScalbertRET=0
264*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 4 > /sys/class/net/br1/brif/eth1/group_fwd_mask"
265*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 4 > /sys/class/net/br1/brif/eth3/group_fwd_mask"
266*f17e4fccSLouis Scalberttest_lacp_port_state both $COLLECTING_DISTRIBUTING 60
267*f17e4fccSLouis Scalberttest_master_carrier up $mode
268*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 and eth1 recovered LACP"
269*f17e4fccSLouis Scalbert
270*f17e4fccSLouis Scalbert# switch to lacp_strict on
271*f17e4fccSLouis ScalbertRET=0
272*f17e4fccSLouis Scalbertmode=on
273*f17e4fccSLouis Scalbertip -n "${d_ns}" link set dev bond0 type bond lacp_strict $mode
274*f17e4fccSLouis Scalberttest_lacp_port_state both $COLLECTING_DISTRIBUTING 1
275*f17e4fccSLouis Scalberttest_master_carrier up $mode
276*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 and eth1 up"
277*f17e4fccSLouis Scalbert
278*f17e4fccSLouis Scalbert# partner eth0 down, eth1 up
279*f17e4fccSLouis ScalbertRET=0
280*f17e4fccSLouis Scalbertip -n "${p_ns}" link set eth0 down
281*f17e4fccSLouis Scalbertip -n "${br_ns}" link set eth2 down
282*f17e4fccSLouis Scalberttest_lacp_port_state eth0 $FAILED 5
283*f17e4fccSLouis Scalberttest_lacp_port_state eth1 $COLLECTING_DISTRIBUTING 1
284*f17e4fccSLouis Scalberttest_master_carrier up $mode
285*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 down"
286*f17e4fccSLouis Scalbert
287*f17e4fccSLouis Scalbert# partner eth0 and eth1 down
288*f17e4fccSLouis ScalbertRET=0
289*f17e4fccSLouis Scalbertip -n "${p_ns}" link set eth1 down
290*f17e4fccSLouis Scalbertip -n "${br_ns}" link set eth3 down
291*f17e4fccSLouis Scalberttest_lacp_port_state both $FAILED 5
292*f17e4fccSLouis Scalberttest_master_carrier down $mode # down because of min_links
293*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 and eth1 down"
294*f17e4fccSLouis Scalbert
295*f17e4fccSLouis Scalbert# partner eth0 up, eth1 down
296*f17e4fccSLouis ScalbertRET=0
297*f17e4fccSLouis Scalbertip -n "${p_ns}" link set eth0 up
298*f17e4fccSLouis Scalbertip -n "${br_ns}" link set eth2 up
299*f17e4fccSLouis Scalberttest_lacp_port_state eth0 $COLLECTING_DISTRIBUTING 60
300*f17e4fccSLouis Scalberttest_lacp_port_state eth1 $FAILED 1
301*f17e4fccSLouis Scalberttest_master_carrier up $mode
302*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 up, eth1 down"
303*f17e4fccSLouis Scalbert
304*f17e4fccSLouis Scalbert# partner eth0 and eth1 up
305*f17e4fccSLouis ScalbertRET=0
306*f17e4fccSLouis Scalbertip -n "${p_ns}" link set eth1 up
307*f17e4fccSLouis Scalbertip -n "${br_ns}" link set eth3 up
308*f17e4fccSLouis Scalberttest_lacp_port_state both $COLLECTING_DISTRIBUTING 60
309*f17e4fccSLouis Scalberttest_master_carrier up $mode
310*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 and eth1 up"
311*f17e4fccSLouis Scalbert
312*f17e4fccSLouis Scalbert# partner eth0 stops LACP and eth1 up
313*f17e4fccSLouis ScalbertRET=0
314*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 0 > /sys/class/net/br0/brif/eth0/group_fwd_mask"
315*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 0 > /sys/class/net/br0/brif/eth2/group_fwd_mask"
316*f17e4fccSLouis Scalberttest_lacp_port_state eth0 $FAILED 5
317*f17e4fccSLouis Scalberttest_lacp_port_state eth1 $COLLECTING_DISTRIBUTING 1
318*f17e4fccSLouis Scalberttest_master_carrier up $mode
319*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 stopped sending LACP"
320*f17e4fccSLouis Scalbert
321*f17e4fccSLouis Scalbert# partner eth0 and eth1 stop LACP
322*f17e4fccSLouis ScalbertRET=0
323*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 0 > /sys/class/net/br1/brif/eth1/group_fwd_mask"
324*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 0 > /sys/class/net/br1/brif/eth3/group_fwd_mask"
325*f17e4fccSLouis Scalberttest_lacp_port_state both $FAILED 5
326*f17e4fccSLouis Scalberttest_master_carrier down $mode
327*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 and eth1 stopped sending LACP"
328*f17e4fccSLouis Scalbert
329*f17e4fccSLouis Scalbert# eth0 recovers LACP
330*f17e4fccSLouis ScalbertRET=0
331*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 4 > /sys/class/net/br0/brif/eth0/group_fwd_mask"
332*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 4 > /sys/class/net/br0/brif/eth2/group_fwd_mask"
333*f17e4fccSLouis Scalberttest_lacp_port_state eth0 $COLLECTING_DISTRIBUTING 60
334*f17e4fccSLouis Scalberttest_lacp_port_state eth1 $FAILED 1
335*f17e4fccSLouis Scalberttest_master_carrier up $mode
336*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 recovered and eth1 stopped sending LACP"
337*f17e4fccSLouis Scalbert
338*f17e4fccSLouis Scalbert# eth1 recovers LACP
339*f17e4fccSLouis Scalbert# shellcheck disable=SC2034
340*f17e4fccSLouis ScalbertRET=0
341*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 4 > /sys/class/net/br1/brif/eth1/group_fwd_mask"
342*f17e4fccSLouis Scalbertip netns exec "${br_ns}" sh -c "echo 4 > /sys/class/net/br1/brif/eth3/group_fwd_mask"
343*f17e4fccSLouis Scalberttest_lacp_port_state both $COLLECTING_DISTRIBUTING 60
344*f17e4fccSLouis Scalberttest_master_carrier up $mode
345*f17e4fccSLouis Scalbertlog_test "bond LACP" "lacp_strict $mode - eth0 and eth1 recovered LACP"
346*f17e4fccSLouis Scalbert
347*f17e4fccSLouis Scalbertexit "${EXIT_STATUS}"
348