Commit 2437c0f5 authored by David S. Miller's avatar David S. Miller

Merge branch 'net-selftests-unique-namespace-last-part'

Hangbin Liu says:

====================
Convert net selftests to run in unique namespace (last part)

Here is the last part of converting net selftests to run in unique namespace.
This part converts all left tests. After the conversion, we can run the net
sleftests in parallel. e.g.

 # ./run_kselftest.sh -n -t net:reuseport_bpf
 TAP version 13
 1..1
 # selftests: net: reuseport_bpf
 ok 1 selftests: net: reuseport_bpf
  mod 10...
 # Socket 0: 0
 # Socket 1: 1
 ...
 # Socket 4: 19
 # Testing filter add without bind...
 # SUCCESS

 # ./run_kselftest.sh -p -n -t net:cmsg_so_mark.sh -t net:cmsg_time.sh -t net:cmsg_ipv6.sh
 TAP version 13
 1..3
 # selftests: net: cmsg_so_mark.sh
 ok 1 selftests: net: cmsg_so_mark.sh
 # selftests: net: cmsg_time.sh
 ok 2 selftests: net: cmsg_time.sh
 # selftests: net: cmsg_ipv6.sh
 ok 3 selftests: net: cmsg_ipv6.sh

 # ./run_kselftest.sh -p -n -c net
 TAP version 13
 1..95
 # selftests: net: reuseport_bpf_numa
 ok 3 selftests: net: reuseport_bpf_numa
 # selftests: net: reuseport_bpf_cpu
 ok 2 selftests: net: reuseport_bpf_cpu
 # selftests: net: sk_bind_sendto_listen
 ok 9 selftests: net: sk_bind_sendto_listen
 # selftests: net: reuseaddr_conflict
 ok 5 selftests: net: reuseaddr_conflict
 ...

Here is the part 1 link:
https://lore.kernel.org/netdev/20231202020110.362433-1-liuhangbin@gmail.com
part 2 link:
https://lore.kernel.org/netdev/20231206070801.1691247-1-liuhangbin@gmail.com
part 3 link:
https://lore.kernel.org/netdev/20231213060856.4030084-1-liuhangbin@gmail.com
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 6530b29f 9d0b4ad8
...@@ -6,6 +6,7 @@ export skip_rc=4 ...@@ -6,6 +6,7 @@ export skip_rc=4
export timeout_rc=124 export timeout_rc=124
export logfile=/dev/stdout export logfile=/dev/stdout
export per_test_logging= export per_test_logging=
export RUN_IN_NETNS=
# Defaults for "settings" file fields: # Defaults for "settings" file fields:
# "timeout" how many seconds to let each test run before running # "timeout" how many seconds to let each test run before running
...@@ -47,7 +48,7 @@ run_one() ...@@ -47,7 +48,7 @@ run_one()
{ {
DIR="$1" DIR="$1"
TEST="$2" TEST="$2"
NUM="$3" local test_num="$3"
BASENAME_TEST=$(basename $TEST) BASENAME_TEST=$(basename $TEST)
...@@ -141,6 +142,33 @@ run_one() ...@@ -141,6 +142,33 @@ run_one()
fi fi
} }
in_netns()
{
local name=$1
ip netns exec $name bash <<-EOF
BASE_DIR=$BASE_DIR
source $BASE_DIR/kselftest/runner.sh
logfile=$logfile
run_one $DIR $TEST $test_num
EOF
}
run_in_netns()
{
local netns=$(mktemp -u ${BASENAME_TEST}-XXXXXX)
local tmplog="/tmp/$(mktemp -u ${BASENAME_TEST}-XXXXXX)"
ip netns add $netns
if [ $? -ne 0 ]; then
echo "# Warning: Create namespace failed for $BASENAME_TEST"
echo "not ok $test_num selftests: $DIR: $BASENAME_TEST # Create NS failed"
fi
ip -n $netns link set lo up
in_netns $netns &> $tmplog
ip netns del $netns &> /dev/null
cat $tmplog
rm -f $tmplog
}
run_many() run_many()
{ {
echo "TAP version 13" echo "TAP version 13"
...@@ -155,6 +183,12 @@ run_many() ...@@ -155,6 +183,12 @@ run_many()
logfile="/tmp/$BASENAME_TEST" logfile="/tmp/$BASENAME_TEST"
cat /dev/null > "$logfile" cat /dev/null > "$logfile"
fi fi
run_one "$DIR" "$TEST" "$test_num" if [ -n "$RUN_IN_NETNS" ]; then
run_in_netns &
else
run_one "$DIR" "$TEST" "$test_num"
fi
done done
wait
} }
...@@ -2,10 +2,8 @@ ...@@ -2,10 +2,8 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# This test is for checking GRE GSO. # This test is for checking GRE GSO.
source lib.sh
ret=0 ret=0
# Kselftest framework requirement - SKIP code is 4.
ksft_skip=4
# all tests in this script. Can be overridden with -t option # all tests in this script. Can be overridden with -t option
TESTS="gre_gso" TESTS="gre_gso"
...@@ -13,8 +11,6 @@ TESTS="gre_gso" ...@@ -13,8 +11,6 @@ TESTS="gre_gso"
VERBOSE=0 VERBOSE=0
PAUSE_ON_FAIL=no PAUSE_ON_FAIL=no
PAUSE=no PAUSE=no
IP="ip -netns ns1"
NS_EXEC="ip netns exec ns1"
TMPFILE=`mktemp` TMPFILE=`mktemp`
PID= PID=
...@@ -50,13 +46,13 @@ log_test() ...@@ -50,13 +46,13 @@ log_test()
setup() setup()
{ {
set -e set -e
ip netns add ns1 setup_ns ns1
ip netns set ns1 auto IP="ip -netns $ns1"
$IP link set dev lo up NS_EXEC="ip netns exec $ns1"
ip link add veth0 type veth peer name veth1 ip link add veth0 type veth peer name veth1
ip link set veth0 up ip link set veth0 up
ip link set veth1 netns ns1 ip link set veth1 netns $ns1
$IP link set veth1 name veth0 $IP link set veth1 name veth0
$IP link set veth0 up $IP link set veth0 up
...@@ -70,7 +66,7 @@ cleanup() ...@@ -70,7 +66,7 @@ cleanup()
[ -n "$PID" ] && kill $PID [ -n "$PID" ] && kill $PID
ip link del dev gre1 &> /dev/null ip link del dev gre1 &> /dev/null
ip link del dev veth0 &> /dev/null ip link del dev veth0 &> /dev/null
ip netns del ns1 cleanup_ns $ns1
} }
get_linklocal() get_linklocal()
...@@ -145,7 +141,7 @@ gre6_gso_test() ...@@ -145,7 +141,7 @@ gre6_gso_test()
setup setup
a1=$(get_linklocal veth0) a1=$(get_linklocal veth0)
a2=$(get_linklocal veth0 ns1) a2=$(get_linklocal veth0 $ns1)
gre_create_tun $a1 $a2 gre_create_tun $a1 $a2
......
...@@ -23,11 +23,11 @@ run_test() { ...@@ -23,11 +23,11 @@ run_test() {
# on every try. # on every try.
for tries in {1..3}; do for tries in {1..3}; do
# Actual test starts here # Actual test starts here
ip netns exec server_ns ./gro "${ARGS[@]}" "--rx" "--iface" "server" \ ip netns exec $server_ns ./gro "${ARGS[@]}" "--rx" "--iface" "server" \
1>>log.txt & 1>>log.txt &
server_pid=$! server_pid=$!
sleep 0.5 # to allow for socket init sleep 0.5 # to allow for socket init
ip netns exec client_ns ./gro "${ARGS[@]}" "--iface" "client" \ ip netns exec $client_ns ./gro "${ARGS[@]}" "--iface" "client" \
1>>log.txt 1>>log.txt
wait "${server_pid}" wait "${server_pid}"
exit_code=$? exit_code=$?
......
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
source lib.sh
set -o pipefail set -o pipefail
NS=netns-name-test
DEV=dummy-dev0 DEV=dummy-dev0
DEV2=dummy-dev1 DEV2=dummy-dev1
ALT_NAME=some-alt-name ALT_NAME=some-alt-name
...@@ -11,7 +11,7 @@ ALT_NAME=some-alt-name ...@@ -11,7 +11,7 @@ ALT_NAME=some-alt-name
RET_CODE=0 RET_CODE=0
cleanup() { cleanup() {
ip netns del $NS cleanup_ns $NS $test_ns
} }
trap cleanup EXIT trap cleanup EXIT
...@@ -21,50 +21,50 @@ fail() { ...@@ -21,50 +21,50 @@ fail() {
RET_CODE=1 RET_CODE=1
} }
ip netns add $NS setup_ns NS test_ns
# #
# Test basic move without a rename # Test basic move without a rename
# #
ip -netns $NS link add name $DEV type dummy || fail ip -netns $NS link add name $DEV type dummy || fail
ip -netns $NS link set dev $DEV netns 1 || ip -netns $NS link set dev $DEV netns $test_ns ||
fail "Can't perform a netns move" fail "Can't perform a netns move"
ip link show dev $DEV >> /dev/null || fail "Device not found after move" ip -netns $test_ns link show dev $DEV >> /dev/null || fail "Device not found after move"
ip link del $DEV || fail ip -netns $test_ns link del $DEV || fail
# #
# Test move with a conflict # Test move with a conflict
# #
ip link add name $DEV type dummy ip -netns $test_ns link add name $DEV type dummy
ip -netns $NS link add name $DEV type dummy || fail ip -netns $NS link add name $DEV type dummy || fail
ip -netns $NS link set dev $DEV netns 1 2> /dev/null && ip -netns $NS link set dev $DEV netns $test_ns 2> /dev/null &&
fail "Performed a netns move with a name conflict" fail "Performed a netns move with a name conflict"
ip link show dev $DEV >> /dev/null || fail "Device not found after move" ip -netns $test_ns link show dev $DEV >> /dev/null || fail "Device not found after move"
ip -netns $NS link del $DEV || fail ip -netns $NS link del $DEV || fail
ip link del $DEV || fail ip -netns $test_ns link del $DEV || fail
# #
# Test move with a conflict and rename # Test move with a conflict and rename
# #
ip link add name $DEV type dummy ip -netns $test_ns link add name $DEV type dummy
ip -netns $NS link add name $DEV type dummy || fail ip -netns $NS link add name $DEV type dummy || fail
ip -netns $NS link set dev $DEV netns 1 name $DEV2 || ip -netns $NS link set dev $DEV netns $test_ns name $DEV2 ||
fail "Can't perform a netns move with rename" fail "Can't perform a netns move with rename"
ip link del $DEV2 || fail ip -netns $test_ns link del $DEV2 || fail
ip link del $DEV || fail ip -netns $test_ns link del $DEV || fail
# #
# Test dup alt-name with netns move # Test dup alt-name with netns move
# #
ip link add name $DEV type dummy || fail ip -netns $test_ns link add name $DEV type dummy || fail
ip link property add dev $DEV altname $ALT_NAME || fail ip -netns $test_ns link property add dev $DEV altname $ALT_NAME || fail
ip -netns $NS link add name $DEV2 type dummy || fail ip -netns $NS link add name $DEV2 type dummy || fail
ip -netns $NS link property add dev $DEV2 altname $ALT_NAME || fail ip -netns $NS link property add dev $DEV2 altname $ALT_NAME || fail
ip -netns $NS link set dev $DEV2 netns 1 2> /dev/null && ip -netns $NS link set dev $DEV2 netns $test_ns 2> /dev/null &&
fail "Moved with alt-name dup" fail "Moved with alt-name dup"
ip link del $DEV || fail ip -netns $test_ns link del $DEV || fail
ip -netns $NS link del $DEV2 || fail ip -netns $NS link del $DEV2 || fail
# #
...@@ -72,11 +72,11 @@ ip -netns $NS link del $DEV2 || fail ...@@ -72,11 +72,11 @@ ip -netns $NS link del $DEV2 || fail
# #
ip -netns $NS link add name $DEV type dummy || fail ip -netns $NS link add name $DEV type dummy || fail
ip -netns $NS link property add dev $DEV altname $ALT_NAME || fail ip -netns $NS link property add dev $DEV altname $ALT_NAME || fail
ip -netns $NS link set dev $DEV netns 1 || fail ip -netns $NS link set dev $DEV netns $test_ns || fail
ip link show dev $ALT_NAME >> /dev/null || fail "Can't find alt-name after move" ip -netns $test_ns link show dev $ALT_NAME >> /dev/null || fail "Can't find alt-name after move"
ip -netns $NS link show dev $ALT_NAME 2> /dev/null && ip -netns $NS link show dev $ALT_NAME 2> /dev/null &&
fail "Can still find alt-name after move" fail "Can still find alt-name after move"
ip link del $DEV || fail ip -netns $test_ns link del $DEV || fail
echo -ne "$(basename $0) \t\t\t\t" echo -ne "$(basename $0) \t\t\t\t"
if [ $RET_CODE -eq 0 ]; then if [ $RET_CODE -eq 0 ]; then
......
...@@ -198,8 +198,7 @@ ...@@ -198,8 +198,7 @@
# - pmtu_ipv6_route_change # - pmtu_ipv6_route_change
# Same as above but with IPv6 # Same as above but with IPv6
# Kselftest framework requirement - SKIP code is 4. source ./lib.sh
ksft_skip=4
PAUSE_ON_FAIL=no PAUSE_ON_FAIL=no
VERBOSE=0 VERBOSE=0
...@@ -268,16 +267,6 @@ tests=" ...@@ -268,16 +267,6 @@ tests="
pmtu_ipv4_route_change ipv4: PMTU exception w/route replace 1 pmtu_ipv4_route_change ipv4: PMTU exception w/route replace 1
pmtu_ipv6_route_change ipv6: PMTU exception w/route replace 1" pmtu_ipv6_route_change ipv6: PMTU exception w/route replace 1"
NS_A="ns-A"
NS_B="ns-B"
NS_C="ns-C"
NS_R1="ns-R1"
NS_R2="ns-R2"
ns_a="ip netns exec ${NS_A}"
ns_b="ip netns exec ${NS_B}"
ns_c="ip netns exec ${NS_C}"
ns_r1="ip netns exec ${NS_R1}"
ns_r2="ip netns exec ${NS_R2}"
# Addressing and routing for tests with routers: four network segments, with # Addressing and routing for tests with routers: four network segments, with
# index SEGMENT between 1 and 4, a common prefix (PREFIX4 or PREFIX6) and an # index SEGMENT between 1 and 4, a common prefix (PREFIX4 or PREFIX6) and an
# identifier ID, which is 1 for hosts (A and B), 2 for routers (R1 and R2). # identifier ID, which is 1 for hosts (A and B), 2 for routers (R1 and R2).
...@@ -543,13 +532,17 @@ setup_ip6ip6() { ...@@ -543,13 +532,17 @@ setup_ip6ip6() {
} }
setup_namespaces() { setup_namespaces() {
setup_ns NS_A NS_B NS_C NS_R1 NS_R2
for n in ${NS_A} ${NS_B} ${NS_C} ${NS_R1} ${NS_R2}; do for n in ${NS_A} ${NS_B} ${NS_C} ${NS_R1} ${NS_R2}; do
ip netns add ${n} || return 1
# Disable DAD, so that we don't have to wait to use the # Disable DAD, so that we don't have to wait to use the
# configured IPv6 addresses # configured IPv6 addresses
ip netns exec ${n} sysctl -q net/ipv6/conf/default/accept_dad=0 ip netns exec ${n} sysctl -q net/ipv6/conf/default/accept_dad=0
done done
ns_a="ip netns exec ${NS_A}"
ns_b="ip netns exec ${NS_B}"
ns_c="ip netns exec ${NS_C}"
ns_r1="ip netns exec ${NS_R1}"
ns_r2="ip netns exec ${NS_R2}"
} }
setup_veth() { setup_veth() {
...@@ -839,7 +832,7 @@ setup_bridge() { ...@@ -839,7 +832,7 @@ setup_bridge() {
run_cmd ${ns_a} ip link set br0 up run_cmd ${ns_a} ip link set br0 up
run_cmd ${ns_c} ip link add veth_C-A type veth peer name veth_A-C run_cmd ${ns_c} ip link add veth_C-A type veth peer name veth_A-C
run_cmd ${ns_c} ip link set veth_A-C netns ns-A run_cmd ${ns_c} ip link set veth_A-C netns ${NS_A}
run_cmd ${ns_a} ip link set veth_A-C up run_cmd ${ns_a} ip link set veth_A-C up
run_cmd ${ns_c} ip link set veth_C-A up run_cmd ${ns_c} ip link set veth_C-A up
...@@ -944,9 +937,7 @@ cleanup() { ...@@ -944,9 +937,7 @@ cleanup() {
done done
socat_pids= socat_pids=
for n in ${NS_A} ${NS_B} ${NS_C} ${NS_R1} ${NS_R2}; do cleanup_all_ns
ip netns del ${n} 2> /dev/null
done
ip link del veth_A-C 2>/dev/null ip link del veth_A-C 2>/dev/null
ip link del veth_A-R1 2>/dev/null ip link del veth_A-R1 2>/dev/null
......
...@@ -35,8 +35,7 @@ VERBOSE=0 ...@@ -35,8 +35,7 @@ VERBOSE=0
PAUSE=no PAUSE=no
PAUSE_ON_FAIL=no PAUSE_ON_FAIL=no
# Kselftest framework requirement - SKIP code is 4. source lib.sh
ksft_skip=4
# set global exit status, but never reset nonzero one. # set global exit status, but never reset nonzero one.
check_err() check_err()
...@@ -517,9 +516,8 @@ kci_test_encap_fou() ...@@ -517,9 +516,8 @@ kci_test_encap_fou()
# test various encap methods, use netns to avoid unwanted interference # test various encap methods, use netns to avoid unwanted interference
kci_test_encap() kci_test_encap()
{ {
testns="testns"
local ret=0 local ret=0
run_cmd ip netns add "$testns" setup_ns testns
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
end_test "SKIP encap tests: cannot add net namespace $testns" end_test "SKIP encap tests: cannot add net namespace $testns"
return $ksft_skip return $ksft_skip
...@@ -574,6 +572,10 @@ kci_test_macsec_offload() ...@@ -574,6 +572,10 @@ kci_test_macsec_offload()
return $ksft_skip return $ksft_skip
fi fi
if ! mount | grep -q debugfs; then
mount -t debugfs none /sys/kernel/debug/ &> /dev/null
fi
# setup netdevsim since dummydev doesn't have offload support # setup netdevsim since dummydev doesn't have offload support
if [ ! -w /sys/bus/netdevsim/new_device ] ; then if [ ! -w /sys/bus/netdevsim/new_device ] ; then
run_cmd modprobe -q netdevsim run_cmd modprobe -q netdevsim
...@@ -738,6 +740,10 @@ kci_test_ipsec_offload() ...@@ -738,6 +740,10 @@ kci_test_ipsec_offload()
sysfsnet=/sys/bus/netdevsim/devices/netdevsim0/net/ sysfsnet=/sys/bus/netdevsim/devices/netdevsim0/net/
probed=false probed=false
if ! mount | grep -q debugfs; then
mount -t debugfs none /sys/kernel/debug/ &> /dev/null
fi
# setup netdevsim since dummydev doesn't have offload support # setup netdevsim since dummydev doesn't have offload support
if [ ! -w /sys/bus/netdevsim/new_device ] ; then if [ ! -w /sys/bus/netdevsim/new_device ] ; then
run_cmd modprobe -q netdevsim run_cmd modprobe -q netdevsim
...@@ -836,11 +842,10 @@ EOF ...@@ -836,11 +842,10 @@ EOF
kci_test_gretap() kci_test_gretap()
{ {
testns="testns"
DEV_NS=gretap00 DEV_NS=gretap00
local ret=0 local ret=0
run_cmd ip netns add "$testns" setup_ns testns
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
end_test "SKIP gretap tests: cannot add net namespace $testns" end_test "SKIP gretap tests: cannot add net namespace $testns"
return $ksft_skip return $ksft_skip
...@@ -878,11 +883,10 @@ kci_test_gretap() ...@@ -878,11 +883,10 @@ kci_test_gretap()
kci_test_ip6gretap() kci_test_ip6gretap()
{ {
testns="testns"
DEV_NS=ip6gretap00 DEV_NS=ip6gretap00
local ret=0 local ret=0
run_cmd ip netns add "$testns" setup_ns testns
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
end_test "SKIP ip6gretap tests: cannot add net namespace $testns" end_test "SKIP ip6gretap tests: cannot add net namespace $testns"
return $ksft_skip return $ksft_skip
...@@ -920,7 +924,6 @@ kci_test_ip6gretap() ...@@ -920,7 +924,6 @@ kci_test_ip6gretap()
kci_test_erspan() kci_test_erspan()
{ {
testns="testns"
DEV_NS=erspan00 DEV_NS=erspan00
local ret=0 local ret=0
run_cmd_grep "^Usage:" ip link help erspan run_cmd_grep "^Usage:" ip link help erspan
...@@ -928,7 +931,7 @@ kci_test_erspan() ...@@ -928,7 +931,7 @@ kci_test_erspan()
end_test "SKIP: erspan: iproute2 too old" end_test "SKIP: erspan: iproute2 too old"
return $ksft_skip return $ksft_skip
fi fi
run_cmd ip netns add "$testns" setup_ns testns
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
end_test "SKIP erspan tests: cannot add net namespace $testns" end_test "SKIP erspan tests: cannot add net namespace $testns"
return $ksft_skip return $ksft_skip
...@@ -970,7 +973,6 @@ kci_test_erspan() ...@@ -970,7 +973,6 @@ kci_test_erspan()
kci_test_ip6erspan() kci_test_ip6erspan()
{ {
testns="testns"
DEV_NS=ip6erspan00 DEV_NS=ip6erspan00
local ret=0 local ret=0
run_cmd_grep "^Usage:" ip link help ip6erspan run_cmd_grep "^Usage:" ip link help ip6erspan
...@@ -978,7 +980,7 @@ kci_test_ip6erspan() ...@@ -978,7 +980,7 @@ kci_test_ip6erspan()
end_test "SKIP: ip6erspan: iproute2 too old" end_test "SKIP: ip6erspan: iproute2 too old"
return $ksft_skip return $ksft_skip
fi fi
run_cmd ip netns add "$testns" setup_ns testns
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
end_test "SKIP ip6erspan tests: cannot add net namespace $testns" end_test "SKIP ip6erspan tests: cannot add net namespace $testns"
return $ksft_skip return $ksft_skip
...@@ -1022,8 +1024,6 @@ kci_test_ip6erspan() ...@@ -1022,8 +1024,6 @@ kci_test_ip6erspan()
kci_test_fdb_get() kci_test_fdb_get()
{ {
IP="ip -netns testns"
BRIDGE="bridge -netns testns"
brdev="test-br0" brdev="test-br0"
vxlandev="vxlan10" vxlandev="vxlan10"
test_mac=de:ad:be:ef:13:37 test_mac=de:ad:be:ef:13:37
...@@ -1037,11 +1037,13 @@ kci_test_fdb_get() ...@@ -1037,11 +1037,13 @@ kci_test_fdb_get()
return $ksft_skip return $ksft_skip
fi fi
run_cmd ip netns add testns setup_ns testns
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
end_test "SKIP fdb get tests: cannot add net namespace $testns" end_test "SKIP fdb get tests: cannot add net namespace $testns"
return $ksft_skip return $ksft_skip
fi fi
IP="ip -netns $testns"
BRIDGE="bridge -netns $testns"
run_cmd $IP link add "$vxlandev" type vxlan id 10 local $localip \ run_cmd $IP link add "$vxlandev" type vxlan id 10 local $localip \
dstport 4789 dstport 4789
run_cmd $IP link add name "$brdev" type bridge run_cmd $IP link add name "$brdev" type bridge
...@@ -1052,7 +1054,7 @@ kci_test_fdb_get() ...@@ -1052,7 +1054,7 @@ kci_test_fdb_get()
run_cmd_grep "dev $vxlandev master $brdev" $BRIDGE fdb get $test_mac br "$brdev" run_cmd_grep "dev $vxlandev master $brdev" $BRIDGE fdb get $test_mac br "$brdev"
run_cmd_grep "dev $vxlandev dst $dstip" $BRIDGE fdb get $test_mac dev "$vxlandev" self run_cmd_grep "dev $vxlandev dst $dstip" $BRIDGE fdb get $test_mac dev "$vxlandev" self
ip netns del testns &>/dev/null ip netns del $testns &>/dev/null
if [ $ret -ne 0 ]; then if [ $ret -ne 0 ]; then
end_test "FAIL: bridge fdb get" end_test "FAIL: bridge fdb get"
......
...@@ -5,6 +5,8 @@ readonly FLUSH_PATH="/sys/class/net/${dev}/gro_flush_timeout" ...@@ -5,6 +5,8 @@ readonly FLUSH_PATH="/sys/class/net/${dev}/gro_flush_timeout"
readonly IRQ_PATH="/sys/class/net/${dev}/napi_defer_hard_irqs" readonly IRQ_PATH="/sys/class/net/${dev}/napi_defer_hard_irqs"
readonly FLUSH_TIMEOUT="$(< ${FLUSH_PATH})" readonly FLUSH_TIMEOUT="$(< ${FLUSH_PATH})"
readonly HARD_IRQS="$(< ${IRQ_PATH})" readonly HARD_IRQS="$(< ${IRQ_PATH})"
readonly server_ns=$(mktemp -u server-XXXXXXXX)
readonly client_ns=$(mktemp -u client-XXXXXXXX)
netdev_check_for_carrier() { netdev_check_for_carrier() {
local -r dev="$1" local -r dev="$1"
...@@ -97,12 +99,12 @@ setup_interrupt() { ...@@ -97,12 +99,12 @@ setup_interrupt() {
setup_ns() { setup_ns() {
# Set up server_ns namespace and client_ns namespace # Set up server_ns namespace and client_ns namespace
setup_macvlan_ns "${dev}" server_ns server "${SERVER_MAC}" setup_macvlan_ns "${dev}" ${server_ns} server "${SERVER_MAC}"
setup_macvlan_ns "${dev}" client_ns client "${CLIENT_MAC}" setup_macvlan_ns "${dev}" ${client_ns} client "${CLIENT_MAC}"
} }
cleanup_ns() { cleanup_ns() {
cleanup_macvlan_ns server_ns server client_ns client cleanup_macvlan_ns ${server_ns} server ${client_ns} client
} }
setup() { setup() {
......
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
readonly server_ns=$(mktemp -u server-XXXXXXXX)
readonly client_ns=$(mktemp -u client-XXXXXXXX)
setup_veth_ns() { setup_veth_ns() {
local -r link_dev="$1" local -r link_dev="$1"
local -r ns_name="$2" local -r ns_name="$2"
...@@ -19,14 +22,14 @@ setup_ns() { ...@@ -19,14 +22,14 @@ setup_ns() {
# Set up server_ns namespace and client_ns namespace # Set up server_ns namespace and client_ns namespace
ip link add name server type veth peer name client ip link add name server type veth peer name client
setup_veth_ns "${dev}" server_ns server "${SERVER_MAC}" setup_veth_ns "${dev}" ${server_ns} server "${SERVER_MAC}"
setup_veth_ns "${dev}" client_ns client "${CLIENT_MAC}" setup_veth_ns "${dev}" ${client_ns} client "${CLIENT_MAC}"
} }
cleanup_ns() { cleanup_ns() {
local ns_name local ns_name
for ns_name in client_ns server_ns; do for ns_name in ${client_ns} ${server_ns}; do
[[ -e /var/run/netns/"${ns_name}" ]] && ip netns del "${ns_name}" [[ -e /var/run/netns/"${ns_name}" ]] && ip netns del "${ns_name}"
done done
} }
......
...@@ -2,18 +2,18 @@ ...@@ -2,18 +2,18 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2022 Meta Platforms, Inc. and affiliates. # Copyright (c) 2022 Meta Platforms, Inc. and affiliates.
NS='stress_reuseport_listen_ns' source lib.sh
NR_FILES=24100 NR_FILES=24100
SAVED_NR_FILES=$(ulimit -n) SAVED_NR_FILES=$(ulimit -n)
setup() { setup() {
ip netns add $NS setup_ns NS
ip netns exec $NS sysctl -q -w net.ipv6.ip_nonlocal_bind=1 ip netns exec $NS sysctl -q -w net.ipv6.ip_nonlocal_bind=1
ulimit -n $NR_FILES ulimit -n $NR_FILES
} }
cleanup() { cleanup() {
ip netns del $NS cleanup_ns $NS
ulimit -n $SAVED_NR_FILES ulimit -n $SAVED_NR_FILES
} }
......
...@@ -147,14 +147,14 @@ setup() { ...@@ -147,14 +147,14 @@ setup() {
setup_loopback_environment "${DEV}" setup_loopback_environment "${DEV}"
# Set up server_ns namespace and client_ns namespace # Set up server_ns namespace and client_ns namespace
setup_macvlan_ns "${DEV}" server_ns server \ setup_macvlan_ns "${DEV}" $server_ns server \
"${SERVER_MAC}" "${SERVER_IP}" "${SERVER_MAC}" "${SERVER_IP}"
setup_macvlan_ns "${DEV}" client_ns client \ setup_macvlan_ns "${DEV}" $client_ns client \
"${CLIENT_MAC}" "${CLIENT_IP}" "${CLIENT_MAC}" "${CLIENT_IP}"
} }
cleanup() { cleanup() {
cleanup_macvlan_ns server_ns server client_ns client cleanup_macvlan_ns $server_ns server $client_ns client
cleanup_loopback "${DEV}" cleanup_loopback "${DEV}"
} }
...@@ -170,22 +170,22 @@ if [[ "${TEST_RSS}" = true ]]; then ...@@ -170,22 +170,22 @@ if [[ "${TEST_RSS}" = true ]]; then
# RPS/RFS must be disabled because they move packets between cpus, # RPS/RFS must be disabled because they move packets between cpus,
# which breaks the PACKET_FANOUT_CPU identification of RSS decisions. # which breaks the PACKET_FANOUT_CPU identification of RSS decisions.
eval "$(get_disable_rfs_cmd) $(get_disable_rps_cmd)" \ eval "$(get_disable_rfs_cmd) $(get_disable_rps_cmd)" \
ip netns exec server_ns ./toeplitz "${IP_FLAG}" "${PROTO_FLAG}" \ ip netns exec $server_ns ./toeplitz "${IP_FLAG}" "${PROTO_FLAG}" \
-d "${PORT}" -i "${DEV}" -k "${KEY}" -T 1000 \ -d "${PORT}" -i "${DEV}" -k "${KEY}" -T 1000 \
-C "$(get_rx_irq_cpus)" -s -v & -C "$(get_rx_irq_cpus)" -s -v &
elif [[ ! -z "${RPS_MAP}" ]]; then elif [[ ! -z "${RPS_MAP}" ]]; then
eval "$(get_disable_rfs_cmd) $(get_set_rps_bitmaps_cmd ${RPS_MAP})" \ eval "$(get_disable_rfs_cmd) $(get_set_rps_bitmaps_cmd ${RPS_MAP})" \
ip netns exec server_ns ./toeplitz "${IP_FLAG}" "${PROTO_FLAG}" \ ip netns exec $server_ns ./toeplitz "${IP_FLAG}" "${PROTO_FLAG}" \
-d "${PORT}" -i "${DEV}" -k "${KEY}" -T 1000 \ -d "${PORT}" -i "${DEV}" -k "${KEY}" -T 1000 \
-r "0x${RPS_MAP}" -s -v & -r "0x${RPS_MAP}" -s -v &
else else
ip netns exec server_ns ./toeplitz "${IP_FLAG}" "${PROTO_FLAG}" \ ip netns exec $server_ns ./toeplitz "${IP_FLAG}" "${PROTO_FLAG}" \
-d "${PORT}" -i "${DEV}" -k "${KEY}" -T 1000 -s -v & -d "${PORT}" -i "${DEV}" -k "${KEY}" -T 1000 -s -v &
fi fi
server_pid=$! server_pid=$!
ip netns exec client_ns ./toeplitz_client.sh "${PROTO_FLAG}" \ ip netns exec $client_ns ./toeplitz_client.sh "${PROTO_FLAG}" \
"${IP_FLAG}" "${SERVER_IP%%/*}" "${PORT}" & "${IP_FLAG}" "${SERVER_IP%%/*}" "${PORT}" &
client_pid=$! client_pid=$!
......
...@@ -18,8 +18,7 @@ ...@@ -18,8 +18,7 @@
# ns1: ping 10.0.2.254: does NOT pass via ipsec tunnel (exception) # ns1: ping 10.0.2.254: does NOT pass via ipsec tunnel (exception)
# ns2: ping 10.0.1.254: does NOT pass via ipsec tunnel (exception) # ns2: ping 10.0.1.254: does NOT pass via ipsec tunnel (exception)
# Kselftest framework requirement - SKIP code is 4. source lib.sh
ksft_skip=4
ret=0 ret=0
policy_checks_ok=1 policy_checks_ok=1
...@@ -204,24 +203,24 @@ check_xfrm() { ...@@ -204,24 +203,24 @@ check_xfrm() {
ip=$2 ip=$2
local lret=0 local lret=0
ip netns exec ns1 ping -q -c 1 10.0.2.$ip > /dev/null ip netns exec ${ns[1]} ping -q -c 1 10.0.2.$ip > /dev/null
check_ipt_policy_count ns3 check_ipt_policy_count ${ns[3]}
if [ $? -ne $rval ] ; then if [ $? -ne $rval ] ; then
lret=1 lret=1
fi fi
check_ipt_policy_count ns4 check_ipt_policy_count ${ns[4]}
if [ $? -ne $rval ] ; then if [ $? -ne $rval ] ; then
lret=1 lret=1
fi fi
ip netns exec ns2 ping -q -c 1 10.0.1.$ip > /dev/null ip netns exec ${ns[2]} ping -q -c 1 10.0.1.$ip > /dev/null
check_ipt_policy_count ns3 check_ipt_policy_count ${ns[3]}
if [ $? -ne $rval ] ; then if [ $? -ne $rval ] ; then
lret=1 lret=1
fi fi
check_ipt_policy_count ns4 check_ipt_policy_count ${ns[4]}
if [ $? -ne $rval ] ; then if [ $? -ne $rval ] ; then
lret=1 lret=1
fi fi
...@@ -270,11 +269,11 @@ check_hthresh_repeat() ...@@ -270,11 +269,11 @@ check_hthresh_repeat()
i=0 i=0
for i in $(seq 1 10);do for i in $(seq 1 10);do
ip -net ns1 xfrm policy update src e000:0001::0000 dst ff01::0014:0000:0001 dir in tmpl src :: dst :: proto esp mode tunnel priority 100 action allow || break ip -net ${ns[1]} xfrm policy update src e000:0001::0000 dst ff01::0014:0000:0001 dir in tmpl src :: dst :: proto esp mode tunnel priority 100 action allow || break
ip -net ns1 xfrm policy set hthresh6 0 28 || break ip -net ${ns[1]} xfrm policy set hthresh6 0 28 || break
ip -net ns1 xfrm policy update src e000:0001::0000 dst ff01::01 dir in tmpl src :: dst :: proto esp mode tunnel priority 100 action allow || break ip -net ${ns[1]} xfrm policy update src e000:0001::0000 dst ff01::01 dir in tmpl src :: dst :: proto esp mode tunnel priority 100 action allow || break
ip -net ns1 xfrm policy set hthresh6 0 28 || break ip -net ${ns[1]} xfrm policy set hthresh6 0 28 || break
done done
if [ $i -ne 10 ] ;then if [ $i -ne 10 ] ;then
...@@ -347,79 +346,80 @@ if [ $? -ne 0 ];then ...@@ -347,79 +346,80 @@ if [ $? -ne 0 ];then
exit $ksft_skip exit $ksft_skip
fi fi
for i in 1 2 3 4; do setup_ns ns1 ns2 ns3 ns4
ip netns add ns$i ns[1]=$ns1
ip -net ns$i link set lo up ns[2]=$ns2
done ns[3]=$ns3
ns[4]=$ns4
DEV=veth0 DEV=veth0
ip link add $DEV netns ns1 type veth peer name eth1 netns ns3 ip link add $DEV netns ${ns[1]} type veth peer name eth1 netns ${ns[3]}
ip link add $DEV netns ns2 type veth peer name eth1 netns ns4 ip link add $DEV netns ${ns[2]} type veth peer name eth1 netns ${ns[4]}
ip link add $DEV netns ns3 type veth peer name veth0 netns ns4 ip link add $DEV netns ${ns[3]} type veth peer name veth0 netns ${ns[4]}
DEV=veth0 DEV=veth0
for i in 1 2; do for i in 1 2; do
ip -net ns$i link set $DEV up ip -net ${ns[$i]} link set $DEV up
ip -net ns$i addr add 10.0.$i.2/24 dev $DEV ip -net ${ns[$i]} addr add 10.0.$i.2/24 dev $DEV
ip -net ns$i addr add dead:$i::2/64 dev $DEV ip -net ${ns[$i]} addr add dead:$i::2/64 dev $DEV
ip -net ns$i addr add 10.0.$i.253 dev $DEV ip -net ${ns[$i]} addr add 10.0.$i.253 dev $DEV
ip -net ns$i addr add 10.0.$i.254 dev $DEV ip -net ${ns[$i]} addr add 10.0.$i.254 dev $DEV
ip -net ns$i addr add dead:$i::fd dev $DEV ip -net ${ns[$i]} addr add dead:$i::fd dev $DEV
ip -net ns$i addr add dead:$i::fe dev $DEV ip -net ${ns[$i]} addr add dead:$i::fe dev $DEV
done done
for i in 3 4; do for i in 3 4; do
ip -net ns$i link set eth1 up ip -net ${ns[$i]} link set eth1 up
ip -net ns$i link set veth0 up ip -net ${ns[$i]} link set veth0 up
done done
ip -net ns1 route add default via 10.0.1.1 ip -net ${ns[1]} route add default via 10.0.1.1
ip -net ns2 route add default via 10.0.2.1 ip -net ${ns[2]} route add default via 10.0.2.1
ip -net ns3 addr add 10.0.1.1/24 dev eth1 ip -net ${ns[3]} addr add 10.0.1.1/24 dev eth1
ip -net ns3 addr add 10.0.3.1/24 dev veth0 ip -net ${ns[3]} addr add 10.0.3.1/24 dev veth0
ip -net ns3 addr add 2001:1::1/64 dev eth1 ip -net ${ns[3]} addr add 2001:1::1/64 dev eth1
ip -net ns3 addr add 2001:3::1/64 dev veth0 ip -net ${ns[3]} addr add 2001:3::1/64 dev veth0
ip -net ns3 route add default via 10.0.3.10 ip -net ${ns[3]} route add default via 10.0.3.10
ip -net ns4 addr add 10.0.2.1/24 dev eth1 ip -net ${ns[4]} addr add 10.0.2.1/24 dev eth1
ip -net ns4 addr add 10.0.3.10/24 dev veth0 ip -net ${ns[4]} addr add 10.0.3.10/24 dev veth0
ip -net ns4 addr add 2001:2::1/64 dev eth1 ip -net ${ns[4]} addr add 2001:2::1/64 dev eth1
ip -net ns4 addr add 2001:3::10/64 dev veth0 ip -net ${ns[4]} addr add 2001:3::10/64 dev veth0
ip -net ns4 route add default via 10.0.3.1 ip -net ${ns[4]} route add default via 10.0.3.1
for j in 4 6; do for j in 4 6; do
for i in 3 4;do for i in 3 4;do
ip netns exec ns$i sysctl net.ipv$j.conf.eth1.forwarding=1 > /dev/null ip netns exec ${ns[$i]} sysctl net.ipv$j.conf.eth1.forwarding=1 > /dev/null
ip netns exec ns$i sysctl net.ipv$j.conf.veth0.forwarding=1 > /dev/null ip netns exec ${ns[$i]} sysctl net.ipv$j.conf.veth0.forwarding=1 > /dev/null
done done
done done
# abuse iptables rule counter to check if ping matches a policy # abuse iptables rule counter to check if ping matches a policy
ip netns exec ns3 iptables -p icmp -A FORWARD -m policy --dir out --pol ipsec ip netns exec ${ns[3]} iptables -p icmp -A FORWARD -m policy --dir out --pol ipsec
ip netns exec ns4 iptables -p icmp -A FORWARD -m policy --dir out --pol ipsec ip netns exec ${ns[4]} iptables -p icmp -A FORWARD -m policy --dir out --pol ipsec
if [ $? -ne 0 ];then if [ $? -ne 0 ];then
echo "SKIP: Could not insert iptables rule" echo "SKIP: Could not insert iptables rule"
for i in 1 2 3 4;do ip netns del ns$i;done cleanup_ns $ns1 $ns2 $ns3 $ns4
exit $ksft_skip exit $ksft_skip
fi fi
# localip remoteip localnet remotenet # localip remoteip localnet remotenet
do_esp ns3 10.0.3.1 10.0.3.10 10.0.1.0/24 10.0.2.0/24 $SPI1 $SPI2 do_esp ${ns[3]} 10.0.3.1 10.0.3.10 10.0.1.0/24 10.0.2.0/24 $SPI1 $SPI2
do_esp ns3 dead:3::1 dead:3::10 dead:1::/64 dead:2::/64 $SPI1 $SPI2 do_esp ${ns[3]} dead:3::1 dead:3::10 dead:1::/64 dead:2::/64 $SPI1 $SPI2
do_esp ns4 10.0.3.10 10.0.3.1 10.0.2.0/24 10.0.1.0/24 $SPI2 $SPI1 do_esp ${ns[4]} 10.0.3.10 10.0.3.1 10.0.2.0/24 10.0.1.0/24 $SPI2 $SPI1
do_esp ns4 dead:3::10 dead:3::1 dead:2::/64 dead:1::/64 $SPI2 $SPI1 do_esp ${ns[4]} dead:3::10 dead:3::1 dead:2::/64 dead:1::/64 $SPI2 $SPI1
do_dummies4 ns3 do_dummies4 ${ns[3]}
do_dummies6 ns4 do_dummies6 ${ns[4]}
do_esp_policy_get_check ns3 10.0.1.0/24 10.0.2.0/24 do_esp_policy_get_check ${ns[3]} 10.0.1.0/24 10.0.2.0/24
do_esp_policy_get_check ns4 10.0.2.0/24 10.0.1.0/24 do_esp_policy_get_check ${ns[4]} 10.0.2.0/24 10.0.1.0/24
do_esp_policy_get_check ns3 dead:1::/64 dead:2::/64 do_esp_policy_get_check ${ns[3]} dead:1::/64 dead:2::/64
do_esp_policy_get_check ns4 dead:2::/64 dead:1::/64 do_esp_policy_get_check ${ns[4]} dead:2::/64 dead:1::/64
# ping to .254 should use ipsec, exception is not installed. # ping to .254 should use ipsec, exception is not installed.
check_xfrm 1 254 check_xfrm 1 254
...@@ -432,11 +432,11 @@ fi ...@@ -432,11 +432,11 @@ fi
# installs exceptions # installs exceptions
# localip remoteip encryptdst plaindst # localip remoteip encryptdst plaindst
do_exception ns3 10.0.3.1 10.0.3.10 10.0.2.253 10.0.2.240/28 do_exception ${ns[3]} 10.0.3.1 10.0.3.10 10.0.2.253 10.0.2.240/28
do_exception ns4 10.0.3.10 10.0.3.1 10.0.1.253 10.0.1.240/28 do_exception ${ns[4]} 10.0.3.10 10.0.3.1 10.0.1.253 10.0.1.240/28
do_exception ns3 dead:3::1 dead:3::10 dead:2::fd dead:2:f0::/96 do_exception ${ns[3]} dead:3::1 dead:3::10 dead:2::fd dead:2:f0::/96
do_exception ns4 dead:3::10 dead:3::1 dead:1::fd dead:1:f0::/96 do_exception ${ns[4]} dead:3::10 dead:3::1 dead:1::fd dead:1:f0::/96
check_exceptions "exceptions" check_exceptions "exceptions"
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
...@@ -444,14 +444,14 @@ if [ $? -ne 0 ]; then ...@@ -444,14 +444,14 @@ if [ $? -ne 0 ]; then
fi fi
# insert block policies with adjacent/overlapping netmasks # insert block policies with adjacent/overlapping netmasks
do_overlap ns3 do_overlap ${ns[3]}
check_exceptions "exceptions and block policies" check_exceptions "exceptions and block policies"
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
ret=1 ret=1
fi fi
for n in ns3 ns4;do for n in ${ns[3]} ${ns[4]};do
ip -net $n xfrm policy set hthresh4 28 24 hthresh6 126 125 ip -net $n xfrm policy set hthresh4 28 24 hthresh6 126 125
sleep $((RANDOM%5)) sleep $((RANDOM%5))
done done
...@@ -459,19 +459,19 @@ done ...@@ -459,19 +459,19 @@ done
check_exceptions "exceptions and block policies after hresh changes" check_exceptions "exceptions and block policies after hresh changes"
# full flush of policy db, check everything gets freed incl. internal meta data # full flush of policy db, check everything gets freed incl. internal meta data
ip -net ns3 xfrm policy flush ip -net ${ns[3]} xfrm policy flush
do_esp_policy ns3 10.0.3.1 10.0.3.10 10.0.1.0/24 10.0.2.0/24 do_esp_policy ${ns[3]} 10.0.3.1 10.0.3.10 10.0.1.0/24 10.0.2.0/24
do_exception ns3 10.0.3.1 10.0.3.10 10.0.2.253 10.0.2.240/28 do_exception ${ns[3]} 10.0.3.1 10.0.3.10 10.0.2.253 10.0.2.240/28
# move inexact policies to hash table # move inexact policies to hash table
ip -net ns3 xfrm policy set hthresh4 16 16 ip -net ${ns[3]} xfrm policy set hthresh4 16 16
sleep $((RANDOM%5)) sleep $((RANDOM%5))
check_exceptions "exceptions and block policies after hthresh change in ns3" check_exceptions "exceptions and block policies after hthresh change in ns3"
# restore original hthresh settings -- move policies back to tables # restore original hthresh settings -- move policies back to tables
for n in ns3 ns4;do for n in ${ns[3]} ${ns[4]};do
ip -net $n xfrm policy set hthresh4 32 32 hthresh6 128 128 ip -net $n xfrm policy set hthresh4 32 32 hthresh6 128 128
sleep $((RANDOM%5)) sleep $((RANDOM%5))
done done
...@@ -479,8 +479,8 @@ check_exceptions "exceptions and block policies after htresh change to normal" ...@@ -479,8 +479,8 @@ check_exceptions "exceptions and block policies after htresh change to normal"
check_hthresh_repeat "policies with repeated htresh change" check_hthresh_repeat "policies with repeated htresh change"
check_random_order ns3 "policies inserted in random order" check_random_order ${ns[3]} "policies inserted in random order"
for i in 1 2 3 4;do ip netns del ns$i;done cleanup_ns $ns1 $ns2 $ns3 $ns4
exit $ret exit $ret
...@@ -20,11 +20,13 @@ usage() ...@@ -20,11 +20,13 @@ usage()
{ {
cat <<EOF cat <<EOF
Usage: $0 [OPTIONS] Usage: $0 [OPTIONS]
-s | --summary Print summary with detailed log in output.log -s | --summary Print summary with detailed log in output.log (conflict with -p)
-p | --per_test_log Print test log in /tmp with each test name (conflict with -s)
-t | --test COLLECTION:TEST Run TEST from COLLECTION -t | --test COLLECTION:TEST Run TEST from COLLECTION
-c | --collection COLLECTION Run all tests from COLLECTION -c | --collection COLLECTION Run all tests from COLLECTION
-l | --list List the available collection:test entries -l | --list List the available collection:test entries
-d | --dry-run Don't actually run any tests -d | --dry-run Don't actually run any tests
-n | --netns Run each test in namespace
-h | --help Show this usage info -h | --help Show this usage info
-o | --override-timeout Number of seconds after which we timeout -o | --override-timeout Number of seconds after which we timeout
EOF EOF
...@@ -41,6 +43,9 @@ while true; do ...@@ -41,6 +43,9 @@ while true; do
logfile="$BASE_DIR"/output.log logfile="$BASE_DIR"/output.log
cat /dev/null > $logfile cat /dev/null > $logfile
shift ;; shift ;;
-p | --per-test-log)
per_test_logging=1
shift ;;
-t | --test) -t | --test)
TESTS="$TESTS $2" TESTS="$TESTS $2"
shift 2 ;; shift 2 ;;
...@@ -53,6 +58,9 @@ while true; do ...@@ -53,6 +58,9 @@ while true; do
-d | --dry-run) -d | --dry-run)
dryrun="echo" dryrun="echo"
shift ;; shift ;;
-n | --netns)
RUN_IN_NETNS=1
shift ;;
-o | --override-timeout) -o | --override-timeout)
kselftest_override_timeout="$2" kselftest_override_timeout="$2"
shift 2 ;; shift 2 ;;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment