Commit d3423ed9 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'selftests-mptcp-share-code-and-fix-shellcheck-warnings'

Matthieu Baerts says:

====================
selftests: mptcp: share code and fix shellcheck warnings

This series cleans MPTCP selftests code.

Patch 1 stops using 'iptables-legacy' if available, but uses 'iptables',
which is likely 'iptables-nft' behind.

Patches 2, 4 and 6 move duplicated code to mptcp_lib.sh. Patch 3 is a
preparation for patch 4, and patch 5 adds generic actions at the
creation and deletion of netns.

Patches 7 to 11 disable a few shellcheck warnings, and fix the rest, so
it is easy to spot real issues later. MPTCP CI is checking that now.

Patch 12 avoids redoing some actions at init time twice, e.g. restarting
the pm events tool.

v1: https://lore.kernel.org/r/20240305-upstream-net-next-20240304-selftests-mptcp-shared-code-shellcheck-v1-0-66618ea5504e@kernel.org
====================

Link: https://lore.kernel.org/r/20240306-upstream-net-next-20240304-selftests-mptcp-shared-code-shellcheck-v2-0-bc79e6e5e6a0@kernel.orgSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents c3874bbe c66fb480
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# Double quotes to prevent globbing and word splitting is recommended in new
# code but we accept it, especially because there were too many before having
# address all other issues detected by shellcheck.
#shellcheck disable=SC2086
. "$(dirname "${0}")/mptcp_lib.sh" . "$(dirname "${0}")/mptcp_lib.sh"
sec=$(date +%s) ns=""
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
ns="ns1-$rndh"
ksft_skip=4
test_cnt=1 test_cnt=1
timeout_poll=30 timeout_poll=30
timeout_test=$((timeout_poll * 2 + 1)) timeout_test=$((timeout_poll * 2 + 1))
...@@ -26,25 +28,17 @@ flush_pids() ...@@ -26,25 +28,17 @@ flush_pids()
done done
} }
# This function is used in the cleanup trap
#shellcheck disable=SC2317
cleanup() cleanup()
{ {
ip netns pids "${ns}" | xargs --no-run-if-empty kill -SIGKILL &>/dev/null ip netns pids "${ns}" | xargs --no-run-if-empty kill -SIGKILL &>/dev/null
ip netns del $ns mptcp_lib_ns_exit "${ns}"
} }
mptcp_lib_check_mptcp mptcp_lib_check_mptcp
mptcp_lib_check_tools ip ss
ip -Version > /dev/null 2>&1
if [ $? -ne 0 ];then
echo "SKIP: Could not run test without ip tool"
exit $ksft_skip
fi
ss -h | grep -q MPTCP
if [ $? -ne 0 ];then
echo "SKIP: ss tool does not support MPTCP"
exit $ksft_skip
fi
get_msk_inuse() get_msk_inuse()
{ {
...@@ -186,7 +180,7 @@ chk_msk_inuse() ...@@ -186,7 +180,7 @@ chk_msk_inuse()
expected=$((expected + listen_nr)) expected=$((expected + listen_nr))
for _ in $(seq 10); do for _ in $(seq 10); do
if [ $(get_msk_inuse) -eq $expected ];then if [ "$(get_msk_inuse)" -eq $expected ]; then
break break
fi fi
sleep 0.1 sleep 0.1
...@@ -224,8 +218,7 @@ wait_connected() ...@@ -224,8 +218,7 @@ wait_connected()
} }
trap cleanup EXIT trap cleanup EXIT
ip netns add $ns mptcp_lib_ns_init ns
ip -n $ns link set dev lo up
echo "a" | \ echo "a" | \
timeout ${timeout_test} \ timeout ${timeout_test} \
...@@ -273,7 +266,7 @@ chk_msk_inuse 0 "1->0" ...@@ -273,7 +266,7 @@ chk_msk_inuse 0 "1->0"
chk_msk_cestab 0 "1->0" chk_msk_cestab 0 "1->0"
NR_CLIENTS=100 NR_CLIENTS=100
for I in `seq 1 $NR_CLIENTS`; do for I in $(seq 1 $NR_CLIENTS); do
echo "a" | \ echo "a" | \
timeout ${timeout_test} \ timeout ${timeout_test} \
ip netns exec $ns \ ip netns exec $ns \
...@@ -282,7 +275,7 @@ for I in `seq 1 $NR_CLIENTS`; do ...@@ -282,7 +275,7 @@ for I in `seq 1 $NR_CLIENTS`; do
done done
mptcp_lib_wait_local_port_listen $ns $((NR_CLIENTS + 10001)) mptcp_lib_wait_local_port_listen $ns $((NR_CLIENTS + 10001))
for I in `seq 1 $NR_CLIENTS`; do for I in $(seq 1 $NR_CLIENTS); do
echo "b" | \ echo "b" | \
timeout ${timeout_test} \ timeout ${timeout_test} \
ip netns exec $ns \ ip netns exec $ns \
......
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# Double quotes to prevent globbing and word splitting is recommended in new
# code but we accept it, especially because there were too many before having
# address all other issues detected by shellcheck.
#shellcheck disable=SC2086
. "$(dirname "${0}")/mptcp_lib.sh" . "$(dirname "${0}")/mptcp_lib.sh"
time_start=$(date +%s) time_start=$(date +%s)
...@@ -13,7 +18,6 @@ sout="" ...@@ -13,7 +18,6 @@ sout=""
cin_disconnect="" cin_disconnect=""
cin="" cin=""
cout="" cout=""
ksft_skip=4
capture=false capture=false
timeout_poll=30 timeout_poll=30
timeout_test=$((timeout_poll * 2 + 1)) timeout_test=$((timeout_poll * 2 + 1))
...@@ -121,16 +125,16 @@ while getopts "$optstring" option;do ...@@ -121,16 +125,16 @@ while getopts "$optstring" option;do
esac esac
done done
sec=$(date +%s) ns1=""
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX) ns2=""
ns1="ns1-$rndh" ns3=""
ns2="ns2-$rndh" ns4=""
ns3="ns3-$rndh"
ns4="ns4-$rndh"
TEST_COUNT=0 TEST_COUNT=0
TEST_GROUP="" TEST_GROUP=""
# This function is used in the cleanup trap
#shellcheck disable=SC2317
cleanup() cleanup()
{ {
rm -f "$cin_disconnect" "$cout_disconnect" rm -f "$cin_disconnect" "$cout_disconnect"
...@@ -138,21 +142,12 @@ cleanup() ...@@ -138,21 +142,12 @@ cleanup()
rm -f "$sin" "$sout" rm -f "$sin" "$sout"
rm -f "$capout" rm -f "$capout"
local netns mptcp_lib_ns_exit "${ns1}" "${ns2}" "${ns3}" "${ns4}"
for netns in "$ns1" "$ns2" "$ns3" "$ns4";do
ip netns del $netns
rm -f /tmp/$netns.{nstat,out}
done
} }
mptcp_lib_check_mptcp mptcp_lib_check_mptcp
mptcp_lib_check_kallsyms mptcp_lib_check_kallsyms
mptcp_lib_check_tools ip
ip -Version > /dev/null 2>&1
if [ $? -ne 0 ];then
echo "SKIP: Could not run test without ip tool"
exit $ksft_skip
fi
sin=$(mktemp) sin=$(mktemp)
sout=$(mktemp) sout=$(mktemp)
...@@ -163,10 +158,7 @@ cin_disconnect="$cin".disconnect ...@@ -163,10 +158,7 @@ cin_disconnect="$cin".disconnect
cout_disconnect="$cout".disconnect cout_disconnect="$cout".disconnect
trap cleanup EXIT trap cleanup EXIT
for i in "$ns1" "$ns2" "$ns3" "$ns4";do mptcp_lib_ns_init ns1 ns2 ns3 ns4
ip netns add $i || exit $ksft_skip
ip -net $i link set lo up
done
# "$ns1" ns2 ns3 ns4 # "$ns1" ns2 ns3 ns4
# ns1eth2 ns2eth1 ns2eth3 ns3eth2 ns3eth4 ns4eth3 # ns1eth2 ns2eth1 ns2eth3 ns3eth2 ns3eth4 ns4eth3
...@@ -225,8 +217,9 @@ set_ethtool_flags() { ...@@ -225,8 +217,9 @@ set_ethtool_flags() {
local dev="$2" local dev="$2"
local flags="$3" local flags="$3"
ip netns exec $ns ethtool -K $dev $flags 2>/dev/null if ip netns exec $ns ethtool -K $dev $flags 2>/dev/null; then
[ $? -eq 0 ] && echo "INFO: set $ns dev $dev: ethtool -K $flags" echo "INFO: set $ns dev $dev: ethtool -K $flags"
fi
} }
set_random_ethtool_flags() { set_random_ethtool_flags() {
...@@ -256,8 +249,8 @@ fi ...@@ -256,8 +249,8 @@ fi
check_mptcp_disabled() check_mptcp_disabled()
{ {
local disabled_ns="ns_disabled-$rndh" local disabled_ns
ip netns add ${disabled_ns} || exit $ksft_skip mptcp_lib_ns_init disabled_ns
# net.mptcp.enabled should be enabled by default # net.mptcp.enabled should be enabled by default
if [ "$(ip netns exec ${disabled_ns} sysctl net.mptcp.enabled | awk '{ print $3 }')" -ne 1 ]; then if [ "$(ip netns exec ${disabled_ns} sysctl net.mptcp.enabled | awk '{ print $3 }')" -ne 1 ]; then
...@@ -271,7 +264,7 @@ check_mptcp_disabled() ...@@ -271,7 +264,7 @@ check_mptcp_disabled()
local err=0 local err=0
LC_ALL=C ip netns exec ${disabled_ns} ./mptcp_connect -p 10000 -s MPTCP 127.0.0.1 < "$cin" 2>&1 | \ LC_ALL=C ip netns exec ${disabled_ns} ./mptcp_connect -p 10000 -s MPTCP 127.0.0.1 < "$cin" 2>&1 | \
grep -q "^socket: Protocol not available$" && err=1 grep -q "^socket: Protocol not available$" && err=1
ip netns delete ${disabled_ns} mptcp_lib_ns_exit "${disabled_ns}"
if [ ${err} -eq 0 ]; then if [ ${err} -eq 0 ]; then
echo -e "New MPTCP socket cannot be blocked via sysctl\t\t[ FAIL ]" echo -e "New MPTCP socket cannot be blocked via sysctl\t\t[ FAIL ]"
...@@ -321,7 +314,7 @@ do_transfer() ...@@ -321,7 +314,7 @@ do_transfer()
local extra_args="$7" local extra_args="$7"
local port local port
port=$((10000+$TEST_COUNT)) port=$((10000+TEST_COUNT))
TEST_COUNT=$((TEST_COUNT+1)) TEST_COUNT=$((TEST_COUNT+1))
if [ "$rcvbuf" -gt 0 ]; then if [ "$rcvbuf" -gt 0 ]; then
...@@ -353,6 +346,7 @@ do_transfer() ...@@ -353,6 +346,7 @@ do_transfer()
if $capture; then if $capture; then
local capuser local capuser
local rndh="${connector_ns:4}"
if [ -z $SUDO_USER ] ; then if [ -z $SUDO_USER ] ; then
capuser="" capuser=""
else else
...@@ -378,12 +372,18 @@ do_transfer() ...@@ -378,12 +372,18 @@ do_transfer()
nstat -n nstat -n
fi fi
local stat_synrx_last_l=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtMPCapableSYNRX") local stat_synrx_last_l
local stat_ackrx_last_l=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtMPCapableACKRX") local stat_ackrx_last_l
local stat_cookietx_last=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtSyncookiesSent") local stat_cookietx_last
local stat_cookierx_last=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtSyncookiesRecv") local stat_cookierx_last
local stat_csum_err_s=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtDataCsumErr") local stat_csum_err_s
local stat_csum_err_c=$(mptcp_lib_get_counter "${connector_ns}" "MPTcpExtDataCsumErr") local stat_csum_err_c
stat_synrx_last_l=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtMPCapableSYNRX")
stat_ackrx_last_l=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtMPCapableACKRX")
stat_cookietx_last=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtSyncookiesSent")
stat_cookierx_last=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtSyncookiesRecv")
stat_csum_err_s=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtDataCsumErr")
stat_csum_err_c=$(mptcp_lib_get_counter "${connector_ns}" "MPTcpExtDataCsumErr")
timeout ${timeout_test} \ timeout ${timeout_test} \
ip netns exec ${listener_ns} \ ip netns exec ${listener_ns} \
...@@ -446,11 +446,16 @@ do_transfer() ...@@ -446,11 +446,16 @@ do_transfer()
mptcp_lib_check_transfer $cin $sout "file received by server" mptcp_lib_check_transfer $cin $sout "file received by server"
rets=$? rets=$?
local stat_synrx_now_l=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtMPCapableSYNRX") local stat_synrx_now_l
local stat_ackrx_now_l=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtMPCapableACKRX") local stat_ackrx_now_l
local stat_cookietx_now=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtSyncookiesSent") local stat_cookietx_now
local stat_cookierx_now=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtSyncookiesRecv") local stat_cookierx_now
local stat_ooo_now=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtTCPOFOQueue") local stat_ooo_now
stat_synrx_now_l=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtMPCapableSYNRX")
stat_ackrx_now_l=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtMPCapableACKRX")
stat_cookietx_now=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtSyncookiesSent")
stat_cookierx_now=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtSyncookiesRecv")
stat_ooo_now=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtTCPOFOQueue")
expect_synrx=$((stat_synrx_last_l)) expect_synrx=$((stat_synrx_last_l))
expect_ackrx=$((stat_ackrx_last_l)) expect_ackrx=$((stat_ackrx_last_l))
...@@ -459,8 +464,8 @@ do_transfer() ...@@ -459,8 +464,8 @@ do_transfer()
cookies=${cookies##*=} cookies=${cookies##*=}
if [ ${cl_proto} = "MPTCP" ] && [ ${srv_proto} = "MPTCP" ]; then if [ ${cl_proto} = "MPTCP" ] && [ ${srv_proto} = "MPTCP" ]; then
expect_synrx=$((stat_synrx_last_l+$connect_per_transfer)) expect_synrx=$((stat_synrx_last_l+connect_per_transfer))
expect_ackrx=$((stat_ackrx_last_l+$connect_per_transfer)) expect_ackrx=$((stat_ackrx_last_l+connect_per_transfer))
fi fi
if [ ${stat_synrx_now_l} -lt ${expect_synrx} ]; then if [ ${stat_synrx_now_l} -lt ${expect_synrx} ]; then
...@@ -468,7 +473,7 @@ do_transfer() ...@@ -468,7 +473,7 @@ do_transfer()
"${stat_synrx_now_l}" "${expect_synrx}" 1>&2 "${stat_synrx_now_l}" "${expect_synrx}" 1>&2
retc=1 retc=1
fi fi
if [ ${stat_ackrx_now_l} -lt ${expect_ackrx} -a ${stat_ooo_now} -eq 0 ]; then if [ ${stat_ackrx_now_l} -lt ${expect_ackrx} ] && [ ${stat_ooo_now} -eq 0 ]; then
if [ ${stat_ooo_now} -eq 0 ]; then if [ ${stat_ooo_now} -eq 0 ]; then
printf "[ FAIL ] lower MPC ACK rx (%d) than expected (%d)\n" \ printf "[ FAIL ] lower MPC ACK rx (%d) than expected (%d)\n" \
"${stat_ackrx_now_l}" "${expect_ackrx}" 1>&2 "${stat_ackrx_now_l}" "${expect_ackrx}" 1>&2
...@@ -479,18 +484,20 @@ do_transfer() ...@@ -479,18 +484,20 @@ do_transfer()
fi fi
if $checksum; then if $checksum; then
local csum_err_s=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtDataCsumErr") local csum_err_s
local csum_err_c=$(mptcp_lib_get_counter "${connector_ns}" "MPTcpExtDataCsumErr") local csum_err_c
csum_err_s=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtDataCsumErr")
csum_err_c=$(mptcp_lib_get_counter "${connector_ns}" "MPTcpExtDataCsumErr")
local csum_err_s_nr=$((csum_err_s - stat_csum_err_s)) local csum_err_s_nr=$((csum_err_s - stat_csum_err_s))
if [ $csum_err_s_nr -gt 0 ]; then if [ $csum_err_s_nr -gt 0 ]; then
printf "[ FAIL ]\nserver got $csum_err_s_nr data checksum error[s]" printf "[ FAIL ]\nserver got %d data checksum error[s]" ${csum_err_s_nr}
rets=1 rets=1
fi fi
local csum_err_c_nr=$((csum_err_c - stat_csum_err_c)) local csum_err_c_nr=$((csum_err_c - stat_csum_err_c))
if [ $csum_err_c_nr -gt 0 ]; then if [ $csum_err_c_nr -gt 0 ]; then
printf "[ FAIL ]\nclient got $csum_err_c_nr data checksum error[s]" printf "[ FAIL ]\nclient got %d data checksum error[s]" ${csum_err_c_nr}
retc=1 retc=1
fi fi
fi fi
...@@ -658,7 +665,7 @@ run_test_transparent() ...@@ -658,7 +665,7 @@ run_test_transparent()
return return
fi fi
ip netns exec "$listener_ns" nft -f /dev/stdin <<"EOF" if ! ip netns exec "$listener_ns" nft -f /dev/stdin <<"EOF"
flush ruleset flush ruleset
table inet mangle { table inet mangle {
chain divert { chain divert {
...@@ -669,7 +676,7 @@ table inet mangle { ...@@ -669,7 +676,7 @@ table inet mangle {
} }
} }
EOF EOF
if [ $? -ne 0 ]; then then
echo "SKIP: $msg, could not load nft ruleset" echo "SKIP: $msg, could not load nft ruleset"
mptcp_lib_fail_if_expected_feature "nft rules" mptcp_lib_fail_if_expected_feature "nft rules"
mptcp_lib_result_skip "${TEST_GROUP}" mptcp_lib_result_skip "${TEST_GROUP}"
...@@ -684,8 +691,7 @@ EOF ...@@ -684,8 +691,7 @@ EOF
local_addr="0.0.0.0" local_addr="0.0.0.0"
fi fi
ip -net "$listener_ns" $r6flag rule add fwmark 1 lookup 100 if ! ip -net "$listener_ns" $r6flag rule add fwmark 1 lookup 100; then
if [ $? -ne 0 ]; then
ip netns exec "$listener_ns" nft flush ruleset ip netns exec "$listener_ns" nft flush ruleset
echo "SKIP: $msg, ip $r6flag rule failed" echo "SKIP: $msg, ip $r6flag rule failed"
mptcp_lib_fail_if_expected_feature "ip rule" mptcp_lib_fail_if_expected_feature "ip rule"
...@@ -693,8 +699,7 @@ EOF ...@@ -693,8 +699,7 @@ EOF
return return
fi fi
ip -net "$listener_ns" route add local $local_addr/0 dev lo table 100 if ! ip -net "$listener_ns" route add local $local_addr/0 dev lo table 100; then
if [ $? -ne 0 ]; then
ip netns exec "$listener_ns" nft flush ruleset ip netns exec "$listener_ns" nft flush ruleset
ip -net "$listener_ns" $r6flag rule del fwmark 1 lookup 100 ip -net "$listener_ns" $r6flag rule del fwmark 1 lookup 100
echo "SKIP: $msg, ip route add local $local_addr failed" echo "SKIP: $msg, ip route add local $local_addr failed"
...@@ -857,7 +862,7 @@ stop_if_error "Could not even run ping tests" ...@@ -857,7 +862,7 @@ stop_if_error "Could not even run ping tests"
echo -n "INFO: Using loss of $tc_loss " echo -n "INFO: Using loss of $tc_loss "
test "$tc_delay" -gt 0 && echo -n "delay $tc_delay ms " test "$tc_delay" -gt 0 && echo -n "delay $tc_delay ms "
reorder_delay=$(($tc_delay / 4)) reorder_delay=$((tc_delay / 4))
if [ -z "${tc_reorder}" ]; then if [ -z "${tc_reorder}" ]; then
reorder1=$((RANDOM%10)) reorder1=$((RANDOM%10))
......
...@@ -86,21 +86,11 @@ init_partial() ...@@ -86,21 +86,11 @@ init_partial()
{ {
capout=$(mktemp) capout=$(mktemp)
local sec rndh mptcp_lib_ns_init ns1 ns2
sec=$(date +%s)
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
ns1="ns1-$rndh"
ns2="ns2-$rndh"
local netns local netns
for netns in "$ns1" "$ns2"; do for netns in "$ns1" "$ns2"; do
ip netns add $netns || exit $ksft_skip
ip -net $netns link set lo up
ip netns exec $netns sysctl -q net.mptcp.enabled=1
ip netns exec $netns sysctl -q net.mptcp.pm_type=0 2>/dev/null || true ip netns exec $netns sysctl -q net.mptcp.pm_type=0 2>/dev/null || true
ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0
ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0
if $checksum; then if $checksum; then
ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1 ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1
fi fi
...@@ -145,45 +135,15 @@ cleanup_partial() ...@@ -145,45 +135,15 @@ cleanup_partial()
{ {
rm -f "$capout" rm -f "$capout"
local netns mptcp_lib_ns_exit "${ns1}" "${ns2}"
for netns in "$ns1" "$ns2"; do
ip netns del $netns
rm -f /tmp/$netns.{nstat,out}
done
}
check_tools()
{
mptcp_lib_check_mptcp
mptcp_lib_check_kallsyms
if ! ip -Version &> /dev/null; then
echo "SKIP: Could not run test without ip tool"
exit $ksft_skip
fi
if ! ss -h | grep -q MPTCP; then
echo "SKIP: ss tool does not support MPTCP"
exit $ksft_skip
fi
# Use the legacy version if available to support old kernel versions
if iptables-legacy -V &> /dev/null; then
iptables="iptables-legacy"
ip6tables="ip6tables-legacy"
elif ! iptables -V &> /dev/null; then
echo "SKIP: Could not run all tests without iptables tool"
exit $ksft_skip
elif ! ip6tables -V &> /dev/null; then
echo "SKIP: Could not run all tests without ip6tables tool"
exit $ksft_skip
fi
} }
init() { init() {
init=1 init=1
check_tools mptcp_lib_check_mptcp
mptcp_lib_check_kallsyms
mptcp_lib_check_tools ip ss "${iptables}" "${ip6tables}"
sin=$(mktemp) sin=$(mktemp)
sout=$(mktemp) sout=$(mktemp)
...@@ -470,12 +430,8 @@ reset_with_events() ...@@ -470,12 +430,8 @@ reset_with_events()
{ {
reset "${1}" || return 1 reset "${1}" || return 1
:> "$evts_ns1" mptcp_lib_events "${ns1}" "${evts_ns1}" evts_ns1_pid
:> "$evts_ns2" mptcp_lib_events "${ns2}" "${evts_ns2}" evts_ns2_pid
ip netns exec $ns1 ./pm_nl_ctl events >> "$evts_ns1" 2>&1 &
evts_ns1_pid=$!
ip netns exec $ns2 ./pm_nl_ctl events >> "$evts_ns2" 2>&1 &
evts_ns2_pid=$!
} }
reset_with_tcp_filter() reset_with_tcp_filter()
...@@ -648,7 +604,9 @@ wait_mpj() ...@@ -648,7 +604,9 @@ wait_mpj()
kill_events_pids() kill_events_pids()
{ {
mptcp_lib_kill_wait $evts_ns1_pid mptcp_lib_kill_wait $evts_ns1_pid
evts_ns1_pid=0
mptcp_lib_kill_wait $evts_ns2_pid mptcp_lib_kill_wait $evts_ns2_pid
evts_ns2_pid=0
} }
pm_nl_set_limits() pm_nl_set_limits()
......
...@@ -342,3 +342,71 @@ mptcp_lib_check_output() { ...@@ -342,3 +342,71 @@ mptcp_lib_check_output() {
return 1 return 1
fi fi
} }
mptcp_lib_check_tools() {
local tool
for tool in "${@}"; do
case "${tool}" in
"ip")
if ! ip -Version &> /dev/null; then
mptcp_lib_print_warn "SKIP: Could not run test without ip tool"
exit ${KSFT_SKIP}
fi
;;
"ss")
if ! ss -h | grep -q MPTCP; then
mptcp_lib_print_warn "SKIP: ss tool does not support MPTCP"
exit ${KSFT_SKIP}
fi
;;
"iptables"* | "ip6tables"*)
if ! "${tool}" -V &> /dev/null; then
mptcp_lib_print_warn "SKIP: Could not run all tests without ${tool}"
exit ${KSFT_SKIP}
fi
;;
*)
mptcp_lib_print_err "Internal error: unsupported tool: ${tool}"
exit ${KSFT_FAIL}
;;
esac
done
}
mptcp_lib_ns_init() {
local sec rndh
sec=$(date +%s)
rndh=$(printf %x "${sec}")-$(mktemp -u XXXXXX)
local netns
for netns in "${@}"; do
eval "${netns}=${netns}-${rndh}"
ip netns add "${!netns}" || exit ${KSFT_SKIP}
ip -net "${!netns}" link set lo up
ip netns exec "${!netns}" sysctl -q net.mptcp.enabled=1
ip netns exec "${!netns}" sysctl -q net.ipv4.conf.all.rp_filter=0
ip netns exec "${!netns}" sysctl -q net.ipv4.conf.default.rp_filter=0
done
}
mptcp_lib_ns_exit() {
local netns
for netns in "${@}"; do
ip netns del "${netns}"
rm -f /tmp/"${netns}".{nstat,out}
done
}
mptcp_lib_events() {
local ns="${1}"
local evts="${2}"
declare -n pid="${3}"
:>"${evts}"
mptcp_lib_kill_wait "${pid:-0}"
ip netns exec "${ns}" ./pm_nl_ctl events >> "${evts}" 2>&1 &
pid=$!
}
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# Double quotes to prevent globbing and word splitting is recommended in new
# code but we accept it, especially because there were too many before having
# address all other issues detected by shellcheck.
#shellcheck disable=SC2086
. "$(dirname "${0}")/mptcp_lib.sh" . "$(dirname "${0}")/mptcp_lib.sh"
ret=0 ret=0
...@@ -8,17 +13,14 @@ sin="" ...@@ -8,17 +13,14 @@ sin=""
sout="" sout=""
cin="" cin=""
cout="" cout=""
ksft_skip=4
timeout_poll=30 timeout_poll=30
timeout_test=$((timeout_poll * 2 + 1)) timeout_test=$((timeout_poll * 2 + 1))
iptables="iptables" iptables="iptables"
ip6tables="ip6tables" ip6tables="ip6tables"
sec=$(date +%s) ns1=""
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX) ns2=""
ns1="ns1-$rndh" ns_sbox=""
ns2="ns2-$rndh"
ns_sbox="ns_sbox-$rndh"
add_mark_rules() add_mark_rules()
{ {
...@@ -40,17 +42,10 @@ add_mark_rules() ...@@ -40,17 +42,10 @@ add_mark_rules()
init() init()
{ {
local netns mptcp_lib_ns_init ns1 ns2 ns_sbox
for netns in "$ns1" "$ns2" "$ns_sbox";do
ip netns add $netns || exit $ksft_skip
ip -net $netns link set lo up
ip netns exec $netns sysctl -q net.mptcp.enabled=1
ip netns exec $netns sysctl -q net.ipv4.conf.all.rp_filter=0
ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0
done
local i local i
for i in `seq 1 4`; do for i in $(seq 1 4); do
ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2" ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2"
ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i
ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad
...@@ -77,36 +72,18 @@ init() ...@@ -77,36 +72,18 @@ init()
add_mark_rules $ns2 2 add_mark_rules $ns2 2
} }
# This function is used in the cleanup trap
#shellcheck disable=SC2317
cleanup() cleanup()
{ {
local netns mptcp_lib_ns_exit "${ns1}" "${ns2}" "${ns_sbox}"
for netns in "$ns1" "$ns2" "$ns_sbox"; do
ip netns del $netns
done
rm -f "$cin" "$cout" rm -f "$cin" "$cout"
rm -f "$sin" "$sout" rm -f "$sin" "$sout"
} }
mptcp_lib_check_mptcp mptcp_lib_check_mptcp
mptcp_lib_check_kallsyms mptcp_lib_check_kallsyms
mptcp_lib_check_tools ip "${iptables}" "${ip6tables}"
ip -Version > /dev/null 2>&1
if [ $? -ne 0 ];then
echo "SKIP: Could not run test without ip tool"
exit $ksft_skip
fi
# Use the legacy version if available to support old kernel versions
if iptables-legacy -V &> /dev/null; then
iptables="iptables-legacy"
ip6tables="ip6tables-legacy"
elif ! iptables -V &> /dev/null; then
echo "SKIP: Could not run all tests without iptables tool"
exit $ksft_skip
elif ! ip6tables -V &> /dev/null; then
echo "SKIP: Could not run all tests without ip6tables tool"
exit $ksft_skip
fi
check_mark() check_mark()
{ {
...@@ -286,12 +263,12 @@ do_tcpinq_test() ...@@ -286,12 +263,12 @@ do_tcpinq_test()
local lret=$? local lret=$?
if [ $lret -ne 0 ];then if [ $lret -ne 0 ];then
ret=$lret ret=$lret
echo "FAIL: mptcp_inq $@" 1>&2 echo "FAIL: mptcp_inq $*" 1>&2
mptcp_lib_result_fail "TCP_INQ: $*" mptcp_lib_result_fail "TCP_INQ: $*"
return $lret return $lret
fi fi
echo "PASS: TCP_INQ cmsg/ioctl $@" echo "PASS: TCP_INQ cmsg/ioctl $*"
mptcp_lib_result_pass "TCP_INQ: $*" mptcp_lib_result_pass "TCP_INQ: $*"
return $lret return $lret
} }
......
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# Double quotes to prevent globbing and word splitting is recommended in new
# code but we accept it, especially because there were too many before having
# address all other issues detected by shellcheck.
#shellcheck disable=SC2086
. "$(dirname "${0}")/mptcp_lib.sh" . "$(dirname "${0}")/mptcp_lib.sh"
ksft_skip=4
ret=0 ret=0
usage() { usage() {
echo "Usage: $0 [ -h ]" echo "Usage: $0 [ -h ]"
} }
optstring=h
while getopts "$optstring" option;do while getopts "$optstring" option;do
case "$option" in case "$option" in
"h") "h")
...@@ -24,30 +28,23 @@ while getopts "$optstring" option;do ...@@ -24,30 +28,23 @@ while getopts "$optstring" option;do
esac esac
done done
sec=$(date +%s) ns1=""
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
ns1="ns1-$rndh"
err=$(mktemp) err=$(mktemp)
# This function is used in the cleanup trap
#shellcheck disable=SC2317
cleanup() cleanup()
{ {
rm -f $err rm -f $err
ip netns del $ns1 mptcp_lib_ns_exit "${ns1}"
} }
mptcp_lib_check_mptcp mptcp_lib_check_mptcp
mptcp_lib_check_tools ip
ip -Version > /dev/null 2>&1
if [ $? -ne 0 ];then
echo "SKIP: Could not run test without ip tool"
exit $ksft_skip
fi
trap cleanup EXIT trap cleanup EXIT
ip netns add $ns1 || exit $ksft_skip mptcp_lib_ns_init ns1
ip -net $ns1 link set lo up
ip netns exec $ns1 sysctl -q net.mptcp.enabled=1
check() check()
{ {
...@@ -100,14 +97,14 @@ check "ip netns exec $ns1 ./pm_nl_ctl get 4" "" "duplicate addr" ...@@ -100,14 +97,14 @@ check "ip netns exec $ns1 ./pm_nl_ctl get 4" "" "duplicate addr"
ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.4 flags signal ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.4 flags signal
check "ip netns exec $ns1 ./pm_nl_ctl get 4" "id 4 flags signal 10.0.1.4" "id addr increment" check "ip netns exec $ns1 ./pm_nl_ctl get 4" "id 4 flags signal 10.0.1.4" "id addr increment"
for i in `seq 5 9`; do for i in $(seq 5 9); do
ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.$i flags signal >/dev/null 2>&1 ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.$i flags signal >/dev/null 2>&1
done done
check "ip netns exec $ns1 ./pm_nl_ctl get 9" "id 9 flags signal 10.0.1.9" "hard addr limit" check "ip netns exec $ns1 ./pm_nl_ctl get 9" "id 9 flags signal 10.0.1.9" "hard addr limit"
check "ip netns exec $ns1 ./pm_nl_ctl get 10" "" "above hard addr limit" check "ip netns exec $ns1 ./pm_nl_ctl get 10" "" "above hard addr limit"
ip netns exec $ns1 ./pm_nl_ctl del 9 ip netns exec $ns1 ./pm_nl_ctl del 9
for i in `seq 10 255`; do for i in $(seq 10 255); do
ip netns exec $ns1 ./pm_nl_ctl add 10.0.0.9 id $i ip netns exec $ns1 ./pm_nl_ctl add 10.0.0.9 id $i
ip netns exec $ns1 ./pm_nl_ctl del $i ip netns exec $ns1 ./pm_nl_ctl del $i
done done
......
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# Double quotes to prevent globbing and word splitting is recommended in new
# code but we accept it, especially because there were too many before having
# address all other issues detected by shellcheck.
#shellcheck disable=SC2086
. "$(dirname "${0}")/mptcp_lib.sh" . "$(dirname "${0}")/mptcp_lib.sh"
sec=$(date +%s) ns1=""
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX) ns2=""
ns1="ns1-$rndh" ns3=""
ns2="ns2-$rndh"
ns3="ns3-$rndh"
capture=false capture=false
ksft_skip=4
timeout_poll=30 timeout_poll=30
timeout_test=$((timeout_poll * 2 + 1)) timeout_test=$((timeout_poll * 2 + 1))
test_cnt=1 test_cnt=1
...@@ -30,25 +32,19 @@ usage() { ...@@ -30,25 +32,19 @@ usage() {
echo -e "\t-d: debug this script" echo -e "\t-d: debug this script"
} }
# This function is used in the cleanup trap
#shellcheck disable=SC2317
cleanup() cleanup()
{ {
rm -f "$cout" "$sout" rm -f "$cout" "$sout"
rm -f "$large" "$small" rm -f "$large" "$small"
rm -f "$capout" rm -f "$capout"
local netns mptcp_lib_ns_exit "${ns1}" "${ns2}" "${ns3}"
for netns in "$ns1" "$ns2" "$ns3";do
ip netns del $netns
done
} }
mptcp_lib_check_mptcp mptcp_lib_check_mptcp
mptcp_lib_check_tools ip
ip -Version > /dev/null 2>&1
if [ $? -ne 0 ];then
echo "SKIP: Could not run test without ip tool"
exit $ksft_skip
fi
# "$ns1" ns2 ns3 # "$ns1" ns2 ns3
# ns1eth1 ns2eth1 ns2eth3 ns3eth1 # ns1eth1 ns2eth1 ns2eth3 ns3eth1
...@@ -70,12 +66,7 @@ setup() ...@@ -70,12 +66,7 @@ setup()
trap cleanup EXIT trap cleanup EXIT
for i in "$ns1" "$ns2" "$ns3";do mptcp_lib_ns_init ns1 ns2 ns3
ip netns add $i || exit $ksft_skip
ip -net $i link set lo up
ip netns exec $i sysctl -q net.ipv4.conf.all.rp_filter=0
ip netns exec $i sysctl -q net.ipv4.conf.default.rp_filter=0
done
ip link add ns1eth1 netns "$ns1" type veth peer name ns2eth1 netns "$ns2" ip link add ns1eth1 netns "$ns1" type veth peer name ns2eth1 netns "$ns2"
ip link add ns1eth2 netns "$ns1" type veth peer name ns2eth2 netns "$ns2" ip link add ns1eth2 netns "$ns1" type veth peer name ns2eth2 netns "$ns2"
...@@ -135,7 +126,7 @@ do_transfer() ...@@ -135,7 +126,7 @@ do_transfer()
local sin=$2 local sin=$2
local max_time=$3 local max_time=$3
local port local port
port=$((10000+$test_cnt)) port=$((10000+test_cnt))
test_cnt=$((test_cnt+1)) test_cnt=$((test_cnt+1))
:> "$cout" :> "$cout"
...@@ -144,6 +135,7 @@ do_transfer() ...@@ -144,6 +135,7 @@ do_transfer()
if $capture; then if $capture; then
local capuser local capuser
local rndh="${ns1:4}"
if [ -z $SUDO_USER ] ; then if [ -z $SUDO_USER ] ; then
capuser="" capuser=""
else else
......
...@@ -17,11 +17,7 @@ if ! mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then ...@@ -17,11 +17,7 @@ if ! mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
echo "userspace pm tests are not supported by the kernel: SKIP" echo "userspace pm tests are not supported by the kernel: SKIP"
exit ${KSFT_SKIP} exit ${KSFT_SKIP}
fi fi
mptcp_lib_check_tools ip
if ! ip -Version &> /dev/null; then
echo "SKIP: Cannot not run test without ip tool"
exit ${KSFT_SKIP}
fi
ANNOUNCED=6 # MPTCP_EVENT_ANNOUNCED ANNOUNCED=6 # MPTCP_EVENT_ANNOUNCED
REMOVED=7 # MPTCP_EVENT_REMOVED REMOVED=7 # MPTCP_EVENT_REMOVED
...@@ -54,10 +50,8 @@ app6_port=50004 ...@@ -54,10 +50,8 @@ app6_port=50004
client_addr_id=${RANDOM:0:2} client_addr_id=${RANDOM:0:2}
server_addr_id=${RANDOM:0:2} server_addr_id=${RANDOM:0:2}
sec=$(date +%s) ns1=""
rndh=$(printf %x "$sec")-$(mktemp -u XXXXXX) ns2=""
ns1="ns1-$rndh"
ns2="ns2-$rndh"
ret=0 ret=0
test_name="" test_name=""
...@@ -122,10 +116,7 @@ cleanup() ...@@ -122,10 +116,7 @@ cleanup()
mptcp_lib_kill_wait $pid mptcp_lib_kill_wait $pid
done done
local netns mptcp_lib_ns_exit "${ns1}" "${ns2}"
for netns in "$ns1" "$ns2" ;do
ip netns del "$netns"
done
rm -rf $file $client_evts $server_evts rm -rf $file $client_evts $server_evts
...@@ -135,10 +126,8 @@ cleanup() ...@@ -135,10 +126,8 @@ cleanup()
trap cleanup EXIT trap cleanup EXIT
# Create and configure network namespaces for testing # Create and configure network namespaces for testing
mptcp_lib_ns_init ns1 ns2
for i in "$ns1" "$ns2" ;do for i in "$ns1" "$ns2" ;do
ip netns add "$i" || exit 1
ip -net "$i" link set lo up
ip netns exec "$i" sysctl -q net.mptcp.enabled=1
ip netns exec "$i" sysctl -q net.mptcp.pm_type=1 ip netns exec "$i" sysctl -q net.mptcp.pm_type=1
done done
...@@ -160,17 +149,23 @@ ip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad ...@@ -160,17 +149,23 @@ ip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad
ip -net "$ns2" addr add dead:beef:2::2/64 dev ns2eth1 nodad ip -net "$ns2" addr add dead:beef:2::2/64 dev ns2eth1 nodad
ip -net "$ns2" link set ns2eth1 up ip -net "$ns2" link set ns2eth1 up
file=$(mktemp)
mptcp_lib_make_file "$file" 2 1
# Capture netlink events over the two network namespaces running
# the MPTCP client and server
client_evts=$(mktemp)
mptcp_lib_events "${ns2}" "${client_evts}" client_evts_pid
server_evts=$(mktemp)
mptcp_lib_events "${ns1}" "${server_evts}" server_evts_pid
sleep 0.5
print_title "Init" print_title "Init"
print_test "Created network namespaces ns1, ns2" print_test "Created network namespaces ns1, ns2"
test_pass test_pass
make_connection() make_connection()
{ {
if [ -z "$file" ]; then
file=$(mktemp)
fi
mptcp_lib_make_file "$file" 2 1
local is_v6=$1 local is_v6=$1
local app_port=$app4_port local app_port=$app4_port
local connect_addr="10.0.1.1" local connect_addr="10.0.1.1"
...@@ -184,27 +179,8 @@ make_connection() ...@@ -184,27 +179,8 @@ make_connection()
is_v6="v4" is_v6="v4"
fi fi
# Capture netlink events over the two network namespaces running
# the MPTCP client and server
if [ -z "$client_evts" ]; then
client_evts=$(mktemp)
fi
:>"$client_evts" :>"$client_evts"
if [ $client_evts_pid -ne 0 ]; then
mptcp_lib_kill_wait $client_evts_pid
fi
ip netns exec "$ns2" ./pm_nl_ctl events >> "$client_evts" 2>&1 &
client_evts_pid=$!
if [ -z "$server_evts" ]; then
server_evts=$(mktemp)
fi
:>"$server_evts" :>"$server_evts"
if [ $server_evts_pid -ne 0 ]; then
mptcp_lib_kill_wait $server_evts_pid
fi
ip netns exec "$ns1" ./pm_nl_ctl events >> "$server_evts" 2>&1 &
server_evts_pid=$!
sleep 0.5
# Run the server # Run the server
ip netns exec "$ns1" \ ip netns exec "$ns1" \
......
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