Marc Harvey wrote: > There are currently no kernel tests that verify setting and getting > options of the team driver. > > In the future, options may be added that implicitly change other > options, which will make it useful to have tests like these that show > nothing breaks. There will be a follow up patch to this that adds new > "rx_enabled" and "tx_enabled" options, which will implicitly affect the > "enabled" option value and vice versa. > > The tests use teamnl to first set options to specific values and then > gets them to compare to the set values. > > Signed-off-by: Marc Harvey <marchar...@google.com> > --- > Changes in v2: > - Fixed shellcheck failures. > - Fixed test failing in vng by adding a config option to enable the > team driver's active backup mode. > - Link to v1: > https://lore.kernel.org/netdev/20250902235504.4190036-1-marchar...@google.com/ > > .../selftests/drivers/net/team/Makefile | 6 +- > .../testing/selftests/drivers/net/team/config | 1 + > .../selftests/drivers/net/team/options.sh | 192 ++++++++++++++++++ > 3 files changed, 197 insertions(+), 2 deletions(-) > create mode 100755 tools/testing/selftests/drivers/net/team/options.sh > > diff --git a/tools/testing/selftests/drivers/net/team/Makefile > b/tools/testing/selftests/drivers/net/team/Makefile > index eaf6938f100e..8b00b70ce67f 100644 > --- a/tools/testing/selftests/drivers/net/team/Makefile > +++ b/tools/testing/selftests/drivers/net/team/Makefile > @@ -1,11 +1,13 @@ > # SPDX-License-Identifier: GPL-2.0 > # Makefile for net selftests > > -TEST_PROGS := dev_addr_lists.sh propagation.sh > +TEST_PROGS := dev_addr_lists.sh propagation.sh options.sh > > TEST_INCLUDES := \ > ../bonding/lag_lib.sh \ > ../../../net/forwarding/lib.sh \ > - ../../../net/lib.sh > + ../../../net/lib.sh \ > + ../../../net/in_netns.sh \ > + ../../../net/lib/sh/defer.sh \
Where is defer used? Also no backslash at last line. > > include ../../../lib.mk > diff --git a/tools/testing/selftests/drivers/net/team/config > b/tools/testing/selftests/drivers/net/team/config > index 636b3525b679..558e1d0cf565 100644 > --- a/tools/testing/selftests/drivers/net/team/config > +++ b/tools/testing/selftests/drivers/net/team/config > @@ -3,4 +3,5 @@ CONFIG_IPV6=y > CONFIG_MACVLAN=y > CONFIG_NETDEVSIM=m > CONFIG_NET_TEAM=y > +CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=y > CONFIG_NET_TEAM_MODE_LOADBALANCE=y > diff --git a/tools/testing/selftests/drivers/net/team/options.sh > b/tools/testing/selftests/drivers/net/team/options.sh > new file mode 100755 > index 000000000000..82bf22aa3480 > --- /dev/null > +++ b/tools/testing/selftests/drivers/net/team/options.sh > @@ -0,0 +1,192 @@ > +#!/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 > + > +ALL_TESTS=" > + team_test_options > +" > + > +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}" nit: parentheses around single character variable. Inconsistent. > + > + 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` to 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. > +####################################### Just curious: is this a standard documentation format? > +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" Can the rest of the test continue if this command failed? > + 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" > +}