Path: blob/master/tools/testing/selftests/drivers/net/bonding/bond_options.sh
26292 views
#!/bin/bash1# SPDX-License-Identifier: GPL-2.02#3# Test bonding options with mode 1,5,645ALL_TESTS="6prio7arp_validate8num_grat_arp9"1011lib_dir=$(dirname "$0")12source ${lib_dir}/bond_topo_3d1c.sh13c_maddr="33:33:ff:00:00:10"14g_maddr="33:33:ff:00:02:54"1516skip_prio()17{18local skip=11920# check if iproute support prio option21ip -n ${s_ns} link set eth0 type bond_slave prio 1022[[ $? -ne 0 ]] && skip=02324# check if kernel support prio option25ip -n ${s_ns} -d link show eth0 | grep -q "prio 10"26[[ $? -ne 0 ]] && skip=02728return $skip29}3031skip_ns()32{33local skip=13435# check if iproute support ns_ip6_target option36ip -n ${s_ns} link add bond1 type bond ns_ip6_target ${g_ip6}37[[ $? -ne 0 ]] && skip=03839# check if kernel support ns_ip6_target option40ip -n ${s_ns} -d link show bond1 | grep -q "ns_ip6_target ${g_ip6}"41[[ $? -ne 0 ]] && skip=04243ip -n ${s_ns} link del bond14445return $skip46}4748active_slave=""49active_slave_changed()50{51local old_active_slave=$152local new_active_slave=$(cmd_jq "ip -n ${s_ns} -d -j link show bond0" \53".[].linkinfo.info_data.active_slave")54[ "$new_active_slave" != "$old_active_slave" -a "$new_active_slave" != "null" ]55}5657check_active_slave()58{59local target_active_slave=$160slowwait 5 active_slave_changed $active_slave61active_slave=$(cmd_jq "ip -n ${s_ns} -d -j link show bond0" ".[].linkinfo.info_data.active_slave")62test "$active_slave" = "$target_active_slave"63check_err $? "Current active slave is $active_slave but not $target_active_slave"64}6566# Test bonding prio option67prio_test()68{69local param="$1"70RET=07172# create bond73bond_reset "${param}"74# set active_slave to primary eth1 specifically75ip -n ${s_ns} link set bond0 type bond active_slave eth17677# check bonding member prio value78ip -n ${s_ns} link set eth0 type bond_slave prio 079ip -n ${s_ns} link set eth1 type bond_slave prio 1080ip -n ${s_ns} link set eth2 type bond_slave prio 1181cmd_jq "ip -n ${s_ns} -d -j link show eth0" \82".[].linkinfo.info_slave_data | select (.prio == 0)" "-e" &> /dev/null83check_err $? "eth0 prio is not 0"84cmd_jq "ip -n ${s_ns} -d -j link show eth1" \85".[].linkinfo.info_slave_data | select (.prio == 10)" "-e" &> /dev/null86check_err $? "eth1 prio is not 10"87cmd_jq "ip -n ${s_ns} -d -j link show eth2" \88".[].linkinfo.info_slave_data | select (.prio == 11)" "-e" &> /dev/null89check_err $? "eth2 prio is not 11"9091bond_check_connection "setup"9293# active slave should be the primary slave94check_active_slave eth19596# active slave should be the higher prio slave97ip -n ${s_ns} link set $active_slave down98check_active_slave eth299bond_check_connection "fail over"100101# when only 1 slave is up102ip -n ${s_ns} link set $active_slave down103check_active_slave eth0104bond_check_connection "only 1 slave up"105106# when a higher prio slave change to up107ip -n ${s_ns} link set eth2 up108bond_check_connection "higher prio slave up"109case $primary_reselect in110"0")111check_active_slave "eth2"112;;113"1")114check_active_slave "eth0"115;;116"2")117check_active_slave "eth0"118;;119esac120local pre_active_slave=$active_slave121122# when the primary slave change to up123ip -n ${s_ns} link set eth1 up124bond_check_connection "primary slave up"125case $primary_reselect in126"0")127check_active_slave "eth1"128;;129"1")130check_active_slave "$pre_active_slave"131;;132"2")133check_active_slave "$pre_active_slave"134ip -n ${s_ns} link set $active_slave down135bond_check_connection "pre_active slave down"136check_active_slave "eth1"137;;138esac139140# Test changing bond slave prio141if [[ "$primary_reselect" == "0" ]];then142ip -n ${s_ns} link set eth0 type bond_slave prio 1000000143ip -n ${s_ns} link set eth1 type bond_slave prio 0144ip -n ${s_ns} link set eth2 type bond_slave prio -50145ip -n ${s_ns} -d link show eth0 | grep -q 'prio 1000000'146check_err $? "eth0 prio is not 1000000"147ip -n ${s_ns} -d link show eth1 | grep -q 'prio 0'148check_err $? "eth1 prio is not 0"149ip -n ${s_ns} -d link show eth2 | grep -q 'prio -50'150check_err $? "eth3 prio is not -50"151check_active_slave "eth1"152153ip -n ${s_ns} link set $active_slave down154check_active_slave "eth0"155bond_check_connection "change slave prio"156fi157}158159prio_miimon()160{161local primary_reselect162local mode=$1163164for primary_reselect in 0 1 2; do165prio_test "mode $mode miimon 100 primary eth1 primary_reselect $primary_reselect"166log_test "prio" "$mode miimon primary_reselect $primary_reselect"167done168}169170prio_arp()171{172local primary_reselect173local mode=$1174175for primary_reselect in 0 1 2; do176prio_test "mode $mode arp_interval 100 arp_ip_target ${g_ip4} primary eth1 primary_reselect $primary_reselect"177log_test "prio" "$mode arp_ip_target primary_reselect $primary_reselect"178done179}180181prio_ns()182{183local primary_reselect184local mode=$1185186if skip_ns; then187log_test_skip "prio ns" "Current iproute or kernel doesn't support bond option 'ns_ip6_target'."188return 0189fi190191for primary_reselect in 0 1 2; do192prio_test "mode $mode arp_interval 100 ns_ip6_target ${g_ip6} primary eth1 primary_reselect $primary_reselect"193log_test "prio" "$mode ns_ip6_target primary_reselect $primary_reselect"194done195}196197prio()198{199local mode modes="active-backup balance-tlb balance-alb"200201if skip_prio; then202log_test_skip "prio" "Current iproute or kernel doesn't support bond option 'prio'."203return 0204fi205206for mode in $modes; do207prio_miimon $mode208done209prio_arp "active-backup"210prio_ns "active-backup"211}212213wait_mii_up()214{215for i in $(seq 0 2); do216mii_status=$(cmd_jq "ip -n ${s_ns} -j -d link show eth$i" ".[].linkinfo.info_slave_data.mii_status")217[ ${mii_status} != "UP" ] && return 1218done219return 0220}221222arp_validate_test()223{224local param="$1"225RET=0226227# create bond228bond_reset "${param}"229230bond_check_connection231[ $RET -ne 0 ] && log_test "arp_validate" "$retmsg"232233# wait for a while to make sure the mii status stable234slowwait 5 wait_mii_up235for i in $(seq 0 2); do236mii_status=$(cmd_jq "ip -n ${s_ns} -j -d link show eth$i" ".[].linkinfo.info_slave_data.mii_status")237if [ ${mii_status} != "UP" ]; then238RET=1239log_test "arp_validate" "interface eth$i mii_status $mii_status"240fi241done242}243244# Testing correct multicast groups are added to slaves for ns targets245arp_validate_mcast()246{247RET=0248local arp_valid=$(cmd_jq "ip -n ${s_ns} -j -d link show bond0" ".[].linkinfo.info_data.arp_validate")249local active_slave=$(cmd_jq "ip -n ${s_ns} -d -j link show bond0" ".[].linkinfo.info_data.active_slave")250251for i in $(seq 0 2); do252maddr_list=$(ip -n ${s_ns} maddr show dev eth${i})253254# arp_valid == 0 or active_slave should not join any maddrs255if { [ "$arp_valid" == "null" ] || [ "eth${i}" == ${active_slave} ]; } && \256echo "$maddr_list" | grep -qE "${c_maddr}|${g_maddr}"; then257RET=1258check_err 1 "arp_valid $arp_valid active_slave $active_slave, eth$i has mcast group"259# arp_valid != 0 and backup_slave should join both maddrs260elif [ "$arp_valid" != "null" ] && [ "eth${i}" != ${active_slave} ] && \261( ! echo "$maddr_list" | grep -q "${c_maddr}" || \262! echo "$maddr_list" | grep -q "${m_maddr}"); then263RET=1264check_err 1 "arp_valid $arp_valid active_slave $active_slave, eth$i has mcast group"265fi266done267268# Do failover269ip -n ${s_ns} link set ${active_slave} down270# wait for active link change271slowwait 2 active_slave_changed $active_slave272active_slave=$(cmd_jq "ip -n ${s_ns} -d -j link show bond0" ".[].linkinfo.info_data.active_slave")273274for i in $(seq 0 2); do275maddr_list=$(ip -n ${s_ns} maddr show dev eth${i})276277# arp_valid == 0 or active_slave should not join any maddrs278if { [ "$arp_valid" == "null" ] || [ "eth${i}" == ${active_slave} ]; } && \279echo "$maddr_list" | grep -qE "${c_maddr}|${g_maddr}"; then280RET=1281check_err 1 "arp_valid $arp_valid active_slave $active_slave, eth$i has mcast group"282# arp_valid != 0 and backup_slave should join both maddrs283elif [ "$arp_valid" != "null" ] && [ "eth${i}" != ${active_slave} ] && \284( ! echo "$maddr_list" | grep -q "${c_maddr}" || \285! echo "$maddr_list" | grep -q "${m_maddr}"); then286RET=1287check_err 1 "arp_valid $arp_valid active_slave $active_slave, eth$i has mcast group"288fi289done290}291292arp_validate_arp()293{294local mode=$1295local val296for val in $(seq 0 6); do297arp_validate_test "mode $mode arp_interval 100 arp_ip_target ${g_ip4} arp_validate $val"298log_test "arp_validate" "$mode arp_ip_target arp_validate $val"299done300}301302arp_validate_ns()303{304local mode=$1305local val306307if skip_ns; then308log_test_skip "arp_validate ns" "Current iproute or kernel doesn't support bond option 'ns_ip6_target'."309return 0310fi311312for val in $(seq 0 6); do313arp_validate_test "mode $mode arp_interval 100 ns_ip6_target ${g_ip6},${c_ip6} arp_validate $val"314log_test "arp_validate" "$mode ns_ip6_target arp_validate $val"315arp_validate_mcast316log_test "arp_validate" "join mcast group"317done318}319320arp_validate()321{322arp_validate_arp "active-backup"323arp_validate_ns "active-backup"324}325326garp_test()327{328local param="$1"329local active_slave exp_num real_num i330RET=0331332# create bond333bond_reset "${param}"334335bond_check_connection336[ $RET -ne 0 ] && log_test "num_grat_arp" "$retmsg"337338339# Add tc rules to count GARP number340for i in $(seq 0 2); do341tc -n ${g_ns} filter add dev s$i ingress protocol arp pref 1 handle 101 \342flower skip_hw arp_op request arp_sip ${s_ip4} arp_tip ${s_ip4} action pass343done344345# Do failover346active_slave=$(cmd_jq "ip -n ${s_ns} -d -j link show bond0" ".[].linkinfo.info_data.active_slave")347ip -n ${s_ns} link set ${active_slave} down348349# wait for active link change350slowwait 2 active_slave_changed $active_slave351352exp_num=$(echo "${param}" | cut -f6 -d ' ')353active_slave=$(cmd_jq "ip -n ${s_ns} -d -j link show bond0" ".[].linkinfo.info_data.active_slave")354slowwait_for_counter $((exp_num + 5)) $exp_num \355tc_rule_handle_stats_get "dev s${active_slave#eth} ingress" 101 ".packets" "-n ${g_ns}"356357# check result358real_num=$(tc_rule_handle_stats_get "dev s${active_slave#eth} ingress" 101 ".packets" "-n ${g_ns}")359if [ "${real_num}" -ne "${exp_num}" ]; then360echo "$real_num garp packets sent on active slave ${active_slave}"361RET=1362fi363364for i in $(seq 0 2); do365tc -n ${g_ns} filter del dev s$i ingress366done367}368369num_grat_arp()370{371local val372for val in 10 20 30; do373garp_test "mode active-backup miimon 10 num_grat_arp $val peer_notify_delay 100"374log_test "num_grat_arp" "active-backup miimon num_grat_arp $val"375done376}377378trap cleanup EXIT379380setup_prepare381setup_wait382tests_run383384exit $EXIT_STATUS385386387