On Thu, Nov 30, 2023 at 12:01 PM Hangbin Liu <liuhangbin@xxxxxxxxx> wrote: > > 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. > > Signed-off-by: Hangbin Liu <liuhangbin@xxxxxxxxx> > --- > tools/testing/selftests/net/Makefile | 2 +- > tools/testing/selftests/net/forwarding/lib.sh | 27 +----- > tools/testing/selftests/net/lib.sh | 85 +++++++++++++++++++ > 3 files changed, 87 insertions(+), 27 deletions(-) > create mode 100644 tools/testing/selftests/net/lib.sh > > diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile > index 9274edfb76ff..14bd68da7466 100644 > --- a/tools/testing/selftests/net/Makefile > +++ b/tools/testing/selftests/net/Makefile > @@ -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 > diff --git a/tools/testing/selftests/net/forwarding/lib.sh b/tools/testing/selftests/net/forwarding/lib.sh > index e37a15eda6c2..8f6ca458af9a 100755 > --- a/tools/testing/selftests/net/forwarding/lib.sh > +++ b/tools/testing/selftests/net/forwarding/lib.sh > @@ -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 > index 000000000000..518eca57b815 > --- /dev/null > +++ b/tools/testing/selftests/net/lib.sh > @@ -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 I got this patchset tested the result is looking good. However it seems that not all of the tests require this loopback bring up, e.g. * arp_ndisc_untracked_subnets.sh * cmsg_ipv6.sh * cmsg_so_mark.sh * cmsg_time.sh * drop_monitor_tests.sh * icmp.sh * ndisc_unsolicited_na_test.sh * sctp_vrf.sh * unicast_extensions.sh A possible solution could be adding an extra flag to setup_ns(), bring lo up on demand. Not sure if this is needed, as I can't think of possible impacts of this for the moment. (Maybe a test does not require loopback device in such state?) Other might be able to provide some feedback about this. > + ns_list="$ns_list $ns" > + done > +} > -- > 2.41.0 >