Message ID | 314990ea9ee4e475cb200cf32efdf9fc37f4a02a.1668800711.git.jtoppins@redhat.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | bonding: fix bond recovery in mode 2 | expand |
On Fri, 2022-11-18 at 15:30 -0500, Jonathan Toppins wrote: > 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@redhat.com> > Signed-off-by: Jonathan Toppins <jtoppins@redhat.com> > --- > .../selftests/drivers/net/bonding/Makefile | 4 +- > .../selftests/drivers/net/bonding/lag_lib.sh | 107 ++++++++++++++++++ > .../net/bonding/mode-1-recovery-updelay.sh | 45 ++++++++ > .../net/bonding/mode-2-recovery-updelay.sh | 45 ++++++++ > .../selftests/drivers/net/bonding/settings | 2 +- > 5 files changed, 201 insertions(+), 2 deletions(-) > create mode 100755 tools/testing/selftests/drivers/net/bonding/mode-1-recovery-updelay.sh > create mode 100755 tools/testing/selftests/drivers/net/bonding/mode-2-recovery-updelay.sh > > diff --git a/tools/testing/selftests/drivers/net/bonding/Makefile b/tools/testing/selftests/drivers/net/bonding/Makefile > index 6b8d2e2f23c2..0f3921908b07 100644 > --- a/tools/testing/selftests/drivers/net/bonding/Makefile > +++ b/tools/testing/selftests/drivers/net/bonding/Makefile > @@ -5,7 +5,9 @@ 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 \ > + mode-1-recovery-updelay.sh \ > + mode-2-recovery-updelay.sh > > TEST_FILES := \ > lag_lib.sh \ > diff --git a/tools/testing/selftests/drivers/net/bonding/lag_lib.sh b/tools/testing/selftests/drivers/net/bonding/lag_lib.sh > index 16c7fb858ac1..6dc9af1f2428 100644 > --- a/tools/testing/selftests/drivers/net/bonding/lag_lib.sh > +++ b/tools/testing/selftests/drivers/net/bonding/lag_lib.sh > @@ -1,6 +1,8 @@ > #!/bin/bash > # SPDX-License-Identifier: GPL-2.0 > > +NAMESPACES="" > + > # Test that a link aggregation device (bonding, team) removes the hardware > # addresses that it adds on its underlying devices. > test_LAG_cleanup() > @@ -59,3 +61,108 @@ test_LAG_cleanup() > > log_test "$driver cleanup mode $mode" > } > + > +# Build a generic 2 node net namespace with 2 connections > +# between the namespaces > +# > +# +-----------+ +-----------+ > +# | node1 | | node2 | > +# | | | | > +# | | | | > +# | eth0 +-------+ eth0 | > +# | | | | > +# | eth1 +-------+ eth1 | > +# | | | | > +# +-----------+ +-----------+ > +lag_setup2x2() > +{ > + local state=${1:-down} > + local namespaces="lag_node1 lag_node2" > + > + # create namespaces > + for n in ${namespaces}; do > + ip netns add ${n} > + done > + > + # wire up namespaces > + ip link add name lag1 type veth peer name lag1-end > + ip link set dev lag1 netns lag_node1 $state name eth0 > + ip link set dev lag1-end netns lag_node2 $state name eth0 > + > + ip link add name lag1 type veth peer name lag1-end > + ip link set dev lag1 netns lag_node1 $state name eth1 > + ip link set dev lag1-end netns lag_node2 $state name eth1 > + > + NAMESPACES="${namespaces}" > +} > + > +# cleanup all lag related namespaces and remove the bonding module > +lag_cleanup() > +{ > + for n in ${NAMESPACES}; do > + ip netns delete ${n} >/dev/null 2>&1 || true > + done > + modprobe -r bonding > +} > + > +SWITCH="lag_node1" > +CLIENT="lag_node2" > +CLIENTIP="172.20.2.1" > +SWITCHIP="172.20.2.2" > + > +lag_setup_network() > +{ > + lag_setup2x2 "down" > + > + # create switch > + ip netns exec ${SWITCH} ip link add br0 up type bridge > + ip netns exec ${SWITCH} ip link set eth0 master br0 up > + ip netns exec ${SWITCH} ip link set eth1 master br0 up > + ip netns exec ${SWITCH} ip addr add ${SWITCHIP}/24 dev br0 > +} > + > +lag_reset_network() > +{ > + ip netns exec ${CLIENT} ip link del bond0 > + ip netns exec ${SWITCH} ip link set eth0 up > + ip netns exec ${SWITCH} ip link set eth1 up > +} > + > +create_bond() > +{ > + # create client > + ip netns exec ${CLIENT} ip link set eth0 down > + ip netns exec ${CLIENT} ip link set eth1 down > + > + ip netns exec ${CLIENT} ip link add bond0 type bond $@ > + ip netns exec ${CLIENT} ip link set eth0 master bond0 > + ip netns exec ${CLIENT} ip link set eth1 master bond0 > + ip netns exec ${CLIENT} ip link set bond0 up > + ip netns exec ${CLIENT} ip addr add ${CLIENTIP}/24 dev bond0 > +} > + > +test_bond_recovery() > +{ > + RET=0 > + > + create_bond $@ > + > + # verify connectivity > + ip netns exec ${CLIENT} ping ${SWITCHIP} -c 5 >/dev/null 2>&1 Minor nit: here and below you reduce the count number, to shorten significantly the tests runtime. > + check_err $? "No connectivity" > + > + # force the links of the bond down > + ip netns exec ${SWITCH} ip link set eth0 down > + sleep 2 > + ip netns exec ${SWITCH} ip link set eth0 up > + ip netns exec ${SWITCH} ip link set eth1 down > + > + # re-verify connectivity > + ip netns exec ${CLIENT} ping ${SWITCHIP} -c 5 >/dev/null 2>&1 > + > + local rc=$? > + check_err $rc "Bond failed to recover" > + log_test "$1 ($2) bond recovery" > + lag_reset_network > + return 0 Minor nit: the return statement is not needed here. Cheers, Paolo
diff --git a/tools/testing/selftests/drivers/net/bonding/Makefile b/tools/testing/selftests/drivers/net/bonding/Makefile index 6b8d2e2f23c2..0f3921908b07 100644 --- a/tools/testing/selftests/drivers/net/bonding/Makefile +++ b/tools/testing/selftests/drivers/net/bonding/Makefile @@ -5,7 +5,9 @@ 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 \ + mode-1-recovery-updelay.sh \ + mode-2-recovery-updelay.sh TEST_FILES := \ lag_lib.sh \ diff --git a/tools/testing/selftests/drivers/net/bonding/lag_lib.sh b/tools/testing/selftests/drivers/net/bonding/lag_lib.sh index 16c7fb858ac1..6dc9af1f2428 100644 --- a/tools/testing/selftests/drivers/net/bonding/lag_lib.sh +++ b/tools/testing/selftests/drivers/net/bonding/lag_lib.sh @@ -1,6 +1,8 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 +NAMESPACES="" + # Test that a link aggregation device (bonding, team) removes the hardware # addresses that it adds on its underlying devices. test_LAG_cleanup() @@ -59,3 +61,108 @@ test_LAG_cleanup() log_test "$driver cleanup mode $mode" } + +# Build a generic 2 node net namespace with 2 connections +# between the namespaces +# +# +-----------+ +-----------+ +# | node1 | | node2 | +# | | | | +# | | | | +# | eth0 +-------+ eth0 | +# | | | | +# | eth1 +-------+ eth1 | +# | | | | +# +-----------+ +-----------+ +lag_setup2x2() +{ + local state=${1:-down} + local namespaces="lag_node1 lag_node2" + + # create namespaces + for n in ${namespaces}; do + ip netns add ${n} + done + + # wire up namespaces + ip link add name lag1 type veth peer name lag1-end + ip link set dev lag1 netns lag_node1 $state name eth0 + ip link set dev lag1-end netns lag_node2 $state name eth0 + + ip link add name lag1 type veth peer name lag1-end + ip link set dev lag1 netns lag_node1 $state name eth1 + ip link set dev lag1-end netns lag_node2 $state name eth1 + + NAMESPACES="${namespaces}" +} + +# cleanup all lag related namespaces and remove the bonding module +lag_cleanup() +{ + for n in ${NAMESPACES}; do + ip netns delete ${n} >/dev/null 2>&1 || true + done + modprobe -r bonding +} + +SWITCH="lag_node1" +CLIENT="lag_node2" +CLIENTIP="172.20.2.1" +SWITCHIP="172.20.2.2" + +lag_setup_network() +{ + lag_setup2x2 "down" + + # create switch + ip netns exec ${SWITCH} ip link add br0 up type bridge + ip netns exec ${SWITCH} ip link set eth0 master br0 up + ip netns exec ${SWITCH} ip link set eth1 master br0 up + ip netns exec ${SWITCH} ip addr add ${SWITCHIP}/24 dev br0 +} + +lag_reset_network() +{ + ip netns exec ${CLIENT} ip link del bond0 + ip netns exec ${SWITCH} ip link set eth0 up + ip netns exec ${SWITCH} ip link set eth1 up +} + +create_bond() +{ + # create client + ip netns exec ${CLIENT} ip link set eth0 down + ip netns exec ${CLIENT} ip link set eth1 down + + ip netns exec ${CLIENT} ip link add bond0 type bond $@ + ip netns exec ${CLIENT} ip link set eth0 master bond0 + ip netns exec ${CLIENT} ip link set eth1 master bond0 + ip netns exec ${CLIENT} ip link set bond0 up + ip netns exec ${CLIENT} ip addr add ${CLIENTIP}/24 dev bond0 +} + +test_bond_recovery() +{ + RET=0 + + create_bond $@ + + # verify connectivity + ip netns exec ${CLIENT} ping ${SWITCHIP} -c 5 >/dev/null 2>&1 + check_err $? "No connectivity" + + # force the links of the bond down + ip netns exec ${SWITCH} ip link set eth0 down + sleep 2 + ip netns exec ${SWITCH} ip link set eth0 up + ip netns exec ${SWITCH} ip link set eth1 down + + # re-verify connectivity + ip netns exec ${CLIENT} ping ${SWITCHIP} -c 5 >/dev/null 2>&1 + + local rc=$? + check_err $rc "Bond failed to recover" + log_test "$1 ($2) bond recovery" + lag_reset_network + return 0 +} diff --git a/tools/testing/selftests/drivers/net/bonding/mode-1-recovery-updelay.sh b/tools/testing/selftests/drivers/net/bonding/mode-1-recovery-updelay.sh new file mode 100755 index 000000000000..ad4c845a4ac7 --- /dev/null +++ b/tools/testing/selftests/drivers/net/bonding/mode-1-recovery-updelay.sh @@ -0,0 +1,45 @@ +#!/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 + + +REQUIRE_MZ=no +REQUIRE_JQ=no +NUM_NETIFS=0 +lib_dir=$(dirname "$0") +source "$lib_dir"/net_forwarding_lib.sh +source "$lib_dir"/lag_lib.sh + +cleanup() +{ + lag_cleanup +} + +trap cleanup 0 1 2 + +lag_setup_network +test_bond_recovery mode 1 miimon 100 updelay 0 +test_bond_recovery mode 1 miimon 100 updelay 200 +test_bond_recovery mode 1 miimon 100 updelay 500 +test_bond_recovery mode 1 miimon 100 updelay 1000 +test_bond_recovery mode 1 miimon 100 updelay 2000 +test_bond_recovery mode 1 miimon 100 updelay 5000 +test_bond_recovery mode 1 miimon 100 updelay 10000 + +exit "$EXIT_STATUS" diff --git a/tools/testing/selftests/drivers/net/bonding/mode-2-recovery-updelay.sh b/tools/testing/selftests/drivers/net/bonding/mode-2-recovery-updelay.sh new file mode 100755 index 000000000000..2330d37453f9 --- /dev/null +++ b/tools/testing/selftests/drivers/net/bonding/mode-2-recovery-updelay.sh @@ -0,0 +1,45 @@ +#!/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 + + +REQUIRE_MZ=no +REQUIRE_JQ=no +NUM_NETIFS=0 +lib_dir=$(dirname "$0") +source "$lib_dir"/net_forwarding_lib.sh +source "$lib_dir"/lag_lib.sh + +cleanup() +{ + lag_cleanup +} + +trap cleanup 0 1 2 + +lag_setup_network +test_bond_recovery mode 2 miimon 100 updelay 0 +test_bond_recovery mode 2 miimon 100 updelay 200 +test_bond_recovery mode 2 miimon 100 updelay 500 +test_bond_recovery mode 2 miimon 100 updelay 1000 +test_bond_recovery mode 2 miimon 100 updelay 2000 +test_bond_recovery mode 2 miimon 100 updelay 5000 +test_bond_recovery mode 2 miimon 100 updelay 10000 + +exit "$EXIT_STATUS" diff --git a/tools/testing/selftests/drivers/net/bonding/settings b/tools/testing/selftests/drivers/net/bonding/settings index 867e118223cd..6091b45d226b 100644 --- a/tools/testing/selftests/drivers/net/bonding/settings +++ b/tools/testing/selftests/drivers/net/bonding/settings @@ -1 +1 @@ -timeout=60 +timeout=120
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@redhat.com> Signed-off-by: Jonathan Toppins <jtoppins@redhat.com> --- .../selftests/drivers/net/bonding/Makefile | 4 +- .../selftests/drivers/net/bonding/lag_lib.sh | 107 ++++++++++++++++++ .../net/bonding/mode-1-recovery-updelay.sh | 45 ++++++++ .../net/bonding/mode-2-recovery-updelay.sh | 45 ++++++++ .../selftests/drivers/net/bonding/settings | 2 +- 5 files changed, 201 insertions(+), 2 deletions(-) create mode 100755 tools/testing/selftests/drivers/net/bonding/mode-1-recovery-updelay.sh create mode 100755 tools/testing/selftests/drivers/net/bonding/mode-2-recovery-updelay.sh