mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-24 03:24:55 +08:00
5888a61cb4
'mptcp_connect' already has a timeout for poll() but in some cases, it is not enough. With "timeout" tool, we will force the command to fail if it doesn't finish on time. Thanks to that, the script will continue and display details about the current state before marking the test as failed. Displaying this state is very important to be able to understand the issue. Best to have our CI reporting the issue than just "the test hanged". Note that in mptcp_connect.sh, we were using a long timeout to validate the fact we cannot create a socket if a sysctl is set. We don't need this timeout. In diag.sh, we want to send signals to mptcp_connect instances that have been started in the netns. But we cannot send this signal to 'timeout' otherwise that will stop the timeout and messages telling us SIGUSR1 has been received will be printed. Instead of trying to find the right PID and storing them in an array, we can simply use the output of 'ip netns pids' which is all the PIDs we want to send signal to. Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/160 Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
137 lines
2.5 KiB
Bash
Executable File
137 lines
2.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
rndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
|
|
ns="ns1-$rndh"
|
|
ksft_skip=4
|
|
test_cnt=1
|
|
timeout_poll=100
|
|
timeout_test=$((timeout_poll * 2 + 1))
|
|
ret=0
|
|
|
|
flush_pids()
|
|
{
|
|
# mptcp_connect in join mode will sleep a bit before completing,
|
|
# give it some time
|
|
sleep 1.1
|
|
|
|
ip netns pids "${ns}" | xargs --no-run-if-empty kill -SIGUSR1 &>/dev/null
|
|
}
|
|
|
|
cleanup()
|
|
{
|
|
ip netns pids "${ns}" | xargs --no-run-if-empty kill -SIGKILL &>/dev/null
|
|
|
|
ip netns del $ns
|
|
}
|
|
|
|
ip -Version > /dev/null 2>&1
|
|
if [ $? -ne 0 ];then
|
|
echo "SKIP: Could not run test without ip tool"
|
|
exit $ksft_skip
|
|
fi
|
|
ss -h | grep -q MPTCP
|
|
if [ $? -ne 0 ];then
|
|
echo "SKIP: ss tool does not support MPTCP"
|
|
exit $ksft_skip
|
|
fi
|
|
|
|
__chk_nr()
|
|
{
|
|
local condition="$1"
|
|
local expected=$2
|
|
local msg nr
|
|
|
|
shift 2
|
|
msg=$*
|
|
nr=$(ss -inmHMN $ns | $condition)
|
|
|
|
printf "%-50s" "$msg"
|
|
if [ $nr != $expected ]; then
|
|
echo "[ fail ] expected $expected found $nr"
|
|
ret=$test_cnt
|
|
else
|
|
echo "[ ok ]"
|
|
fi
|
|
test_cnt=$((test_cnt+1))
|
|
}
|
|
|
|
chk_msk_nr()
|
|
{
|
|
__chk_nr "grep -c token:" $*
|
|
}
|
|
|
|
chk_msk_fallback_nr()
|
|
{
|
|
__chk_nr "grep -c fallback" $*
|
|
}
|
|
|
|
chk_msk_remote_key_nr()
|
|
{
|
|
__chk_nr "grep -c remote_key" $*
|
|
}
|
|
|
|
|
|
trap cleanup EXIT
|
|
ip netns add $ns
|
|
ip -n $ns link set dev lo up
|
|
|
|
echo "a" | \
|
|
timeout ${timeout_test} \
|
|
ip netns exec $ns \
|
|
./mptcp_connect -p 10000 -l -t ${timeout_poll} \
|
|
0.0.0.0 >/dev/null &
|
|
sleep 0.1
|
|
chk_msk_nr 0 "no msk on netns creation"
|
|
|
|
echo "b" | \
|
|
timeout ${timeout_test} \
|
|
ip netns exec $ns \
|
|
./mptcp_connect -p 10000 -j -t ${timeout_poll} \
|
|
127.0.0.1 >/dev/null &
|
|
sleep 0.1
|
|
chk_msk_nr 2 "after MPC handshake "
|
|
chk_msk_remote_key_nr 2 "....chk remote_key"
|
|
chk_msk_fallback_nr 0 "....chk no fallback"
|
|
flush_pids
|
|
|
|
|
|
echo "a" | \
|
|
timeout ${timeout_test} \
|
|
ip netns exec $ns \
|
|
./mptcp_connect -p 10001 -l -s TCP -t ${timeout_poll} \
|
|
0.0.0.0 >/dev/null &
|
|
sleep 0.1
|
|
echo "b" | \
|
|
timeout ${timeout_test} \
|
|
ip netns exec $ns \
|
|
./mptcp_connect -p 10001 -j -t ${timeout_poll} \
|
|
127.0.0.1 >/dev/null &
|
|
sleep 0.1
|
|
chk_msk_fallback_nr 1 "check fallback"
|
|
flush_pids
|
|
|
|
NR_CLIENTS=100
|
|
for I in `seq 1 $NR_CLIENTS`; do
|
|
echo "a" | \
|
|
timeout ${timeout_test} \
|
|
ip netns exec $ns \
|
|
./mptcp_connect -p $((I+10001)) -l -w 10 \
|
|
-t ${timeout_poll} 0.0.0.0 >/dev/null &
|
|
done
|
|
sleep 0.1
|
|
|
|
for I in `seq 1 $NR_CLIENTS`; do
|
|
echo "b" | \
|
|
timeout ${timeout_test} \
|
|
ip netns exec $ns \
|
|
./mptcp_connect -p $((I+10001)) -w 10 \
|
|
-t ${timeout_poll} 127.0.0.1 >/dev/null &
|
|
done
|
|
sleep 1.5
|
|
|
|
chk_msk_nr $((NR_CLIENTS*2)) "many msk socket present"
|
|
flush_pids
|
|
|
|
exit $ret
|