[net-next,1/2] selftests: bonding: up/down delay w/ slave link flapping
Commit Message
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
Comments
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
@@ -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 \
@@ -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
+}
new file mode 100755
@@ -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"
new file mode 100755
@@ -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"
@@ -1 +1 @@
-timeout=60
+timeout=120