Skip to content

Commit db1b600

Browse files
Marc HarveyPaolo Abeni
authored andcommitted
selftests: net: Add tests to verify team driver option set and get.
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 <marcharvey@google.com> Link: https://patch.msgid.link/20250905040441.2679296-1-marcharvey@google.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent 1f24a24 commit db1b600

File tree

3 files changed

+193
-2
lines changed

3 files changed

+193
-2
lines changed
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
# SPDX-License-Identifier: GPL-2.0
22
# Makefile for net selftests
33

4-
TEST_PROGS := dev_addr_lists.sh propagation.sh
4+
TEST_PROGS := dev_addr_lists.sh propagation.sh options.sh
55

66
TEST_INCLUDES := \
77
../bonding/lag_lib.sh \
88
../../../net/forwarding/lib.sh \
9-
../../../net/lib.sh
9+
../../../net/lib.sh \
10+
../../../net/in_netns.sh \
11+
../../../net/lib/sh/defer.sh
1012

1113
include ../../../lib.mk

tools/testing/selftests/drivers/net/team/config

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

0 commit comments

Comments
 (0)