xref: /linux/tools/testing/selftests/drivers/net/team/transmit_failover.sh (revision 91a4855d6c03e770e42f17c798a36a3c46e63de2)
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4# These tests verify the basic failover capability of the team driver via the
5# `enabled` team driver option across different team driver modes. This does not
6# rely on teamd, and instead just uses teamnl to set the `enabled` option
7# directly.
8#
9# Topology:
10#
11#  +-------------------------+  NS1
12#  |        test_team1       |
13#  |            +            |
14#  |      eth0  |  eth1      |
15#  |        +---+---+        |
16#  |        |       |        |
17#  +-------------------------+
18#           |       |
19#  +-------------------------+  NS2
20#  |        |       |        |
21#  |        +-------+        |
22#  |      eth0  |  eth1      |
23#  |            +            |
24#  |        test_team2       |
25#  +-------------------------+
26
27export ALL_TESTS="team_test_failover"
28
29test_dir="$(dirname "$0")"
30# shellcheck disable=SC1091
31source "${test_dir}/../../../net/lib.sh"
32# shellcheck disable=SC1091
33source "${test_dir}/team_lib.sh"
34
35NS1=""
36NS2=""
37export NODAD="nodad"
38PREFIX_LENGTH="64"
39NS1_IP="fd00::1"
40NS2_IP="fd00::2"
41NS1_IP4="192.168.0.1"
42NS2_IP4="192.168.0.2"
43MEMBERS=("eth0" "eth1")
44
45while getopts "4" opt; do
46	case $opt in
47		4)
48			echo "IPv4 mode selected."
49			export NODAD=
50			PREFIX_LENGTH="24"
51			NS1_IP="${NS1_IP4}"
52			NS2_IP="${NS2_IP4}"
53			;;
54		\?)
55			echo "Invalid option: -$OPTARG" >&2
56			exit 1
57			;;
58	esac
59done
60
61# Create the network namespaces, veth pair, and team devices in the specified
62# mode.
63# Globals:
64#   RET - Used by test infra, set by `check_err` functions.
65# Arguments:
66#   mode - The team driver mode to use for the team devices.
67environment_create()
68{
69	trap cleanup_all_ns EXIT
70	setup_ns ns1 ns2
71	NS1="${NS_LIST[0]}"
72	NS2="${NS_LIST[1]}"
73
74	# Create the interfaces.
75	ip -n "${NS1}" link add eth0 type veth peer name eth0 netns "${NS2}"
76	ip -n "${NS1}" link add eth1 type veth peer name eth1 netns "${NS2}"
77	ip -n "${NS1}" link add test_team1 type team
78	ip -n "${NS2}" link add test_team2 type team
79
80	# Set up the receiving network namespace's team interface.
81	setup_team "${NS2}" test_team2 roundrobin "${NS2_IP}" \
82			"${PREFIX_LENGTH}" "${MEMBERS[@]}"
83}
84
85
86# Check that failover works for a specific team driver mode.
87# Globals:
88#   RET - Used by test infra, set by `check_err` functions.
89# Arguments:
90#   mode - The mode to set the team interfaces to.
91team_test_mode_failover()
92{
93	local mode="$1"
94	export RET=0
95
96	# Set up the sender team with the correct mode.
97	setup_team "${NS1}" test_team1 "${mode}" "${NS1_IP}" \
98			"${PREFIX_LENGTH}" "${MEMBERS[@]}"
99	check_err $? "Failed to set up sender team"
100
101	start_listening_and_sending
102
103	### Scenario 1: All interfaces initially enabled.
104	save_tcpdump_outputs "${NS2}" "${MEMBERS[@]}"
105	did_interface_receive eth0 "${NS2_IP}"
106	check_err $? "eth0 not transmitting when both links enabled"
107	did_interface_receive eth1 "${NS2_IP}"
108	check_err $? "eth1 not transmitting when both links enabled"
109	clear_tcpdump_outputs "${MEMBERS[@]}"
110
111	### Scenario 2: One tx-side interface disabled.
112	ip netns exec "${NS1}" teamnl test_team1 setoption enabled false \
113			--port=eth1
114	slowwait 2 bash -c "ip netns exec ${NS1} teamnl test_team1 getoption \
115			enabled --port=eth1 | grep -q false"
116
117	save_tcpdump_outputs "${NS2}" "${MEMBERS[@]}"
118	did_interface_receive eth0 "${NS2_IP}"
119	check_err $? "eth0 not transmitting when enabled"
120	did_interface_receive eth1 "${NS2_IP}"
121	check_fail $? "eth1 IS transmitting when disabled"
122	clear_tcpdump_outputs "${MEMBERS[@]}"
123
124	### Scenario 3: The interface is re-enabled.
125	ip netns exec "${NS1}" teamnl test_team1 setoption enabled true \
126			--port=eth1
127	slowwait 2 bash -c "ip netns exec ${NS1} teamnl test_team1 getoption \
128			enabled --port=eth1 | grep -q true"
129
130	save_tcpdump_outputs "${NS2}" "${MEMBERS[@]}"
131	did_interface_receive eth0 "${NS2_IP}"
132	check_err $? "eth0 not transmitting when both links enabled"
133	did_interface_receive eth1 "${NS2_IP}"
134	check_err $? "eth1 not transmitting when both links enabled"
135	clear_tcpdump_outputs "${MEMBERS[@]}"
136
137	log_test "Failover of '${mode}' test"
138
139	# Clean up
140	stop_sending_and_listening
141}
142
143team_test_failover()
144{
145	team_test_mode_failover broadcast
146	team_test_mode_failover roundrobin
147	team_test_mode_failover random
148	# Don't test `activebackup` or `loadbalance` modes, since they are too
149	# complicated for just setting `enabled` to work. They use more than
150	# the `enabled` option for transmit.
151}
152
153require_command teamnl
154require_command iperf3
155require_command tcpdump
156environment_create
157tests_run
158exit "${EXIT_STATUS}"
159