18c2ecf20Sopenharmony_ci#!/bin/bash
28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci. "$(dirname "${0}")/mptcp_lib.sh"
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_cirndh=$(printf %x $sec)-$(mktemp -u XXXXXX)
78c2ecf20Sopenharmony_cins="ns1-$rndh"
88c2ecf20Sopenharmony_ciksft_skip=4
98c2ecf20Sopenharmony_citest_cnt=1
108c2ecf20Sopenharmony_ciret=0
118c2ecf20Sopenharmony_cipids=()
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ciflush_pids()
148c2ecf20Sopenharmony_ci{
158c2ecf20Sopenharmony_ci	# mptcp_connect in join mode will sleep a bit before completing,
168c2ecf20Sopenharmony_ci	# give it some time
178c2ecf20Sopenharmony_ci	sleep 1.1
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci	for pid in ${pids[@]}; do
208c2ecf20Sopenharmony_ci		[ -d /proc/$pid ] && kill -SIGUSR1 $pid >/dev/null 2>&1
218c2ecf20Sopenharmony_ci	done
228c2ecf20Sopenharmony_ci	pids=()
238c2ecf20Sopenharmony_ci}
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_cicleanup()
268c2ecf20Sopenharmony_ci{
278c2ecf20Sopenharmony_ci	ip netns del $ns
288c2ecf20Sopenharmony_ci	for pid in ${pids[@]}; do
298c2ecf20Sopenharmony_ci		[ -d /proc/$pid ] && kill -9 $pid >/dev/null 2>&1
308c2ecf20Sopenharmony_ci	done
318c2ecf20Sopenharmony_ci}
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_cimptcp_lib_check_mptcp
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ciip -Version > /dev/null 2>&1
368c2ecf20Sopenharmony_ciif [ $? -ne 0 ];then
378c2ecf20Sopenharmony_ci	echo "SKIP: Could not run test without ip tool"
388c2ecf20Sopenharmony_ci	exit $ksft_skip
398c2ecf20Sopenharmony_cifi
408c2ecf20Sopenharmony_ciss -h | grep -q MPTCP
418c2ecf20Sopenharmony_ciif [ $? -ne 0 ];then
428c2ecf20Sopenharmony_ci	echo "SKIP: ss tool does not support MPTCP"
438c2ecf20Sopenharmony_ci	exit $ksft_skip
448c2ecf20Sopenharmony_cifi
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci__chk_nr()
478c2ecf20Sopenharmony_ci{
488c2ecf20Sopenharmony_ci	local condition="$1"
498c2ecf20Sopenharmony_ci	local expected=$2
508c2ecf20Sopenharmony_ci	local msg nr
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci	shift 2
538c2ecf20Sopenharmony_ci	msg=$*
548c2ecf20Sopenharmony_ci	nr=$(ss -inmHMN $ns | $condition)
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	printf "%-50s" "$msg"
578c2ecf20Sopenharmony_ci	if [ $nr != $expected ]; then
588c2ecf20Sopenharmony_ci		echo "[ fail ] expected $expected found $nr"
598c2ecf20Sopenharmony_ci		ret=$test_cnt
608c2ecf20Sopenharmony_ci	else
618c2ecf20Sopenharmony_ci		echo "[  ok  ]"
628c2ecf20Sopenharmony_ci	fi
638c2ecf20Sopenharmony_ci	test_cnt=$((test_cnt+1))
648c2ecf20Sopenharmony_ci}
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_cichk_msk_nr()
678c2ecf20Sopenharmony_ci{
688c2ecf20Sopenharmony_ci	__chk_nr "grep -c token:" $*
698c2ecf20Sopenharmony_ci}
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_cichk_msk_fallback_nr()
728c2ecf20Sopenharmony_ci{
738c2ecf20Sopenharmony_ci		__chk_nr "grep -c fallback" $*
748c2ecf20Sopenharmony_ci}
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_cichk_msk_remote_key_nr()
778c2ecf20Sopenharmony_ci{
788c2ecf20Sopenharmony_ci		__chk_nr "grep -c remote_key" $*
798c2ecf20Sopenharmony_ci}
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_citrap cleanup EXIT
838c2ecf20Sopenharmony_ciip netns add $ns
848c2ecf20Sopenharmony_ciip -n $ns link set dev lo up
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ciecho "a" | ip netns exec $ns ./mptcp_connect -p 10000 -l 0.0.0.0 -t 100 >/dev/null &
878c2ecf20Sopenharmony_cisleep 0.1
888c2ecf20Sopenharmony_cipids[0]=$!
898c2ecf20Sopenharmony_cichk_msk_nr 0 "no msk on netns creation"
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ciecho "b" | ip netns exec $ns ./mptcp_connect -p 10000 127.0.0.1 -j -t 100 >/dev/null &
928c2ecf20Sopenharmony_cisleep 0.1
938c2ecf20Sopenharmony_cipids[1]=$!
948c2ecf20Sopenharmony_cichk_msk_nr 2 "after MPC handshake "
958c2ecf20Sopenharmony_cichk_msk_remote_key_nr 2 "....chk remote_key"
968c2ecf20Sopenharmony_cichk_msk_fallback_nr 0 "....chk no fallback"
978c2ecf20Sopenharmony_ciflush_pids
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ciecho "a" | ip netns exec $ns ./mptcp_connect -p 10001 -s TCP -l 0.0.0.0 -t 100 >/dev/null &
1018c2ecf20Sopenharmony_cipids[0]=$!
1028c2ecf20Sopenharmony_cisleep 0.1
1038c2ecf20Sopenharmony_ciecho "b" | ip netns exec $ns ./mptcp_connect -p 10001 127.0.0.1 -j -t 100 >/dev/null &
1048c2ecf20Sopenharmony_cipids[1]=$!
1058c2ecf20Sopenharmony_cisleep 0.1
1068c2ecf20Sopenharmony_cichk_msk_fallback_nr 1 "check fallback"
1078c2ecf20Sopenharmony_ciflush_pids
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ciNR_CLIENTS=100
1108c2ecf20Sopenharmony_cifor I in `seq 1 $NR_CLIENTS`; do
1118c2ecf20Sopenharmony_ci	echo "a" | ip netns exec $ns ./mptcp_connect -p $((I+10001)) -l 0.0.0.0 -t 100 -w 10 >/dev/null  &
1128c2ecf20Sopenharmony_ci	pids[$((I*2))]=$!
1138c2ecf20Sopenharmony_cidone
1148c2ecf20Sopenharmony_cisleep 0.1
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_cifor I in `seq 1 $NR_CLIENTS`; do
1178c2ecf20Sopenharmony_ci	echo "b" | ip netns exec $ns ./mptcp_connect -p $((I+10001)) 127.0.0.1 -t 100 -w 10 >/dev/null &
1188c2ecf20Sopenharmony_ci	pids[$((I*2 + 1))]=$!
1198c2ecf20Sopenharmony_cidone
1208c2ecf20Sopenharmony_cisleep 1.5
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_cichk_msk_nr $((NR_CLIENTS*2)) "many msk socket present"
1238c2ecf20Sopenharmony_ciflush_pids
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ciexit $ret
126