159 lines
4.4 KiB
Bash
Executable File
159 lines
4.4 KiB
Bash
Executable File
#!/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}"
|