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 |
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
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
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 >
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
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 >
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
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 --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"
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