Verify when a bond is configured with {up,down}delay and the link state of slave members flaps if there are no remaining members up the bond should immediately select a member to bring up. (from bonding.txt section 13.1 paragraph 4) Suggested-by: Liang Li <liali@xxxxxxxxxx> Signed-off-by: Jonathan Toppins <jtoppins@xxxxxxxxxx> --- Notes: Bug: Currently the bond never comes back up. .../selftests/drivers/net/bonding/Makefile | 3 +- .../net/bonding/slave-link-flapping.sh | 85 +++++++++++++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100755 tools/testing/selftests/drivers/net/bonding/slave-link-flapping.sh diff --git a/tools/testing/selftests/drivers/net/bonding/Makefile b/tools/testing/selftests/drivers/net/bonding/Makefile index e9dab5f9d773..cb40ef91c152 100644 --- a/tools/testing/selftests/drivers/net/bonding/Makefile +++ b/tools/testing/selftests/drivers/net/bonding/Makefile @@ -5,7 +5,8 @@ TEST_PROGS := \ bond-arp-interval-causes-panic.sh \ bond-break-lacpdu-tx.sh \ bond-lladdr-target.sh \ - dev_addr_lists.sh + dev_addr_lists.sh \ + slave-link-flapping.sh TEST_FILES := lag_lib.sh diff --git a/tools/testing/selftests/drivers/net/bonding/slave-link-flapping.sh b/tools/testing/selftests/drivers/net/bonding/slave-link-flapping.sh new file mode 100755 index 000000000000..a1499933fd39 --- /dev/null +++ b/tools/testing/selftests/drivers/net/bonding/slave-link-flapping.sh @@ -0,0 +1,85 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +# Regression Test: +# When the bond is configured with down/updelay and the link state of +# slave members flaps if there are no remaining members up the bond +# should immediately select a member to bring up. (from bonding.txt +# section 13.1 paragraph 4) +# +# +-------------+ +-----------+ +# | client | | switch | +# | | | | +# | +--------| link1 |-----+ | +# | | +-------+ | | +# | | | | | | +# | | +-------+ | | +# | | bond | link2 | Br0 | | +# +-------------+ +-----------+ +# 172.20.2.1 172.20.2.2 + +set -e + +BOND="bond0" +LINK1="veth1" +LINK2="veth2" +CLIENTIP="172.20.2.1" +SWITCHIP="172.20.2.2" +NAMESPACES="switch client" + +cleanup() +{ + for n in ${NAMESPACES}; do + ip netns delete ${n} >/dev/null 2>&1 || true + done + modprobe -r bonding +} + +setup_network() +{ + # create namespaces + for n in ${NAMESPACES}; do + ip netns add ${n} + done + + # create veths + ip link add name ${LINK1}-bond type veth peer name ${LINK1}-end + ip link add name ${LINK2}-bond type veth peer name ${LINK2}-end + + # create switch + ip netns exec switch ip link add br0 up type bridge + ip link set ${LINK1}-end netns switch up + ip link set ${LINK2}-end netns switch up + ip netns exec switch ip link set ${LINK1}-end master br0 + ip netns exec switch ip link set ${LINK2}-end master br0 + ip netns exec switch ip addr add ${SWITCHIP}/24 dev br0 + + # create client + ip link set ${LINK1}-bond netns client + ip link set ${LINK2}-bond netns client + ip netns exec client ip link add ${BOND} type bond \ + mode 2 miimon 100 updelay 10000 + ip netns exec client ip link set ${LINK1}-bond master ${BOND} + ip netns exec client ip link set ${LINK2}-bond master ${BOND} + ip netns exec client ip link set ${BOND} up + ip netns exec client ip addr add ${CLIENTIP}/24 dev ${BOND} +} + +trap cleanup 0 1 2 +cleanup +sleep 1 + +dmesg --clear +setup_network + +# verify connectivity +ip netns exec client ping ${SWITCHIP} -c 5 >/dev/null 2>&1 + +# force the links of the bond down +ip netns exec switch ip link set ${LINK1}-end down +sleep 2 +ip netns exec switch ip link set ${LINK1}-end up +ip netns exec switch ip link set ${LINK2}-end down + +# re-verify connectivity +ip netns exec client ping ${SWITCHIP} -c 5 >/dev/null 2>&1 -- 2.31.1