#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # These tests verify basic set and get functionality of the team # driver options over netlink. # Run in private netns. test_dir="$(dirname "$0")" if [[ $# -eq 0 ]]; then "${test_dir}"/../../../net/in_netns.sh "$0" __subprocess exit $? fi export ALL_TESTS=" team_test_options team_test_enabled_implicit_changes team_test_rx_enabled_implicit_changes team_test_tx_enabled_implicit_changes " # shellcheck disable=SC1091 source "${test_dir}/../../../net/lib.sh" TEAM_PORT="team0" MEMBER_PORT="dummy0" setup() { ip link add name "${MEMBER_PORT}" type dummy ip link add name "${TEAM_PORT}" type team } get_and_check_value() { local option_name="$1" local expected_value="$2" local port_flag="$3" local value_from_get if ! value_from_get=$(teamnl "${TEAM_PORT}" getoption "${option_name}" \ "${port_flag}"); then echo "Could not get option '${option_name}'" >&2 return 1 fi if [[ "${value_from_get}" != "${expected_value}" ]]; then echo "Incorrect value for option '${option_name}'" >&2 echo "get (${value_from_get}) != set (${expected_value})" >&2 return 1 fi } set_and_check_get() { local option_name="$1" local option_value="$2" local port_flag="$3" local value_from_get if ! teamnl "${TEAM_PORT}" setoption "${option_name}" \ "${option_value}" "${port_flag}"; then echo "'setoption ${option_name} ${option_value}' failed" >&2 return 1 fi get_and_check_value "${option_name}" "${option_value}" "${port_flag}" return $? } # Get a "port flag" to pass to the `teamnl` command. # E.g. $1="dummy0" -> "port=dummy0", # $1="" -> "" get_port_flag() { local port_name="$1" if [[ -n "${port_name}" ]]; then echo "--port=${port_name}" fi } attach_port_if_specified() { local port_name="$1" if [[ -n "${port_name}" ]]; then ip link set dev "${port_name}" master "${TEAM_PORT}" return $? fi } detach_port_if_specified() { local port_name="$1" if [[ -n "${port_name}" ]]; then ip link set dev "${port_name}" nomaster return $? fi } # Test that an option's get value matches its set value. # Globals: # RET - Used by testing infra like `check_err`. # EXIT_STATUS - Used by `log_test` for whole script exit value. # Arguments: # option_name - The name of the option. # value_1 - The first value to try setting. # value_2 - The second value to try setting. # port_name - The (optional) name of the attached port. team_test_option() { local option_name="$1" local value_1="$2" local value_2="$3" local possible_values="$2 $3 $2" local port_name="$4" local port_flag RET=0 echo "Setting '${option_name}' to '${value_1}' and '${value_2}'" attach_port_if_specified "${port_name}" check_err $? "Couldn't attach ${port_name} to master" port_flag=$(get_port_flag "${port_name}") # Set and get both possible values. for value in ${possible_values}; do set_and_check_get "${option_name}" "${value}" "${port_flag}" check_err $? "Failed to set '${option_name}' to '${value}'" done detach_port_if_specified "${port_name}" check_err $? "Couldn't detach ${port_name} from its master" log_test "Set + Get '${option_name}' test" } # Test that getting a non-existant option fails. # Globals: # RET - Used by testing infra like `check_err`. # EXIT_STATUS - Used by `log_test` for whole script exit value. # Arguments: # option_name - The name of the option. # port_name - The (optional) name of the attached port. team_test_get_option_fails() { local option_name="$1" local port_name="$2" local port_flag RET=0 attach_port_if_specified "${port_name}" check_err $? "Couldn't attach ${port_name} to master" port_flag=$(get_port_flag "${port_name}") # Just confirm that getting the value fails. teamnl "${TEAM_PORT}" getoption "${option_name}" "${port_flag}" check_fail $? "Shouldn't be able to get option '${option_name}'" detach_port_if_specified "${port_name}" log_test "Get '${option_name}' fails" } team_test_options() { # Wrong option name behavior. team_test_get_option_fails fake_option1 team_test_get_option_fails fake_option2 "${MEMBER_PORT}" # Correct set and get behavior. team_test_option mode activebackup loadbalance team_test_option notify_peers_count 0 5 team_test_option notify_peers_interval 0 5 team_test_option mcast_rejoin_count 0 5 team_test_option mcast_rejoin_interval 0 5 team_test_option enabled true false "${MEMBER_PORT}" team_test_option rx_enabled true false "${MEMBER_PORT}" team_test_option tx_enabled true false "${MEMBER_PORT}" team_test_option user_linkup true false "${MEMBER_PORT}" team_test_option user_linkup_enabled true false "${MEMBER_PORT}" team_test_option priority 10 20 "${MEMBER_PORT}" team_test_option queue_id 0 1 "${MEMBER_PORT}" } team_test_enabled_implicit_changes() { export RET=0 attach_port_if_specified "${MEMBER_PORT}" check_err $? "Couldn't attach ${MEMBER_PORT} to master" # Set enabled to true. set_and_check_get enabled true "--port=${MEMBER_PORT}" check_err $? "Failed to set 'enabled' to true" # Show that both rx enabled and tx enabled are true. get_and_check_value rx_enabled true "--port=${MEMBER_PORT}" check_err $? "'Rx_enabled' wasn't implicitly set to true" get_and_check_value tx_enabled true "--port=${MEMBER_PORT}" check_err $? "'Tx_enabled' wasn't implicitly set to true" # Set enabled to false. set_and_check_get enabled false "--port=${MEMBER_PORT}" check_err $? "Failed to set 'enabled' to false" # Show that both rx enabled and tx enabled are false. get_and_check_value rx_enabled false "--port=${MEMBER_PORT}" check_err $? "'Rx_enabled' wasn't implicitly set to false" get_and_check_value tx_enabled false "--port=${MEMBER_PORT}" check_err $? "'Tx_enabled' wasn't implicitly set to false" log_test "'Enabled' implicit changes" } team_test_rx_enabled_implicit_changes() { export RET=0 attach_port_if_specified "${MEMBER_PORT}" check_err $? "Couldn't attach ${MEMBER_PORT} to master" # Set enabled to true. set_and_check_get enabled true "--port=${MEMBER_PORT}" check_err $? "Failed to set 'enabled' to true" # Set rx_enabled to false. set_and_check_get rx_enabled false "--port=${MEMBER_PORT}" check_err $? "Failed to set 'rx_enabled' to false" # Show that enabled is false. get_and_check_value enabled false "--port=${MEMBER_PORT}" check_err $? "'enabled' wasn't implicitly set to false" # Set rx_enabled to true. set_and_check_get rx_enabled true "--port=${MEMBER_PORT}" check_err $? "Failed to set 'rx_enabled' to true" # Show that enabled is true. get_and_check_value enabled true "--port=${MEMBER_PORT}" check_err $? "'enabled' wasn't implicitly set to true" log_test "'Rx_enabled' implicit changes" } team_test_tx_enabled_implicit_changes() { export RET=0 attach_port_if_specified "${MEMBER_PORT}" check_err $? "Couldn't attach ${MEMBER_PORT} to master" # Set enabled to true. set_and_check_get enabled true "--port=${MEMBER_PORT}" check_err $? "Failed to set 'enabled' to true" # Set tx_enabled to false. set_and_check_get tx_enabled false "--port=${MEMBER_PORT}" check_err $? "Failed to set 'tx_enabled' to false" # Show that enabled is false. get_and_check_value enabled false "--port=${MEMBER_PORT}" check_err $? "'enabled' wasn't implicitly set to false" # Set tx_enabled to true. set_and_check_get tx_enabled true "--port=${MEMBER_PORT}" check_err $? "Failed to set 'tx_enabled' to true" # Show that enabled is true. get_and_check_value enabled true "--port=${MEMBER_PORT}" check_err $? "'enabled' wasn't implicitly set to true" log_test "'Tx_enabled' implicit changes" } require_command teamnl setup tests_run exit "${EXIT_STATUS}"