xref: /linux/tools/testing/selftests/drivers/net/team/options.sh (revision ec2e0fb07d789976c601bec19ecced7a501c3705)
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