xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/net/mptcp/diag.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun
4*4882a593Smuzhiyunrndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
5*4882a593Smuzhiyunns="ns1-$rndh"
6*4882a593Smuzhiyunksft_skip=4
7*4882a593Smuzhiyuntest_cnt=1
8*4882a593Smuzhiyunret=0
9*4882a593Smuzhiyunpids=()
10*4882a593Smuzhiyun
11*4882a593Smuzhiyunflush_pids()
12*4882a593Smuzhiyun{
13*4882a593Smuzhiyun	# mptcp_connect in join mode will sleep a bit before completing,
14*4882a593Smuzhiyun	# give it some time
15*4882a593Smuzhiyun	sleep 1.1
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun	for pid in ${pids[@]}; do
18*4882a593Smuzhiyun		[ -d /proc/$pid ] && kill -SIGUSR1 $pid >/dev/null 2>&1
19*4882a593Smuzhiyun	done
20*4882a593Smuzhiyun	pids=()
21*4882a593Smuzhiyun}
22*4882a593Smuzhiyun
23*4882a593Smuzhiyuncleanup()
24*4882a593Smuzhiyun{
25*4882a593Smuzhiyun	ip netns del $ns
26*4882a593Smuzhiyun	for pid in ${pids[@]}; do
27*4882a593Smuzhiyun		[ -d /proc/$pid ] && kill -9 $pid >/dev/null 2>&1
28*4882a593Smuzhiyun	done
29*4882a593Smuzhiyun}
30*4882a593Smuzhiyun
31*4882a593Smuzhiyunip -Version > /dev/null 2>&1
32*4882a593Smuzhiyunif [ $? -ne 0 ];then
33*4882a593Smuzhiyun	echo "SKIP: Could not run test without ip tool"
34*4882a593Smuzhiyun	exit $ksft_skip
35*4882a593Smuzhiyunfi
36*4882a593Smuzhiyunss -h | grep -q MPTCP
37*4882a593Smuzhiyunif [ $? -ne 0 ];then
38*4882a593Smuzhiyun	echo "SKIP: ss tool does not support MPTCP"
39*4882a593Smuzhiyun	exit $ksft_skip
40*4882a593Smuzhiyunfi
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun__chk_nr()
43*4882a593Smuzhiyun{
44*4882a593Smuzhiyun	local condition="$1"
45*4882a593Smuzhiyun	local expected=$2
46*4882a593Smuzhiyun	local msg nr
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun	shift 2
49*4882a593Smuzhiyun	msg=$*
50*4882a593Smuzhiyun	nr=$(ss -inmHMN $ns | $condition)
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun	printf "%-50s" "$msg"
53*4882a593Smuzhiyun	if [ $nr != $expected ]; then
54*4882a593Smuzhiyun		echo "[ fail ] expected $expected found $nr"
55*4882a593Smuzhiyun		ret=$test_cnt
56*4882a593Smuzhiyun	else
57*4882a593Smuzhiyun		echo "[  ok  ]"
58*4882a593Smuzhiyun	fi
59*4882a593Smuzhiyun	test_cnt=$((test_cnt+1))
60*4882a593Smuzhiyun}
61*4882a593Smuzhiyun
62*4882a593Smuzhiyunchk_msk_nr()
63*4882a593Smuzhiyun{
64*4882a593Smuzhiyun	__chk_nr "grep -c token:" $*
65*4882a593Smuzhiyun}
66*4882a593Smuzhiyun
67*4882a593Smuzhiyunchk_msk_fallback_nr()
68*4882a593Smuzhiyun{
69*4882a593Smuzhiyun		__chk_nr "grep -c fallback" $*
70*4882a593Smuzhiyun}
71*4882a593Smuzhiyun
72*4882a593Smuzhiyunchk_msk_remote_key_nr()
73*4882a593Smuzhiyun{
74*4882a593Smuzhiyun		__chk_nr "grep -c remote_key" $*
75*4882a593Smuzhiyun}
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun
78*4882a593Smuzhiyuntrap cleanup EXIT
79*4882a593Smuzhiyunip netns add $ns
80*4882a593Smuzhiyunip -n $ns link set dev lo up
81*4882a593Smuzhiyun
82*4882a593Smuzhiyunecho "a" | ip netns exec $ns ./mptcp_connect -p 10000 -l 0.0.0.0 -t 100 >/dev/null &
83*4882a593Smuzhiyunsleep 0.1
84*4882a593Smuzhiyunpids[0]=$!
85*4882a593Smuzhiyunchk_msk_nr 0 "no msk on netns creation"
86*4882a593Smuzhiyun
87*4882a593Smuzhiyunecho "b" | ip netns exec $ns ./mptcp_connect -p 10000 127.0.0.1 -j -t 100 >/dev/null &
88*4882a593Smuzhiyunsleep 0.1
89*4882a593Smuzhiyunpids[1]=$!
90*4882a593Smuzhiyunchk_msk_nr 2 "after MPC handshake "
91*4882a593Smuzhiyunchk_msk_remote_key_nr 2 "....chk remote_key"
92*4882a593Smuzhiyunchk_msk_fallback_nr 0 "....chk no fallback"
93*4882a593Smuzhiyunflush_pids
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun
96*4882a593Smuzhiyunecho "a" | ip netns exec $ns ./mptcp_connect -p 10001 -s TCP -l 0.0.0.0 -t 100 >/dev/null &
97*4882a593Smuzhiyunpids[0]=$!
98*4882a593Smuzhiyunsleep 0.1
99*4882a593Smuzhiyunecho "b" | ip netns exec $ns ./mptcp_connect -p 10001 127.0.0.1 -j -t 100 >/dev/null &
100*4882a593Smuzhiyunpids[1]=$!
101*4882a593Smuzhiyunsleep 0.1
102*4882a593Smuzhiyunchk_msk_fallback_nr 1 "check fallback"
103*4882a593Smuzhiyunflush_pids
104*4882a593Smuzhiyun
105*4882a593SmuzhiyunNR_CLIENTS=100
106*4882a593Smuzhiyunfor I in `seq 1 $NR_CLIENTS`; do
107*4882a593Smuzhiyun	echo "a" | ip netns exec $ns ./mptcp_connect -p $((I+10001)) -l 0.0.0.0 -t 100 -w 10 >/dev/null  &
108*4882a593Smuzhiyun	pids[$((I*2))]=$!
109*4882a593Smuzhiyundone
110*4882a593Smuzhiyunsleep 0.1
111*4882a593Smuzhiyun
112*4882a593Smuzhiyunfor I in `seq 1 $NR_CLIENTS`; do
113*4882a593Smuzhiyun	echo "b" | ip netns exec $ns ./mptcp_connect -p $((I+10001)) 127.0.0.1 -t 100 -w 10 >/dev/null &
114*4882a593Smuzhiyun	pids[$((I*2 + 1))]=$!
115*4882a593Smuzhiyundone
116*4882a593Smuzhiyunsleep 1.5
117*4882a593Smuzhiyun
118*4882a593Smuzhiyunchk_msk_nr $((NR_CLIENTS*2)) "many msk socket present"
119*4882a593Smuzhiyunflush_pids
120*4882a593Smuzhiyun
121*4882a593Smuzhiyunexit $ret
122