public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Petr Machata <petrm@nvidia.com>
To: Ioana Ciornei <ioana.ciornei@nxp.com>
Cc: <netdev@vger.kernel.org>, Andrew Lunn <andrew+netdev@lunn.ch>,
	"David S. Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	"Jakub Kicinski" <kuba@kernel.org>,
	Paolo Abeni <pabeni@redhat.com>, Simon Horman <horms@kernel.org>,
	<linux-kernel@vger.kernel.org>, <petrm@nvidia.com>,
	<willemb@google.com>, <linux-kselftest@vger.kernel.org>
Subject: Re: [PATCH net-next v4 03/10] selftests: net: extend lib.sh to parse drivers/net/net.config
Date: Mon, 30 Mar 2026 13:28:49 +0200	[thread overview]
Message-ID: <87wlyt4juu.fsf@nvidia.com> (raw)
In-Reply-To: <20260326132828.805703-4-ioana.ciornei@nxp.com>


Ioana Ciornei <ioana.ciornei@nxp.com> writes:

> Extend lib.sh so that it's able to parse driver/net/net.config and
> environment variables such as NETIF, REMOTE_TYPE, LOCAL_V4 etc described
> in drivers/net/README.rst.
>
> In order to make the transition towards running with a single local
> interface smoother for the bash networking driver tests, beside sourcing
> the net.config file also translate the new env variables into the old
> style based on the NETIFS array. Since the NETIFS array only holds the
> network interface names, also add a new array - TARGETS - which keeps
> track of the target on which a specific interfaces resides - local,
> netns or accesible through an ssh command.
>
> For example, a net.config which looks like below:
>
> 	NETIF=eth0
> 	LOCAL_V4=192.168.1.1
> 	REMOTE_V4=192.168.1.2
> 	REMOTE_TYPE=ssh
> 	REMOTE_ARGS=root@192.168.1.2
>
> will generate the NETIFS and TARGETS arrays with the following data.
>
> 	NETIFS[p1]="eth0"
> 	NETIFS[p2]="eth2"
>
> 	TARGETS[eth0]="local:"
> 	TARGETS[eth2]="ssh:root@192.168.1.2"
>
> The above will be true if on the remote target, the interface which has
> the 192.168.1.2 address is named eth2.
>
> Since the TARGETS array is indexed by the network interface name,
> document a new restriction README.rst which states that the remote
> interface cannot have the same name as the local one.
>
> Also keep the old way of populating the NETIFS variable based on the
> command line arguments. This will be invoked in case NETIF is not
> defined.
>
> Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
> ---
> Changes in v4:
> - reword the entry in README.rst to mention that the different interface
>   names is only a bash restriction and the python infrastructure does
>   not have the same problem.
> - only declare the TARGETS array when necessary

I guess you mean at the point where it's necessary, instead of it being
a user API. Right now TARGETS is defined always, and I think that's
better than having it only defined sometimes.

> - add a new flags - DRIVER_TEST_CONFORMANT - that needs to be set by the
>   test
> - rework the check_env() function so that its logic is simpler
> - source drivers/net/net.config only if DRIVER_TEST_CONFORMANT == yes
> - check that NETIF and the remote netif have different names and abort
>   test is not
>
> Changes in v3:
> - s/TARGET/CUR_TARGET
> - this used to be patch #2/9 in v2. Swapped the two patches so that the
>   run_cmd used in this patch is defined earlier, not later.
> Changes in v2:
> - patch is new
>
>  .../testing/selftests/drivers/net/README.rst  |   4 +
>  tools/testing/selftests/net/forwarding/lib.sh | 106 ++++++++++++++++--
>  2 files changed, 101 insertions(+), 9 deletions(-)
>
> diff --git a/tools/testing/selftests/drivers/net/README.rst b/tools/testing/selftests/drivers/net/README.rst
> index c94992acf10b..1897aa1583ec 100644
> --- a/tools/testing/selftests/drivers/net/README.rst
> +++ b/tools/testing/selftests/drivers/net/README.rst
> @@ -26,6 +26,10 @@ The netdevice against which tests will be run must exist, be running
>  Refer to list of :ref:`Variables` later in this file to set up running
>  the tests against a real device.
>  
> +The current support for bash tests restricts the use of the same interface name
> +on the local system and the remote one and will bail if this case is
> +encountered.
> +
>  Both modes required
>  ~~~~~~~~~~~~~~~~~~~
>  
> diff --git a/tools/testing/selftests/net/forwarding/lib.sh b/tools/testing/selftests/net/forwarding/lib.sh
> index 3009ce00c5dc..93b865681840 100644
> --- a/tools/testing/selftests/net/forwarding/lib.sh
> +++ b/tools/testing/selftests/net/forwarding/lib.sh
> @@ -3,6 +3,7 @@
>  
>  ##############################################################################
>  # Topology description. p1 looped back to p2, p3 to p4 and so on.
> +#shellcheck disable=SC2034 # SC doesn't see our uses of global variables

The shellcheck line should be moved elsewhere. The comment is related to
NETIFS, and it's weird there's a shellcheck declaration between a
comment and the thing it's commenting.

>  declare -A NETIFS=(
>      [p1]=veth0
> @@ -85,6 +86,9 @@ declare -A NETIFS=(
>  # e.g. a low-power board.
>  : "${KSFT_MACHINE_SLOW:=no}"
>  
> +# Whether the test is conforming to the requirements and usage described in
> +# drivers/net/README.rst.
> +: "${DRIVER_TEST_CONFORMANT:=no}"

Not sure this makes sense as user API either honestly. Given the
differences between requirements of the two test types I can't imagine a
non-conformant test would be runnable like that. The actual line is OK,
but it should be moved probably above the if check, so as not to
indicate it's usable as a user API.

>  ##############################################################################
>  # Find netifs by test-specified driver name
>  
> @@ -340,17 +344,101 @@ fi
>  ##############################################################################
>  # Command line options handling
>  
> -count=0
> +check_env() {
> +	if [[ ! (( -n "$LOCAL_V4" && -n "$REMOTE_V4") ||
> +		 ( -n "$LOCAL_V6" && -n "$REMOTE_V6" )) ]]; then
> +		echo "SKIP: Invalid environment, missing or inconsistent LOCAL_V4/REMOTE_V4/LOCAL_V6/REMOTE_V6"
> +		echo "Please see tools/testing/selftests/drivers/net/README.rst"
> +		exit "$ksft_skip"
> +	fi
>  
> -while [[ $# -gt 0 ]]; do
> -	if [[ "$count" -eq "0" ]]; then
> -		unset NETIFS
> -		declare -A NETIFS
> +	if [[ -z "$REMOTE_TYPE" ]]; then
> +		echo "SKIP: Invalid environment, missing REMOTE_TYPE"
> +		exit "$ksft_skip"
>  	fi
> -	count=$((count + 1))
> -	NETIFS[p$count]="$1"
> -	shift
> -done
> +
> +	if [[ -z "$REMOTE_ARGS" ]]; then
> +		echo "SKIP: Invalid environment, missing REMOTE_ARGS"
> +		exit "$ksft_skip"
> +	fi
> +}
> +
> +get_ifname_by_ip()
> +{
> +	local target=$1; shift
> +	local ip_addr=$1; shift
> +
> +	__run_on "$target" ip -j addr show to "$ip_addr" | jq -r '.[].ifname'
> +}
> +
> +# Based on DRIVER_TEST_CONFORMANT, decide if to source drivers/net/net.config
> +# or not. In the "yes" case, the test expects to pass the arguments through the
> +# variables specified in drivers/net/README.rst file. If not, fallback on
> +# parsing the script arguments for interface names.
> +if [ "${DRIVER_TEST_CONFORMANT}" = "yes" ]; then
> +	if [[ -f $net_forwarding_dir/../../drivers/net/net.config ]]; then
> +		source "$net_forwarding_dir/../../drivers/net/net.config"
> +	fi
> +
> +	if (( NUM_NETIFS > 2)); then
> +		echo "SKIP: DRIVER_TEST_CONFORMANT=yes and NUM_NETIFS is bigger than 2"
> +		exit "$ksft_skip"
> +	fi
> +
> +	check_env
> +
> +	# Populate the NETIFS and TARGETS arrays automatically based on the
> +	# environment variables. The TARGETS array is indexed by the network
> +	# interface name keeping track of the target on which the interface
> +	# resides. Values will be strings of the following format -
> +	# <type>:<args>.
> +	#
> +	# TARGETS[eth0]="local:" - meaning that the eth0 interface is
> +	# accessible locally
> +	# TARGETS[eth1]="netns:foo" - eth1 is in the foo netns
> +	# TARGETS[eth2]="ssh:root@10.0.0.2" - eth2 is accessible through
> +	# running the 'ssh root@10.0.0.2' command.
> +
> +	unset NETIFS
> +	declare -A NETIFS
> +	declare -A TARGETS
> +
> +	NETIFS[p1]="$NETIF"
> +	TARGETS[$NETIF]="local:"
> +
> +	# Locate the name of the remote interface
> +	remote_target="$REMOTE_TYPE:$REMOTE_ARGS"
> +	if [[ -v REMOTE_V4 ]]; then
> +		remote_netif=$(get_ifname_by_ip "$remote_target" "$REMOTE_V4")
> +	else
> +		remote_netif=$(get_ifname_by_ip "$remote_target" "$REMOTE_V6")
> +	fi
> +	if [[ ! -n "$remote_netif" ]]; then
> +		echo "SKIP: cannot find remote interface"
> +		exit "$ksft_skip"
> +	fi
> +
> +	if [[ "$NETIF" == "$remote_netif" ]]; then
> +		echo "SKIP: local and remote interfaces cannot have the same name"
> +		exit "$ksft_skip"
> +	fi
> +
> +	NETIFS[p2]="$remote_netif"
> +	TARGETS[$remote_netif]="$REMOTE_TYPE:$REMOTE_ARGS"
> +else
> +	count=0

This leg is missing declare -A TARGETS.

Since both legs need to declare it, why not move it up above the if?

> +	while [[ $# -gt 0 ]]; do
> +		if [[ "$count" -eq "0" ]]; then
> +			unset NETIFS
> +			declare -A NETIFS
> +		fi
> +		count=$((count + 1))
> +		NETIFS[p$count]="$1"
> +		TARGETS[$1]="local:"
> +		shift
> +	done
> +fi
>  
>  ##############################################################################
>  # Network interfaces configuration


  reply	other threads:[~2026-03-30 11:50 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-26 13:28 [PATCH net-next v4 00/10] selftests: drivers: bash support for remote traffic generators Ioana Ciornei
2026-03-26 13:28 ` [PATCH net-next v4 01/10] selftests: forwarding: extend ethtool_std_stats_get with pause statistics Ioana Ciornei
2026-03-26 13:28 ` [PATCH net-next v4 02/10] selftests: net: add helpers for running a command on other targets Ioana Ciornei
2026-03-30 11:02   ` Petr Machata
2026-03-30 11:32     ` Petr Machata
2026-03-30 12:12       ` Ioana Ciornei
2026-03-26 13:28 ` [PATCH net-next v4 03/10] selftests: net: extend lib.sh to parse drivers/net/net.config Ioana Ciornei
2026-03-30 11:28   ` Petr Machata [this message]
2026-03-30 12:28     ` Ioana Ciornei
2026-03-26 13:28 ` [PATCH net-next v4 04/10] selftests: net: update some helpers to use run_on Ioana Ciornei
2026-03-30 11:55   ` Petr Machata
2026-03-26 13:28 ` [PATCH net-next v4 05/10] selftests: drivers: hw: cleanup shellcheck warnings in the rmon test Ioana Ciornei
2026-03-26 13:28 ` [PATCH net-next v4 06/10] selftests: drivers: hw: test rmon counters only on first interface Ioana Ciornei
2026-03-26 13:28 ` [PATCH net-next v4 07/10] selftests: drivers: hw: replace counter upper limit with UINT32_MAX in rmon test Ioana Ciornei
2026-03-26 13:28 ` [PATCH net-next v4 08/10] selftests: drivers: hw: move to KTAP output Ioana Ciornei
2026-03-30 12:01   ` Petr Machata
2026-03-26 13:28 ` [PATCH net-next v4 09/10] selftests: drivers: hw: update ethtool_rmon to work with a single local interface Ioana Ciornei
2026-03-26 13:28 ` [PATCH net-next v4 10/10] selftests: drivers: hw: add test for the ethtool standard counters Ioana Ciornei
2026-03-30 12:03   ` Petr Machata
2026-03-26 19:03 ` [PATCH net-next v4 00/10] selftests: drivers: bash support for remote traffic generators Jakub Kicinski
2026-03-27  7:32   ` Ioana Ciornei
2026-03-28  0:24     ` Jakub Kicinski
2026-03-30 10:38       ` Petr Machata
2026-03-30 11:10         ` Petr Machata
2026-03-30 11:11         ` Ioana Ciornei
2026-03-30 11:52           ` Petr Machata

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87wlyt4juu.fsf@nvidia.com \
    --to=petrm@nvidia.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=horms@kernel.org \
    --cc=ioana.ciornei@nxp.com \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=willemb@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox