selftests: mptcp: join: skip check if MIB counter not supported

commit 47867f0a7e upstream.

Selftests are supposed to run on any kernels, including the old ones not
supporting all MPTCP features.

One of them is the MPTCP MIB counters introduced in commit fc518953bc
("mptcp: add and use MIB counter infrastructure") and more later. The
MPTCP Join selftest heavily relies on these counters.

If a counter is not supported by the kernel, it is not displayed when
using 'nstat -z'. We can then detect that and skip the verification. A
new helper (get_counter()) has been added to do the required checks and
return an error if the counter is not available.

Note that if we expect to have these features available and if
SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES env var is set to 1, the tests
will be marked as failed instead of skipped.

This new helper also makes sure we get the exact counter we want to
avoid issues we had in the past, e.g. with MPTcpExtRmAddr and
MPTcpExtRmAddrDrop sharing the same prefix. While at it, we uniform the
way we fetch a MIB counter.

Note for the backports: we rarely change these modified blocks so if
there is are conflicts, it is very likely because a counter is not used
in the older kernels and we don't need that chunk.

Link: https://github.com/multipath-tcp/mptcp_net-next/issues/368
Fixes: b08fbf2410 ("selftests: add test-cases for MPTCP MP_JOIN")
Cc: stable@vger.kernel.org
Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Matthieu Baerts 2023-06-22 15:35:37 +02:00 committed by Greg Kroah-Hartman
parent 64cb73ea77
commit 485f6be254

View File

@ -247,6 +247,22 @@ is_v6()
[ -z "${1##*:*}" ]
}
# $1: ns ; $2: counter
get_counter()
{
local ns="${1}"
local counter="${2}"
local count
count=$(ip netns exec ${ns} nstat -asz "${counter}" | awk 'NR==1 {next} {print $2}')
if [ -z "${count}" ]; then
mptcp_lib_fail_if_expected_feature "${counter} counter"
return 1
fi
echo "${count}"
}
do_transfer()
{
listener_ns="$1"
@ -560,9 +576,10 @@ chk_csum_nr()
echo -n " "
fi
printf " %-36s %s" "$msg" "sum"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != 0 ]; then
count=$(get_counter ${ns1} "MPTcpExtDataCsumErr")
if [ -z "$count" ]; then
echo -n "[skip]"
elif [ "$count" != 0 ]; then
echo "[fail] got $count data checksum error[s] expected 0"
ret=1
dump_stats=1
@ -570,9 +587,10 @@ chk_csum_nr()
echo -n "[ ok ]"
fi
echo -n " - csum "
count=`ip netns exec $ns2 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != 0 ]; then
count=$(get_counter ${ns2} "MPTcpExtDataCsumErr")
if [ -z "$count" ]; then
echo "[skip]"
elif [ "$count" != 0 ]; then
echo "[fail] got $count data checksum error[s] expected 0"
ret=1
dump_stats=1
@ -595,9 +613,10 @@ chk_fail_nr()
local dump_stats
printf "%-39s %s" " " "ftx"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPFailTx | awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$mp_fail_nr_tx" ]; then
count=$(get_counter ${ns1} "MPTcpExtMPFailTx")
if [ -z "$count" ]; then
echo -n "[skip]"
elif [ "$count" != "$mp_fail_nr_tx" ]; then
echo "[fail] got $count MP_FAIL[s] TX expected $mp_fail_nr_tx"
ret=1
dump_stats=1
@ -606,9 +625,10 @@ chk_fail_nr()
fi
echo -n " - frx "
count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPFailRx | awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$mp_fail_nr_rx" ]; then
count=$(get_counter ${ns2} "MPTcpExtMPFailRx")
if [ -z "$count" ]; then
echo "[skip]"
elif [ "$count" != "$mp_fail_nr_rx" ]; then
echo "[fail] got $count MP_FAIL[s] RX expected $mp_fail_nr_rx"
ret=1
dump_stats=1
@ -635,9 +655,10 @@ chk_join_nr()
local with_cookie
printf "%02u %-36s %s" "$TEST_COUNT" "$msg" "syn"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinSynRx | awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$syn_nr" ]; then
count=$(get_counter ${ns1} "MPTcpExtMPJoinSynRx")
if [ -z "$count" ]; then
echo -n "[skip]"
elif [ "$count" != "$syn_nr" ]; then
echo "[fail] got $count JOIN[s] syn expected $syn_nr"
ret=1
dump_stats=1
@ -647,9 +668,10 @@ chk_join_nr()
echo -n " - synack"
with_cookie=`ip netns exec $ns2 sysctl -n net.ipv4.tcp_syncookies`
count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinSynAckRx | awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$syn_ack_nr" ]; then
count=$(get_counter ${ns2} "MPTcpExtMPJoinSynAckRx")
if [ -z "$count" ]; then
echo -n "[skip]"
elif [ "$count" != "$syn_ack_nr" ]; then
# simult connections exceeding the limit with cookie enabled could go up to
# synack validation as the conn limit can be enforced reliably only after
# the subflow creation
@ -665,9 +687,10 @@ chk_join_nr()
fi
echo -n " - ack"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinAckRx | awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$ack_nr" ]; then
count=$(get_counter ${ns1} "MPTcpExtMPJoinAckRx")
if [ -z "$count" ]; then
echo "[skip]"
elif [ "$count" != "$ack_nr" ]; then
echo "[fail] got $count JOIN[s] ack expected $ack_nr"
ret=1
dump_stats=1
@ -702,14 +725,13 @@ chk_stale_nr()
local recover_nr
printf "%-39s %-18s" " " "stale"
stale_nr=`ip netns exec $ns nstat -as | grep MPTcpExtSubflowStale | awk '{print $2}'`
[ -z "$stale_nr" ] && stale_nr=0
recover_nr=`ip netns exec $ns nstat -as | grep MPTcpExtSubflowRecover | awk '{print $2}'`
[ -z "$recover_nr" ] && recover_nr=0
if [ $stale_nr -lt $stale_min ] ||
[ $stale_max -gt 0 -a $stale_nr -gt $stale_max ] ||
[ $((stale_nr - $recover_nr)) -ne $stale_delta ]; then
stale_nr=$(get_counter ${ns} "MPTcpExtSubflowStale")
recover_nr=$(get_counter ${ns} "MPTcpExtSubflowRecover")
if [ -z "$stale_nr" ] || [ -z "$recover_nr" ]; then
echo "[skip]"
elif [ $stale_nr -lt $stale_min ] ||
[ $stale_max -gt 0 -a $stale_nr -gt $stale_max ] ||
[ $((stale_nr - $recover_nr)) -ne $stale_delta ]; then
echo "[fail] got $stale_nr stale[s] $recover_nr recover[s], " \
" expected stale in range [$stale_min..$stale_max]," \
" stale-recover delta $stale_delta "
@ -740,9 +762,10 @@ chk_add_nr()
local dump_stats
printf "%-39s %s" " " "add"
count=`ip netns exec $ns2 nstat -as MPTcpExtAddAddr | grep MPTcpExtAddAddr | awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$add_nr" ]; then
count=$(get_counter ${ns2} "MPTcpExtAddAddr")
if [ -z "$count" ]; then
echo -n "[skip]"
elif [ "$count" != "$add_nr" ]; then
echo "[fail] got $count ADD_ADDR[s] expected $add_nr"
ret=1
dump_stats=1
@ -751,9 +774,10 @@ chk_add_nr()
fi
echo -n " - echo "
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$echo_nr" ]; then
count=$(get_counter ${ns1} "MPTcpExtEchoAdd")
if [ -z "$count" ]; then
echo -n "[skip]"
elif [ "$count" != "$echo_nr" ]; then
echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr"
ret=1
dump_stats=1
@ -763,9 +787,10 @@ chk_add_nr()
if [ $port_nr -gt 0 ]; then
echo -n " - pt "
count=`ip netns exec $ns2 nstat -as | grep MPTcpExtPortAdd | awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$port_nr" ]; then
count=$(get_counter ${ns2} "MPTcpExtPortAdd")
if [ -z "$count" ]; then
echo "[skip]"
elif [ "$count" != "$port_nr" ]; then
echo "[fail] got $count ADD_ADDR[s] with a port-number expected $port_nr"
ret=1
dump_stats=1
@ -774,10 +799,10 @@ chk_add_nr()
fi
printf "%-39s %s" " " "syn"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortSynRx |
awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$syn_nr" ]; then
count=$(get_counter ${ns1} "MPTcpExtMPJoinPortSynRx")
if [ -z "$count" ]; then
echo -n "[skip]"
elif [ "$count" != "$syn_nr" ]; then
echo "[fail] got $count JOIN[s] syn with a different \
port-number expected $syn_nr"
ret=1
@ -787,10 +812,10 @@ chk_add_nr()
fi
echo -n " - synack"
count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinPortSynAckRx |
awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$syn_ack_nr" ]; then
count=$(get_counter ${ns2} "MPTcpExtMPJoinPortSynAckRx")
if [ -z "$count" ]; then
echo -n "[skip]"
elif [ "$count" != "$syn_ack_nr" ]; then
echo "[fail] got $count JOIN[s] synack with a different \
port-number expected $syn_ack_nr"
ret=1
@ -800,10 +825,10 @@ chk_add_nr()
fi
echo -n " - ack"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortAckRx |
awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$ack_nr" ]; then
count=$(get_counter ${ns1} "MPTcpExtMPJoinPortAckRx")
if [ -z "$count" ]; then
echo "[skip]"
elif [ "$count" != "$ack_nr" ]; then
echo "[fail] got $count JOIN[s] ack with a different \
port-number expected $ack_nr"
ret=1
@ -813,10 +838,10 @@ chk_add_nr()
fi
printf "%-39s %s" " " "syn"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortSynRx |
awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$mis_syn_nr" ]; then
count=$(get_counter ${ns1} "MPTcpExtMismatchPortSynRx")
if [ -z "$count" ]; then
echo -n "[skip]"
elif [ "$count" != "$mis_syn_nr" ]; then
echo "[fail] got $count JOIN[s] syn with a mismatched \
port-number expected $mis_syn_nr"
ret=1
@ -826,10 +851,10 @@ chk_add_nr()
fi
echo -n " - ack "
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortAckRx |
awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$mis_ack_nr" ]; then
count=$(get_counter ${ns1} "MPTcpExtMismatchPortAckRx")
if [ -z "$count" ]; then
echo "[skip]"
elif [ "$count" != "$mis_ack_nr" ]; then
echo "[fail] got $count JOIN[s] ack with a mismatched \
port-number expected $mis_ack_nr"
ret=1
@ -868,9 +893,10 @@ chk_rm_nr()
fi
printf "%-39s %s" " " "rm "
count=`ip netns exec $addr_ns nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$rm_addr_nr" ]; then
count=$(get_counter ${addr_ns} "MPTcpExtRmAddr")
if [ -z "$count" ]; then
echo -n "[skip]"
elif [ "$count" != "$rm_addr_nr" ]; then
echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr"
ret=1
dump_stats=1
@ -879,9 +905,10 @@ chk_rm_nr()
fi
echo -n " - sf "
count=`ip netns exec $subflow_ns nstat -as | grep MPTcpExtRmSubflow | awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$rm_subflow_nr" ]; then
count=$(get_counter ${subflow_ns} "MPTcpExtRmSubflow")
if [ -z "$count" ]; then
echo "[skip]"
elif [ "$count" != "$rm_subflow_nr" ]; then
echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr"
ret=1
dump_stats=1
@ -905,9 +932,10 @@ chk_prio_nr()
local dump_stats
printf "%-39s %s" " " "ptx"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$mp_prio_nr_tx" ]; then
count=$(get_counter ${ns1} "MPTcpExtMPPrioTx")
if [ -z "$count" ]; then
echo -n "[skip]"
elif [ "$count" != "$mp_prio_nr_tx" ]; then
echo "[fail] got $count MP_PRIO[s] TX expected $mp_prio_nr_tx"
ret=1
dump_stats=1
@ -916,9 +944,10 @@ chk_prio_nr()
fi
echo -n " - prx "
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}'`
[ -z "$count" ] && count=0
if [ "$count" != "$mp_prio_nr_rx" ]; then
count=$(get_counter ${ns1} "MPTcpExtMPPrioRx")
if [ -z "$count" ]; then
echo "[skip]"
elif [ "$count" != "$mp_prio_nr_rx" ]; then
echo "[fail] got $count MP_PRIO[s] RX expected $mp_prio_nr_rx"
ret=1
dump_stats=1