selftests: mptcp: listener test for userspace PM
authorGeliang Tang <geliang.tang@suse.com>
Wed, 30 Nov 2022 14:06:31 +0000 (15:06 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 2 Dec 2022 04:06:07 +0000 (20:06 -0800)
This patch adds test coverage for listening sockets created by userspace
processes.

It adds a new test named test_listener() and a new verifying helper
verify_listener_events(). The new output looks like this:

 CREATE_SUBFLOW 10.0.2.2 (ns2) => 10.0.2.1 (ns1)              [OK]
 DESTROY_SUBFLOW 10.0.2.2 (ns2) => 10.0.2.1 (ns1)             [OK]
 MP_PRIO TX                                                   [OK]
 MP_PRIO RX                                                   [OK]
 CREATE_LISTENER 10.0.2.2:37106       [OK]
 CLOSE_LISTENER 10.0.2.2:37106       [OK]

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

index 91d6f30e2fe4e867300da2bd8e71c6de2e289316..a29deb9fa024cd5804e5be81f6b1cfcaa821c00d 100755 (executable)
@@ -11,6 +11,8 @@ ANNOUNCED=6        # MPTCP_EVENT_ANNOUNCED
 REMOVED=7          # MPTCP_EVENT_REMOVED
 SUB_ESTABLISHED=10 # MPTCP_EVENT_SUB_ESTABLISHED
 SUB_CLOSED=11      # MPTCP_EVENT_SUB_CLOSED
+LISTENER_CREATED=15 #MPTCP_EVENT_LISTENER_CREATED
+LISTENER_CLOSED=16  #MPTCP_EVENT_LISTENER_CLOSED
 
 AF_INET=2
 AF_INET6=10
@@ -781,11 +783,85 @@ test_prio()
        fi
 }
 
+verify_listener_events()
+{
+       local evt=$1
+       local e_type=$2
+       local e_family=$3
+       local e_saddr=$4
+       local e_sport=$5
+       local type
+       local family
+       local saddr
+       local sport
+
+       if [ $e_type = $LISTENER_CREATED ]; then
+               stdbuf -o0 -e0 printf "CREATE_LISTENER %s:%s\t\t\t\t\t"\
+                       $e_saddr $e_sport
+       elif [ $e_type = $LISTENER_CLOSED ]; then
+               stdbuf -o0 -e0 printf "CLOSE_LISTENER %s:%s\t\t\t\t\t"\
+                       $e_saddr $e_sport
+       fi
+
+       type=$(grep "type:$e_type," $evt |
+              sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q')
+       family=$(grep "type:$e_type," $evt |
+                sed --unbuffered -n 's/.*\(family:\)\([[:digit:]]*\).*$/\2/p;q')
+       sport=$(grep "type:$e_type," $evt |
+               sed --unbuffered -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q')
+       if [ $family ] && [ $family = $AF_INET6 ]; then
+               saddr=$(grep "type:$e_type," $evt |
+                       sed --unbuffered -n 's/.*\(saddr6:\)\([0-9a-f:.]*\).*$/\2/p;q')
+       else
+               saddr=$(grep "type:$e_type," $evt |
+                       sed --unbuffered -n 's/.*\(saddr4:\)\([0-9.]*\).*$/\2/p;q')
+       fi
+
+       if [ $type ] && [ $type = $e_type ] &&
+          [ $family ] && [ $family = $e_family ] &&
+          [ $saddr ] && [ $saddr = $e_saddr ] &&
+          [ $sport ] && [ $sport = $e_sport ]; then
+               stdbuf -o0 -e0 printf "[OK]\n"
+               return 0
+       fi
+       stdbuf -o0 -e0 printf "[FAIL]\n"
+       exit 1
+}
+
+test_listener()
+{
+       # Capture events on the network namespace running the client
+       :>$client_evts
+
+       # Attempt to add a listener at 10.0.2.2:<subflow-port>
+       ip netns exec $ns2 ./pm_nl_ctl listen 10.0.2.2\
+               $client4_port > /dev/null 2>&1 &
+       local listener_pid=$!
+
+       verify_listener_events $client_evts $LISTENER_CREATED $AF_INET 10.0.2.2 $client4_port
+
+       # ADD_ADDR from client to server machine reusing the subflow port
+       ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id\
+               $client_addr_id > /dev/null 2>&1
+       sleep 0.5
+
+       # CREATE_SUBFLOW from server to client machine
+       ip netns exec $ns1 ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2\
+               rport $client4_port token $server4_token > /dev/null 2>&1
+       sleep 0.5
+
+       # Delete the listener from the client ns, if one was created
+       kill_wait $listener_pid
+
+       verify_listener_events $client_evts $LISTENER_CLOSED $AF_INET 10.0.2.2 $client4_port
+}
+
 make_connection
 make_connection "v6"
 test_announce
 test_remove
 test_subflows
 test_prio
+test_listener
 
 exit 0