selftests: mptcp: add wrapper for showing addrs
authorGeliang Tang <geliang.tang@suse.com>
Sat, 5 Feb 2022 00:03:33 +0000 (16:03 -0800)
committerJakub Kicinski <kuba@kernel.org>
Sat, 5 Feb 2022 04:30:24 +0000 (20:30 -0800)
This patch implemented a new function named pm_nl_show_endpoints(), wrapped
the PM netlink commands 'ip mptcp endpoint show' and 'pm_nl_ctl dump' in
it, used a new argument 'ip_mptcp' to choose which one to use to show all
the PM endpoints.

Used this wrapper in do_transfer() instead of using the pm_nl_ctl commands
directly.

The original 'pos+=5' in the remoing tests only works for the output of
'pm_nl_ctl show':

  id 1 flags subflow 10.0.1.1

It doesn't work for the output of 'ip mptcp endpoint show':

  10.0.1.1 id 1 subflow

So implemented a more flexible approach to get the address ID from the PM
dump output to fit for both commands.

Signed-off-by: Geliang Tang <geliang.tang@suse.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/testing/selftests/net/mptcp/mptcp_join.sh

index 6ca6ed7..093eb27 100755 (executable)
@@ -365,6 +365,17 @@ pm_nl_flush_endpoint()
        fi
 }
 
+pm_nl_show_endpoints()
+{
+       local ns=$1
+
+       if [ $ip_mptcp -eq 1 ]; then
+               ip -n $ns mptcp endpoint show
+       else
+               ip netns exec $ns ./pm_nl_ctl dump
+       fi
+}
+
 do_transfer()
 {
        listener_ns="$1"
@@ -472,20 +483,25 @@ do_transfer()
        elif [ $addr_nr_ns1 -lt 0 ]; then
                let rm_nr_ns1=-addr_nr_ns1
                if [ $rm_nr_ns1 -lt 8 ]; then
-                       counter=1
-                       pos=1
-                       dump=(`ip netns exec ${listener_ns} ./pm_nl_ctl dump`)
-                       if [ ${#dump[@]} -gt 0 ]; then
-                               while [ $counter -le $rm_nr_ns1 ]
-                               do
-                                       id=${dump[$pos]}
-                                       rm_addr=$(rm_addr_count ${connector_ns})
-                                       pm_nl_del_endpoint ${listener_ns} $id
-                                       wait_rm_addr ${connector_ns} ${rm_addr}
-                                       let counter+=1
-                                       let pos+=5
+                       counter=0
+                       pm_nl_show_endpoints ${listener_ns} | while read line; do
+                               local arr=($line)
+                               local nr=0
+
+                               for i in ${arr[@]}; do
+                                       if [ $i = "id" ]; then
+                                               if [ $counter -eq $rm_nr_ns1 ]; then
+                                                       break
+                                               fi
+                                               id=${arr[$nr+1]}
+                                               rm_addr=$(rm_addr_count ${connector_ns})
+                                               pm_nl_del_endpoint ${listener_ns} $id
+                                               wait_rm_addr ${connector_ns} ${rm_addr}
+                                               let counter+=1
+                                       fi
+                                       let nr+=1
                                done
-                       fi
+                       done
                elif [ $rm_nr_ns1 -eq 8 ]; then
                        pm_nl_flush_endpoint ${listener_ns}
                elif [ $rm_nr_ns1 -eq 9 ]; then
@@ -520,21 +536,27 @@ do_transfer()
        elif [ $addr_nr_ns2 -lt 0 ]; then
                let rm_nr_ns2=-addr_nr_ns2
                if [ $rm_nr_ns2 -lt 8 ]; then
-                       counter=1
-                       pos=1
-                       dump=(`ip netns exec ${connector_ns} ./pm_nl_ctl dump`)
-                       if [ ${#dump[@]} -gt 0 ]; then
-                               while [ $counter -le $rm_nr_ns2 ]
-                               do
-                                       # rm_addr are serialized, allow the previous one to complete
-                                       id=${dump[$pos]}
-                                       rm_addr=$(rm_addr_count ${listener_ns})
-                                       pm_nl_del_endpoint ${connector_ns} $id
-                                       wait_rm_addr ${listener_ns} ${rm_addr}
-                                       let counter+=1
-                                       let pos+=5
+                       counter=0
+                       pm_nl_show_endpoints ${connector_ns} | while read line; do
+                               local arr=($line)
+                               local nr=0
+
+                               for i in ${arr[@]}; do
+                                       if [ $i = "id" ]; then
+                                               if [ $counter -eq $rm_nr_ns2 ]; then
+                                                       break
+                                               fi
+                                               # rm_addr are serialized, allow the previous one to
+                                               # complete
+                                               id=${arr[$nr+1]}
+                                               rm_addr=$(rm_addr_count ${listener_ns})
+                                               pm_nl_del_endpoint ${connector_ns} $id
+                                               wait_rm_addr ${listener_ns} ${rm_addr}
+                                               let counter+=1
+                                       fi
+                                       let nr+=1
                                done
-                       fi
+                       done
                elif [ $rm_nr_ns2 -eq 8 ]; then
                        pm_nl_flush_endpoint ${connector_ns}
                elif [ $rm_nr_ns2 -eq 9 ]; then
@@ -551,7 +573,7 @@ do_transfer()
        if [ ! -z $sflags ]; then
                sleep 1
                for netns in "$ns1" "$ns2"; do
-                       ip netns exec $netns ./pm_nl_ctl dump | while read line; do
+                       pm_nl_show_endpoints $netns | while read line; do
                                local arr=($line)
                                local addr
                                local port=0