]> git.itanic.dy.fi Git - linux-stable/commitdiff
selftests/net: add lib.sh
authorHangbin Liu <liuhangbin@gmail.com>
Sat, 2 Dec 2023 02:00:57 +0000 (10:00 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 5 Dec 2023 12:00:55 +0000 (13:00 +0100)
Add a lib.sh for net selftests. This file can be used to define commonly
used variables and functions. Some commonly used functions can be moved
from forwarding/lib.sh to this lib file. e.g. busywait().

Add function setup_ns() for user to create unique namespaces with given
prefix name.

Reviewed-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
tools/testing/selftests/net/Makefile
tools/testing/selftests/net/forwarding/lib.sh
tools/testing/selftests/net/lib.sh [new file with mode: 0644]

index 9274edfb76ffcd3591ef21df7eaf329183252e90..14bd68da746693f4b11e073420231e885c5894f3 100644 (file)
@@ -54,7 +54,7 @@ TEST_PROGS += ip_local_port_range.sh
 TEST_PROGS += rps_default_mask.sh
 TEST_PROGS += big_tcp.sh
 TEST_PROGS_EXTENDED := in_netns.sh setup_loopback.sh setup_veth.sh
-TEST_PROGS_EXTENDED += toeplitz_client.sh toeplitz.sh
+TEST_PROGS_EXTENDED += toeplitz_client.sh toeplitz.sh lib.sh
 TEST_GEN_FILES =  socket nettest
 TEST_GEN_FILES += psock_fanout psock_tpacket msg_zerocopy reuseport_addr_any
 TEST_GEN_FILES += tcp_mmap tcp_inq psock_snd txring_overwrite
index e37a15eda6c240836ee487ad53f7ac2f8532bd56..8f6ca458af9a8dde1b93e2a64ad582e8b54e6cdb 100755 (executable)
@@ -4,9 +4,6 @@
 ##############################################################################
 # Defines
 
-# Kselftest framework requirement - SKIP code is 4.
-ksft_skip=4
-
 # Can be overridden by the configuration file.
 PING=${PING:=ping}
 PING6=${PING6:=ping6}
@@ -41,6 +38,7 @@ if [[ -f $relative_path/forwarding.config ]]; then
        source "$relative_path/forwarding.config"
 fi
 
+source ../lib.sh
 ##############################################################################
 # Sanity checks
 
@@ -395,29 +393,6 @@ log_info()
        echo "INFO: $msg"
 }
 
-busywait()
-{
-       local timeout=$1; shift
-
-       local start_time="$(date -u +%s%3N)"
-       while true
-       do
-               local out
-               out=$("$@")
-               local ret=$?
-               if ((!ret)); then
-                       echo -n "$out"
-                       return 0
-               fi
-
-               local current_time="$(date -u +%s%3N)"
-               if ((current_time - start_time > timeout)); then
-                       echo -n "$out"
-                       return 1
-               fi
-       done
-}
-
 not()
 {
        "$@"
diff --git a/tools/testing/selftests/net/lib.sh b/tools/testing/selftests/net/lib.sh
new file mode 100644 (file)
index 0000000..518eca5
--- /dev/null
@@ -0,0 +1,85 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+##############################################################################
+# Defines
+
+# Kselftest framework requirement - SKIP code is 4.
+ksft_skip=4
+
+##############################################################################
+# Helpers
+busywait()
+{
+       local timeout=$1; shift
+
+       local start_time="$(date -u +%s%3N)"
+       while true
+       do
+               local out
+               out=$("$@")
+               local ret=$?
+               if ((!ret)); then
+                       echo -n "$out"
+                       return 0
+               fi
+
+               local current_time="$(date -u +%s%3N)"
+               if ((current_time - start_time > timeout)); then
+                       echo -n "$out"
+                       return 1
+               fi
+       done
+}
+
+cleanup_ns()
+{
+       local ns=""
+       local errexit=0
+       local ret=0
+
+       # disable errexit temporary
+       if [[ $- =~ "e" ]]; then
+               errexit=1
+               set +e
+       fi
+
+       for ns in "$@"; do
+               ip netns delete "${ns}" &> /dev/null
+               if ! busywait 2 ip netns list \| grep -vq "^$ns$" &> /dev/null; then
+                       echo "Warn: Failed to remove namespace $ns"
+                       ret=1
+               fi
+       done
+
+       [ $errexit -eq 1 ] && set -e
+       return $ret
+}
+
+# setup netns with given names as prefix. e.g
+# setup_ns local remote
+setup_ns()
+{
+       local ns=""
+       local ns_name=""
+       local ns_list=""
+       for ns_name in "$@"; do
+               # Some test may setup/remove same netns multi times
+               if unset ${ns_name} 2> /dev/null; then
+                       ns="${ns_name,,}-$(mktemp -u XXXXXX)"
+                       eval readonly ${ns_name}="$ns"
+               else
+                       eval ns='$'${ns_name}
+                       cleanup_ns "$ns"
+
+               fi
+
+               if ! ip netns add "$ns"; then
+                       echo "Failed to create namespace $ns_name"
+                       cleanup_ns "$ns_list"
+                       return $ksft_skip
+               fi
+               ip -n "$ns" link set lo up
+               ns_list="$ns_list $ns"
+       done
+}