Commit d43eff0b authored by Jonathan Toppins's avatar Jonathan Toppins Committed by Jakub Kicinski
Browse files

selftests: bonding: up/down delay w/ slave link flapping



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: default avatarLiang Li <liali@redhat.com>
Signed-off-by: default avatarJonathan Toppins <jtoppins@redhat.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 64a8f8f7
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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 \
+106 −0
Original line number Diff line number Diff line
#!/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,107 @@ 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 2 >/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 2 >/dev/null 2>&1

	local rc=$?
	check_err $rc "Bond failed to recover"
	log_test "$1 ($2) bond recovery"
	lag_reset_network
}
+45 −0
Original line number Diff line number Diff line
#!/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"
+45 −0
Original line number Diff line number Diff line
#!/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
Original line number Diff line number Diff line
timeout=60
timeout=120