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