diff mbox series

[net,2/3] selftests: bonding: re-format bond option tests

Message ID 20230329101859.3458449-3-liuhangbin@gmail.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series bonding: fix ns validation on backup slaves | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net
netdev/fixes_present success Fixes tag present in non-next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 18 this patch: 18
netdev/cc_maintainers warning 3 maintainers not CCed: linux-kselftest@vger.kernel.org shuah@kernel.org andy@greyhouse.net
netdev/build_clang success Errors and warnings before: 18 this patch: 18
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest fail Script option_prio.sh not found in tools/testing/selftests/drivers/net/bonding/Makefile
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 18 this patch: 18
netdev/checkpatch warning WARNING: added, moved or deleted file(s), does MAINTAINERS need updating? WARNING: line length of 100 exceeds 80 columns WARNING: line length of 106 exceeds 80 columns WARNING: line length of 112 exceeds 80 columns WARNING: line length of 136 exceeds 80 columns WARNING: line length of 81 exceeds 80 columns WARNING: line length of 82 exceeds 80 columns WARNING: line length of 86 exceeds 80 columns WARNING: line length of 87 exceeds 80 columns WARNING: line length of 88 exceeds 80 columns WARNING: line length of 89 exceeds 80 columns WARNING: line length of 97 exceeds 80 columns
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Hangbin Liu March 29, 2023, 10:18 a.m. UTC
To improve the testing process for bond options, A new bond library is
added to our testing setup. The current option_prio.sh file will be
renamed to bond_options.sh so that all bonding options can be tested here.
Specifically, for priority testing, we will run all tests using module
1, 5, and 6. These changes will help us streamline the testing process
and ensure that our bond options are rigorously evaluated.

Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
---
 .../selftests/drivers/net/bonding/Makefile    |   3 +-
 .../selftests/drivers/net/bonding/bond_lib.sh | 145 +++++++++++
 .../drivers/net/bonding/bond_options.sh       | 216 +++++++++++++++
 .../drivers/net/bonding/option_prio.sh        | 245 ------------------
 4 files changed, 363 insertions(+), 246 deletions(-)
 create mode 100644 tools/testing/selftests/drivers/net/bonding/bond_lib.sh
 create mode 100755 tools/testing/selftests/drivers/net/bonding/bond_options.sh
 delete mode 100755 tools/testing/selftests/drivers/net/bonding/option_prio.sh

Comments

Jonathan Toppins March 30, 2023, 4:45 p.m. UTC | #1
On 3/29/23 06:18, Hangbin Liu wrote:
> To improve the testing process for bond options, A new bond library is
> added to our testing setup. The current option_prio.sh file will be
> renamed to bond_options.sh so that all bonding options can be tested here.
> Specifically, for priority testing, we will run all tests using module
                                            I think you mean `modes`^^^
> 1, 5, and 6. These changes will help us streamline the testing process
> and ensure that our bond options are rigorously evaluated.
> 
> Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
> ---
>   .../selftests/drivers/net/bonding/Makefile    |   3 +-
>   .../selftests/drivers/net/bonding/bond_lib.sh | 145 +++++++++++
>   .../drivers/net/bonding/bond_options.sh       | 216 +++++++++++++++
>   .../drivers/net/bonding/option_prio.sh        | 245 ------------------
>   4 files changed, 363 insertions(+), 246 deletions(-)
>   create mode 100644 tools/testing/selftests/drivers/net/bonding/bond_lib.sh
>   create mode 100755 tools/testing/selftests/drivers/net/bonding/bond_options.sh
>   delete mode 100755 tools/testing/selftests/drivers/net/bonding/option_prio.sh
> 
> diff --git a/tools/testing/selftests/drivers/net/bonding/Makefile b/tools/testing/selftests/drivers/net/bonding/Makefile
> index a39bb2560d9b..4683b06afdba 100644
> --- a/tools/testing/selftests/drivers/net/bonding/Makefile
> +++ b/tools/testing/selftests/drivers/net/bonding/Makefile
> @@ -8,11 +8,12 @@ TEST_PROGS := \
>   	dev_addr_lists.sh \
>   	mode-1-recovery-updelay.sh \
>   	mode-2-recovery-updelay.sh \
> -	option_prio.sh \
> +	bond_options.sh \
>   	bond-eth-type-change.sh
>   
>   TEST_FILES := \
>   	lag_lib.sh \
> +	bond_lib.sh \
>   	net_forwarding_lib.sh
>   
>   include ../../../lib.mk
> diff --git a/tools/testing/selftests/drivers/net/bonding/bond_lib.sh b/tools/testing/selftests/drivers/net/bonding/bond_lib.sh
> new file mode 100644
> index 000000000000..ca64a82e1385
> --- /dev/null
> +++ b/tools/testing/selftests/drivers/net/bonding/bond_lib.sh

I like this idea, we might want to separate network topology from 
library code however. That way a given test case can just include a 
predefined topology. A quick review of the test cases show a 2 node 
setup is the most common across all test cases.

-Jon
Hangbin Liu March 31, 2023, 2:31 a.m. UTC | #2
On Thu, Mar 30, 2023 at 12:45:11PM -0400, Jonathan Toppins wrote:
> On 3/29/23 06:18, Hangbin Liu wrote:
> > To improve the testing process for bond options, A new bond library is
> > added to our testing setup. The current option_prio.sh file will be
> > renamed to bond_options.sh so that all bonding options can be tested here.
> > Specifically, for priority testing, we will run all tests using module
>                                            I think you mean `modes`^^^

Ah, yes.

> > 1, 5, and 6. These changes will help us streamline the testing process
> > and ensure that our bond options are rigorously evaluated.
> > 
> > Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
> > ---
> > diff --git a/tools/testing/selftests/drivers/net/bonding/bond_lib.sh b/tools/testing/selftests/drivers/net/bonding/bond_lib.sh
> > new file mode 100644
> > index 000000000000..ca64a82e1385
> > --- /dev/null
> > +++ b/tools/testing/selftests/drivers/net/bonding/bond_lib.sh
> 
> I like this idea, we might want to separate network topology from library
> code however. That way a given test case can just include a predefined

Would you like to help explain more clear? Separate network topology to where?

> topology. A quick review of the test cases show a 2 node setup is the most
> common across all test cases.

Liang suggested that with 2 clients we can test xmit_hash_policy. In
client_create() I only create 1 client for current testing. We can add more
clients in future.

Thanks
Hangbin
Jay Vosburgh March 31, 2023, 3:55 a.m. UTC | #3
Hangbin Liu <liuhangbin@gmail.com> wrote:

>To improve the testing process for bond options, A new bond library is
>added to our testing setup. The current option_prio.sh file will be
>renamed to bond_options.sh so that all bonding options can be tested here.
>Specifically, for priority testing, we will run all tests using module

	Typo here, "module" vs "mode"

>1, 5, and 6. These changes will help us streamline the testing process
>and ensure that our bond options are rigorously evaluated.

	Other than the typo above and a couple more noted below (which
aren't new to this patch; they're in code being copied), looks good to
me.

Acked-by: Jay Vosburgh <jay.vosburgh@canonical.com>

>Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
>---
> .../selftests/drivers/net/bonding/Makefile    |   3 +-
> .../selftests/drivers/net/bonding/bond_lib.sh | 145 +++++++++++
> .../drivers/net/bonding/bond_options.sh       | 216 +++++++++++++++
> .../drivers/net/bonding/option_prio.sh        | 245 ------------------
> 4 files changed, 363 insertions(+), 246 deletions(-)
> create mode 100644 tools/testing/selftests/drivers/net/bonding/bond_lib.sh
> create mode 100755 tools/testing/selftests/drivers/net/bonding/bond_options.sh
> delete mode 100755 tools/testing/selftests/drivers/net/bonding/option_prio.sh
>
>diff --git a/tools/testing/selftests/drivers/net/bonding/Makefile b/tools/testing/selftests/drivers/net/bonding/Makefile
>index a39bb2560d9b..4683b06afdba 100644
>--- a/tools/testing/selftests/drivers/net/bonding/Makefile
>+++ b/tools/testing/selftests/drivers/net/bonding/Makefile
>@@ -8,11 +8,12 @@ TEST_PROGS := \
> 	dev_addr_lists.sh \
> 	mode-1-recovery-updelay.sh \
> 	mode-2-recovery-updelay.sh \
>-	option_prio.sh \
>+	bond_options.sh \
> 	bond-eth-type-change.sh
> 
> TEST_FILES := \
> 	lag_lib.sh \
>+	bond_lib.sh \
> 	net_forwarding_lib.sh
> 
> include ../../../lib.mk
>diff --git a/tools/testing/selftests/drivers/net/bonding/bond_lib.sh b/tools/testing/selftests/drivers/net/bonding/bond_lib.sh
>new file mode 100644
>index 000000000000..ca64a82e1385
>--- /dev/null
>+++ b/tools/testing/selftests/drivers/net/bonding/bond_lib.sh
>@@ -0,0 +1,145 @@
>+#!/bin/bash
>+# SPDX-License-Identifier: GPL-2.0
>+#
>+# Topology for Bond mode 1,5,6 testing
>+#
>+#  +---------------------------------------+
>+#  |                 bond0                 |  192.0.2.1/24
>+#  |                   +                   |  2001:db8::1/24
>+#  |       eth0        | eth1   eth2       |  Server
>+#  |         +-------------------+         |
>+#  |         |         |         |         |
>+#  +---------------------------------------+
>+#            |         |         |
>+#            |         |         |
>+#  +---------------------------------------+
>+#  |         |         |         |         |  192.0.2.254/24
>+#  |     +---+---------+---------+---+     |  2001:db8::254/24
>+#  |     |            br0            |     |  Switch
>+#  |     +---+---------+---------+---+     |
>+#  |         |         |         |         |
>+#  +---------------------------------------+
>+#            |         |         |
>+#      +-----+         |         +-----+
>+#      |               |               |
>+#  +-------+       +-------+           |
>+#  |   |   |       |   |   |           +
>+#  |   +   |       |   +   |     ... More clients if needed
>+#  | eth0  |       | eth0  |
>+#  +-------+       +-------+
>+#   Client          Client1
>+#  192.0.2.10      192.0.2.11
>+# 2001:db8::10    2001:db8::11
>+
>+s_ns="s-$(mktemp -u XXXXXX)"
>+sw_ns="sw-$(mktemp -u XXXXXX)"
>+c_ns="c-$(mktemp -u XXXXXX)"
>+s_ip4="192.0.2.1"
>+c_ip4="192.0.2.10"
>+sw_ip4="192.0.2.254"
>+s_ip6="2001:db8::1"
>+c_ip6="2001:db8::10"
>+sw_ip6="2001:db8::254"
>+
>+switch_create()
>+{
>+	ip netns add ${sw_ns}
>+	ip -n ${sw_ns} link add br0 type bridge
>+	ip -n ${sw_ns} link set br0 up
>+	ip -n ${sw_ns} addr add ${sw_ip4}/24 dev br0
>+	ip -n ${sw_ns} addr add ${sw_ip6}/24 dev br0
>+}
>+
>+switch_destroy()
>+{
>+	ip -n ${sw_ns} link del br0
>+	ip netns del ${sw_ns}
>+}
>+
>+server_create()
>+{
>+	ip netns add ${s_ns}
>+	ip -n ${s_ns} link add bond0 type bond mode active-backup miimon 100
>+
>+	for i in $(seq 0 2); do
>+		ip -n ${s_ns} link add eth${i} type veth peer name s${i} netns ${sw_ns}
>+
>+		ip -n ${sw_ns} link set s${i} up
>+		ip -n ${sw_ns} link set s${i} master br0
>+		ip -n ${s_ns} link set eth${i} master bond0
>+	done
>+
>+	ip -n ${s_ns} link set bond0 up
>+	ip -n ${s_ns} addr add ${s_ip4}/24 dev bond0
>+	ip -n ${s_ns} addr add ${s_ip6}/24 dev bond0
>+	sleep 2
>+}
>+
>+bond_reset()
>+{
>+	local param="$1"
>+
>+	ip -n ${s_ns} link set bond0 down
>+	ip -n ${s_ns} link del bond0
>+
>+	ip -n ${s_ns} link add bond0 type bond $param
>+	for i in $(seq 0 2); do
>+		ip -n ${s_ns} link set eth$i master bond0
>+	done
>+
>+	ip -n ${s_ns} link set bond0 up
>+	ip -n ${s_ns} addr add ${s_ip4}/24 dev bond0
>+	ip -n ${s_ns} addr add ${s_ip6}/24 dev bond0
>+	sleep 2
>+}
>+
>+server_destroy()
>+{
>+	for i in $(seq 0 2); do
>+		ip -n ${s_ns} link del eth${i}
>+	done
>+	ip netns del ${s_ns}
>+}
>+
>+client_create()
>+{
>+	ip netns add ${c_ns}
>+	ip -n ${c_ns} link add eth0 type veth peer name c0 netns ${sw_ns}
>+
>+	ip -n ${sw_ns} link set c0 up
>+	ip -n ${sw_ns} link set c0 master br0
>+
>+	ip -n ${c_ns} link set eth0 up
>+	ip -n ${c_ns} addr add ${c_ip4}/24 dev eth0
>+	ip -n ${c_ns} addr add ${c_ip6}/24 dev eth0
>+}
>+
>+client_destroy()
>+{
>+	ip -n ${c_ns} link del eth0
>+	ip netns del ${c_ns}
>+}
>+
>+setup_prepare()
>+{
>+	switch_create
>+	server_create
>+	client_create
>+}
>+
>+cleanup()
>+{
>+	pre_cleanup
>+
>+	client_destroy
>+	server_destroy
>+	switch_destroy
>+}
>+
>+bond_check_connection()
>+{
>+	ip netns exec ${s_ns} ping ${c_ip4} -c5 -i 0.1 -I bond0 &>/dev/null
>+	check_err $? "ping failed"
>+	ip netns exec ${s_ns} ping6 ${c_ip6} -c5 -i 0.1 -I bond0 &>/dev/null
>+	check_err $? "ping6 failed"
>+}
>diff --git a/tools/testing/selftests/drivers/net/bonding/bond_options.sh b/tools/testing/selftests/drivers/net/bonding/bond_options.sh
>new file mode 100755
>index 000000000000..431ce0e45e3c
>--- /dev/null
>+++ b/tools/testing/selftests/drivers/net/bonding/bond_options.sh
>@@ -0,0 +1,216 @@
>+#!/bin/bash
>+# SPDX-License-Identifier: GPL-2.0
>+#
>+# Test bonding options
>+
>+ALL_TESTS="
>+	prio
>+"
>+
>+REQUIRE_MZ=no
>+NUM_NETIFS=0
>+lib_dir=$(dirname "$0")
>+source "$lib_dir"/net_forwarding_lib.sh
>+source "$lib_dir"/bond_lib.sh
>+
>+skip_prio()
>+{
>+	local skip=1
>+
>+	# check if iproute support prio option
>+	ip -n ${s_ns} link set eth0 type bond_slave prio 10
>+	[[ $? -ne 0 ]] && skip=0
>+
>+	# check if kernel support prio option
>+	ip -n ${s_ns} -d link show eth0 | grep -q "prio 10"
>+	[[ $? -ne 0 ]] && skip=0
>+
>+	return $skip
>+}
>+
>+skip_ns()
>+{
>+	local skip=1
>+
>+	# check if iproute support ns_ip6_target option
>+	ip -n ${s_ns} link add bond1 type bond ns_ip6_target ${sw_ip6}
>+	[[ $? -ne 0 ]] && skip=0
>+
>+	# check if kernel support ns_ip6_target option
>+	ip -n ${s_ns} -d link show bond1 | grep -q "ns_ip6_target ${sw_ip6}"
>+	[[ $? -ne 0 ]] && skip=0
>+
>+	ip -n ${s_ns} link del bond1
>+
>+	return $skip
>+}
>+
>+active_slave=""
>+check_active_slave()
>+{
>+	local target_active_slave=$1
>+	active_slave=$(cmd_jq "ip -n ${s_ns} -d -j link show bond0" ".[].linkinfo.info_data.active_slave")
>+	test "$active_slave" = "$target_active_slave"
>+	check_err $? "Current active slave is $active_slave but not $target_active_slave"
>+}
>+
>+
>+# Test bonding prio option
>+prio_test()
>+{
>+	local param="$1"
>+	RET=0
>+
>+	# create bond
>+	bond_reset "${param}"
>+
>+	# check bonding member prio value
>+	ip -n ${s_ns} link set eth0 type bond_slave prio 0
>+	ip -n ${s_ns} link set eth1 type bond_slave prio 10
>+	ip -n ${s_ns} link set eth2 type bond_slave prio 11
>+	cmd_jq "ip -n ${s_ns} -d -j link show eth0" \
>+		".[].linkinfo.info_slave_data | select (.prio == 0)" "-e" &> /dev/null
>+	check_err $? "eth0 prio is not 0"
>+	cmd_jq "ip -n ${s_ns} -d -j link show eth1" \
>+		".[].linkinfo.info_slave_data | select (.prio == 10)" "-e" &> /dev/null
>+	check_err $? "eth1 prio is not 10"
>+	cmd_jq "ip -n ${s_ns} -d -j link show eth2" \
>+		".[].linkinfo.info_slave_data | select (.prio == 11)" "-e" &> /dev/null
>+	check_err $? "eth2 prio is not 11"
>+
>+	bond_check_connection
>+	[ $RET -ne 0 ] && log_test "prio" "$retmsg"
>+
>+	# active salve should be the primary slave

	"salve" -> "slave"

>+	check_active_slave eth1
>+
>+	# active slave should be the higher prio slave
>+	ip -n ${s_ns} link set $active_slave down
>+	ip netns exec ${s_ns} ping $c_ip4 -c5 -I bond0 &>/dev/null
>+	check_err $? "ping failed 2."
>+	check_active_slave eth2
>+
>+	# when only 1 slave is up
>+	ip -n ${s_ns} link set $active_slave down
>+	ip netns exec ${s_ns} ping $c_ip4 -c5 -I bond0 &>/dev/null
>+	check_err $? "ping failed 3."
>+	check_active_slave eth0
>+
>+	# when a higher prio slave change to up
>+	ip -n ${s_ns} link set eth2 up
>+	ip netns exec ${s_ns} ping $c_ip4 -c5 -I bond0 &>/dev/null
>+	check_err $? "ping failed 4."
>+	case $primary_reselect in
>+		"0")
>+			check_active_slave "eth2"
>+			;;
>+		"1")
>+			check_active_slave "eth0"
>+			;;
>+		"2")
>+			check_active_slave "eth0"
>+			;;
>+	esac
>+	local pre_active_slave=$active_slave
>+
>+	# when the primary slave change to up
>+	ip -n ${s_ns} link set eth1 up
>+	ip netns exec ${s_ns} ping $c_ip4 -c5 -I bond0 &>/dev/null
>+	check_err $? "ping failed 5."
>+	case $primary_reselect in
>+		"0")
>+			check_active_slave "eth1"
>+			;;
>+		"1")
>+			check_active_slave "$pre_active_slave"
>+			;;
>+		"2")
>+			check_active_slave "$pre_active_slave"
>+			ip -n ${s_ns} link set $active_slave down
>+			ip netns exec ${s_ns} ping $c_ip4 -c5 -I bond0 &>/dev/null
>+			check_err $? "ping failed 6."
>+			check_active_slave "eth1"
>+			;;
>+	esac
>+
>+	# Test changing bond salve prio

	"salve" -> "slave"

>+	if [[ "$primary_reselect" == "0" ]];then
>+		ip -n ${s_ns} link set eth0 type bond_slave prio 1000000
>+		ip -n ${s_ns} link set eth1 type bond_slave prio 0
>+		ip -n ${s_ns} link set eth2 type bond_slave prio -50
>+		ip -n ${s_ns} -d link show eth0 | grep -q 'prio 1000000'
>+		check_err $? "eth0 prio is not 1000000"
>+		ip -n ${s_ns} -d link show eth1 | grep -q 'prio 0'
>+		check_err $? "eth1 prio is not 0"
>+		ip -n ${s_ns} -d link show eth2 | grep -q 'prio -50'
>+		check_err $? "eth3 prio is not -50"
>+		check_active_slave "eth1"
>+
>+		ip -n ${s_ns} link set $active_slave down
>+		ip netns exec ${s_ns} ping $c_ip4 -c5 -I bond0 &>/dev/null
>+		check_err $? "ping failed 7."
>+		check_active_slave "eth0"
>+	fi
>+}
>+
>+prio_miimon()
>+{
>+	local primary_reselect
>+	local mode=$1
>+
>+	for primary_reselect in 0 1 2; do
>+		prio_test "mode $mode miimon 100 primary eth1 primary_reselect $primary_reselect"
>+		log_test "prio" "$mode miimon primary_reselect $primary_reselect"
>+	done
>+}
>+
>+prio_arp()
>+{
>+	local primary_reselect
>+	local mode=$1
>+
>+	for primary_reselect in 0 1 2; do
>+		prio_test "mode active-backup arp_interval 1000 arp_ip_target ${sw_ip4} primary eth1 primary_reselect $primary_reselect"
>+		log_test "prio" "$mode arp_ip_target primary_reselect $primary_reselect"
>+	done
>+}
>+
>+prio_ns()
>+{
>+	local primary_reselect
>+	local mode=$1
>+
>+	if skip_ns; then
>+		log_test_skip "prio ns" "Current iproute or kernel doesn't support bond option 'ns_ip6_target'."
>+		return 0
>+	fi
>+
>+	for primary_reselect in 0 1 2; do
>+		prio_test "mode active-backup arp_interval 1000 ns_ip6_target ${sw_ip6} primary eth1 primary_reselect $primary_reselect"
>+		log_test "prio" "$mode ns_ip6_target primary_reselect $primary_reselect"
>+	done
>+}
>+
>+prio()
>+{
>+	local mode modes="active-backup balance-tlb balance-alb"
>+
>+	if skip_prio; then
>+		log_test_skip "prio" "Current iproute or kernel doesn't support bond option 'prio'."
>+		return 0
>+	fi
>+
>+	for mode in $modes; do
>+		prio_miimon $mode
>+		prio_arp $mode
>+		prio_ns $mode
>+	done
>+}
>+
>+trap cleanup EXIT
>+
>+setup_prepare
>+setup_wait
>+tests_run
>+
>+exit $EXIT_STATUS
>diff --git a/tools/testing/selftests/drivers/net/bonding/option_prio.sh b/tools/testing/selftests/drivers/net/bonding/option_prio.sh
>deleted file mode 100755
>index c32eebff5005..000000000000
>--- a/tools/testing/selftests/drivers/net/bonding/option_prio.sh
>+++ /dev/null
>@@ -1,245 +0,0 @@
>-#!/bin/bash
>-# SPDX-License-Identifier: GPL-2.0
>-#
>-# Test bonding option prio
>-#
>-
>-ALL_TESTS="
>-	prio_arp_ip_target_test
>-	prio_miimon_test
>-"
>-
>-REQUIRE_MZ=no
>-REQUIRE_JQ=no
>-NUM_NETIFS=0
>-lib_dir=$(dirname "$0")
>-source "$lib_dir"/net_forwarding_lib.sh
>-
>-destroy()
>-{
>-	ip link del bond0 &>/dev/null
>-	ip link del br0 &>/dev/null
>-	ip link del veth0 &>/dev/null
>-	ip link del veth1 &>/dev/null
>-	ip link del veth2 &>/dev/null
>-	ip netns del ns1 &>/dev/null
>-	ip link del veth3 &>/dev/null
>-}
>-
>-cleanup()
>-{
>-	pre_cleanup
>-
>-	destroy
>-}
>-
>-skip()
>-{
>-        local skip=1
>-	ip link add name bond0 type bond mode 1 miimon 100 &>/dev/null
>-	ip link add name veth0 type veth peer name veth0_p
>-	ip link set veth0 master bond0
>-
>-	# check if iproute support prio option
>-	ip link set dev veth0 type bond_slave prio 10
>-	[[ $? -ne 0 ]] && skip=0
>-
>-	# check if bonding support prio option
>-	ip -d link show veth0 | grep -q "prio 10"
>-	[[ $? -ne 0 ]] && skip=0
>-
>-	ip link del bond0 &>/dev/null
>-	ip link del veth0
>-
>-	return $skip
>-}
>-
>-active_slave=""
>-check_active_slave()
>-{
>-	local target_active_slave=$1
>-	active_slave="$(cat /sys/class/net/bond0/bonding/activev_slave)"
>-	test "$active_slave" = "$target_active_slave"
>-	check_err $? "Current active slave is $active_slave but not $target_active_slave"
>-}
>-
>-
>-# Test bonding prio option with mode=$mode monitor=$monitor
>-# and primary_reselect=$primary_reselect
>-prio_test()
>-{
>-	RET=0
>-
>-	local monitor=$1
>-	local mode=$2
>-	local primary_reselect=$3
>-
>-	local bond_ip4="192.169.1.2"
>-	local peer_ip4="192.169.1.1"
>-	local bond_ip6="2009:0a:0b::02"
>-	local peer_ip6="2009:0a:0b::01"
>-
>-
>-	# create veths
>-	ip link add name veth0 type veth peer name veth0_p
>-	ip link add name veth1 type veth peer name veth1_p
>-	ip link add name veth2 type veth peer name veth2_p
>-
>-	# create bond
>-	if [[ "$monitor" == "miimon" ]];then
>-		ip link add name bond0 type bond mode $mode miimon 100 primary veth1 primary_reselect $primary_reselect
>-	elif [[ "$monitor" == "arp_ip_target" ]];then
>-		ip link add name bond0 type bond mode $mode arp_interval 1000 arp_ip_target $peer_ip4 primary veth1 primary_reselect $primary_reselect
>-	elif [[ "$monitor" == "ns_ip6_target" ]];then
>-		ip link add name bond0 type bond mode $mode arp_interval 1000 ns_ip6_target $peer_ip6 primary veth1 primary_reselect $primary_reselect
>-	fi
>-	ip link set bond0 up
>-	ip link set veth0 master bond0
>-	ip link set veth1 master bond0
>-	ip link set veth2 master bond0
>-	# check bonding member prio value
>-	ip link set dev veth0 type bond_slave prio 0
>-	ip link set dev veth1 type bond_slave prio 10
>-	ip link set dev veth2 type bond_slave prio 11
>-	ip -d link show veth0 | grep -q 'prio 0'
>-	check_err $? "veth0 prio is not 0"
>-	ip -d link show veth1 | grep -q 'prio 10'
>-	check_err $? "veth0 prio is not 10"
>-	ip -d link show veth2 | grep -q 'prio 11'
>-	check_err $? "veth0 prio is not 11"
>-
>-	ip link set veth0 up
>-	ip link set veth1 up
>-	ip link set veth2 up
>-	ip link set veth0_p up
>-	ip link set veth1_p up
>-	ip link set veth2_p up
>-
>-	# prepare ping target
>-	ip link add name br0 type bridge
>-	ip link set br0 up
>-	ip link set veth0_p master br0
>-	ip link set veth1_p master br0
>-	ip link set veth2_p master br0
>-	ip link add name veth3 type veth peer name veth3_p
>-	ip netns add ns1
>-	ip link set veth3_p master br0 up
>-	ip link set veth3 netns ns1 up
>-	ip netns exec ns1 ip addr add $peer_ip4/24 dev veth3
>-	ip netns exec ns1 ip addr add $peer_ip6/64 dev veth3
>-	ip addr add $bond_ip4/24 dev bond0
>-	ip addr add $bond_ip6/64 dev bond0
>-	sleep 5
>-
>-	ping $peer_ip4 -c5 -I bond0 &>/dev/null
>-	check_err $? "ping failed 1."
>-	ping6 $peer_ip6 -c5 -I bond0 &>/dev/null
>-	check_err $? "ping6 failed 1."
>-
>-	# active salve should be the primary slave
>-	check_active_slave veth1
>-
>-	# active slave should be the higher prio slave
>-	ip link set $active_slave down
>-	ping $peer_ip4 -c5 -I bond0 &>/dev/null
>-	check_err $? "ping failed 2."
>-	check_active_slave veth2
>-
>-	# when only 1 slave is up
>-	ip link set $active_slave down
>-	ping $peer_ip4 -c5 -I bond0 &>/dev/null
>-	check_err $? "ping failed 3."
>-	check_active_slave veth0
>-
>-	# when a higher prio slave change to up
>-	ip link set veth2 up
>-	ping $peer_ip4 -c5 -I bond0 &>/dev/null
>-	check_err $? "ping failed 4."
>-	case $primary_reselect in
>-		"0")
>-			check_active_slave "veth2"
>-			;;
>-		"1")
>-			check_active_slave "veth0"
>-			;;
>-		"2")
>-			check_active_slave "veth0"
>-			;;
>-	esac
>-	local pre_active_slave=$active_slave
>-
>-	# when the primary slave change to up
>-	ip link set veth1 up
>-	ping $peer_ip4 -c5 -I bond0 &>/dev/null
>-	check_err $? "ping failed 5."
>-	case $primary_reselect in
>-		"0")
>-			check_active_slave "veth1"
>-			;;
>-		"1")
>-			check_active_slave "$pre_active_slave"
>-			;;
>-		"2")
>-			check_active_slave "$pre_active_slave"
>-			ip link set $active_slave down
>-			ping $peer_ip4 -c5 -I bond0 &>/dev/null
>-			check_err $? "ping failed 6."
>-			check_active_slave "veth1"
>-			;;
>-	esac
>-
>-	# Test changing bond salve prio
>-	if [[ "$primary_reselect" == "0" ]];then
>-		ip link set dev veth0 type bond_slave prio 1000000
>-		ip link set dev veth1 type bond_slave prio 0
>-		ip link set dev veth2 type bond_slave prio -50
>-		ip -d link show veth0 | grep -q 'prio 1000000'
>-		check_err $? "veth0 prio is not 1000000"
>-		ip -d link show veth1 | grep -q 'prio 0'
>-		check_err $? "veth1 prio is not 0"
>-		ip -d link show veth2 | grep -q 'prio -50'
>-		check_err $? "veth3 prio is not -50"
>-		check_active_slave "veth1"
>-
>-		ip link set $active_slave down
>-		ping $peer_ip4 -c5 -I bond0 &>/dev/null
>-		check_err $? "ping failed 7."
>-		check_active_slave "veth0"
>-	fi
>-
>-	cleanup
>-
>-	log_test "prio_test" "Test bonding option 'prio' with mode=$mode monitor=$monitor and primary_reselect=$primary_reselect"
>-}
>-
>-prio_miimon_test()
>-{
>-	local mode
>-	local primary_reselect
>-
>-	for mode in 1 5 6; do
>-		for primary_reselect in 0 1 2; do
>-			prio_test "miimon" $mode $primary_reselect
>-		done
>-	done
>-}
>-
>-prio_arp_ip_target_test()
>-{
>-	local primary_reselect
>-
>-	for primary_reselect in 0 1 2; do
>-		prio_test "arp_ip_target" 1 $primary_reselect
>-	done
>-}
>-
>-if skip;then
>-	log_test_skip "option_prio.sh" "Current iproute doesn't support 'prio'."
>-	exit 0
>-fi
>-
>-trap cleanup EXIT
>-
>-tests_run
>-
>-exit "$EXIT_STATUS"
>-- 
>2.38.1
>
Hangbin Liu April 4, 2023, 2:28 a.m. UTC | #4
On Fri, Mar 31, 2023 at 10:31:47AM +0800, Hangbin Liu wrote:
> > > +++ b/tools/testing/selftests/drivers/net/bonding/bond_lib.sh
> > 
> > I like this idea, we might want to separate network topology from library
> > code however. That way a given test case can just include a predefined
> 
> Would you like to help explain more clear? Separate network topology to where?


Hi Jon, would you please help explain this part?

Thanks
Hangbin

> 
> > topology. A quick review of the test cases show a 2 node setup is the most
> > common across all test cases.
> 
> Liang suggested that with 2 clients we can test xmit_hash_policy. In
> client_create() I only create 1 client for current testing. We can add more
> clients in future.
> 
> Thanks
> Hangbin
Jonathan Toppins April 4, 2023, 4:34 p.m. UTC | #5
On 4/3/23 22:28, Hangbin Liu wrote:
> On Fri, Mar 31, 2023 at 10:31:47AM +0800, Hangbin Liu wrote:
>>>> +++ b/tools/testing/selftests/drivers/net/bonding/bond_lib.sh
>>>
>>> I like this idea, we might want to separate network topology from library
>>> code however. That way a given test case can just include a predefined
>>
>> Would you like to help explain more clear? Separate network topology to where?
> 
> 
> Hi Jon, would you please help explain this part?

Thanks for the ping. It looks like several test cases build largely the 
same virtual network topology and then execute the test case. I was 
attempting to point out that it might be better to provide a standard 
network topology and then each test case utilizes this standard topology 
instead of each test case rolling its own. Also, with my comment about 
separating out the topology from library code I was accounting for the 
ability to support multiple topologies, fe:

  bond_lib.sh
  bond_topo_gateway.sh
  bond_topo_2.sh

Then a given test case only includes/sources `bond_topo_gateway.sh` 
which creates the virtual network.

-Jon

> 
>>
>>> topology. A quick review of the test cases show a 2 node setup is the most
>>> common across all test cases.
>>
>> Liang suggested that with 2 clients we can test xmit_hash_policy. In
>> client_create() I only create 1 client for current testing. We can add more
>> clients in future.
>>
>> Thanks
>> Hangbin
>
Hangbin Liu April 5, 2023, 9:57 a.m. UTC | #6
On Tue, Apr 04, 2023 at 12:34:03PM -0400, Jonathan Toppins wrote:
> > > > I like this idea, we might want to separate network topology from library
> > > > code however. That way a given test case can just include a predefined
> > > 
> > > Would you like to help explain more clear? Separate network topology to where?
> > 
> > 
> > Hi Jon, would you please help explain this part?
> 
> Thanks for the ping. It looks like several test cases build largely the same
> virtual network topology and then execute the test case. I was attempting to
> point out that it might be better to provide a standard network topology and
> then each test case utilizes this standard topology instead of each test
> case rolling its own. Also, with my comment about separating out the
> topology from library code I was accounting for the ability to support
> multiple topologies, fe:
> 
>  bond_lib.sh
>  bond_topo_gateway.sh
>  bond_topo_2.sh
> 
> Then a given test case only includes/sources `bond_topo_gateway.sh` which
> creates the virtual network.

Thank Jon, this is much clear to me now. I'm not good at naming.
For topology with 2 down link devices, 1 client, I plan to name it
bond_topo_2d1c.sh. So 3 down links devices, 2 clients will be
bond_topo_3d2c.sh. If there is no switch between server and client, it could
be bond_topo_2d1c_ns.sh.

I'm not sure if the name is weird to you. Any comments?

Thanks
Hangbin
Jonathan Toppins April 6, 2023, 12:23 a.m. UTC | #7
On 4/5/23 05:57, Hangbin Liu wrote:
> On Tue, Apr 04, 2023 at 12:34:03PM -0400, Jonathan Toppins wrote:
>>>>> I like this idea, we might want to separate network topology from library
>>>>> code however. That way a given test case can just include a predefined
>>>>
>>>> Would you like to help explain more clear? Separate network topology to where?
>>>
>>>
>>> Hi Jon, would you please help explain this part?
>>
>> Thanks for the ping. It looks like several test cases build largely the same
>> virtual network topology and then execute the test case. I was attempting to
>> point out that it might be better to provide a standard network topology and
>> then each test case utilizes this standard topology instead of each test
>> case rolling its own. Also, with my comment about separating out the
>> topology from library code I was accounting for the ability to support
>> multiple topologies, fe:
>>
>>   bond_lib.sh
>>   bond_topo_gateway.sh
>>   bond_topo_2.sh
>>
>> Then a given test case only includes/sources `bond_topo_gateway.sh` which
>> creates the virtual network.
> 
> Thank Jon, this is much clear to me now. I'm not good at naming.
> For topology with 2 down link devices, 1 client, I plan to name it
> bond_topo_2d1c.sh. So 3 down links devices, 2 clients will be
> bond_topo_3d2c.sh. If there is no switch between server and client, it could
> be bond_topo_2d1c_ns.sh.
> 
> I'm not sure if the name is weird to you. Any comments?
> 

Hi Hangbin, I do not have a particular preference for the naming. What 
you have proposed seems good to me.

-Jon
diff mbox series

Patch

diff --git a/tools/testing/selftests/drivers/net/bonding/Makefile b/tools/testing/selftests/drivers/net/bonding/Makefile
index a39bb2560d9b..4683b06afdba 100644
--- a/tools/testing/selftests/drivers/net/bonding/Makefile
+++ b/tools/testing/selftests/drivers/net/bonding/Makefile
@@ -8,11 +8,12 @@  TEST_PROGS := \
 	dev_addr_lists.sh \
 	mode-1-recovery-updelay.sh \
 	mode-2-recovery-updelay.sh \
-	option_prio.sh \
+	bond_options.sh \
 	bond-eth-type-change.sh
 
 TEST_FILES := \
 	lag_lib.sh \
+	bond_lib.sh \
 	net_forwarding_lib.sh
 
 include ../../../lib.mk
diff --git a/tools/testing/selftests/drivers/net/bonding/bond_lib.sh b/tools/testing/selftests/drivers/net/bonding/bond_lib.sh
new file mode 100644
index 000000000000..ca64a82e1385
--- /dev/null
+++ b/tools/testing/selftests/drivers/net/bonding/bond_lib.sh
@@ -0,0 +1,145 @@ 
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+#
+# Topology for Bond mode 1,5,6 testing
+#
+#  +---------------------------------------+
+#  |                 bond0                 |  192.0.2.1/24
+#  |                   +                   |  2001:db8::1/24
+#  |       eth0        | eth1   eth2       |  Server
+#  |         +-------------------+         |
+#  |         |         |         |         |
+#  +---------------------------------------+
+#            |         |         |
+#            |         |         |
+#  +---------------------------------------+
+#  |         |         |         |         |  192.0.2.254/24
+#  |     +---+---------+---------+---+     |  2001:db8::254/24
+#  |     |            br0            |     |  Switch
+#  |     +---+---------+---------+---+     |
+#  |         |         |         |         |
+#  +---------------------------------------+
+#            |         |         |
+#      +-----+         |         +-----+
+#      |               |               |
+#  +-------+       +-------+           |
+#  |   |   |       |   |   |           +
+#  |   +   |       |   +   |     ... More clients if needed
+#  | eth0  |       | eth0  |
+#  +-------+       +-------+
+#   Client          Client1
+#  192.0.2.10      192.0.2.11
+# 2001:db8::10    2001:db8::11
+
+s_ns="s-$(mktemp -u XXXXXX)"
+sw_ns="sw-$(mktemp -u XXXXXX)"
+c_ns="c-$(mktemp -u XXXXXX)"
+s_ip4="192.0.2.1"
+c_ip4="192.0.2.10"
+sw_ip4="192.0.2.254"
+s_ip6="2001:db8::1"
+c_ip6="2001:db8::10"
+sw_ip6="2001:db8::254"
+
+switch_create()
+{
+	ip netns add ${sw_ns}
+	ip -n ${sw_ns} link add br0 type bridge
+	ip -n ${sw_ns} link set br0 up
+	ip -n ${sw_ns} addr add ${sw_ip4}/24 dev br0
+	ip -n ${sw_ns} addr add ${sw_ip6}/24 dev br0
+}
+
+switch_destroy()
+{
+	ip -n ${sw_ns} link del br0
+	ip netns del ${sw_ns}
+}
+
+server_create()
+{
+	ip netns add ${s_ns}
+	ip -n ${s_ns} link add bond0 type bond mode active-backup miimon 100
+
+	for i in $(seq 0 2); do
+		ip -n ${s_ns} link add eth${i} type veth peer name s${i} netns ${sw_ns}
+
+		ip -n ${sw_ns} link set s${i} up
+		ip -n ${sw_ns} link set s${i} master br0
+		ip -n ${s_ns} link set eth${i} master bond0
+	done
+
+	ip -n ${s_ns} link set bond0 up
+	ip -n ${s_ns} addr add ${s_ip4}/24 dev bond0
+	ip -n ${s_ns} addr add ${s_ip6}/24 dev bond0
+	sleep 2
+}
+
+bond_reset()
+{
+	local param="$1"
+
+	ip -n ${s_ns} link set bond0 down
+	ip -n ${s_ns} link del bond0
+
+	ip -n ${s_ns} link add bond0 type bond $param
+	for i in $(seq 0 2); do
+		ip -n ${s_ns} link set eth$i master bond0
+	done
+
+	ip -n ${s_ns} link set bond0 up
+	ip -n ${s_ns} addr add ${s_ip4}/24 dev bond0
+	ip -n ${s_ns} addr add ${s_ip6}/24 dev bond0
+	sleep 2
+}
+
+server_destroy()
+{
+	for i in $(seq 0 2); do
+		ip -n ${s_ns} link del eth${i}
+	done
+	ip netns del ${s_ns}
+}
+
+client_create()
+{
+	ip netns add ${c_ns}
+	ip -n ${c_ns} link add eth0 type veth peer name c0 netns ${sw_ns}
+
+	ip -n ${sw_ns} link set c0 up
+	ip -n ${sw_ns} link set c0 master br0
+
+	ip -n ${c_ns} link set eth0 up
+	ip -n ${c_ns} addr add ${c_ip4}/24 dev eth0
+	ip -n ${c_ns} addr add ${c_ip6}/24 dev eth0
+}
+
+client_destroy()
+{
+	ip -n ${c_ns} link del eth0
+	ip netns del ${c_ns}
+}
+
+setup_prepare()
+{
+	switch_create
+	server_create
+	client_create
+}
+
+cleanup()
+{
+	pre_cleanup
+
+	client_destroy
+	server_destroy
+	switch_destroy
+}
+
+bond_check_connection()
+{
+	ip netns exec ${s_ns} ping ${c_ip4} -c5 -i 0.1 -I bond0 &>/dev/null
+	check_err $? "ping failed"
+	ip netns exec ${s_ns} ping6 ${c_ip6} -c5 -i 0.1 -I bond0 &>/dev/null
+	check_err $? "ping6 failed"
+}
diff --git a/tools/testing/selftests/drivers/net/bonding/bond_options.sh b/tools/testing/selftests/drivers/net/bonding/bond_options.sh
new file mode 100755
index 000000000000..431ce0e45e3c
--- /dev/null
+++ b/tools/testing/selftests/drivers/net/bonding/bond_options.sh
@@ -0,0 +1,216 @@ 
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+#
+# Test bonding options
+
+ALL_TESTS="
+	prio
+"
+
+REQUIRE_MZ=no
+NUM_NETIFS=0
+lib_dir=$(dirname "$0")
+source "$lib_dir"/net_forwarding_lib.sh
+source "$lib_dir"/bond_lib.sh
+
+skip_prio()
+{
+	local skip=1
+
+	# check if iproute support prio option
+	ip -n ${s_ns} link set eth0 type bond_slave prio 10
+	[[ $? -ne 0 ]] && skip=0
+
+	# check if kernel support prio option
+	ip -n ${s_ns} -d link show eth0 | grep -q "prio 10"
+	[[ $? -ne 0 ]] && skip=0
+
+	return $skip
+}
+
+skip_ns()
+{
+	local skip=1
+
+	# check if iproute support ns_ip6_target option
+	ip -n ${s_ns} link add bond1 type bond ns_ip6_target ${sw_ip6}
+	[[ $? -ne 0 ]] && skip=0
+
+	# check if kernel support ns_ip6_target option
+	ip -n ${s_ns} -d link show bond1 | grep -q "ns_ip6_target ${sw_ip6}"
+	[[ $? -ne 0 ]] && skip=0
+
+	ip -n ${s_ns} link del bond1
+
+	return $skip
+}
+
+active_slave=""
+check_active_slave()
+{
+	local target_active_slave=$1
+	active_slave=$(cmd_jq "ip -n ${s_ns} -d -j link show bond0" ".[].linkinfo.info_data.active_slave")
+	test "$active_slave" = "$target_active_slave"
+	check_err $? "Current active slave is $active_slave but not $target_active_slave"
+}
+
+
+# Test bonding prio option
+prio_test()
+{
+	local param="$1"
+	RET=0
+
+	# create bond
+	bond_reset "${param}"
+
+	# check bonding member prio value
+	ip -n ${s_ns} link set eth0 type bond_slave prio 0
+	ip -n ${s_ns} link set eth1 type bond_slave prio 10
+	ip -n ${s_ns} link set eth2 type bond_slave prio 11
+	cmd_jq "ip -n ${s_ns} -d -j link show eth0" \
+		".[].linkinfo.info_slave_data | select (.prio == 0)" "-e" &> /dev/null
+	check_err $? "eth0 prio is not 0"
+	cmd_jq "ip -n ${s_ns} -d -j link show eth1" \
+		".[].linkinfo.info_slave_data | select (.prio == 10)" "-e" &> /dev/null
+	check_err $? "eth1 prio is not 10"
+	cmd_jq "ip -n ${s_ns} -d -j link show eth2" \
+		".[].linkinfo.info_slave_data | select (.prio == 11)" "-e" &> /dev/null
+	check_err $? "eth2 prio is not 11"
+
+	bond_check_connection
+	[ $RET -ne 0 ] && log_test "prio" "$retmsg"
+
+	# active salve should be the primary slave
+	check_active_slave eth1
+
+	# active slave should be the higher prio slave
+	ip -n ${s_ns} link set $active_slave down
+	ip netns exec ${s_ns} ping $c_ip4 -c5 -I bond0 &>/dev/null
+	check_err $? "ping failed 2."
+	check_active_slave eth2
+
+	# when only 1 slave is up
+	ip -n ${s_ns} link set $active_slave down
+	ip netns exec ${s_ns} ping $c_ip4 -c5 -I bond0 &>/dev/null
+	check_err $? "ping failed 3."
+	check_active_slave eth0
+
+	# when a higher prio slave change to up
+	ip -n ${s_ns} link set eth2 up
+	ip netns exec ${s_ns} ping $c_ip4 -c5 -I bond0 &>/dev/null
+	check_err $? "ping failed 4."
+	case $primary_reselect in
+		"0")
+			check_active_slave "eth2"
+			;;
+		"1")
+			check_active_slave "eth0"
+			;;
+		"2")
+			check_active_slave "eth0"
+			;;
+	esac
+	local pre_active_slave=$active_slave
+
+	# when the primary slave change to up
+	ip -n ${s_ns} link set eth1 up
+	ip netns exec ${s_ns} ping $c_ip4 -c5 -I bond0 &>/dev/null
+	check_err $? "ping failed 5."
+	case $primary_reselect in
+		"0")
+			check_active_slave "eth1"
+			;;
+		"1")
+			check_active_slave "$pre_active_slave"
+			;;
+		"2")
+			check_active_slave "$pre_active_slave"
+			ip -n ${s_ns} link set $active_slave down
+			ip netns exec ${s_ns} ping $c_ip4 -c5 -I bond0 &>/dev/null
+			check_err $? "ping failed 6."
+			check_active_slave "eth1"
+			;;
+	esac
+
+	# Test changing bond salve prio
+	if [[ "$primary_reselect" == "0" ]];then
+		ip -n ${s_ns} link set eth0 type bond_slave prio 1000000
+		ip -n ${s_ns} link set eth1 type bond_slave prio 0
+		ip -n ${s_ns} link set eth2 type bond_slave prio -50
+		ip -n ${s_ns} -d link show eth0 | grep -q 'prio 1000000'
+		check_err $? "eth0 prio is not 1000000"
+		ip -n ${s_ns} -d link show eth1 | grep -q 'prio 0'
+		check_err $? "eth1 prio is not 0"
+		ip -n ${s_ns} -d link show eth2 | grep -q 'prio -50'
+		check_err $? "eth3 prio is not -50"
+		check_active_slave "eth1"
+
+		ip -n ${s_ns} link set $active_slave down
+		ip netns exec ${s_ns} ping $c_ip4 -c5 -I bond0 &>/dev/null
+		check_err $? "ping failed 7."
+		check_active_slave "eth0"
+	fi
+}
+
+prio_miimon()
+{
+	local primary_reselect
+	local mode=$1
+
+	for primary_reselect in 0 1 2; do
+		prio_test "mode $mode miimon 100 primary eth1 primary_reselect $primary_reselect"
+		log_test "prio" "$mode miimon primary_reselect $primary_reselect"
+	done
+}
+
+prio_arp()
+{
+	local primary_reselect
+	local mode=$1
+
+	for primary_reselect in 0 1 2; do
+		prio_test "mode active-backup arp_interval 1000 arp_ip_target ${sw_ip4} primary eth1 primary_reselect $primary_reselect"
+		log_test "prio" "$mode arp_ip_target primary_reselect $primary_reselect"
+	done
+}
+
+prio_ns()
+{
+	local primary_reselect
+	local mode=$1
+
+	if skip_ns; then
+		log_test_skip "prio ns" "Current iproute or kernel doesn't support bond option 'ns_ip6_target'."
+		return 0
+	fi
+
+	for primary_reselect in 0 1 2; do
+		prio_test "mode active-backup arp_interval 1000 ns_ip6_target ${sw_ip6} primary eth1 primary_reselect $primary_reselect"
+		log_test "prio" "$mode ns_ip6_target primary_reselect $primary_reselect"
+	done
+}
+
+prio()
+{
+	local mode modes="active-backup balance-tlb balance-alb"
+
+	if skip_prio; then
+		log_test_skip "prio" "Current iproute or kernel doesn't support bond option 'prio'."
+		return 0
+	fi
+
+	for mode in $modes; do
+		prio_miimon $mode
+		prio_arp $mode
+		prio_ns $mode
+	done
+}
+
+trap cleanup EXIT
+
+setup_prepare
+setup_wait
+tests_run
+
+exit $EXIT_STATUS
diff --git a/tools/testing/selftests/drivers/net/bonding/option_prio.sh b/tools/testing/selftests/drivers/net/bonding/option_prio.sh
deleted file mode 100755
index c32eebff5005..000000000000
--- a/tools/testing/selftests/drivers/net/bonding/option_prio.sh
+++ /dev/null
@@ -1,245 +0,0 @@ 
-#!/bin/bash
-# SPDX-License-Identifier: GPL-2.0
-#
-# Test bonding option prio
-#
-
-ALL_TESTS="
-	prio_arp_ip_target_test
-	prio_miimon_test
-"
-
-REQUIRE_MZ=no
-REQUIRE_JQ=no
-NUM_NETIFS=0
-lib_dir=$(dirname "$0")
-source "$lib_dir"/net_forwarding_lib.sh
-
-destroy()
-{
-	ip link del bond0 &>/dev/null
-	ip link del br0 &>/dev/null
-	ip link del veth0 &>/dev/null
-	ip link del veth1 &>/dev/null
-	ip link del veth2 &>/dev/null
-	ip netns del ns1 &>/dev/null
-	ip link del veth3 &>/dev/null
-}
-
-cleanup()
-{
-	pre_cleanup
-
-	destroy
-}
-
-skip()
-{
-        local skip=1
-	ip link add name bond0 type bond mode 1 miimon 100 &>/dev/null
-	ip link add name veth0 type veth peer name veth0_p
-	ip link set veth0 master bond0
-
-	# check if iproute support prio option
-	ip link set dev veth0 type bond_slave prio 10
-	[[ $? -ne 0 ]] && skip=0
-
-	# check if bonding support prio option
-	ip -d link show veth0 | grep -q "prio 10"
-	[[ $? -ne 0 ]] && skip=0
-
-	ip link del bond0 &>/dev/null
-	ip link del veth0
-
-	return $skip
-}
-
-active_slave=""
-check_active_slave()
-{
-	local target_active_slave=$1
-	active_slave="$(cat /sys/class/net/bond0/bonding/active_slave)"
-	test "$active_slave" = "$target_active_slave"
-	check_err $? "Current active slave is $active_slave but not $target_active_slave"
-}
-
-
-# Test bonding prio option with mode=$mode monitor=$monitor
-# and primary_reselect=$primary_reselect
-prio_test()
-{
-	RET=0
-
-	local monitor=$1
-	local mode=$2
-	local primary_reselect=$3
-
-	local bond_ip4="192.169.1.2"
-	local peer_ip4="192.169.1.1"
-	local bond_ip6="2009:0a:0b::02"
-	local peer_ip6="2009:0a:0b::01"
-
-
-	# create veths
-	ip link add name veth0 type veth peer name veth0_p
-	ip link add name veth1 type veth peer name veth1_p
-	ip link add name veth2 type veth peer name veth2_p
-
-	# create bond
-	if [[ "$monitor" == "miimon" ]];then
-		ip link add name bond0 type bond mode $mode miimon 100 primary veth1 primary_reselect $primary_reselect
-	elif [[ "$monitor" == "arp_ip_target" ]];then
-		ip link add name bond0 type bond mode $mode arp_interval 1000 arp_ip_target $peer_ip4 primary veth1 primary_reselect $primary_reselect
-	elif [[ "$monitor" == "ns_ip6_target" ]];then
-		ip link add name bond0 type bond mode $mode arp_interval 1000 ns_ip6_target $peer_ip6 primary veth1 primary_reselect $primary_reselect
-	fi
-	ip link set bond0 up
-	ip link set veth0 master bond0
-	ip link set veth1 master bond0
-	ip link set veth2 master bond0
-	# check bonding member prio value
-	ip link set dev veth0 type bond_slave prio 0
-	ip link set dev veth1 type bond_slave prio 10
-	ip link set dev veth2 type bond_slave prio 11
-	ip -d link show veth0 | grep -q 'prio 0'
-	check_err $? "veth0 prio is not 0"
-	ip -d link show veth1 | grep -q 'prio 10'
-	check_err $? "veth0 prio is not 10"
-	ip -d link show veth2 | grep -q 'prio 11'
-	check_err $? "veth0 prio is not 11"
-
-	ip link set veth0 up
-	ip link set veth1 up
-	ip link set veth2 up
-	ip link set veth0_p up
-	ip link set veth1_p up
-	ip link set veth2_p up
-
-	# prepare ping target
-	ip link add name br0 type bridge
-	ip link set br0 up
-	ip link set veth0_p master br0
-	ip link set veth1_p master br0
-	ip link set veth2_p master br0
-	ip link add name veth3 type veth peer name veth3_p
-	ip netns add ns1
-	ip link set veth3_p master br0 up
-	ip link set veth3 netns ns1 up
-	ip netns exec ns1 ip addr add $peer_ip4/24 dev veth3
-	ip netns exec ns1 ip addr add $peer_ip6/64 dev veth3
-	ip addr add $bond_ip4/24 dev bond0
-	ip addr add $bond_ip6/64 dev bond0
-	sleep 5
-
-	ping $peer_ip4 -c5 -I bond0 &>/dev/null
-	check_err $? "ping failed 1."
-	ping6 $peer_ip6 -c5 -I bond0 &>/dev/null
-	check_err $? "ping6 failed 1."
-
-	# active salve should be the primary slave
-	check_active_slave veth1
-
-	# active slave should be the higher prio slave
-	ip link set $active_slave down
-	ping $peer_ip4 -c5 -I bond0 &>/dev/null
-	check_err $? "ping failed 2."
-	check_active_slave veth2
-
-	# when only 1 slave is up
-	ip link set $active_slave down
-	ping $peer_ip4 -c5 -I bond0 &>/dev/null
-	check_err $? "ping failed 3."
-	check_active_slave veth0
-
-	# when a higher prio slave change to up
-	ip link set veth2 up
-	ping $peer_ip4 -c5 -I bond0 &>/dev/null
-	check_err $? "ping failed 4."
-	case $primary_reselect in
-		"0")
-			check_active_slave "veth2"
-			;;
-		"1")
-			check_active_slave "veth0"
-			;;
-		"2")
-			check_active_slave "veth0"
-			;;
-	esac
-	local pre_active_slave=$active_slave
-
-	# when the primary slave change to up
-	ip link set veth1 up
-	ping $peer_ip4 -c5 -I bond0 &>/dev/null
-	check_err $? "ping failed 5."
-	case $primary_reselect in
-		"0")
-			check_active_slave "veth1"
-			;;
-		"1")
-			check_active_slave "$pre_active_slave"
-			;;
-		"2")
-			check_active_slave "$pre_active_slave"
-			ip link set $active_slave down
-			ping $peer_ip4 -c5 -I bond0 &>/dev/null
-			check_err $? "ping failed 6."
-			check_active_slave "veth1"
-			;;
-	esac
-
-	# Test changing bond salve prio
-	if [[ "$primary_reselect" == "0" ]];then
-		ip link set dev veth0 type bond_slave prio 1000000
-		ip link set dev veth1 type bond_slave prio 0
-		ip link set dev veth2 type bond_slave prio -50
-		ip -d link show veth0 | grep -q 'prio 1000000'
-		check_err $? "veth0 prio is not 1000000"
-		ip -d link show veth1 | grep -q 'prio 0'
-		check_err $? "veth1 prio is not 0"
-		ip -d link show veth2 | grep -q 'prio -50'
-		check_err $? "veth3 prio is not -50"
-		check_active_slave "veth1"
-
-		ip link set $active_slave down
-		ping $peer_ip4 -c5 -I bond0 &>/dev/null
-		check_err $? "ping failed 7."
-		check_active_slave "veth0"
-	fi
-
-	cleanup
-
-	log_test "prio_test" "Test bonding option 'prio' with mode=$mode monitor=$monitor and primary_reselect=$primary_reselect"
-}
-
-prio_miimon_test()
-{
-	local mode
-	local primary_reselect
-
-	for mode in 1 5 6; do
-		for primary_reselect in 0 1 2; do
-			prio_test "miimon" $mode $primary_reselect
-		done
-	done
-}
-
-prio_arp_ip_target_test()
-{
-	local primary_reselect
-
-	for primary_reselect in 0 1 2; do
-		prio_test "arp_ip_target" 1 $primary_reselect
-	done
-}
-
-if skip;then
-	log_test_skip "option_prio.sh" "Current iproute doesn't support 'prio'."
-	exit 0
-fi
-
-trap cleanup EXIT
-
-tests_run
-
-exit "$EXIT_STATUS"