mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 06:01:57 +00:00
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.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
d3423ed9b8
@ -1,12 +1,14 @@
|
||||
#!/bin/bash
|
||||
# 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"
|
||||
|
||||
sec=$(date +%s)
|
||||
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
|
||||
ns="ns1-$rndh"
|
||||
ksft_skip=4
|
||||
ns=""
|
||||
test_cnt=1
|
||||
timeout_poll=30
|
||||
timeout_test=$((timeout_poll * 2 + 1))
|
||||
@ -26,25 +28,17 @@ flush_pids()
|
||||
done
|
||||
}
|
||||
|
||||
# This function is used in the cleanup trap
|
||||
#shellcheck disable=SC2317
|
||||
cleanup()
|
||||
{
|
||||
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
|
||||
|
||||
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
|
||||
mptcp_lib_check_tools ip ss
|
||||
|
||||
get_msk_inuse()
|
||||
{
|
||||
@ -186,7 +180,7 @@ chk_msk_inuse()
|
||||
expected=$((expected + listen_nr))
|
||||
|
||||
for _ in $(seq 10); do
|
||||
if [ $(get_msk_inuse) -eq $expected ];then
|
||||
if [ "$(get_msk_inuse)" -eq $expected ]; then
|
||||
break
|
||||
fi
|
||||
sleep 0.1
|
||||
@ -224,8 +218,7 @@ wait_connected()
|
||||
}
|
||||
|
||||
trap cleanup EXIT
|
||||
ip netns add $ns
|
||||
ip -n $ns link set dev lo up
|
||||
mptcp_lib_ns_init ns
|
||||
|
||||
echo "a" | \
|
||||
timeout ${timeout_test} \
|
||||
@ -273,7 +266,7 @@ chk_msk_inuse 0 "1->0"
|
||||
chk_msk_cestab 0 "1->0"
|
||||
|
||||
NR_CLIENTS=100
|
||||
for I in `seq 1 $NR_CLIENTS`; do
|
||||
for I in $(seq 1 $NR_CLIENTS); do
|
||||
echo "a" | \
|
||||
timeout ${timeout_test} \
|
||||
ip netns exec $ns \
|
||||
@ -282,7 +275,7 @@ for I in `seq 1 $NR_CLIENTS`; do
|
||||
done
|
||||
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" | \
|
||||
timeout ${timeout_test} \
|
||||
ip netns exec $ns \
|
||||
|
@ -1,6 +1,11 @@
|
||||
#!/bin/bash
|
||||
# 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"
|
||||
|
||||
time_start=$(date +%s)
|
||||
@ -13,7 +18,6 @@ sout=""
|
||||
cin_disconnect=""
|
||||
cin=""
|
||||
cout=""
|
||||
ksft_skip=4
|
||||
capture=false
|
||||
timeout_poll=30
|
||||
timeout_test=$((timeout_poll * 2 + 1))
|
||||
@ -121,16 +125,16 @@ while getopts "$optstring" option;do
|
||||
esac
|
||||
done
|
||||
|
||||
sec=$(date +%s)
|
||||
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
|
||||
ns1="ns1-$rndh"
|
||||
ns2="ns2-$rndh"
|
||||
ns3="ns3-$rndh"
|
||||
ns4="ns4-$rndh"
|
||||
ns1=""
|
||||
ns2=""
|
||||
ns3=""
|
||||
ns4=""
|
||||
|
||||
TEST_COUNT=0
|
||||
TEST_GROUP=""
|
||||
|
||||
# This function is used in the cleanup trap
|
||||
#shellcheck disable=SC2317
|
||||
cleanup()
|
||||
{
|
||||
rm -f "$cin_disconnect" "$cout_disconnect"
|
||||
@ -138,21 +142,12 @@ cleanup()
|
||||
rm -f "$sin" "$sout"
|
||||
rm -f "$capout"
|
||||
|
||||
local netns
|
||||
for netns in "$ns1" "$ns2" "$ns3" "$ns4";do
|
||||
ip netns del $netns
|
||||
rm -f /tmp/$netns.{nstat,out}
|
||||
done
|
||||
mptcp_lib_ns_exit "${ns1}" "${ns2}" "${ns3}" "${ns4}"
|
||||
}
|
||||
|
||||
mptcp_lib_check_mptcp
|
||||
mptcp_lib_check_kallsyms
|
||||
|
||||
ip -Version > /dev/null 2>&1
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: Could not run test without ip tool"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
mptcp_lib_check_tools ip
|
||||
|
||||
sin=$(mktemp)
|
||||
sout=$(mktemp)
|
||||
@ -163,10 +158,7 @@ cin_disconnect="$cin".disconnect
|
||||
cout_disconnect="$cout".disconnect
|
||||
trap cleanup EXIT
|
||||
|
||||
for i in "$ns1" "$ns2" "$ns3" "$ns4";do
|
||||
ip netns add $i || exit $ksft_skip
|
||||
ip -net $i link set lo up
|
||||
done
|
||||
mptcp_lib_ns_init ns1 ns2 ns3 ns4
|
||||
|
||||
# "$ns1" ns2 ns3 ns4
|
||||
# ns1eth2 ns2eth1 ns2eth3 ns3eth2 ns3eth4 ns4eth3
|
||||
@ -225,8 +217,9 @@ set_ethtool_flags() {
|
||||
local dev="$2"
|
||||
local flags="$3"
|
||||
|
||||
ip netns exec $ns ethtool -K $dev $flags 2>/dev/null
|
||||
[ $? -eq 0 ] && echo "INFO: set $ns dev $dev: ethtool -K $flags"
|
||||
if ip netns exec $ns ethtool -K $dev $flags 2>/dev/null; then
|
||||
echo "INFO: set $ns dev $dev: ethtool -K $flags"
|
||||
fi
|
||||
}
|
||||
|
||||
set_random_ethtool_flags() {
|
||||
@ -256,8 +249,8 @@ fi
|
||||
|
||||
check_mptcp_disabled()
|
||||
{
|
||||
local disabled_ns="ns_disabled-$rndh"
|
||||
ip netns add ${disabled_ns} || exit $ksft_skip
|
||||
local disabled_ns
|
||||
mptcp_lib_ns_init disabled_ns
|
||||
|
||||
# net.mptcp.enabled should be enabled by default
|
||||
if [ "$(ip netns exec ${disabled_ns} sysctl net.mptcp.enabled | awk '{ print $3 }')" -ne 1 ]; then
|
||||
@ -271,7 +264,7 @@ check_mptcp_disabled()
|
||||
local err=0
|
||||
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
|
||||
ip netns delete ${disabled_ns}
|
||||
mptcp_lib_ns_exit "${disabled_ns}"
|
||||
|
||||
if [ ${err} -eq 0 ]; then
|
||||
echo -e "New MPTCP socket cannot be blocked via sysctl\t\t[ FAIL ]"
|
||||
@ -321,7 +314,7 @@ do_transfer()
|
||||
local extra_args="$7"
|
||||
|
||||
local port
|
||||
port=$((10000+$TEST_COUNT))
|
||||
port=$((10000+TEST_COUNT))
|
||||
TEST_COUNT=$((TEST_COUNT+1))
|
||||
|
||||
if [ "$rcvbuf" -gt 0 ]; then
|
||||
@ -353,6 +346,7 @@ do_transfer()
|
||||
|
||||
if $capture; then
|
||||
local capuser
|
||||
local rndh="${connector_ns:4}"
|
||||
if [ -z $SUDO_USER ] ; then
|
||||
capuser=""
|
||||
else
|
||||
@ -378,12 +372,18 @@ do_transfer()
|
||||
nstat -n
|
||||
fi
|
||||
|
||||
local stat_synrx_last_l=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtMPCapableSYNRX")
|
||||
local stat_ackrx_last_l=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtMPCapableACKRX")
|
||||
local stat_cookietx_last=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtSyncookiesSent")
|
||||
local stat_cookierx_last=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtSyncookiesRecv")
|
||||
local stat_csum_err_s=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtDataCsumErr")
|
||||
local stat_csum_err_c=$(mptcp_lib_get_counter "${connector_ns}" "MPTcpExtDataCsumErr")
|
||||
local stat_synrx_last_l
|
||||
local stat_ackrx_last_l
|
||||
local stat_cookietx_last
|
||||
local stat_cookierx_last
|
||||
local stat_csum_err_s
|
||||
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} \
|
||||
ip netns exec ${listener_ns} \
|
||||
@ -446,11 +446,16 @@ do_transfer()
|
||||
mptcp_lib_check_transfer $cin $sout "file received by server"
|
||||
rets=$?
|
||||
|
||||
local stat_synrx_now_l=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtMPCapableSYNRX")
|
||||
local stat_ackrx_now_l=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtMPCapableACKRX")
|
||||
local stat_cookietx_now=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtSyncookiesSent")
|
||||
local stat_cookierx_now=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtSyncookiesRecv")
|
||||
local stat_ooo_now=$(mptcp_lib_get_counter "${listener_ns}" "TcpExtTCPOFOQueue")
|
||||
local stat_synrx_now_l
|
||||
local stat_ackrx_now_l
|
||||
local stat_cookietx_now
|
||||
local stat_cookierx_now
|
||||
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_ackrx=$((stat_ackrx_last_l))
|
||||
@ -459,8 +464,8 @@ do_transfer()
|
||||
cookies=${cookies##*=}
|
||||
|
||||
if [ ${cl_proto} = "MPTCP" ] && [ ${srv_proto} = "MPTCP" ]; then
|
||||
expect_synrx=$((stat_synrx_last_l+$connect_per_transfer))
|
||||
expect_ackrx=$((stat_ackrx_last_l+$connect_per_transfer))
|
||||
expect_synrx=$((stat_synrx_last_l+connect_per_transfer))
|
||||
expect_ackrx=$((stat_ackrx_last_l+connect_per_transfer))
|
||||
fi
|
||||
|
||||
if [ ${stat_synrx_now_l} -lt ${expect_synrx} ]; then
|
||||
@ -468,7 +473,7 @@ do_transfer()
|
||||
"${stat_synrx_now_l}" "${expect_synrx}" 1>&2
|
||||
retc=1
|
||||
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
|
||||
printf "[ FAIL ] lower MPC ACK rx (%d) than expected (%d)\n" \
|
||||
"${stat_ackrx_now_l}" "${expect_ackrx}" 1>&2
|
||||
@ -479,18 +484,20 @@ do_transfer()
|
||||
fi
|
||||
|
||||
if $checksum; then
|
||||
local csum_err_s=$(mptcp_lib_get_counter "${listener_ns}" "MPTcpExtDataCsumErr")
|
||||
local csum_err_c=$(mptcp_lib_get_counter "${connector_ns}" "MPTcpExtDataCsumErr")
|
||||
local csum_err_s
|
||||
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))
|
||||
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
|
||||
fi
|
||||
|
||||
local csum_err_c_nr=$((csum_err_c - stat_csum_err_c))
|
||||
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
|
||||
fi
|
||||
fi
|
||||
@ -658,7 +665,7 @@ run_test_transparent()
|
||||
return
|
||||
fi
|
||||
|
||||
ip netns exec "$listener_ns" nft -f /dev/stdin <<"EOF"
|
||||
if ! ip netns exec "$listener_ns" nft -f /dev/stdin <<"EOF"
|
||||
flush ruleset
|
||||
table inet mangle {
|
||||
chain divert {
|
||||
@ -669,7 +676,7 @@ table inet mangle {
|
||||
}
|
||||
}
|
||||
EOF
|
||||
if [ $? -ne 0 ]; then
|
||||
then
|
||||
echo "SKIP: $msg, could not load nft ruleset"
|
||||
mptcp_lib_fail_if_expected_feature "nft rules"
|
||||
mptcp_lib_result_skip "${TEST_GROUP}"
|
||||
@ -684,8 +691,7 @@ EOF
|
||||
local_addr="0.0.0.0"
|
||||
fi
|
||||
|
||||
ip -net "$listener_ns" $r6flag rule add fwmark 1 lookup 100
|
||||
if [ $? -ne 0 ]; then
|
||||
if ! ip -net "$listener_ns" $r6flag rule add fwmark 1 lookup 100; then
|
||||
ip netns exec "$listener_ns" nft flush ruleset
|
||||
echo "SKIP: $msg, ip $r6flag rule failed"
|
||||
mptcp_lib_fail_if_expected_feature "ip rule"
|
||||
@ -693,8 +699,7 @@ EOF
|
||||
return
|
||||
fi
|
||||
|
||||
ip -net "$listener_ns" route add local $local_addr/0 dev lo table 100
|
||||
if [ $? -ne 0 ]; then
|
||||
if ! ip -net "$listener_ns" route add local $local_addr/0 dev lo table 100; then
|
||||
ip netns exec "$listener_ns" nft flush ruleset
|
||||
ip -net "$listener_ns" $r6flag rule del fwmark 1 lookup 100
|
||||
echo "SKIP: $msg, ip route add local $local_addr failed"
|
||||
@ -857,7 +862,7 @@ stop_if_error "Could not even run ping tests"
|
||||
echo -n "INFO: Using loss of $tc_loss "
|
||||
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
|
||||
reorder1=$((RANDOM%10))
|
||||
|
@ -86,21 +86,11 @@ init_partial()
|
||||
{
|
||||
capout=$(mktemp)
|
||||
|
||||
local sec rndh
|
||||
sec=$(date +%s)
|
||||
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
|
||||
|
||||
ns1="ns1-$rndh"
|
||||
ns2="ns2-$rndh"
|
||||
mptcp_lib_ns_init ns1 ns2
|
||||
|
||||
local netns
|
||||
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.ipv4.conf.all.rp_filter=0
|
||||
ip netns exec $netns sysctl -q net.ipv4.conf.default.rp_filter=0
|
||||
if $checksum; then
|
||||
ip netns exec $netns sysctl -q net.mptcp.checksum_enabled=1
|
||||
fi
|
||||
@ -145,45 +135,15 @@ cleanup_partial()
|
||||
{
|
||||
rm -f "$capout"
|
||||
|
||||
local netns
|
||||
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
|
||||
mptcp_lib_ns_exit "${ns1}" "${ns2}"
|
||||
}
|
||||
|
||||
init() {
|
||||
init=1
|
||||
|
||||
check_tools
|
||||
mptcp_lib_check_mptcp
|
||||
mptcp_lib_check_kallsyms
|
||||
mptcp_lib_check_tools ip ss "${iptables}" "${ip6tables}"
|
||||
|
||||
sin=$(mktemp)
|
||||
sout=$(mktemp)
|
||||
@ -470,12 +430,8 @@ reset_with_events()
|
||||
{
|
||||
reset "${1}" || return 1
|
||||
|
||||
:> "$evts_ns1"
|
||||
:> "$evts_ns2"
|
||||
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=$!
|
||||
mptcp_lib_events "${ns1}" "${evts_ns1}" evts_ns1_pid
|
||||
mptcp_lib_events "${ns2}" "${evts_ns2}" evts_ns2_pid
|
||||
}
|
||||
|
||||
reset_with_tcp_filter()
|
||||
@ -648,7 +604,9 @@ wait_mpj()
|
||||
kill_events_pids()
|
||||
{
|
||||
mptcp_lib_kill_wait $evts_ns1_pid
|
||||
evts_ns1_pid=0
|
||||
mptcp_lib_kill_wait $evts_ns2_pid
|
||||
evts_ns2_pid=0
|
||||
}
|
||||
|
||||
pm_nl_set_limits()
|
||||
|
@ -342,3 +342,71 @@ mptcp_lib_check_output() {
|
||||
return 1
|
||||
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=$!
|
||||
}
|
||||
|
@ -1,6 +1,11 @@
|
||||
#!/bin/bash
|
||||
# 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"
|
||||
|
||||
ret=0
|
||||
@ -8,17 +13,14 @@ sin=""
|
||||
sout=""
|
||||
cin=""
|
||||
cout=""
|
||||
ksft_skip=4
|
||||
timeout_poll=30
|
||||
timeout_test=$((timeout_poll * 2 + 1))
|
||||
iptables="iptables"
|
||||
ip6tables="ip6tables"
|
||||
|
||||
sec=$(date +%s)
|
||||
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
|
||||
ns1="ns1-$rndh"
|
||||
ns2="ns2-$rndh"
|
||||
ns_sbox="ns_sbox-$rndh"
|
||||
ns1=""
|
||||
ns2=""
|
||||
ns_sbox=""
|
||||
|
||||
add_mark_rules()
|
||||
{
|
||||
@ -40,17 +42,10 @@ add_mark_rules()
|
||||
|
||||
init()
|
||||
{
|
||||
local netns
|
||||
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
|
||||
mptcp_lib_ns_init ns1 ns2 ns_sbox
|
||||
|
||||
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 -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
|
||||
@ -77,36 +72,18 @@ init()
|
||||
add_mark_rules $ns2 2
|
||||
}
|
||||
|
||||
# This function is used in the cleanup trap
|
||||
#shellcheck disable=SC2317
|
||||
cleanup()
|
||||
{
|
||||
local netns
|
||||
for netns in "$ns1" "$ns2" "$ns_sbox"; do
|
||||
ip netns del $netns
|
||||
done
|
||||
mptcp_lib_ns_exit "${ns1}" "${ns2}" "${ns_sbox}"
|
||||
rm -f "$cin" "$cout"
|
||||
rm -f "$sin" "$sout"
|
||||
}
|
||||
|
||||
mptcp_lib_check_mptcp
|
||||
mptcp_lib_check_kallsyms
|
||||
|
||||
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
|
||||
mptcp_lib_check_tools ip "${iptables}" "${ip6tables}"
|
||||
|
||||
check_mark()
|
||||
{
|
||||
@ -286,12 +263,12 @@ do_tcpinq_test()
|
||||
local lret=$?
|
||||
if [ $lret -ne 0 ];then
|
||||
ret=$lret
|
||||
echo "FAIL: mptcp_inq $@" 1>&2
|
||||
echo "FAIL: mptcp_inq $*" 1>&2
|
||||
mptcp_lib_result_fail "TCP_INQ: $*"
|
||||
return $lret
|
||||
fi
|
||||
|
||||
echo "PASS: TCP_INQ cmsg/ioctl $@"
|
||||
echo "PASS: TCP_INQ cmsg/ioctl $*"
|
||||
mptcp_lib_result_pass "TCP_INQ: $*"
|
||||
return $lret
|
||||
}
|
||||
|
@ -1,16 +1,20 @@
|
||||
#!/bin/bash
|
||||
# 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"
|
||||
|
||||
ksft_skip=4
|
||||
ret=0
|
||||
|
||||
usage() {
|
||||
echo "Usage: $0 [ -h ]"
|
||||
}
|
||||
|
||||
|
||||
optstring=h
|
||||
while getopts "$optstring" option;do
|
||||
case "$option" in
|
||||
"h")
|
||||
@ -24,30 +28,23 @@ while getopts "$optstring" option;do
|
||||
esac
|
||||
done
|
||||
|
||||
sec=$(date +%s)
|
||||
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
|
||||
ns1="ns1-$rndh"
|
||||
ns1=""
|
||||
err=$(mktemp)
|
||||
|
||||
# This function is used in the cleanup trap
|
||||
#shellcheck disable=SC2317
|
||||
cleanup()
|
||||
{
|
||||
rm -f $err
|
||||
ip netns del $ns1
|
||||
mptcp_lib_ns_exit "${ns1}"
|
||||
}
|
||||
|
||||
mptcp_lib_check_mptcp
|
||||
|
||||
ip -Version > /dev/null 2>&1
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: Could not run test without ip tool"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
mptcp_lib_check_tools ip
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
ip netns add $ns1 || exit $ksft_skip
|
||||
ip -net $ns1 link set lo up
|
||||
ip netns exec $ns1 sysctl -q net.mptcp.enabled=1
|
||||
mptcp_lib_ns_init ns1
|
||||
|
||||
check()
|
||||
{
|
||||
@ -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
|
||||
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
|
||||
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 10" "" "above hard addr limit"
|
||||
|
||||
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 del $i
|
||||
done
|
||||
|
@ -1,15 +1,17 @@
|
||||
#!/bin/bash
|
||||
# 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"
|
||||
|
||||
sec=$(date +%s)
|
||||
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
|
||||
ns1="ns1-$rndh"
|
||||
ns2="ns2-$rndh"
|
||||
ns3="ns3-$rndh"
|
||||
ns1=""
|
||||
ns2=""
|
||||
ns3=""
|
||||
capture=false
|
||||
ksft_skip=4
|
||||
timeout_poll=30
|
||||
timeout_test=$((timeout_poll * 2 + 1))
|
||||
test_cnt=1
|
||||
@ -30,25 +32,19 @@ usage() {
|
||||
echo -e "\t-d: debug this script"
|
||||
}
|
||||
|
||||
# This function is used in the cleanup trap
|
||||
#shellcheck disable=SC2317
|
||||
cleanup()
|
||||
{
|
||||
rm -f "$cout" "$sout"
|
||||
rm -f "$large" "$small"
|
||||
rm -f "$capout"
|
||||
|
||||
local netns
|
||||
for netns in "$ns1" "$ns2" "$ns3";do
|
||||
ip netns del $netns
|
||||
done
|
||||
mptcp_lib_ns_exit "${ns1}" "${ns2}" "${ns3}"
|
||||
}
|
||||
|
||||
mptcp_lib_check_mptcp
|
||||
|
||||
ip -Version > /dev/null 2>&1
|
||||
if [ $? -ne 0 ];then
|
||||
echo "SKIP: Could not run test without ip tool"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
mptcp_lib_check_tools ip
|
||||
|
||||
# "$ns1" ns2 ns3
|
||||
# ns1eth1 ns2eth1 ns2eth3 ns3eth1
|
||||
@ -70,12 +66,7 @@ setup()
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
for i in "$ns1" "$ns2" "$ns3";do
|
||||
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
|
||||
mptcp_lib_ns_init ns1 ns2 ns3
|
||||
|
||||
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"
|
||||
@ -135,7 +126,7 @@ do_transfer()
|
||||
local sin=$2
|
||||
local max_time=$3
|
||||
local port
|
||||
port=$((10000+$test_cnt))
|
||||
port=$((10000+test_cnt))
|
||||
test_cnt=$((test_cnt+1))
|
||||
|
||||
:> "$cout"
|
||||
@ -144,6 +135,7 @@ do_transfer()
|
||||
|
||||
if $capture; then
|
||||
local capuser
|
||||
local rndh="${ns1:4}"
|
||||
if [ -z $SUDO_USER ] ; then
|
||||
capuser=""
|
||||
else
|
||||
|
@ -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"
|
||||
exit ${KSFT_SKIP}
|
||||
fi
|
||||
|
||||
if ! ip -Version &> /dev/null; then
|
||||
echo "SKIP: Cannot not run test without ip tool"
|
||||
exit ${KSFT_SKIP}
|
||||
fi
|
||||
mptcp_lib_check_tools ip
|
||||
|
||||
ANNOUNCED=6 # MPTCP_EVENT_ANNOUNCED
|
||||
REMOVED=7 # MPTCP_EVENT_REMOVED
|
||||
@ -54,10 +50,8 @@ app6_port=50004
|
||||
client_addr_id=${RANDOM:0:2}
|
||||
server_addr_id=${RANDOM:0:2}
|
||||
|
||||
sec=$(date +%s)
|
||||
rndh=$(printf %x "$sec")-$(mktemp -u XXXXXX)
|
||||
ns1="ns1-$rndh"
|
||||
ns2="ns2-$rndh"
|
||||
ns1=""
|
||||
ns2=""
|
||||
ret=0
|
||||
test_name=""
|
||||
|
||||
@ -122,10 +116,7 @@ cleanup()
|
||||
mptcp_lib_kill_wait $pid
|
||||
done
|
||||
|
||||
local netns
|
||||
for netns in "$ns1" "$ns2" ;do
|
||||
ip netns del "$netns"
|
||||
done
|
||||
mptcp_lib_ns_exit "${ns1}" "${ns2}"
|
||||
|
||||
rm -rf $file $client_evts $server_evts
|
||||
|
||||
@ -135,10 +126,8 @@ cleanup()
|
||||
trap cleanup EXIT
|
||||
|
||||
# Create and configure network namespaces for testing
|
||||
mptcp_lib_ns_init ns1 ns2
|
||||
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
|
||||
done
|
||||
|
||||
@ -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" 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_test "Created network namespaces ns1, ns2"
|
||||
test_pass
|
||||
|
||||
make_connection()
|
||||
{
|
||||
if [ -z "$file" ]; then
|
||||
file=$(mktemp)
|
||||
fi
|
||||
mptcp_lib_make_file "$file" 2 1
|
||||
|
||||
local is_v6=$1
|
||||
local app_port=$app4_port
|
||||
local connect_addr="10.0.1.1"
|
||||
@ -184,27 +179,8 @@ make_connection()
|
||||
is_v6="v4"
|
||||
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"
|
||||
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"
|
||||
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
|
||||
ip netns exec "$ns1" \
|
||||
|
Loading…
Reference in New Issue
Block a user