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
        [email protected]

will generate the NETIFS and TARGETS arrays with the following data.

        NETIFS[p1]="eth0"
        NETIFS[p2]="eth2"
        be used for traffic

        TARGETS[eth0]="local:"
        TARGETS[eth2]="ssh:[email protected]"

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 <[email protected]>
---
Changes in v2:
- patch is new

 .../testing/selftests/drivers/net/README.rst  |   3 +
 tools/testing/selftests/net/forwarding/lib.sh | 117 ++++++++++++++++--
 2 files changed, 111 insertions(+), 9 deletions(-)

diff --git a/tools/testing/selftests/drivers/net/README.rst 
b/tools/testing/selftests/drivers/net/README.rst
index c94992acf10b..8d8d9d62e763 100644
--- a/tools/testing/selftests/drivers/net/README.rst
+++ b/tools/testing/selftests/drivers/net/README.rst
@@ -26,6 +26,9 @@ 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.
 
+Also, make sure that if you are using a remote machine for traffic injection,
+the local and remote interfaces have different names.
+
 Both modes required
 ~~~~~~~~~~~~~~~~~~~
 
diff --git a/tools/testing/selftests/net/forwarding/lib.sh 
b/tools/testing/selftests/net/forwarding/lib.sh
index cf40cb766c68..25b354da4d23 100644
--- a/tools/testing/selftests/net/forwarding/lib.sh
+++ b/tools/testing/selftests/net/forwarding/lib.sh
@@ -17,6 +17,15 @@ declare -A NETIFS=(
     [p10]=veth9
 )
 
+# Array 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:[email protected]" - eth2 is accessible through running the
+# 'ssh [email protected]' command.
+declare -A TARGETS
+
 # Port that does not have a cable connected.
 : "${NETIF_NO_CABLE:=eth8}"
 
@@ -340,17 +349,107 @@ fi
 ##############################################################################
 # Command line options handling
 
-count=0
+check_env() {
+       local vars_needed=("LOCAL_V4,LOCAL_V6"
+                          "REMOTE_V4,REMOTE_V6"
+                          "REMOTE_TYPE"
+                          "REMOTE_ARGS")
+       local missing=()
+       local choice
+
+       # If a choice has multiple comma separated options, at least one must
+       # exist
+       for choice in "${vars_needed[@]}"; do
+               IFS=',' read -ra entries <<< "$choice"
+
+               local found=0
+               for entry in "${entries[@]}"; do
+                       if [[ -n "${!entry}" ]]; then
+                               found=1
+                               break
+                       fi
+               done
+
+               if [[ $found -eq 0 ]]; then
+                       missing+=("$choice")
+               fi
+       done
+
+       # Make sure v4 / v6 configs are symmetric
+       if [[ (-n "${LOCAL_V6}" && -z "${REMOTE_V6}") || \
+             (-z "${LOCAL_V6}" && -n "${REMOTE_V6}") ]]; then
+               missing+=("LOCAL_V6,REMOTE_V6")
+       fi
 
-while [[ $# -gt 0 ]]; do
-       if [[ "$count" -eq "0" ]]; then
-               unset NETIFS
-               declare -A NETIFS
+       if [[ (-n "${LOCAL_V4}" && -z "${REMOTE_V4}") || \
+             (-z "${LOCAL_V4}" && -n "${REMOTE_V4}") ]]; then
+               missing+=("LOCAL_V4,REMOTE_V4")
        fi
-       count=$((count + 1))
-       NETIFS[p$count]="$1"
-       shift
-done
+
+       if [[ ${#missing[@]} -gt 0 ]]; then
+               echo "SKIP: Invalid environment, missing configuration: 
${missing[*]}"
+               echo "Please see tools/testing/selftests/drivers/net/README.rst"
+               exit $ksft_skip
+       fi
+}
+
+get_ifname_by_ip()
+{
+       local ip_addr=$1; shift
+
+       run_cmd ip -j addr show to "$ip_addr" | jq -r '.[].ifname'
+}
+
+# If there is a configuration file, source it
+if [[ -f $net_forwarding_dir/../../drivers/net/net.config ]]; then
+       source "$net_forwarding_dir/../../drivers/net/net.config"
+fi
+
+# In case NETIF is specified, then 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 [[ -v NETIF ]]; then
+       if (( NUM_NETIFS > 2)); then
+               echo "SKIP: test uses NIC_SETUP=yes but NUM_NETIFS is bigger 
than 2"
+               exit $ksft_skip
+       fi
+
+       check_env
+
+       # Populate the NETIF and TARGETS arrays automatically based on the env 
variables
+       unset NETIFS
+       declare -A NETIFS
+
+       NETIFS[p1]="$NETIF"
+       TARGETS[$NETIF]="local:"
+
+       # Locate the name of the remote interface
+       if [[ -v REMOTE_V4 ]]; then
+               remote_netif=$(TARGET="$REMOTE_TYPE:$REMOTE_ARGS" 
get_ifname_by_ip "$REMOTE_V4")
+       else
+               remote_netif=$(TARGET="$REMOTE_TYPE:$REMOTE_ARGS" 
get_ifname_by_ip "$REMOTE_V6")
+       fi
+       if [[ ! -n "$remote_netif" ]]; then
+               echo "SKIP: cannot find remote interface"
+               exit $ksft_skip
+       fi
+
+       NETIFS[p2]="$remote_netif"
+       TARGETS[$remote_netif]="$REMOTE_TYPE:$REMOTE_ARGS"
+else
+       count=0
+
+       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
-- 
2.25.1


Reply via email to