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