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: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Родитель
5cad43a52e
Коммит
327b9a94e2
|
@ -238,6 +238,45 @@ is_v6()
|
|||
[ -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()
|
||||
{
|
||||
listener_ns="$1"
|
||||
|
@ -307,7 +346,7 @@ do_transfer()
|
|||
fi
|
||||
spid=$!
|
||||
|
||||
sleep 1
|
||||
wait_local_port_listen "${listener_ns}" "${port}"
|
||||
|
||||
if [ "$test_link_fail" -eq 0 ];then
|
||||
timeout ${timeout_test} \
|
||||
|
@ -324,10 +363,13 @@ do_transfer()
|
|||
fi
|
||||
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
|
||||
let add_nr_ns1=addr_nr_ns1
|
||||
counter=2
|
||||
sleep 1
|
||||
while [ $add_nr_ns1 -gt 0 ]; do
|
||||
local addr
|
||||
if is_v6 "${connect_addr}"; then
|
||||
|
@ -339,7 +381,6 @@ do_transfer()
|
|||
let counter+=1
|
||||
let add_nr_ns1-=1
|
||||
done
|
||||
sleep 1
|
||||
elif [ $addr_nr_ns1 -lt 0 ]; then
|
||||
let rm_nr_ns1=-addr_nr_ns1
|
||||
if [ $rm_nr_ns1 -lt 8 ]; then
|
||||
|
@ -347,22 +388,19 @@ do_transfer()
|
|||
pos=1
|
||||
dump=(`ip netns exec ${listener_ns} ./pm_nl_ctl dump`)
|
||||
if [ ${#dump[@]} -gt 0 ]; then
|
||||
sleep 1
|
||||
|
||||
while [ $counter -le $rm_nr_ns1 ]
|
||||
do
|
||||
id=${dump[$pos]}
|
||||
rm_addr=$(rm_addr_count ${connector_ns})
|
||||
ip netns exec ${listener_ns} ./pm_nl_ctl del $id
|
||||
sleep 1
|
||||
wait_rm_addr ${connector_ns} ${rm_addr}
|
||||
let counter+=1
|
||||
let pos+=5
|
||||
done
|
||||
fi
|
||||
elif [ $rm_nr_ns1 -eq 8 ]; then
|
||||
sleep 1
|
||||
ip netns exec ${listener_ns} ./pm_nl_ctl flush
|
||||
elif [ $rm_nr_ns1 -eq 9 ]; then
|
||||
sleep 1
|
||||
ip netns exec ${listener_ns} ./pm_nl_ctl del 0 ${connect_addr}
|
||||
fi
|
||||
fi
|
||||
|
@ -373,10 +411,13 @@ do_transfer()
|
|||
addr_nr_ns2=${addr_nr_ns2:9}
|
||||
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
|
||||
let add_nr_ns2=addr_nr_ns2
|
||||
counter=3
|
||||
sleep 1
|
||||
while [ $add_nr_ns2 -gt 0 ]; do
|
||||
local addr
|
||||
if is_v6 "${connect_addr}"; then
|
||||
|
@ -388,7 +429,6 @@ do_transfer()
|
|||
let counter+=1
|
||||
let add_nr_ns2-=1
|
||||
done
|
||||
sleep 1
|
||||
elif [ $addr_nr_ns2 -lt 0 ]; then
|
||||
let rm_nr_ns2=-addr_nr_ns2
|
||||
if [ $rm_nr_ns2 -lt 8 ]; then
|
||||
|
@ -396,19 +436,18 @@ do_transfer()
|
|||
pos=1
|
||||
dump=(`ip netns exec ${connector_ns} ./pm_nl_ctl dump`)
|
||||
if [ ${#dump[@]} -gt 0 ]; then
|
||||
sleep 1
|
||||
|
||||
while [ $counter -le $rm_nr_ns2 ]
|
||||
do
|
||||
# rm_addr are serialized, allow the previous one to complete
|
||||
id=${dump[$pos]}
|
||||
rm_addr=$(rm_addr_count ${listener_ns})
|
||||
ip netns exec ${connector_ns} ./pm_nl_ctl del $id
|
||||
sleep 1
|
||||
wait_rm_addr ${listener_ns} ${rm_addr}
|
||||
let counter+=1
|
||||
let pos+=5
|
||||
done
|
||||
fi
|
||||
elif [ $rm_nr_ns2 -eq 8 ]; then
|
||||
sleep 1
|
||||
ip netns exec ${connector_ns} ./pm_nl_ctl flush
|
||||
elif [ $rm_nr_ns2 -eq 9 ]; then
|
||||
local addr
|
||||
|
@ -417,7 +456,6 @@ do_transfer()
|
|||
else
|
||||
addr="10.0.1.2"
|
||||
fi
|
||||
sleep 1
|
||||
ip netns exec ${connector_ns} ./pm_nl_ctl del 0 $addr
|
||||
fi
|
||||
fi
|
||||
|
@ -539,6 +577,14 @@ run_tests()
|
|||
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()
|
||||
{
|
||||
local msg=${1:-""}
|
||||
|
@ -570,12 +616,7 @@ chk_csum_nr()
|
|||
else
|
||||
echo "[ ok ]"
|
||||
fi
|
||||
if [ "${dump_stats}" = 1 ]; then
|
||||
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
|
||||
[ "${dump_stats}" = 1 ] && dump_stats
|
||||
}
|
||||
|
||||
chk_fail_nr()
|
||||
|
@ -607,12 +648,7 @@ chk_fail_nr()
|
|||
echo "[ ok ]"
|
||||
fi
|
||||
|
||||
if [ "${dump_stats}" = 1 ]; then
|
||||
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
|
||||
[ "${dump_stats}" = 1 ] && dump_stats
|
||||
}
|
||||
|
||||
chk_join_nr()
|
||||
|
@ -656,12 +692,7 @@ chk_join_nr()
|
|||
else
|
||||
echo "[ ok ]"
|
||||
fi
|
||||
if [ "${dump_stats}" = 1 ]; then
|
||||
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
|
||||
[ "${dump_stats}" = 1 ] && dump_stats
|
||||
if [ $checksum -eq 1 ]; then
|
||||
chk_csum_nr
|
||||
chk_fail_nr 0 0
|
||||
|
@ -823,12 +854,7 @@ chk_add_nr()
|
|||
echo ""
|
||||
fi
|
||||
|
||||
if [ "${dump_stats}" = 1 ]; then
|
||||
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
|
||||
[ "${dump_stats}" = 1 ] && dump_stats
|
||||
}
|
||||
|
||||
chk_rm_nr()
|
||||
|
@ -871,12 +897,7 @@ chk_rm_nr()
|
|||
echo "[ ok ]"
|
||||
fi
|
||||
|
||||
if [ "${dump_stats}" = 1 ]; then
|
||||
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
|
||||
[ "${dump_stats}" = 1 ] && dump_stats
|
||||
}
|
||||
|
||||
chk_prio_nr()
|
||||
|
@ -908,12 +929,7 @@ chk_prio_nr()
|
|||
echo "[ ok ]"
|
||||
fi
|
||||
|
||||
if [ "${dump_stats}" = 1 ]; then
|
||||
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
|
||||
[ "${dump_stats}" = 1 ] && dump_stats
|
||||
}
|
||||
|
||||
chk_link_usage()
|
||||
|
@ -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 add 10.0.3.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_add_nr 1 1
|
||||
chk_rm_nr 2 2
|
||||
|
|
Загрузка…
Ссылка в новой задаче