linux/tools/testing/selftests/drivers/net/team/options.sh
Marc Harvey d3870724eb selftests: net: Add tests for team driver decoupled tx and rx control
Use ping and tcpdump to verify that independent rx and tx enablement
of team driver member interfaces works as intended.

Signed-off-by: Marc Harvey <marcharvey@google.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com>
Link: https://patch.msgid.link/20260409-teaming-driver-internal-v7-10-f47e7589685d@google.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
2026-04-13 15:09:49 +02:00

286 lines
8.4 KiB
Bash
Executable File

#!/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}"