Commit 327b9a94 authored by Paolo Abeni's avatar Paolo Abeni Committed by Jakub Kicinski

selftests: mptcp: more stable join tests-cases

MPTCP join self-tests are a bit fragile as they reply on
delays instead of events to catch-up with the expected
sockets states.

Replace the delay with state checking where possible and
reduce the number of sleeps in the most complex scenarios.

This will both reduce the tests run-time and will improve
stability.
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 5cad43a5
...@@ -238,6 +238,45 @@ is_v6() ...@@ -238,6 +238,45 @@ is_v6()
[ -z "${1##*:*}" ] [ -z "${1##*:*}" ]
} }
# $1: ns, $2: port
wait_local_port_listen()
{
local listener_ns="${1}"
local port="${2}"
local port_hex i
port_hex="$(printf "%04X" "${port}")"
for i in $(seq 10); do
ip netns exec "${listener_ns}" cat /proc/net/tcp* | \
awk "BEGIN {rc=1} {if (\$2 ~ /:${port_hex}\$/ && \$4 ~ /0A/) {rc=0; exit}} END {exit rc}" &&
break
sleep 0.1
done
}
rm_addr_count()
{
ns=${1}
ip netns exec ${ns} nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'
}
# $1: ns, $2: old rm_addr counter in $ns
wait_rm_addr()
{
local ns="${1}"
local old_cnt="${2}"
local cnt
local i
for i in $(seq 10); do
cnt=$(rm_addr_count ${ns})
[ "$cnt" = "${old_cnt}" ] || break
sleep 0.1
done
}
do_transfer() do_transfer()
{ {
listener_ns="$1" listener_ns="$1"
...@@ -307,7 +346,7 @@ do_transfer() ...@@ -307,7 +346,7 @@ do_transfer()
fi fi
spid=$! spid=$!
sleep 1 wait_local_port_listen "${listener_ns}" "${port}"
if [ "$test_link_fail" -eq 0 ];then if [ "$test_link_fail" -eq 0 ];then
timeout ${timeout_test} \ timeout ${timeout_test} \
...@@ -324,10 +363,13 @@ do_transfer() ...@@ -324,10 +363,13 @@ do_transfer()
fi fi
cpid=$! cpid=$!
# let the mptcp subflow be established in background before
# do endpoint manipulation
[ $addr_nr_ns1 = "0" -a $addr_nr_ns2 = "0" ] || sleep 1
if [ $addr_nr_ns1 -gt 0 ]; then if [ $addr_nr_ns1 -gt 0 ]; then
let add_nr_ns1=addr_nr_ns1 let add_nr_ns1=addr_nr_ns1
counter=2 counter=2
sleep 1
while [ $add_nr_ns1 -gt 0 ]; do while [ $add_nr_ns1 -gt 0 ]; do
local addr local addr
if is_v6 "${connect_addr}"; then if is_v6 "${connect_addr}"; then
...@@ -339,7 +381,6 @@ do_transfer() ...@@ -339,7 +381,6 @@ do_transfer()
let counter+=1 let counter+=1
let add_nr_ns1-=1 let add_nr_ns1-=1
done done
sleep 1
elif [ $addr_nr_ns1 -lt 0 ]; then elif [ $addr_nr_ns1 -lt 0 ]; then
let rm_nr_ns1=-addr_nr_ns1 let rm_nr_ns1=-addr_nr_ns1
if [ $rm_nr_ns1 -lt 8 ]; then if [ $rm_nr_ns1 -lt 8 ]; then
...@@ -347,22 +388,19 @@ do_transfer() ...@@ -347,22 +388,19 @@ do_transfer()
pos=1 pos=1
dump=(`ip netns exec ${listener_ns} ./pm_nl_ctl dump`) dump=(`ip netns exec ${listener_ns} ./pm_nl_ctl dump`)
if [ ${#dump[@]} -gt 0 ]; then if [ ${#dump[@]} -gt 0 ]; then
sleep 1
while [ $counter -le $rm_nr_ns1 ] while [ $counter -le $rm_nr_ns1 ]
do do
id=${dump[$pos]} id=${dump[$pos]}
rm_addr=$(rm_addr_count ${connector_ns})
ip netns exec ${listener_ns} ./pm_nl_ctl del $id ip netns exec ${listener_ns} ./pm_nl_ctl del $id
sleep 1 wait_rm_addr ${connector_ns} ${rm_addr}
let counter+=1 let counter+=1
let pos+=5 let pos+=5
done done
fi fi
elif [ $rm_nr_ns1 -eq 8 ]; then elif [ $rm_nr_ns1 -eq 8 ]; then
sleep 1
ip netns exec ${listener_ns} ./pm_nl_ctl flush ip netns exec ${listener_ns} ./pm_nl_ctl flush
elif [ $rm_nr_ns1 -eq 9 ]; then elif [ $rm_nr_ns1 -eq 9 ]; then
sleep 1
ip netns exec ${listener_ns} ./pm_nl_ctl del 0 ${connect_addr} ip netns exec ${listener_ns} ./pm_nl_ctl del 0 ${connect_addr}
fi fi
fi fi
...@@ -373,10 +411,13 @@ do_transfer() ...@@ -373,10 +411,13 @@ do_transfer()
addr_nr_ns2=${addr_nr_ns2:9} addr_nr_ns2=${addr_nr_ns2:9}
fi fi
# if newly added endpoints must be deleted, give the background msk
# some time to created them
[ $addr_nr_ns1 -gt 0 -a $addr_nr_ns2 -lt 0 ] && sleep 1
if [ $addr_nr_ns2 -gt 0 ]; then if [ $addr_nr_ns2 -gt 0 ]; then
let add_nr_ns2=addr_nr_ns2 let add_nr_ns2=addr_nr_ns2
counter=3 counter=3
sleep 1
while [ $add_nr_ns2 -gt 0 ]; do while [ $add_nr_ns2 -gt 0 ]; do
local addr local addr
if is_v6 "${connect_addr}"; then if is_v6 "${connect_addr}"; then
...@@ -388,7 +429,6 @@ do_transfer() ...@@ -388,7 +429,6 @@ do_transfer()
let counter+=1 let counter+=1
let add_nr_ns2-=1 let add_nr_ns2-=1
done done
sleep 1
elif [ $addr_nr_ns2 -lt 0 ]; then elif [ $addr_nr_ns2 -lt 0 ]; then
let rm_nr_ns2=-addr_nr_ns2 let rm_nr_ns2=-addr_nr_ns2
if [ $rm_nr_ns2 -lt 8 ]; then if [ $rm_nr_ns2 -lt 8 ]; then
...@@ -396,19 +436,18 @@ do_transfer() ...@@ -396,19 +436,18 @@ do_transfer()
pos=1 pos=1
dump=(`ip netns exec ${connector_ns} ./pm_nl_ctl dump`) dump=(`ip netns exec ${connector_ns} ./pm_nl_ctl dump`)
if [ ${#dump[@]} -gt 0 ]; then if [ ${#dump[@]} -gt 0 ]; then
sleep 1
while [ $counter -le $rm_nr_ns2 ] while [ $counter -le $rm_nr_ns2 ]
do do
# rm_addr are serialized, allow the previous one to complete
id=${dump[$pos]} id=${dump[$pos]}
rm_addr=$(rm_addr_count ${listener_ns})
ip netns exec ${connector_ns} ./pm_nl_ctl del $id ip netns exec ${connector_ns} ./pm_nl_ctl del $id
sleep 1 wait_rm_addr ${listener_ns} ${rm_addr}
let counter+=1 let counter+=1
let pos+=5 let pos+=5
done done
fi fi
elif [ $rm_nr_ns2 -eq 8 ]; then elif [ $rm_nr_ns2 -eq 8 ]; then
sleep 1
ip netns exec ${connector_ns} ./pm_nl_ctl flush ip netns exec ${connector_ns} ./pm_nl_ctl flush
elif [ $rm_nr_ns2 -eq 9 ]; then elif [ $rm_nr_ns2 -eq 9 ]; then
local addr local addr
...@@ -417,7 +456,6 @@ do_transfer() ...@@ -417,7 +456,6 @@ do_transfer()
else else
addr="10.0.1.2" addr="10.0.1.2"
fi fi
sleep 1
ip netns exec ${connector_ns} ./pm_nl_ctl del 0 $addr ip netns exec ${connector_ns} ./pm_nl_ctl del 0 $addr
fi fi
fi fi
...@@ -539,6 +577,14 @@ run_tests() ...@@ -539,6 +577,14 @@ run_tests()
lret=$? lret=$?
} }
dump_stats()
{
echo Server ns stats
ip netns exec $ns1 nstat -as | grep Tcp
echo Client ns stats
ip netns exec $ns2 nstat -as | grep Tcp
}
chk_csum_nr() chk_csum_nr()
{ {
local msg=${1:-""} local msg=${1:-""}
...@@ -570,12 +616,7 @@ chk_csum_nr() ...@@ -570,12 +616,7 @@ chk_csum_nr()
else else
echo "[ ok ]" echo "[ ok ]"
fi fi
if [ "${dump_stats}" = 1 ]; then [ "${dump_stats}" = 1 ] && dump_stats
echo Server ns stats
ip netns exec $ns1 nstat -as | grep MPTcp
echo Client ns stats
ip netns exec $ns2 nstat -as | grep MPTcp
fi
} }
chk_fail_nr() chk_fail_nr()
...@@ -607,12 +648,7 @@ chk_fail_nr() ...@@ -607,12 +648,7 @@ chk_fail_nr()
echo "[ ok ]" echo "[ ok ]"
fi fi
if [ "${dump_stats}" = 1 ]; then [ "${dump_stats}" = 1 ] && dump_stats
echo Server ns stats
ip netns exec $ns1 nstat -as | grep MPTcp
echo Client ns stats
ip netns exec $ns2 nstat -as | grep MPTcp
fi
} }
chk_join_nr() chk_join_nr()
...@@ -656,12 +692,7 @@ chk_join_nr() ...@@ -656,12 +692,7 @@ chk_join_nr()
else else
echo "[ ok ]" echo "[ ok ]"
fi fi
if [ "${dump_stats}" = 1 ]; then [ "${dump_stats}" = 1 ] && dump_stats
echo Server ns stats
ip netns exec $ns1 nstat -as | grep MPTcp
echo Client ns stats
ip netns exec $ns2 nstat -as | grep MPTcp
fi
if [ $checksum -eq 1 ]; then if [ $checksum -eq 1 ]; then
chk_csum_nr chk_csum_nr
chk_fail_nr 0 0 chk_fail_nr 0 0
...@@ -823,12 +854,7 @@ chk_add_nr() ...@@ -823,12 +854,7 @@ chk_add_nr()
echo "" echo ""
fi fi
if [ "${dump_stats}" = 1 ]; then [ "${dump_stats}" = 1 ] && dump_stats
echo Server ns stats
ip netns exec $ns1 nstat -as | grep MPTcp
echo Client ns stats
ip netns exec $ns2 nstat -as | grep MPTcp
fi
} }
chk_rm_nr() chk_rm_nr()
...@@ -871,12 +897,7 @@ chk_rm_nr() ...@@ -871,12 +897,7 @@ chk_rm_nr()
echo "[ ok ]" echo "[ ok ]"
fi fi
if [ "${dump_stats}" = 1 ]; then [ "${dump_stats}" = 1 ] && dump_stats
echo Server ns stats
ip netns exec $ns1 nstat -as | grep MPTcp
echo Client ns stats
ip netns exec $ns2 nstat -as | grep MPTcp
fi
} }
chk_prio_nr() chk_prio_nr()
...@@ -908,12 +929,7 @@ chk_prio_nr() ...@@ -908,12 +929,7 @@ chk_prio_nr()
echo "[ ok ]" echo "[ ok ]"
fi fi
if [ "${dump_stats}" = 1 ]; then [ "${dump_stats}" = 1 ] && dump_stats
echo Server ns stats
ip netns exec $ns1 nstat -as | grep MPTcp
echo Client ns stats
ip netns exec $ns2 nstat -as | grep MPTcp
fi
} }
chk_link_usage() chk_link_usage()
...@@ -1651,7 +1667,7 @@ add_addr_ports_tests() ...@@ -1651,7 +1667,7 @@ add_addr_ports_tests()
ip netns exec $ns2 ./pm_nl_ctl limits 1 3 ip netns exec $ns2 ./pm_nl_ctl limits 1 3
ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow run_tests $ns1 $ns2 10.0.1.1 0 -8 -2 slow
chk_join_nr "flush subflows and signal with port" 3 3 3 chk_join_nr "flush subflows and signal with port" 3 3 3
chk_add_nr 1 1 chk_add_nr 1 1
chk_rm_nr 2 2 chk_rm_nr 2 2
......
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