1*db1b6006SMarc Harvey#!/bin/bash 2*db1b6006SMarc Harvey# SPDX-License-Identifier: GPL-2.0 3*db1b6006SMarc Harvey 4*db1b6006SMarc Harvey# These tests verify basic set and get functionality of the team 5*db1b6006SMarc Harvey# driver options over netlink. 6*db1b6006SMarc Harvey 7*db1b6006SMarc Harvey# Run in private netns. 8*db1b6006SMarc Harveytest_dir="$(dirname "$0")" 9*db1b6006SMarc Harveyif [[ $# -eq 0 ]]; then 10*db1b6006SMarc Harvey "${test_dir}"/../../../net/in_netns.sh "$0" __subprocess 11*db1b6006SMarc Harvey exit $? 12*db1b6006SMarc Harveyfi 13*db1b6006SMarc Harvey 14*db1b6006SMarc HarveyALL_TESTS=" 15*db1b6006SMarc Harvey team_test_options 16*db1b6006SMarc Harvey" 17*db1b6006SMarc Harvey 18*db1b6006SMarc Harveysource "${test_dir}/../../../net/lib.sh" 19*db1b6006SMarc Harvey 20*db1b6006SMarc HarveyTEAM_PORT="team0" 21*db1b6006SMarc HarveyMEMBER_PORT="dummy0" 22*db1b6006SMarc Harvey 23*db1b6006SMarc Harveysetup() 24*db1b6006SMarc Harvey{ 25*db1b6006SMarc Harvey ip link add name "${MEMBER_PORT}" type dummy 26*db1b6006SMarc Harvey ip link add name "${TEAM_PORT}" type team 27*db1b6006SMarc Harvey} 28*db1b6006SMarc Harvey 29*db1b6006SMarc Harveyget_and_check_value() 30*db1b6006SMarc Harvey{ 31*db1b6006SMarc Harvey local option_name="$1" 32*db1b6006SMarc Harvey local expected_value="$2" 33*db1b6006SMarc Harvey local port_flag="$3" 34*db1b6006SMarc Harvey 35*db1b6006SMarc Harvey local value_from_get 36*db1b6006SMarc Harvey 37*db1b6006SMarc Harvey if ! value_from_get=$(teamnl "${TEAM_PORT}" getoption "${option_name}" \ 38*db1b6006SMarc Harvey "${port_flag}"); then 39*db1b6006SMarc Harvey echo "Could not get option '${option_name}'" >&2 40*db1b6006SMarc Harvey return 1 41*db1b6006SMarc Harvey fi 42*db1b6006SMarc Harvey 43*db1b6006SMarc Harvey if [[ "${value_from_get}" != "${expected_value}" ]]; then 44*db1b6006SMarc Harvey echo "Incorrect value for option '${option_name}'" >&2 45*db1b6006SMarc Harvey echo "get (${value_from_get}) != set (${expected_value})" >&2 46*db1b6006SMarc Harvey return 1 47*db1b6006SMarc Harvey fi 48*db1b6006SMarc Harvey} 49*db1b6006SMarc Harvey 50*db1b6006SMarc Harveyset_and_check_get() 51*db1b6006SMarc Harvey{ 52*db1b6006SMarc Harvey local option_name="$1" 53*db1b6006SMarc Harvey local option_value="$2" 54*db1b6006SMarc Harvey local port_flag="$3" 55*db1b6006SMarc Harvey 56*db1b6006SMarc Harvey local value_from_get 57*db1b6006SMarc Harvey 58*db1b6006SMarc Harvey if ! teamnl "${TEAM_PORT}" setoption "${option_name}" \ 59*db1b6006SMarc Harvey "${option_value}" "${port_flag}"; then 60*db1b6006SMarc Harvey echo "'setoption ${option_name} ${option_value}' failed" >&2 61*db1b6006SMarc Harvey return 1 62*db1b6006SMarc Harvey fi 63*db1b6006SMarc Harvey 64*db1b6006SMarc Harvey get_and_check_value "${option_name}" "${option_value}" "${port_flag}" 65*db1b6006SMarc Harvey return $? 66*db1b6006SMarc Harvey} 67*db1b6006SMarc Harvey 68*db1b6006SMarc Harvey# Get a "port flag" to pass to the `teamnl` command. 69*db1b6006SMarc Harvey# E.g. $1="dummy0" -> "port=dummy0", 70*db1b6006SMarc Harvey# $1="" -> "" 71*db1b6006SMarc Harveyget_port_flag() 72*db1b6006SMarc Harvey{ 73*db1b6006SMarc Harvey local port_name="$1" 74*db1b6006SMarc Harvey 75*db1b6006SMarc Harvey if [[ -n "${port_name}" ]]; then 76*db1b6006SMarc Harvey echo "--port=${port_name}" 77*db1b6006SMarc Harvey fi 78*db1b6006SMarc Harvey} 79*db1b6006SMarc Harvey 80*db1b6006SMarc Harveyattach_port_if_specified() 81*db1b6006SMarc Harvey{ 82*db1b6006SMarc Harvey local port_name="$1" 83*db1b6006SMarc Harvey 84*db1b6006SMarc Harvey if [[ -n "${port_name}" ]]; then 85*db1b6006SMarc Harvey ip link set dev "${port_name}" master "${TEAM_PORT}" 86*db1b6006SMarc Harvey return $? 87*db1b6006SMarc Harvey fi 88*db1b6006SMarc Harvey} 89*db1b6006SMarc Harvey 90*db1b6006SMarc Harveydetach_port_if_specified() 91*db1b6006SMarc Harvey{ 92*db1b6006SMarc Harvey local port_name="$1" 93*db1b6006SMarc Harvey 94*db1b6006SMarc Harvey if [[ -n "${port_name}" ]]; then 95*db1b6006SMarc Harvey ip link set dev "${port_name}" nomaster 96*db1b6006SMarc Harvey return $? 97*db1b6006SMarc Harvey fi 98*db1b6006SMarc Harvey} 99*db1b6006SMarc Harvey 100*db1b6006SMarc Harvey# Test that an option's get value matches its set value. 101*db1b6006SMarc Harvey# Globals: 102*db1b6006SMarc Harvey# RET - Used by testing infra like `check_err`. 103*db1b6006SMarc Harvey# EXIT_STATUS - Used by `log_test` for whole script exit value. 104*db1b6006SMarc Harvey# Arguments: 105*db1b6006SMarc Harvey# option_name - The name of the option. 106*db1b6006SMarc Harvey# value_1 - The first value to try setting. 107*db1b6006SMarc Harvey# value_2 - The second value to try setting. 108*db1b6006SMarc Harvey# port_name - The (optional) name of the attached port. 109*db1b6006SMarc Harveyteam_test_option() 110*db1b6006SMarc Harvey{ 111*db1b6006SMarc Harvey local option_name="$1" 112*db1b6006SMarc Harvey local value_1="$2" 113*db1b6006SMarc Harvey local value_2="$3" 114*db1b6006SMarc Harvey local possible_values="$2 $3 $2" 115*db1b6006SMarc Harvey local port_name="$4" 116*db1b6006SMarc Harvey local port_flag 117*db1b6006SMarc Harvey 118*db1b6006SMarc Harvey RET=0 119*db1b6006SMarc Harvey 120*db1b6006SMarc Harvey echo "Setting '${option_name}' to '${value_1}' and '${value_2}'" 121*db1b6006SMarc Harvey 122*db1b6006SMarc Harvey attach_port_if_specified "${port_name}" 123*db1b6006SMarc Harvey check_err $? "Couldn't attach ${port_name} to master" 124*db1b6006SMarc Harvey port_flag=$(get_port_flag "${port_name}") 125*db1b6006SMarc Harvey 126*db1b6006SMarc Harvey # Set and get both possible values. 127*db1b6006SMarc Harvey for value in ${possible_values}; do 128*db1b6006SMarc Harvey set_and_check_get "${option_name}" "${value}" "${port_flag}" 129*db1b6006SMarc Harvey check_err $? "Failed to set '${option_name}' to '${value}'" 130*db1b6006SMarc Harvey done 131*db1b6006SMarc Harvey 132*db1b6006SMarc Harvey detach_port_if_specified "${port_name}" 133*db1b6006SMarc Harvey check_err $? "Couldn't detach ${port_name} from its master" 134*db1b6006SMarc Harvey 135*db1b6006SMarc Harvey log_test "Set + Get '${option_name}' test" 136*db1b6006SMarc Harvey} 137*db1b6006SMarc Harvey 138*db1b6006SMarc Harvey# Test that getting a non-existant option fails. 139*db1b6006SMarc Harvey# Globals: 140*db1b6006SMarc Harvey# RET - Used by testing infra like `check_err`. 141*db1b6006SMarc Harvey# EXIT_STATUS - Used by `log_test` for whole script exit value. 142*db1b6006SMarc Harvey# Arguments: 143*db1b6006SMarc Harvey# option_name - The name of the option. 144*db1b6006SMarc Harvey# port_name - The (optional) name of the attached port. 145*db1b6006SMarc Harveyteam_test_get_option_fails() 146*db1b6006SMarc Harvey{ 147*db1b6006SMarc Harvey local option_name="$1" 148*db1b6006SMarc Harvey local port_name="$2" 149*db1b6006SMarc Harvey local port_flag 150*db1b6006SMarc Harvey 151*db1b6006SMarc Harvey RET=0 152*db1b6006SMarc Harvey 153*db1b6006SMarc Harvey attach_port_if_specified "${port_name}" 154*db1b6006SMarc Harvey check_err $? "Couldn't attach ${port_name} to master" 155*db1b6006SMarc Harvey port_flag=$(get_port_flag "${port_name}") 156*db1b6006SMarc Harvey 157*db1b6006SMarc Harvey # Just confirm that getting the value fails. 158*db1b6006SMarc Harvey teamnl "${TEAM_PORT}" getoption "${option_name}" "${port_flag}" 159*db1b6006SMarc Harvey check_fail $? "Shouldn't be able to get option '${option_name}'" 160*db1b6006SMarc Harvey 161*db1b6006SMarc Harvey detach_port_if_specified "${port_name}" 162*db1b6006SMarc Harvey 163*db1b6006SMarc Harvey log_test "Get '${option_name}' fails" 164*db1b6006SMarc Harvey} 165*db1b6006SMarc Harvey 166*db1b6006SMarc Harveyteam_test_options() 167*db1b6006SMarc Harvey{ 168*db1b6006SMarc Harvey # Wrong option name behavior. 169*db1b6006SMarc Harvey team_test_get_option_fails fake_option1 170*db1b6006SMarc Harvey team_test_get_option_fails fake_option2 "${MEMBER_PORT}" 171*db1b6006SMarc Harvey 172*db1b6006SMarc Harvey # Correct set and get behavior. 173*db1b6006SMarc Harvey team_test_option mode activebackup loadbalance 174*db1b6006SMarc Harvey team_test_option notify_peers_count 0 5 175*db1b6006SMarc Harvey team_test_option notify_peers_interval 0 5 176*db1b6006SMarc Harvey team_test_option mcast_rejoin_count 0 5 177*db1b6006SMarc Harvey team_test_option mcast_rejoin_interval 0 5 178*db1b6006SMarc Harvey team_test_option enabled true false "${MEMBER_PORT}" 179*db1b6006SMarc Harvey team_test_option user_linkup true false "${MEMBER_PORT}" 180*db1b6006SMarc Harvey team_test_option user_linkup_enabled true false "${MEMBER_PORT}" 181*db1b6006SMarc Harvey team_test_option priority 10 20 "${MEMBER_PORT}" 182*db1b6006SMarc Harvey team_test_option queue_id 0 1 "${MEMBER_PORT}" 183*db1b6006SMarc Harvey} 184*db1b6006SMarc Harvey 185*db1b6006SMarc Harveyrequire_command teamnl 186*db1b6006SMarc Harveysetup 187*db1b6006SMarc Harveytests_run 188*db1b6006SMarc Harveyexit "${EXIT_STATUS}" 189