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