Commit 7ba0732c authored by Paolo Abeni's avatar Paolo Abeni

Merge branch 'selftests-mptcp-skip-tests-not-supported-by-old-kernels-part-1'

Matthieu Baerts says:

====================
selftests: mptcp: skip tests not supported by old kernels (part 1)

After a few years of increasing test coverage in the MPTCP selftests, we
realised [1] the last version of the selftests is supposed to run on old
kernels without issues.

Supporting older versions is not that easy for this MPTCP case: these
selftests are often validating the internals by checking packets that
are exchanged, when some MIB counters are incremented after some
actions, how connections are getting opened and closed in some cases,
etc. In other words, it is not limited to the socket interface between
the userspace and the kernelspace. In addition, the current selftests
run a lot of different sub-tests but the TAP13 protocol used in the
selftests don't support sub-tests: in other words, one failure in
sub-tests implies that the whole selftest is seen as failed at the end
because sub-tests are not tracked. It is then important to skip
sub-tests not supported by old kernels.

To minimise the modifications and reduce the complexity to support old
versions, the idea is to look at external signs and skip the whole
selftests or just some sub-tests before starting them.

This first part focuses on marking the different selftests as skipped
if MPTCP is not even supported. That's what is done in patches 2 to 8.
Patch 2/8 introduces a new file (mptcp_lib.sh) to be able to re-use some
helpers in the different selftests. The first MPTCP selftest has been
introduced in v5.6.

Patch 1/8 is a bit different but still linked: it modifies mptcp_join.sh
selftest not to use 'cmp --bytes' which is not supported by the BusyBox
implementation. It is apparently quite common to use BusyBox in CI
environments. This tool is needed for a subtest introduced in v6.1.

Link: https://lore.kernel.org/stable/CA+G9fYtDGpgT4dckXD-y-N92nqUxuvue_7AtDdBcHrbOMsDZLg@mail.gmail.com/ [1]
Link: https://github.com/multipath-tcp/mptcp_net-next/issues/368
====================

Link: https://lore.kernel.org/r/20230528-upstream-net-20230528-mptcp-selftests-support-old-kernels-part-1-v1-0-a32d85577fc6@tessares.netSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 1919b39f 63212608
...@@ -9,7 +9,7 @@ TEST_PROGS := mptcp_connect.sh pm_netlink.sh mptcp_join.sh diag.sh \ ...@@ -9,7 +9,7 @@ TEST_PROGS := mptcp_connect.sh pm_netlink.sh mptcp_join.sh diag.sh \
TEST_GEN_FILES = mptcp_connect pm_nl_ctl mptcp_sockopt mptcp_inq TEST_GEN_FILES = mptcp_connect pm_nl_ctl mptcp_sockopt mptcp_inq
TEST_FILES := settings TEST_FILES := mptcp_lib.sh settings
EXTRA_CLEAN := *.pcap EXTRA_CLEAN := *.pcap
......
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
. "$(dirname "${0}")/mptcp_lib.sh"
sec=$(date +%s) sec=$(date +%s)
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX) rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
ns="ns1-$rndh" ns="ns1-$rndh"
...@@ -31,6 +33,8 @@ cleanup() ...@@ -31,6 +33,8 @@ cleanup()
ip netns del $ns ip netns del $ns
} }
mptcp_lib_check_mptcp
ip -Version > /dev/null 2>&1 ip -Version > /dev/null 2>&1
if [ $? -ne 0 ];then if [ $? -ne 0 ];then
echo "SKIP: Could not run test without ip tool" echo "SKIP: Could not run test without ip tool"
......
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
. "$(dirname "${0}")/mptcp_lib.sh"
time_start=$(date +%s) time_start=$(date +%s)
optstring="S:R:d:e:l:r:h4cm:f:tC" optstring="S:R:d:e:l:r:h4cm:f:tC"
...@@ -141,6 +143,8 @@ cleanup() ...@@ -141,6 +143,8 @@ cleanup()
done done
} }
mptcp_lib_check_mptcp
ip -Version > /dev/null 2>&1 ip -Version > /dev/null 2>&1
if [ $? -ne 0 ];then if [ $? -ne 0 ];then
echo "SKIP: Could not run test without ip tool" echo "SKIP: Could not run test without ip tool"
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
# because it's invoked by variable name, see how the "tests" array is used # because it's invoked by variable name, see how the "tests" array is used
#shellcheck disable=SC2317 #shellcheck disable=SC2317
. "$(dirname "${0}")/mptcp_lib.sh"
ret=0 ret=0
sin="" sin=""
sinfail="" sinfail=""
...@@ -17,6 +19,7 @@ sout="" ...@@ -17,6 +19,7 @@ sout=""
cin="" cin=""
cinfail="" cinfail=""
cinsent="" cinsent=""
tmpfile=""
cout="" cout=""
capout="" capout=""
ns1="" ns1=""
...@@ -136,6 +139,8 @@ cleanup_partial() ...@@ -136,6 +139,8 @@ cleanup_partial()
check_tools() check_tools()
{ {
mptcp_lib_check_mptcp
if ! ip -Version &> /dev/null; then if ! ip -Version &> /dev/null; then
echo "SKIP: Could not run test without ip tool" echo "SKIP: Could not run test without ip tool"
exit $ksft_skip exit $ksft_skip
...@@ -175,6 +180,7 @@ cleanup() ...@@ -175,6 +180,7 @@ cleanup()
{ {
rm -f "$cin" "$cout" "$sinfail" rm -f "$cin" "$cout" "$sinfail"
rm -f "$sin" "$sout" "$cinsent" "$cinfail" rm -f "$sin" "$sout" "$cinsent" "$cinfail"
rm -f "$tmpfile"
rm -rf $evts_ns1 $evts_ns2 rm -rf $evts_ns1 $evts_ns2
cleanup_partial cleanup_partial
} }
...@@ -383,9 +389,16 @@ check_transfer() ...@@ -383,9 +389,16 @@ check_transfer()
fail_test fail_test
return 1 return 1
fi fi
bytes="--bytes=${bytes}"
# note: BusyBox's "cmp" command doesn't support --bytes
tmpfile=$(mktemp)
head --bytes="$bytes" "$in" > "$tmpfile"
mv "$tmpfile" "$in"
head --bytes="$bytes" "$out" > "$tmpfile"
mv "$tmpfile" "$out"
tmpfile=""
fi fi
cmp -l "$in" "$out" ${bytes} | while read -r i a b; do cmp -l "$in" "$out" | while read -r i a b; do
local sum=$((0${a} + 0${b})) local sum=$((0${a} + 0${b}))
if [ $check_invert -eq 0 ] || [ $sum -ne $((0xff)) ]; then if [ $check_invert -eq 0 ] || [ $sum -ne $((0xff)) ]; then
echo "[ FAIL ] $what does not match (in, out):" echo "[ FAIL ] $what does not match (in, out):"
......
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
readonly KSFT_FAIL=1
readonly KSFT_SKIP=4
# 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
# a test is not being skipped by mistake.
mptcp_lib_expect_all_features() {
[ "${SELFTESTS_MPTCP_LIB_EXPECT_ALL_FEATURES:-}" = "1" ]
}
# $1: msg
mptcp_lib_fail_if_expected_feature() {
if mptcp_lib_expect_all_features; then
echo "ERROR: missing feature: ${*}"
exit ${KSFT_FAIL}
fi
return 1
}
# $1: file
mptcp_lib_has_file() {
local f="${1}"
if [ -f "${f}" ]; then
return 0
fi
mptcp_lib_fail_if_expected_feature "${f} file not found"
}
mptcp_lib_check_mptcp() {
if ! mptcp_lib_has_file "/proc/sys/net/mptcp/enabled"; then
echo "SKIP: MPTCP support is not available"
exit ${KSFT_SKIP}
fi
}
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
. "$(dirname "${0}")/mptcp_lib.sh"
ret=0 ret=0
sin="" sin=""
sout="" sout=""
...@@ -84,6 +86,8 @@ cleanup() ...@@ -84,6 +86,8 @@ cleanup()
rm -f "$sin" "$sout" rm -f "$sin" "$sout"
} }
mptcp_lib_check_mptcp
ip -Version > /dev/null 2>&1 ip -Version > /dev/null 2>&1
if [ $? -ne 0 ];then if [ $? -ne 0 ];then
echo "SKIP: Could not run test without ip tool" echo "SKIP: Could not run test without ip tool"
......
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
. "$(dirname "${0}")/mptcp_lib.sh"
ksft_skip=4 ksft_skip=4
ret=0 ret=0
...@@ -34,6 +36,8 @@ cleanup() ...@@ -34,6 +36,8 @@ cleanup()
ip netns del $ns1 ip netns del $ns1
} }
mptcp_lib_check_mptcp
ip -Version > /dev/null 2>&1 ip -Version > /dev/null 2>&1
if [ $? -ne 0 ];then if [ $? -ne 0 ];then
echo "SKIP: Could not run test without ip tool" echo "SKIP: Could not run test without ip tool"
......
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
. "$(dirname "${0}")/mptcp_lib.sh"
sec=$(date +%s) sec=$(date +%s)
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX) rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
ns1="ns1-$rndh" ns1="ns1-$rndh"
...@@ -34,6 +36,8 @@ cleanup() ...@@ -34,6 +36,8 @@ cleanup()
done done
} }
mptcp_lib_check_mptcp
ip -Version > /dev/null 2>&1 ip -Version > /dev/null 2>&1
if [ $? -ne 0 ];then if [ $? -ne 0 ];then
echo "SKIP: Could not run test without ip tool" echo "SKIP: Could not run test without ip tool"
......
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
. "$(dirname "${0}")/mptcp_lib.sh"
mptcp_lib_check_mptcp
ip -Version > /dev/null 2>&1 ip -Version > /dev/null 2>&1
if [ $? -ne 0 ];then if [ $? -ne 0 ];then
echo "SKIP: Cannot not run test without ip tool" echo "SKIP: Cannot not run test without ip tool"
......
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