Commit 09c4a16d authored by David S. Miller's avatar David S. Miller

Merge branch 'mptcp-selftests'

Matthieu Baerts says:

====================
selftests: mptcp: format subtests results in TAP

The current selftests infrastructure formats the results in TAP 13. This
version doesn't support subtests and only the end result of each
selftest is taken into account. It means that a single issue in a
subtest of a selftest containing multiple subtests forces the whole
selftest to be marked as failed. It also means that subtests results are
not tracked by CI executing selftests.

MPTCP selftests run hundreds of various subtests. It is then important
to track each of them and not one result per selftest.

It is particularly interesting to do that when validating stable kernels
with the last version of the test suite: tests might fail because a
feature is not supported but the test didn't skip that part. In this
case, if subtests are not tracked, the whole selftest will be marked as
failed making the other subtests useless because their results are
ignored.

Regarding this patch set:

 - The two first patches modify connect and userspace_pm selftests to
   continue executing other tests if there is an error before the end.
   This is what is done in the other MPTCP selftests.

 - Patches 3-5 are refactoring the code in userspace_pm selftest to
   reduce duplicated code, suppress some shellcheck warnings and prepare
   subtests' support by using new helpers.

 - Patch 6 adds new helpers in mptcp_lib.sh to easily support printing
   the subtests results in the different MPTCP selftests.

 - Patch 7-13 format subtests results in TAP 13 in the different MPTCP
   selftests.
====================
Signed-off-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 47448ff2 f589234e
...@@ -65,12 +65,15 @@ __chk_nr() ...@@ -65,12 +65,15 @@ __chk_nr()
if [ $nr != $expected ]; then if [ $nr != $expected ]; then
if [ $nr = "$skip" ] && ! mptcp_lib_expect_all_features; then if [ $nr = "$skip" ] && ! mptcp_lib_expect_all_features; then
echo "[ skip ] Feature probably not supported" echo "[ skip ] Feature probably not supported"
mptcp_lib_result_skip "${msg}"
else else
echo "[ fail ] expected $expected found $nr" echo "[ fail ] expected $expected found $nr"
mptcp_lib_result_fail "${msg}"
ret=$test_cnt ret=$test_cnt
fi fi
else else
echo "[ ok ]" echo "[ ok ]"
mptcp_lib_result_pass "${msg}"
fi fi
test_cnt=$((test_cnt+1)) test_cnt=$((test_cnt+1))
} }
...@@ -111,12 +114,15 @@ wait_msk_nr() ...@@ -111,12 +114,15 @@ wait_msk_nr()
printf "%-50s" "$msg" printf "%-50s" "$msg"
if [ $i -ge $timeout ]; then if [ $i -ge $timeout ]; then
echo "[ fail ] timeout while expecting $expected max $max last $nr" echo "[ fail ] timeout while expecting $expected max $max last $nr"
mptcp_lib_result_fail "${msg} # timeout"
ret=$test_cnt ret=$test_cnt
elif [ $nr != $expected ]; then elif [ $nr != $expected ]; then
echo "[ fail ] expected $expected found $nr" echo "[ fail ] expected $expected found $nr"
mptcp_lib_result_fail "${msg} # unexpected result"
ret=$test_cnt ret=$test_cnt
else else
echo "[ ok ]" echo "[ ok ]"
mptcp_lib_result_pass "${msg}"
fi fi
test_cnt=$((test_cnt+1)) test_cnt=$((test_cnt+1))
} }
...@@ -276,4 +282,5 @@ flush_pids ...@@ -276,4 +282,5 @@ flush_pids
chk_msk_inuse 0 "....chk 0 msk in use after flush" chk_msk_inuse 0 "....chk 0 msk in use after flush"
mptcp_lib_result_print_all_tap
exit $ret exit $ret
...@@ -7,6 +7,7 @@ time_start=$(date +%s) ...@@ -7,6 +7,7 @@ time_start=$(date +%s)
optstring="S:R:d:e:l:r:h4cm:f:tC" optstring="S:R:d:e:l:r:h4cm:f:tC"
ret=0 ret=0
final_ret=0
sin="" sin=""
sout="" sout=""
cin_disconnect="" cin_disconnect=""
...@@ -128,6 +129,7 @@ ns3="ns3-$rndh" ...@@ -128,6 +129,7 @@ ns3="ns3-$rndh"
ns4="ns4-$rndh" ns4="ns4-$rndh"
TEST_COUNT=0 TEST_COUNT=0
TEST_GROUP=""
cleanup() cleanup()
{ {
...@@ -285,6 +287,7 @@ check_mptcp_disabled() ...@@ -285,6 +287,7 @@ check_mptcp_disabled()
# 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
echo -e "net.mptcp.enabled sysctl is not 1 by default\t\t[ FAIL ]" echo -e "net.mptcp.enabled sysctl is not 1 by default\t\t[ FAIL ]"
mptcp_lib_result_fail "net.mptcp.enabled sysctl is not 1 by default"
ret=1 ret=1
return 1 return 1
fi fi
...@@ -297,11 +300,13 @@ check_mptcp_disabled() ...@@ -297,11 +300,13 @@ check_mptcp_disabled()
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 ]"
mptcp_lib_result_fail "New MPTCP socket cannot be blocked via sysctl"
ret=1 ret=1
return 1 return 1
fi fi
echo -e "New MPTCP socket can be blocked via sysctl\t\t[ OK ]" echo -e "New MPTCP socket can be blocked via sysctl\t\t[ OK ]"
mptcp_lib_result_pass "New MPTCP socket can be blocked via sysctl"
return 0 return 0
} }
...@@ -317,14 +322,16 @@ do_ping() ...@@ -317,14 +322,16 @@ do_ping()
local connector_ns="$2" local connector_ns="$2"
local connect_addr="$3" local connect_addr="$3"
local ping_args="-q -c 1" local ping_args="-q -c 1"
local rc=0
if is_v6 "${connect_addr}"; then if is_v6 "${connect_addr}"; then
$ipv6 || return 0 $ipv6 || return 0
ping_args="${ping_args} -6" ping_args="${ping_args} -6"
fi fi
ip netns exec ${connector_ns} ping ${ping_args} $connect_addr >/dev/null ip netns exec ${connector_ns} ping ${ping_args} $connect_addr >/dev/null || rc=1
if [ $? -ne 0 ] ; then
if [ $rc -ne 0 ] ; then
echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2 echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2
ret=1 ret=1
...@@ -403,7 +410,9 @@ do_transfer() ...@@ -403,7 +410,9 @@ do_transfer()
local addr_port local addr_port
addr_port=$(printf "%s:%d" ${connect_addr} ${port}) addr_port=$(printf "%s:%d" ${connect_addr} ${port})
printf "%.3s %-5s -> %.3s (%-20s) %-5s\t" ${connector_ns} ${cl_proto} ${listener_ns} ${addr_port} ${srv_proto} local result_msg
result_msg="$(printf "%.3s %-5s -> %.3s (%-20s) %-5s" ${connector_ns} ${cl_proto} ${listener_ns} ${addr_port} ${srv_proto})"
printf "%s\t" "${result_msg}"
if $capture; then if $capture; then
local capuser local capuser
...@@ -478,6 +487,7 @@ do_transfer() ...@@ -478,6 +487,7 @@ do_transfer()
local duration local duration
duration=$((stop-start)) duration=$((stop-start))
result_msg+=" # time=${duration}ms"
printf "(duration %05sms) " "${duration}" printf "(duration %05sms) " "${duration}"
if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then
echo "[ FAIL ] client exit code $retc, server $rets" 1>&2 echo "[ FAIL ] client exit code $retc, server $rets" 1>&2
...@@ -490,6 +500,7 @@ do_transfer() ...@@ -490,6 +500,7 @@ do_transfer()
echo echo
cat "$capout" cat "$capout"
mptcp_lib_result_fail "${TEST_GROUP}: ${result_msg}"
return 1 return 1
fi fi
...@@ -549,6 +560,9 @@ do_transfer() ...@@ -549,6 +560,9 @@ do_transfer()
if [ $retc -eq 0 ] && [ $rets -eq 0 ]; then if [ $retc -eq 0 ] && [ $rets -eq 0 ]; then
printf "[ OK ]" printf "[ OK ]"
mptcp_lib_result_pass "${TEST_GROUP}: ${result_msg}"
else
mptcp_lib_result_fail "${TEST_GROUP}: ${result_msg}"
fi fi
if [ $cookies -eq 2 ];then if [ $cookies -eq 2 ];then
...@@ -691,6 +705,8 @@ run_test_transparent() ...@@ -691,6 +705,8 @@ run_test_transparent()
local lret=0 local lret=0
local r6flag="" local r6flag=""
TEST_GROUP="${msg}"
# skip if we don't want v6 # skip if we don't want v6
if ! $ipv6 && is_v6 "${connect_addr}"; then if ! $ipv6 && is_v6 "${connect_addr}"; then
return 0 return 0
...@@ -702,6 +718,7 @@ run_test_transparent() ...@@ -702,6 +718,7 @@ run_test_transparent()
# checking for a specific kernel version. # checking for a specific kernel version.
if ! mptcp_lib_kallsyms_has "T __ip_sock_set_tos$"; then if ! mptcp_lib_kallsyms_has "T __ip_sock_set_tos$"; then
echo "INFO: ${msg} not supported by the kernel: SKIP" echo "INFO: ${msg} not supported by the kernel: SKIP"
mptcp_lib_result_skip "${TEST_GROUP}"
return return
fi fi
...@@ -719,6 +736,7 @@ EOF ...@@ -719,6 +736,7 @@ EOF
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; 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}"
return return
fi fi
...@@ -735,6 +753,7 @@ EOF ...@@ -735,6 +753,7 @@ EOF
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"
mptcp_lib_result_skip "${TEST_GROUP}"
return return
fi fi
...@@ -744,6 +763,7 @@ EOF ...@@ -744,6 +763,7 @@ EOF
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"
mptcp_lib_fail_if_expected_feature "ip route" mptcp_lib_fail_if_expected_feature "ip route"
mptcp_lib_result_skip "${TEST_GROUP}"
return return
fi fi
...@@ -773,6 +793,7 @@ run_tests_peekmode() ...@@ -773,6 +793,7 @@ run_tests_peekmode()
{ {
local peekmode="$1" local peekmode="$1"
TEST_GROUP="peek mode: ${peekmode}"
echo "INFO: with peek mode: ${peekmode}" echo "INFO: with peek mode: ${peekmode}"
run_tests_lo "$ns1" "$ns1" 10.0.1.1 1 "-P ${peekmode}" run_tests_lo "$ns1" "$ns1" 10.0.1.1 1 "-P ${peekmode}"
run_tests_lo "$ns1" "$ns1" dead:beef:1::1 1 "-P ${peekmode}" run_tests_lo "$ns1" "$ns1" dead:beef:1::1 1 "-P ${peekmode}"
...@@ -780,8 +801,11 @@ run_tests_peekmode() ...@@ -780,8 +801,11 @@ run_tests_peekmode()
run_tests_mptfo() run_tests_mptfo()
{ {
TEST_GROUP="MPTFO"
if ! mptcp_lib_kallsyms_has "mptcp_fastopen_"; then if ! mptcp_lib_kallsyms_has "mptcp_fastopen_"; then
echo "INFO: TFO not supported by the kernel: SKIP" echo "INFO: TFO not supported by the kernel: SKIP"
mptcp_lib_result_skip "${TEST_GROUP}"
return return
fi fi
...@@ -805,8 +829,11 @@ run_tests_disconnect() ...@@ -805,8 +829,11 @@ run_tests_disconnect()
local old_cin=$cin local old_cin=$cin
local old_sin=$sin local old_sin=$sin
TEST_GROUP="full disconnect"
if ! mptcp_lib_kallsyms_has "mptcp_pm_data_reset$"; then if ! mptcp_lib_kallsyms_has "mptcp_pm_data_reset$"; then
echo "INFO: Full disconnect not supported: SKIP" echo "INFO: Full disconnect not supported: SKIP"
mptcp_lib_result_skip "${TEST_GROUP}"
return return
fi fi
...@@ -837,14 +864,26 @@ display_time() ...@@ -837,14 +864,26 @@ display_time()
echo "Time: ${time_run} seconds" echo "Time: ${time_run} seconds"
} }
stop_if_error() log_if_error()
{ {
local msg="$1" local msg="$1"
if [ ${ret} -ne 0 ]; then if [ ${ret} -ne 0 ]; then
echo "FAIL: ${msg}" 1>&2 echo "FAIL: ${msg}" 1>&2
final_ret=${ret}
ret=0
return ${final_ret}
fi
}
stop_if_error()
{
if ! log_if_error "${@}"; then
display_time display_time
exit ${ret} mptcp_lib_result_print_all_tap
exit ${final_ret}
fi fi
} }
...@@ -874,6 +913,8 @@ for sender in "$ns1" "$ns2" "$ns3" "$ns4";do ...@@ -874,6 +913,8 @@ for sender in "$ns1" "$ns2" "$ns3" "$ns4";do
do_ping "$ns4" $sender dead:beef:3::1 do_ping "$ns4" $sender dead:beef:3::1
done done
mptcp_lib_result_code "${ret}" "ping tests"
stop_if_error "Could not even run ping tests" stop_if_error "Could not even run ping tests"
[ -n "$tc_loss" ] && tc -net "$ns2" qdisc add dev ns2eth3 root netem loss random $tc_loss delay ${tc_delay}ms [ -n "$tc_loss" ] && tc -net "$ns2" qdisc add dev ns2eth3 root netem loss random $tc_loss delay ${tc_delay}ms
...@@ -903,12 +944,15 @@ echo "on ns3eth4" ...@@ -903,12 +944,15 @@ echo "on ns3eth4"
tc -net "$ns3" qdisc add dev ns3eth4 root netem delay ${reorder_delay}ms $tc_reorder tc -net "$ns3" qdisc add dev ns3eth4 root netem delay ${reorder_delay}ms $tc_reorder
TEST_GROUP="loopback v4"
run_tests_lo "$ns1" "$ns1" 10.0.1.1 1 run_tests_lo "$ns1" "$ns1" 10.0.1.1 1
stop_if_error "Could not even run loopback test" stop_if_error "Could not even run loopback test"
TEST_GROUP="loopback v6"
run_tests_lo "$ns1" "$ns1" dead:beef:1::1 1 run_tests_lo "$ns1" "$ns1" dead:beef:1::1 1
stop_if_error "Could not even run loopback v6 test" stop_if_error "Could not even run loopback v6 test"
TEST_GROUP="multihosts"
for sender in $ns1 $ns2 $ns3 $ns4;do for sender in $ns1 $ns2 $ns3 $ns4;do
# ns1<->ns2 is not subject to reordering/tc delays. Use it to test # ns1<->ns2 is not subject to reordering/tc delays. Use it to test
# mptcp syncookie support. # mptcp syncookie support.
...@@ -934,23 +978,25 @@ for sender in $ns1 $ns2 $ns3 $ns4;do ...@@ -934,23 +978,25 @@ for sender in $ns1 $ns2 $ns3 $ns4;do
run_tests "$ns4" $sender 10.0.3.1 run_tests "$ns4" $sender 10.0.3.1
run_tests "$ns4" $sender dead:beef:3::1 run_tests "$ns4" $sender dead:beef:3::1
stop_if_error "Tests with $sender as a sender have failed" log_if_error "Tests with $sender as a sender have failed"
done done
run_tests_peekmode "saveWithPeek" run_tests_peekmode "saveWithPeek"
run_tests_peekmode "saveAfterPeek" run_tests_peekmode "saveAfterPeek"
stop_if_error "Tests with peek mode have failed" log_if_error "Tests with peek mode have failed"
# MPTFO (MultiPath TCP Fatopen tests) # MPTFO (MultiPath TCP Fatopen tests)
run_tests_mptfo run_tests_mptfo
stop_if_error "Tests with MPTFO have failed" log_if_error "Tests with MPTFO have failed"
# connect to ns4 ip address, ns2 should intercept/proxy # connect to ns4 ip address, ns2 should intercept/proxy
run_test_transparent 10.0.3.1 "tproxy ipv4" run_test_transparent 10.0.3.1 "tproxy ipv4"
run_test_transparent dead:beef:3::1 "tproxy ipv6" run_test_transparent dead:beef:3::1 "tproxy ipv6"
stop_if_error "Tests with tproxy have failed" log_if_error "Tests with tproxy have failed"
run_tests_disconnect run_tests_disconnect
log_if_error "Tests of the full disconnection have failed"
display_time display_time
exit $ret mptcp_lib_result_print_all_tap
exit ${final_ret}
...@@ -39,7 +39,9 @@ evts_ns1="" ...@@ -39,7 +39,9 @@ evts_ns1=""
evts_ns2="" evts_ns2=""
evts_ns1_pid=0 evts_ns1_pid=0
evts_ns2_pid=0 evts_ns2_pid=0
stats_dumped=0 last_test_failed=0
last_test_skipped=0
last_test_ignored=1
declare -A all_tests declare -A all_tests
declare -a only_tests_ids declare -a only_tests_ids
...@@ -101,7 +103,6 @@ init_partial() ...@@ -101,7 +103,6 @@ init_partial()
fi fi
done done
stats_dumped=0
check_invert=0 check_invert=0
validate_checksum=$checksum validate_checksum=$checksum
...@@ -216,6 +217,8 @@ mark_as_skipped() ...@@ -216,6 +217,8 @@ mark_as_skipped()
print_title "[ skip ] ${msg}" print_title "[ skip ] ${msg}"
printf "\n" printf "\n"
last_test_skipped=1
} }
# $@: condition # $@: condition
...@@ -248,14 +251,32 @@ skip_test() ...@@ -248,14 +251,32 @@ skip_test()
return 0 return 0
} }
append_prev_results()
{
if [ ${last_test_failed} -eq 1 ]; then
mptcp_lib_result_fail "${TEST_NAME}"
elif [ ${last_test_skipped} -eq 1 ]; then
mptcp_lib_result_skip "${TEST_NAME}"
elif [ ${last_test_ignored} -ne 1 ]; then
mptcp_lib_result_pass "${TEST_NAME}"
fi
last_test_failed=0
last_test_skipped=0
last_test_ignored=0
}
# $1: test name # $1: test name
reset() reset()
{ {
append_prev_results
TEST_NAME="${1}" TEST_NAME="${1}"
TEST_COUNT=$((TEST_COUNT+1)) TEST_COUNT=$((TEST_COUNT+1))
if skip_test; then if skip_test; then
last_test_ignored=1
return 1 return 1
fi fi
...@@ -442,10 +463,13 @@ reset_with_tcp_filter() ...@@ -442,10 +463,13 @@ reset_with_tcp_filter()
fail_test() fail_test()
{ {
ret=1 ret=1
failed_tests[${TEST_COUNT}]="${TEST_NAME}"
[ "${stats_dumped}" = 0 ] && dump_stats # just in case a test is marked twice as failed
stats_dumped=1 if [ ${last_test_failed} -eq 0 ]; then
failed_tests[${TEST_COUNT}]="${TEST_NAME}"
dump_stats
last_test_failed=1
fi
} }
get_failed_tests_ids() get_failed_tests_ids()
...@@ -3599,4 +3623,7 @@ if [ ${ret} -ne 0 ]; then ...@@ -3599,4 +3623,7 @@ if [ ${ret} -ne 0 ]; then
echo echo
fi fi
append_prev_results
mptcp_lib_result_print_all_tap
exit $ret exit $ret
#! /bin/bash #! /bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
readonly KSFT_PASS=0
readonly KSFT_FAIL=1 readonly KSFT_FAIL=1
readonly KSFT_SKIP=4 readonly KSFT_SKIP=4
readonly KSFT_TEST=$(basename "${0}" | sed 's/\.sh$//g')
MPTCP_LIB_SUBTESTS=()
# SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES env var can be set when validating all # SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES env var can be set when validating all
# features using the last version of the kernel and the selftests to make sure # features using the last version of the kernel and the selftests to make sure
...@@ -102,3 +106,65 @@ mptcp_lib_kversion_ge() { ...@@ -102,3 +106,65 @@ mptcp_lib_kversion_ge() {
mptcp_lib_fail_if_expected_feature "kernel version ${1} lower than ${v}" mptcp_lib_fail_if_expected_feature "kernel version ${1} lower than ${v}"
} }
__mptcp_lib_result_add() {
local result="${1}"
shift
local id=$((${#MPTCP_LIB_SUBTESTS[@]} + 1))
MPTCP_LIB_SUBTESTS+=("${result} ${id} - ${KSFT_TEST}: ${*}")
}
# $1: test name
mptcp_lib_result_pass() {
__mptcp_lib_result_add "ok" "${1}"
}
# $1: test name
mptcp_lib_result_fail() {
__mptcp_lib_result_add "not ok" "${1}"
}
# $1: test name
mptcp_lib_result_skip() {
__mptcp_lib_result_add "ok" "${1} # SKIP"
}
# $1: result code ; $2: test name
mptcp_lib_result_code() {
local ret="${1}"
local name="${2}"
case "${ret}" in
"${KSFT_PASS}")
mptcp_lib_result_pass "${name}"
;;
"${KSFT_FAIL}")
mptcp_lib_result_fail "${name}"
;;
"${KSFT_SKIP}")
mptcp_lib_result_skip "${name}"
;;
*)
echo "ERROR: wrong result code: ${ret}"
exit ${KSFT_FAIL}
;;
esac
}
mptcp_lib_result_print_all_tap() {
local subtest
if [ ${#MPTCP_LIB_SUBTESTS[@]} -eq 0 ] ||
[ "${SELFTESTS_MPTCP_LIB_NO_TAP:-}" = "1" ]; then
return
fi
printf "\nTAP version 13\n"
printf "1..%d\n" "${#MPTCP_LIB_SUBTESTS[@]}"
for subtest in "${MPTCP_LIB_SUBTESTS[@]}"; do
printf "%s\n" "${subtest}"
done
}
...@@ -183,11 +183,13 @@ do_transfer() ...@@ -183,11 +183,13 @@ do_transfer()
local mptcp_connect="./mptcp_connect -r 20" local mptcp_connect="./mptcp_connect -r 20"
local local_addr local local_addr ip
if is_v6 "${connect_addr}"; then if is_v6 "${connect_addr}"; then
local_addr="::" local_addr="::"
ip=ipv6
else else
local_addr="0.0.0.0" local_addr="0.0.0.0"
ip=ipv4
fi fi
cmsg="TIMESTAMPNS" cmsg="TIMESTAMPNS"
...@@ -223,6 +225,8 @@ do_transfer() ...@@ -223,6 +225,8 @@ do_transfer()
echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2 echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2
ip netns exec ${connector_ns} ss -Menita 1>&2 -o "dport = :$port" ip netns exec ${connector_ns} ss -Menita 1>&2 -o "dport = :$port"
mptcp_lib_result_fail "transfer ${ip}"
ret=1 ret=1
return 1 return 1
fi fi
...@@ -236,9 +240,11 @@ do_transfer() ...@@ -236,9 +240,11 @@ do_transfer()
fi fi
check_transfer $cin $sout "file received by server" check_transfer $cin $sout "file received by server"
rets=$? rets=$?
mptcp_lib_result_code "${retc}" "mark ${ip}"
mptcp_lib_result_code "${rets}" "transfer ${ip}"
if [ $retc -eq 0 ] && [ $rets -eq 0 ];then if [ $retc -eq 0 ] && [ $rets -eq 0 ];then
return 0 return 0
fi fi
...@@ -264,6 +270,7 @@ do_mptcp_sockopt_tests() ...@@ -264,6 +270,7 @@ do_mptcp_sockopt_tests()
if ! mptcp_lib_kallsyms_has "mptcp_diag_fill_info$"; then if ! mptcp_lib_kallsyms_has "mptcp_diag_fill_info$"; then
echo "INFO: MPTCP sockopt not supported: SKIP" echo "INFO: MPTCP sockopt not supported: SKIP"
mptcp_lib_result_skip "sockopt"
return return
fi fi
...@@ -272,18 +279,22 @@ do_mptcp_sockopt_tests() ...@@ -272,18 +279,22 @@ do_mptcp_sockopt_tests()
if [ $lret -ne 0 ]; then if [ $lret -ne 0 ]; then
echo "FAIL: SOL_MPTCP getsockopt" 1>&2 echo "FAIL: SOL_MPTCP getsockopt" 1>&2
mptcp_lib_result_fail "sockopt v4"
ret=$lret ret=$lret
return return
fi fi
mptcp_lib_result_pass "sockopt v4"
ip netns exec "$ns_sbox" ./mptcp_sockopt -6 ip netns exec "$ns_sbox" ./mptcp_sockopt -6
lret=$? lret=$?
if [ $lret -ne 0 ]; then if [ $lret -ne 0 ]; then
echo "FAIL: SOL_MPTCP getsockopt (ipv6)" 1>&2 echo "FAIL: SOL_MPTCP getsockopt (ipv6)" 1>&2
mptcp_lib_result_fail "sockopt v6"
ret=$lret ret=$lret
return return
fi fi
mptcp_lib_result_pass "sockopt v6"
} }
run_tests() run_tests()
...@@ -310,10 +321,12 @@ do_tcpinq_test() ...@@ -310,10 +321,12 @@ do_tcpinq_test()
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: $*"
return $lret return $lret
fi fi
echo "PASS: TCP_INQ cmsg/ioctl $@" echo "PASS: TCP_INQ cmsg/ioctl $@"
mptcp_lib_result_pass "TCP_INQ: $*"
return $lret return $lret
} }
...@@ -323,6 +336,7 @@ do_tcpinq_tests() ...@@ -323,6 +336,7 @@ do_tcpinq_tests()
if ! mptcp_lib_kallsyms_has "mptcp_ioctl$"; then if ! mptcp_lib_kallsyms_has "mptcp_ioctl$"; then
echo "INFO: TCP_INQ not supported: SKIP" echo "INFO: TCP_INQ not supported: SKIP"
mptcp_lib_result_skip "TCP_INQ"
return return
fi fi
...@@ -367,4 +381,6 @@ if [ $ret -eq 0 ];then ...@@ -367,4 +381,6 @@ if [ $ret -eq 0 ];then
fi fi
do_tcpinq_tests do_tcpinq_tests
mptcp_lib_result_print_all_tap
exit $ret exit $ret
...@@ -58,16 +58,19 @@ check() ...@@ -58,16 +58,19 @@ check()
local out=`$cmd 2>$err` local out=`$cmd 2>$err`
local cmd_ret=$? local cmd_ret=$?
printf "%-50s %s" "$msg" printf "%-50s" "$msg"
if [ $cmd_ret -ne 0 ]; then if [ $cmd_ret -ne 0 ]; then
echo "[FAIL] command execution '$cmd' stderr " echo "[FAIL] command execution '$cmd' stderr "
cat $err cat $err
mptcp_lib_result_fail "${msg} # error ${cmd_ret}"
ret=1 ret=1
elif [ "$out" = "$expected" ]; then elif [ "$out" = "$expected" ]; then
echo "[ OK ]" echo "[ OK ]"
mptcp_lib_result_pass "${msg}"
else else
echo -n "[FAIL] " echo -n "[FAIL] "
echo "expected '$expected' got '$out'" echo "expected '$expected' got '$out'"
mptcp_lib_result_fail "${msg} # different output"
ret=1 ret=1
fi fi
} }
...@@ -193,4 +196,5 @@ subflow 10.0.1.1" " (nofullmesh)" ...@@ -193,4 +196,5 @@ subflow 10.0.1.1" " (nofullmesh)"
subflow,backup,fullmesh 10.0.1.1" " (backup,fullmesh)" subflow,backup,fullmesh 10.0.1.1" " (backup,fullmesh)"
fi fi
mptcp_lib_result_print_all_tap
exit $ret exit $ret
...@@ -261,6 +261,7 @@ run_test() ...@@ -261,6 +261,7 @@ run_test()
printf "%-60s" "$msg" printf "%-60s" "$msg"
do_transfer $small $large $time do_transfer $small $large $time
lret=$? lret=$?
mptcp_lib_result_code "${lret}" "${msg}"
if [ $lret -ne 0 ]; then if [ $lret -ne 0 ]; then
ret=$lret ret=$lret
[ $bail -eq 0 ] || exit $ret [ $bail -eq 0 ] || exit $ret
...@@ -269,6 +270,7 @@ run_test() ...@@ -269,6 +270,7 @@ run_test()
printf "%-60s" "$msg - reverse direction" printf "%-60s" "$msg - reverse direction"
do_transfer $large $small $time do_transfer $large $small $time
lret=$? lret=$?
mptcp_lib_result_code "${lret}" "${msg}"
if [ $lret -ne 0 ]; then if [ $lret -ne 0 ]; then
ret=$lret ret=$lret
[ $bail -eq 0 ] || exit $ret [ $bail -eq 0 ] || exit $ret
...@@ -305,4 +307,6 @@ run_test 10 10 1 50 "balanced bwidth with unbalanced delay" ...@@ -305,4 +307,6 @@ run_test 10 10 1 50 "balanced bwidth with unbalanced delay"
run_test 30 10 0 0 "unbalanced bwidth" run_test 30 10 0 0 "unbalanced bwidth"
run_test 30 10 1 50 "unbalanced bwidth with unbalanced delay" run_test 30 10 1 50 "unbalanced bwidth with unbalanced delay"
run_test 30 10 50 1 "unbalanced bwidth with opposed, unbalanced delay" run_test 30 10 50 1 "unbalanced bwidth with opposed, unbalanced delay"
mptcp_lib_result_print_all_tap
exit $ret exit $ret
#!/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.
#shellcheck disable=SC2086
# Some variables are used below but indirectly, see check_expected_one()
#shellcheck disable=SC2034
. "$(dirname "${0}")/mptcp_lib.sh" . "$(dirname "${0}")/mptcp_lib.sh"
mptcp_lib_check_mptcp mptcp_lib_check_mptcp
...@@ -11,8 +18,7 @@ if ! mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then ...@@ -11,8 +18,7 @@ if ! mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
exit ${KSFT_SKIP} exit ${KSFT_SKIP}
fi fi
ip -Version > /dev/null 2>&1 if ! ip -Version &> /dev/null; then
if [ $? -ne 0 ];then
echo "SKIP: Cannot not run test without ip tool" echo "SKIP: Cannot not run test without ip tool"
exit ${KSFT_SKIP} exit ${KSFT_SKIP}
fi fi
...@@ -52,10 +58,54 @@ sec=$(date +%s) ...@@ -52,10 +58,54 @@ sec=$(date +%s)
rndh=$(printf %x "$sec")-$(mktemp -u XXXXXX) rndh=$(printf %x "$sec")-$(mktemp -u XXXXXX)
ns1="ns1-$rndh" ns1="ns1-$rndh"
ns2="ns2-$rndh" ns2="ns2-$rndh"
ret=0
test_name=""
_printf() {
stdbuf -o0 -e0 printf "${@}"
}
print_title() print_title()
{ {
stdbuf -o0 -e0 printf "INFO: %s\n" "${1}" _printf "INFO: %s\n" "${1}"
}
# $1: test name
print_test()
{
test_name="${1}"
_printf "%-63s" "${test_name}"
}
print_results()
{
_printf "[%s]\n" "${1}"
}
test_pass()
{
print_results " OK "
mptcp_lib_result_pass "${test_name}"
}
test_skip()
{
print_results "SKIP"
mptcp_lib_result_skip "${test_name}"
}
# $1: msg
test_fail()
{
print_results "FAIL"
ret=1
if [ -n "${1}" ]; then
_printf "\t%s\n" "${1}"
fi
mptcp_lib_result_fail "${test_name}"
} }
kill_wait() kill_wait()
...@@ -67,6 +117,8 @@ kill_wait() ...@@ -67,6 +117,8 @@ kill_wait()
wait $1 2>/dev/null wait $1 2>/dev/null
} }
# This function is used in the cleanup trap
#shellcheck disable=SC2317
cleanup() cleanup()
{ {
print_title "Cleanup" print_title "Cleanup"
...@@ -86,7 +138,7 @@ cleanup() ...@@ -86,7 +138,7 @@ cleanup()
rm -rf $file $client_evts $server_evts rm -rf $file $client_evts $server_evts
stdbuf -o0 -e0 printf "Done\n" _printf "Done\n"
} }
trap cleanup EXIT trap cleanup EXIT
...@@ -118,7 +170,8 @@ ip -net "$ns2" addr add dead:beef:2::2/64 dev ns2eth1 nodad ...@@ -118,7 +170,8 @@ 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
print_title "Init" print_title "Init"
stdbuf -o0 -e0 printf "Created network namespaces ns1, ns2 \t\t\t[OK]\n" print_test "Created network namespaces ns1, ns2"
test_pass
make_file() make_file()
{ {
...@@ -203,16 +256,14 @@ make_connection() ...@@ -203,16 +256,14 @@ make_connection()
server_serverside=$(grep "type:1," "$server_evts" | server_serverside=$(grep "type:1," "$server_evts" |
sed --unbuffered -n 's/.*\(server_side:\)\([[:digit:]]*\).*$/\2/p;q') sed --unbuffered -n 's/.*\(server_side:\)\([[:digit:]]*\).*$/\2/p;q')
stdbuf -o0 -e0 printf "Established IP%s MPTCP Connection ns2 => ns1 \t\t" $is_v6 print_test "Established IP${is_v6} MPTCP Connection ns2 => ns1"
if [ "$client_token" != "" ] && [ "$server_token" != "" ] && [ "$client_serverside" = 0 ] && if [ "$client_token" != "" ] && [ "$server_token" != "" ] && [ "$client_serverside" = 0 ] &&
[ "$server_serverside" = 1 ] [ "$server_serverside" = 1 ]
then then
stdbuf -o0 -e0 printf "[OK]\n" test_pass
else else
stdbuf -o0 -e0 printf "[FAIL]\n" test_fail "Expected tokens (c:${client_token} - s:${server_token}) and server (c:${client_serverside} - s:${server_serverside})"
stdbuf -o0 -e0 printf "\tExpected tokens (c:%s - s:%s) and server (c:%d - s:%d)\n" \ mptcp_lib_result_print_all_tap
"${client_token}" "${server_token}" \
"${client_serverside}" "${server_serverside}"
exit 1 exit 1
fi fi
...@@ -246,10 +297,10 @@ check_expected_one() ...@@ -246,10 +297,10 @@ check_expected_one()
if [ "${prev_ret}" = "0" ] if [ "${prev_ret}" = "0" ]
then then
stdbuf -o0 -e0 printf "[FAIL]\n" test_fail
fi fi
stdbuf -o0 -e0 printf "\tExpected value for '%s': '%s', got '%s'.\n" \ _printf "\tExpected value for '%s': '%s', got '%s'.\n" \
"${var}" "${!exp}" "${!var}" "${var}" "${!exp}" "${!var}"
return 1 return 1
} }
...@@ -257,21 +308,21 @@ check_expected_one() ...@@ -257,21 +308,21 @@ check_expected_one()
# $@: all var names to check # $@: all var names to check
check_expected() check_expected()
{ {
local ret=0 local rc=0
local var local var
for var in "${@}" for var in "${@}"
do do
check_expected_one "${var}" "${ret}" || ret=1 check_expected_one "${var}" "${rc}" || rc=1
done done
if [ ${ret} -eq 0 ] if [ ${rc} -eq 0 ]
then then
stdbuf -o0 -e0 printf "[OK]\n" test_pass
return 0 return 0
fi fi
exit 1 return 1
} }
verify_announce_event() verify_announce_event()
...@@ -317,13 +368,12 @@ test_announce() ...@@ -317,13 +368,12 @@ test_announce()
local type local type
type=$(sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$server_evts") type=$(sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$server_evts")
stdbuf -o0 -e0 printf "ADD_ADDR 10.0.2.2 (ns2) => ns1, invalid token \t\t" print_test "ADD_ADDR 10.0.2.2 (ns2) => ns1, invalid token"
if [ "$type" = "" ] if [ "$type" = "" ]
then then
stdbuf -o0 -e0 printf "[OK]\n" test_pass
else else
stdbuf -o0 -e0 printf "[FAIL]\n\ttype defined: %s\n" "${type}" test_fail "type defined: ${type}"
exit 1
fi fi
# ADD_ADDR from the client to server machine reusing the subflow port # ADD_ADDR from the client to server machine reusing the subflow port
...@@ -331,7 +381,7 @@ test_announce() ...@@ -331,7 +381,7 @@ test_announce()
ip netns exec "$ns2"\ ip netns exec "$ns2"\
./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id $client_addr_id dev\ ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id $client_addr_id dev\
ns2eth1 > /dev/null 2>&1 ns2eth1 > /dev/null 2>&1
stdbuf -o0 -e0 printf "ADD_ADDR id:%d 10.0.2.2 (ns2) => ns1, reuse port \t\t" $client_addr_id print_test "ADD_ADDR id:${client_addr_id} 10.0.2.2 (ns2) => ns1, reuse port"
sleep 0.5 sleep 0.5
verify_announce_event $server_evts $ANNOUNCED $server4_token "10.0.2.2" $client_addr_id \ verify_announce_event $server_evts $ANNOUNCED $server4_token "10.0.2.2" $client_addr_id \
"$client4_port" "$client4_port"
...@@ -340,7 +390,7 @@ test_announce() ...@@ -340,7 +390,7 @@ test_announce()
:>"$server_evts" :>"$server_evts"
ip netns exec "$ns2" ./pm_nl_ctl ann\ ip netns exec "$ns2" ./pm_nl_ctl ann\
dead:beef:2::2 token "$client6_token" id $client_addr_id dev ns2eth1 > /dev/null 2>&1 dead:beef:2::2 token "$client6_token" id $client_addr_id dev ns2eth1 > /dev/null 2>&1
stdbuf -o0 -e0 printf "ADD_ADDR6 id:%d dead:beef:2::2 (ns2) => ns1, reuse port\t\t" $client_addr_id print_test "ADD_ADDR6 id:${client_addr_id} dead:beef:2::2 (ns2) => ns1, reuse port"
sleep 0.5 sleep 0.5
verify_announce_event "$server_evts" "$ANNOUNCED" "$server6_token" "dead:beef:2::2"\ verify_announce_event "$server_evts" "$ANNOUNCED" "$server6_token" "dead:beef:2::2"\
"$client_addr_id" "$client6_port" "v6" "$client_addr_id" "$client6_port" "v6"
...@@ -350,7 +400,7 @@ test_announce() ...@@ -350,7 +400,7 @@ test_announce()
client_addr_id=$((client_addr_id+1)) client_addr_id=$((client_addr_id+1))
ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id\ ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id\
$client_addr_id dev ns2eth1 port $new4_port > /dev/null 2>&1 $client_addr_id dev ns2eth1 port $new4_port > /dev/null 2>&1
stdbuf -o0 -e0 printf "ADD_ADDR id:%d 10.0.2.2 (ns2) => ns1, new port \t\t\t" $client_addr_id print_test "ADD_ADDR id:${client_addr_id} 10.0.2.2 (ns2) => ns1, new port"
sleep 0.5 sleep 0.5
verify_announce_event "$server_evts" "$ANNOUNCED" "$server4_token" "10.0.2.2"\ verify_announce_event "$server_evts" "$ANNOUNCED" "$server4_token" "10.0.2.2"\
"$client_addr_id" "$new4_port" "$client_addr_id" "$new4_port"
...@@ -361,7 +411,7 @@ test_announce() ...@@ -361,7 +411,7 @@ test_announce()
# ADD_ADDR from the server to client machine reusing the subflow port # ADD_ADDR from the server to client machine reusing the subflow port
ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\
$server_addr_id dev ns1eth2 > /dev/null 2>&1 $server_addr_id dev ns1eth2 > /dev/null 2>&1
stdbuf -o0 -e0 printf "ADD_ADDR id:%d 10.0.2.1 (ns1) => ns2, reuse port \t\t" $server_addr_id print_test "ADD_ADDR id:${server_addr_id} 10.0.2.1 (ns1) => ns2, reuse port"
sleep 0.5 sleep 0.5
verify_announce_event "$client_evts" "$ANNOUNCED" "$client4_token" "10.0.2.1"\ verify_announce_event "$client_evts" "$ANNOUNCED" "$client4_token" "10.0.2.1"\
"$server_addr_id" "$app4_port" "$server_addr_id" "$app4_port"
...@@ -370,7 +420,7 @@ test_announce() ...@@ -370,7 +420,7 @@ test_announce()
:>"$client_evts" :>"$client_evts"
ip netns exec "$ns1" ./pm_nl_ctl ann dead:beef:2::1 token "$server6_token" id\ ip netns exec "$ns1" ./pm_nl_ctl ann dead:beef:2::1 token "$server6_token" id\
$server_addr_id dev ns1eth2 > /dev/null 2>&1 $server_addr_id dev ns1eth2 > /dev/null 2>&1
stdbuf -o0 -e0 printf "ADD_ADDR6 id:%d dead:beef:2::1 (ns1) => ns2, reuse port\t\t" $server_addr_id print_test "ADD_ADDR6 id:${server_addr_id} dead:beef:2::1 (ns1) => ns2, reuse port"
sleep 0.5 sleep 0.5
verify_announce_event "$client_evts" "$ANNOUNCED" "$client6_token" "dead:beef:2::1"\ verify_announce_event "$client_evts" "$ANNOUNCED" "$client6_token" "dead:beef:2::1"\
"$server_addr_id" "$app6_port" "v6" "$server_addr_id" "$app6_port" "v6"
...@@ -380,7 +430,7 @@ test_announce() ...@@ -380,7 +430,7 @@ test_announce()
server_addr_id=$((server_addr_id+1)) server_addr_id=$((server_addr_id+1))
ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\
$server_addr_id dev ns1eth2 port $new4_port > /dev/null 2>&1 $server_addr_id dev ns1eth2 port $new4_port > /dev/null 2>&1
stdbuf -o0 -e0 printf "ADD_ADDR id:%d 10.0.2.1 (ns1) => ns2, new port \t\t\t" $server_addr_id print_test "ADD_ADDR id:${server_addr_id} 10.0.2.1 (ns1) => ns2, new port"
sleep 0.5 sleep 0.5
verify_announce_event "$client_evts" "$ANNOUNCED" "$client4_token" "10.0.2.1"\ verify_announce_event "$client_evts" "$ANNOUNCED" "$client4_token" "10.0.2.1"\
"$server_addr_id" "$new4_port" "$server_addr_id" "$new4_port"
...@@ -414,39 +464,34 @@ test_remove() ...@@ -414,39 +464,34 @@ test_remove()
local invalid_token=$(( client4_token - 1 )) local invalid_token=$(( client4_token - 1 ))
ip netns exec "$ns2" ./pm_nl_ctl rem token $invalid_token id\ ip netns exec "$ns2" ./pm_nl_ctl rem token $invalid_token id\
$client_addr_id > /dev/null 2>&1 $client_addr_id > /dev/null 2>&1
stdbuf -o0 -e0 printf "RM_ADDR id:%d ns2 => ns1, invalid token \t"\ print_test "RM_ADDR id:${client_addr_id} ns2 => ns1, invalid token"
$client_addr_id
local type local type
type=$(sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$server_evts") type=$(sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$server_evts")
if [ "$type" = "" ] if [ "$type" = "" ]
then then
stdbuf -o0 -e0 printf "[OK]\n" test_pass
else else
stdbuf -o0 -e0 printf "[FAIL]\n" test_fail
exit 1
fi fi
# RM_ADDR using an invalid addr id should result in no action # RM_ADDR using an invalid addr id should result in no action
local invalid_id=$(( client_addr_id + 1 )) local invalid_id=$(( client_addr_id + 1 ))
ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\
$invalid_id > /dev/null 2>&1 $invalid_id > /dev/null 2>&1
stdbuf -o0 -e0 printf "RM_ADDR id:%d ns2 => ns1, invalid id \t"\ print_test "RM_ADDR id:${invalid_id} ns2 => ns1, invalid id"
$invalid_id
type=$(sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$server_evts") type=$(sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$server_evts")
if [ "$type" = "" ] if [ "$type" = "" ]
then then
stdbuf -o0 -e0 printf "[OK]\n" test_pass
else else
stdbuf -o0 -e0 printf "[FAIL]\n" test_fail
exit 1
fi fi
# RM_ADDR from the client to server machine # RM_ADDR from the client to server machine
:>"$server_evts" :>"$server_evts"
ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\
$client_addr_id > /dev/null 2>&1 $client_addr_id > /dev/null 2>&1
stdbuf -o0 -e0 printf "RM_ADDR id:%d ns2 => ns1 \t"\ print_test "RM_ADDR id:${client_addr_id} ns2 => ns1"
$client_addr_id
sleep 0.5 sleep 0.5
verify_remove_event "$server_evts" "$REMOVED" "$server4_token" "$client_addr_id" verify_remove_event "$server_evts" "$REMOVED" "$server4_token" "$client_addr_id"
...@@ -455,8 +500,7 @@ test_remove() ...@@ -455,8 +500,7 @@ test_remove()
client_addr_id=$(( client_addr_id - 1 )) client_addr_id=$(( client_addr_id - 1 ))
ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\
$client_addr_id > /dev/null 2>&1 $client_addr_id > /dev/null 2>&1
stdbuf -o0 -e0 printf "RM_ADDR id:%d ns2 => ns1 \t"\ print_test "RM_ADDR id:${client_addr_id} ns2 => ns1"
$client_addr_id
sleep 0.5 sleep 0.5
verify_remove_event "$server_evts" "$REMOVED" "$server4_token" "$client_addr_id" verify_remove_event "$server_evts" "$REMOVED" "$server4_token" "$client_addr_id"
...@@ -464,8 +508,7 @@ test_remove() ...@@ -464,8 +508,7 @@ test_remove()
:>"$server_evts" :>"$server_evts"
ip netns exec "$ns2" ./pm_nl_ctl rem token "$client6_token" id\ ip netns exec "$ns2" ./pm_nl_ctl rem token "$client6_token" id\
$client_addr_id > /dev/null 2>&1 $client_addr_id > /dev/null 2>&1
stdbuf -o0 -e0 printf "RM_ADDR6 id:%d ns2 => ns1 \t"\ print_test "RM_ADDR6 id:${client_addr_id} ns2 => ns1"
$client_addr_id
sleep 0.5 sleep 0.5
verify_remove_event "$server_evts" "$REMOVED" "$server6_token" "$client_addr_id" verify_remove_event "$server_evts" "$REMOVED" "$server6_token" "$client_addr_id"
...@@ -475,8 +518,7 @@ test_remove() ...@@ -475,8 +518,7 @@ test_remove()
# RM_ADDR from the server to client machine # RM_ADDR from the server to client machine
ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\ ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\
$server_addr_id > /dev/null 2>&1 $server_addr_id > /dev/null 2>&1
stdbuf -o0 -e0 printf "RM_ADDR id:%d ns1 => ns2 \t"\ print_test "RM_ADDR id:${server_addr_id} ns1 => ns2"
$server_addr_id
sleep 0.5 sleep 0.5
verify_remove_event "$client_evts" "$REMOVED" "$client4_token" "$server_addr_id" verify_remove_event "$client_evts" "$REMOVED" "$client4_token" "$server_addr_id"
...@@ -485,7 +527,7 @@ test_remove() ...@@ -485,7 +527,7 @@ test_remove()
server_addr_id=$(( server_addr_id - 1 )) server_addr_id=$(( server_addr_id - 1 ))
ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\ ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\
$server_addr_id > /dev/null 2>&1 $server_addr_id > /dev/null 2>&1
stdbuf -o0 -e0 printf "RM_ADDR id:%d ns1 => ns2 \t" $server_addr_id print_test "RM_ADDR id:${server_addr_id} ns1 => ns2"
sleep 0.5 sleep 0.5
verify_remove_event "$client_evts" "$REMOVED" "$client4_token" "$server_addr_id" verify_remove_event "$client_evts" "$REMOVED" "$client4_token" "$server_addr_id"
...@@ -493,7 +535,7 @@ test_remove() ...@@ -493,7 +535,7 @@ test_remove()
:>"$client_evts" :>"$client_evts"
ip netns exec "$ns1" ./pm_nl_ctl rem token "$server6_token" id\ ip netns exec "$ns1" ./pm_nl_ctl rem token "$server6_token" id\
$server_addr_id > /dev/null 2>&1 $server_addr_id > /dev/null 2>&1
stdbuf -o0 -e0 printf "RM_ADDR6 id:%d ns1 => ns2 \t" $server_addr_id print_test "RM_ADDR6 id:${server_addr_id} ns1 => ns2"
sleep 0.5 sleep 0.5
verify_remove_event "$client_evts" "$REMOVED" "$client6_token" "$server_addr_id" verify_remove_event "$client_evts" "$REMOVED" "$client6_token" "$server_addr_id"
} }
...@@ -520,25 +562,24 @@ verify_subflow_events() ...@@ -520,25 +562,24 @@ verify_subflow_events()
local dport local dport
local locid local locid
local remid local remid
local info
info="${e_saddr} (${e_from}) => ${e_daddr} (${e_to})"
if [ "$e_type" = "$SUB_ESTABLISHED" ] if [ "$e_type" = "$SUB_ESTABLISHED" ]
then then
if [ "$e_family" = "$AF_INET6" ] if [ "$e_family" = "$AF_INET6" ]
then then
stdbuf -o0 -e0 printf "CREATE_SUBFLOW6 %s (%s) => %s (%s) "\ print_test "CREATE_SUBFLOW6 ${info}"
"$e_saddr" "$e_from" "$e_daddr" "$e_to"
else else
stdbuf -o0 -e0 printf "CREATE_SUBFLOW %s (%s) => %s (%s) \t"\ print_test "CREATE_SUBFLOW ${info}"
"$e_saddr" "$e_from" "$e_daddr" "$e_to"
fi fi
else else
if [ "$e_family" = "$AF_INET6" ] if [ "$e_family" = "$AF_INET6" ]
then then
stdbuf -o0 -e0 printf "DESTROY_SUBFLOW6 %s (%s) => %s (%s) "\ print_test "DESTROY_SUBFLOW6 ${info}"
"$e_saddr" "$e_from" "$e_daddr" "$e_to"
else else
stdbuf -o0 -e0 printf "DESTROY_SUBFLOW %s (%s) => %s (%s) \t"\ print_test "DESTROY_SUBFLOW ${info}"
"$e_saddr" "$e_from" "$e_daddr" "$e_to"
fi fi
fi fi
...@@ -809,7 +850,7 @@ test_subflows_v4_v6_mix() ...@@ -809,7 +850,7 @@ test_subflows_v4_v6_mix()
:>"$client_evts" :>"$client_evts"
ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server6_token" id\ ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server6_token" id\
$server_addr_id dev ns1eth2 > /dev/null 2>&1 $server_addr_id dev ns1eth2 > /dev/null 2>&1
stdbuf -o0 -e0 printf "ADD_ADDR4 id:%d 10.0.2.1 (ns1) => ns2, reuse port\t\t" $server_addr_id print_test "ADD_ADDR4 id:${server_addr_id} 10.0.2.1 (ns1) => ns2, reuse port"
sleep 0.5 sleep 0.5
verify_announce_event "$client_evts" "$ANNOUNCED" "$client6_token" "10.0.2.1"\ verify_announce_event "$client_evts" "$ANNOUNCED" "$client6_token" "10.0.2.1"\
"$server_addr_id" "$app6_port" "$server_addr_id" "$app6_port"
...@@ -854,25 +895,23 @@ test_prio() ...@@ -854,25 +895,23 @@ test_prio()
sleep 0.5 sleep 0.5
# Check TX # Check TX
stdbuf -o0 -e0 printf "MP_PRIO TX \t" print_test "MP_PRIO TX"
count=$(ip netns exec "$ns2" nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}') count=$(ip netns exec "$ns2" nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ $count != 1 ]; then if [ $count != 1 ]; then
stdbuf -o0 -e0 printf "[FAIL]\n\tCount != 1: %d\n" "${count}" test_fail "Count != 1: ${count}"
exit 1
else else
stdbuf -o0 -e0 printf "[OK]\n" test_pass
fi fi
# Check RX # Check RX
stdbuf -o0 -e0 printf "MP_PRIO RX \t" print_test "MP_PRIO RX"
count=$(ip netns exec "$ns1" nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}') count=$(ip netns exec "$ns1" nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ $count != 1 ]; then if [ $count != 1 ]; then
stdbuf -o0 -e0 printf "[FAIL]\n\tCount != 1: %d\n" "${count}" test_fail "Count != 1: ${count}"
exit 1
else else
stdbuf -o0 -e0 printf "[OK]\n" test_pass
fi fi
} }
...@@ -889,11 +928,9 @@ verify_listener_events() ...@@ -889,11 +928,9 @@ verify_listener_events()
local sport local sport
if [ $e_type = $LISTENER_CREATED ]; then if [ $e_type = $LISTENER_CREATED ]; then
stdbuf -o0 -e0 printf "CREATE_LISTENER %s:%s\t\t\t\t\t"\ print_test "CREATE_LISTENER $e_saddr:$e_sport"
$e_saddr $e_sport
elif [ $e_type = $LISTENER_CLOSED ]; then elif [ $e_type = $LISTENER_CLOSED ]; then
stdbuf -o0 -e0 printf "CLOSE_LISTENER %s:%s\t\t\t\t\t"\ print_test "CLOSE_LISTENER $e_saddr:$e_sport"
$e_saddr $e_sport
fi fi
type=$(grep "type:$e_type," $evt | type=$(grep "type:$e_type," $evt |
...@@ -918,7 +955,8 @@ test_listener() ...@@ -918,7 +955,8 @@ test_listener()
print_title "Listener tests" print_title "Listener tests"
if ! mptcp_lib_kallsyms_has "mptcp_event_pm_listener$"; then if ! mptcp_lib_kallsyms_has "mptcp_event_pm_listener$"; then
stdbuf -o0 -e0 printf "LISTENER events \t[SKIP] Not supported\n" print_test "LISTENER events"
test_skip
return return
fi fi
...@@ -961,4 +999,5 @@ test_subflows_v4_v6_mix ...@@ -961,4 +999,5 @@ test_subflows_v4_v6_mix
test_prio test_prio
test_listener test_listener
exit 0 mptcp_lib_result_print_all_tap
exit ${ret}
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