selftest: mptcp: add test for mptcp socket in use
authorMenglong Dong <imagedong@tencent.com>
Fri, 6 Jan 2023 18:57:25 +0000 (10:57 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 9 Jan 2023 07:30:50 +0000 (07:30 +0000)
Add the function chk_msk_inuse() to diag.sh, which is used to check the
statistics of mptcp socket in use. As mptcp socket in listen state will
be closed randomly after 'accept', we need to get the count of listening
mptcp socket through 'ss' command.

All tests pass.

Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Menglong Dong <imagedong@tencent.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/net/mptcp/diag.sh

index 24bcd7b..ef628b1 100755 (executable)
@@ -17,6 +17,11 @@ flush_pids()
        sleep 1.1
 
        ip netns pids "${ns}" | xargs --no-run-if-empty kill -SIGUSR1 &>/dev/null
+
+       for _ in $(seq 10); do
+               [ -z "$(ip netns pids "${ns}")" ] && break
+               sleep 0.1
+       done
 }
 
 cleanup()
@@ -37,15 +42,20 @@ if [ $? -ne 0 ];then
        exit $ksft_skip
 fi
 
+get_msk_inuse()
+{
+       ip netns exec $ns cat /proc/net/protocols | awk '$1~/^MPTCP$/{print $3}'
+}
+
 __chk_nr()
 {
-       local condition="$1"
+       local command="$1"
        local expected=$2
        local msg nr
 
        shift 2
        msg=$*
-       nr=$(ss -inmHMN $ns | $condition)
+       nr=$(eval $command)
 
        printf "%-50s" "$msg"
        if [ $nr != $expected ]; then
@@ -57,9 +67,17 @@ __chk_nr()
        test_cnt=$((test_cnt+1))
 }
 
+__chk_msk_nr()
+{
+       local condition=$1
+       shift 1
+
+       __chk_nr "ss -inmHMN $ns | $condition" $*
+}
+
 chk_msk_nr()
 {
-       __chk_nr "grep -c token:" $*
+       __chk_msk_nr "grep -c token:" $*
 }
 
 wait_msk_nr()
@@ -97,12 +115,12 @@ wait_msk_nr()
 
 chk_msk_fallback_nr()
 {
-               __chk_nr "grep -c fallback" $*
+               __chk_msk_nr "grep -c fallback" $*
 }
 
 chk_msk_remote_key_nr()
 {
-               __chk_nr "grep -c remote_key" $*
+               __chk_msk_nr "grep -c remote_key" $*
 }
 
 __chk_listen()
@@ -142,6 +160,26 @@ chk_msk_listen()
        nr=$(ss -Ml $filter | wc -l)
 }
 
+chk_msk_inuse()
+{
+       local expected=$1
+       local listen_nr
+
+       shift 1
+
+       listen_nr=$(ss -N "${ns}" -Ml | grep -c LISTEN)
+       expected=$((expected + listen_nr))
+
+       for _ in $(seq 10); do
+               if [ $(get_msk_inuse) -eq $expected ];then
+                       break
+               fi
+               sleep 0.1
+       done
+
+       __chk_nr get_msk_inuse $expected $*
+}
+
 # $1: ns, $2: port
 wait_local_port_listen()
 {
@@ -195,8 +233,10 @@ wait_connected $ns 10000
 chk_msk_nr 2 "after MPC handshake "
 chk_msk_remote_key_nr 2 "....chk remote_key"
 chk_msk_fallback_nr 0 "....chk no fallback"
+chk_msk_inuse 2 "....chk 2 msk in use"
 flush_pids
 
+chk_msk_inuse 0 "....chk 0 msk in use after flush"
 
 echo "a" | \
        timeout ${timeout_test} \
@@ -211,8 +251,11 @@ echo "b" | \
                                127.0.0.1 >/dev/null &
 wait_connected $ns 10001
 chk_msk_fallback_nr 1 "check fallback"
+chk_msk_inuse 1 "....chk 1 msk in use"
 flush_pids
 
+chk_msk_inuse 0 "....chk 0 msk in use after flush"
+
 NR_CLIENTS=100
 for I in `seq 1 $NR_CLIENTS`; do
        echo "a" | \
@@ -232,6 +275,9 @@ for I in `seq 1 $NR_CLIENTS`; do
 done
 
 wait_msk_nr $((NR_CLIENTS*2)) "many msk socket present"
+chk_msk_inuse $((NR_CLIENTS*2)) "....chk many msk in use"
 flush_pids
 
+chk_msk_inuse 0 "....chk 0 msk in use after flush"
+
 exit $ret