On 4/9/26 4:59 AM, Marc Harvey wrote:
> There are currently no kernel tests that verify the effect of setting
> the enabled team driver option. In a followup patch, there will be
> changes to this option, so it will be important to make sure it still
> behaves as it does now.
> 
> The test verifies that tcp continues to work across two different team
> devices in separate network namespaces, even when member links are
> manually disabled.
> 
> Signed-off-by: Marc Harvey <[email protected]>
> ---
> Changes in v6:
> - Use a tcp port with no associated service.
> - Make tcpdump helper function not string-replace port numbers with
>   associated service names, even on Fedora, which has a tcpdump patch
>   that changes the required flag.
> - Link to v5: 
> https://lore.kernel.org/netdev/[email protected]/
> 
> Changes in v5:
> - Use tcpdump for collecting traffic, rather than reading rx counters.
> - Link to v4: 
> https://lore.kernel.org/netdev/[email protected]/
> 
> Changes in v2:
> - Fix shellcheck failures.
> - Remove dependency on net forwarding lib and pipe viewer tools.
> - Use iperf3 for tcp instead of netcat.
> - Link to v1: 
> https://lore.kernel.org/all/[email protected]/
> ---
>  tools/testing/selftests/drivers/net/team/Makefile  |   2 +
>  tools/testing/selftests/drivers/net/team/config    |   4 +
>  .../testing/selftests/drivers/net/team/team_lib.sh | 148 +++++++++++++++++++
>  .../drivers/net/team/transmit_failover.sh          | 158 
> +++++++++++++++++++++
>  tools/testing/selftests/net/forwarding/lib.sh      |   9 +-
>  5 files changed, 319 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/testing/selftests/drivers/net/team/Makefile 
> b/tools/testing/selftests/drivers/net/team/Makefile
> index 02d6f51d5a06..777da2e0429e 100644
> --- a/tools/testing/selftests/drivers/net/team/Makefile
> +++ b/tools/testing/selftests/drivers/net/team/Makefile
> @@ -7,9 +7,11 @@ TEST_PROGS := \
>       options.sh \
>       propagation.sh \
>       refleak.sh \
> +     transmit_failover.sh \
>  # end of TEST_PROGS
>  
>  TEST_INCLUDES := \
> +     team_lib.sh \
>       ../bonding/lag_lib.sh \
>       ../../../net/forwarding/lib.sh \
>       ../../../net/in_netns.sh \
> diff --git a/tools/testing/selftests/drivers/net/team/config 
> b/tools/testing/selftests/drivers/net/team/config
> index 5d36a22ef080..8f04ae419c53 100644
> --- a/tools/testing/selftests/drivers/net/team/config
> +++ b/tools/testing/selftests/drivers/net/team/config
> @@ -6,4 +6,8 @@ CONFIG_NETDEVSIM=m
>  CONFIG_NET_IPGRE=y
>  CONFIG_NET_TEAM=y
>  CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=y
> +CONFIG_NET_TEAM_MODE_BROADCAST=y
>  CONFIG_NET_TEAM_MODE_LOADBALANCE=y
> +CONFIG_NET_TEAM_MODE_RANDOM=y
> +CONFIG_NET_TEAM_MODE_ROUNDROBIN=y
> +CONFIG_VETH=y
> diff --git a/tools/testing/selftests/drivers/net/team/team_lib.sh 
> b/tools/testing/selftests/drivers/net/team/team_lib.sh
> new file mode 100644
> index 000000000000..2057f5edee79
> --- /dev/null
> +++ b/tools/testing/selftests/drivers/net/team/team_lib.sh
> @@ -0,0 +1,148 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +
> +test_dir="$(dirname "$0")"
> +export REQUIRE_MZ=no
> +export NUM_NETIFS=0
> +# shellcheck disable=SC1091
> +source "${test_dir}/../../../net/forwarding/lib.sh"
> +
> +TCP_PORT="43434"
> +
> +# Create a team interface inside of a given network namespace with a given
> +# mode, members, and IP address.
> +# Arguments:
> +#  namespace - Network namespace to put the team interface into.
> +#  team - The name of the team interface to setup.
> +#  mode - The team mode of the interface.
> +#  ip_address - The IP address to assign to the team interface.
> +#  prefix_length - The prefix length for the IP address subnet.
> +#  $@ - members - The member interfaces of the aggregation.
> +setup_team()
> +{
> +     local namespace=$1
> +     local team=$2
> +     local mode=$3
> +     local ip_address=$4
> +     local prefix_length=$5
> +     shift 5
> +     local members=("$@")
> +
> +     # Prerequisite: team must have no members
> +     for member in "${members[@]}"; do
> +             ip -n "${namespace}" link set "${member}" nomaster
> +     done
> +
> +     # Prerequisite: team must have no address in order to set it
> +     # shellcheck disable=SC2086
> +     ip -n "${namespace}" addr del "${ip_address}/${prefix_length}" \
> +                     ${NODAD} dev "${team}"
> +
> +     echo "Setting team in ${namespace} to mode ${mode}"
> +
> +     if ! ip -n "${namespace}" link set "${team}" down; then
> +             echo "Failed to bring team device down"
> +             return 1
> +     fi
> +     if ! ip netns exec "${namespace}" teamnl "${team}" setoption mode \
> +                     "${mode}"; then
> +             echo "Failed to set ${team} mode to '${mode}'"
> +             return 1
> +     fi
> +
> +     # Aggregate the members into teams.
> +     for member in "${members[@]}"; do
> +             ip -n "${namespace}" link set "${member}" master "${team}"
> +     done
> +
> +     # Bring team devices up and give them addresses.
> +     if ! ip -n "${namespace}" link set "${team}" up; then
> +             echo "Failed to set ${team} up"
> +             return 1
> +     fi
> +
> +     # shellcheck disable=SC2086
> +     if ! ip -n "${namespace}" addr add "${ip_address}/${prefix_length}" \
> +                     ${NODAD} dev "${team}"; then
> +             echo "Failed to give ${team} IP address in ${namespace}"
> +             return 1
> +     fi
> +}
> +
> +# This is global used to keep track of the sender's iperf3 process, so that 
> it
> +# can be terminated.
> +declare sender_pid
> +
> +# Start sending and receiving TCP traffic with iperf3.
> +# Globals:
> +#  sender_pid - The process ID of the iperf3 sender process. Used to kill it
> +#  later.
> +start_listening_and_sending()
> +{
> +     ip netns exec "${NS2}" iperf3 -s -p "${TCP_PORT}" --logfile /dev/null &
> +     # Wait for server to become reachable before starting client.
> +     slowwait 5 ip netns exec "${NS1}" iperf3 -c "${NS2_IP}" -p \
> +                     "${TCP_PORT}" -t 1 --logfile /dev/null

Note for a possible follow-up: the iperf3 server is apparently never
stopped. You could used the wait_local_port_listen helper and
the`--one-off` iperf3 command line argument to avoid that (or explicitly
killing the server pid at cleanup time)

/P


Reply via email to