mptcp_connect=""
 capture=0
 checksum=0
+ip_mptcp=0
 do_all_tests=1
 
 TEST_COUNT=0
        done
 }
 
+pm_nl_set_limits()
+{
+       local ns=$1
+       local addrs=$2
+       local subflows=$3
+
+       if [ $ip_mptcp -eq 1 ]; then
+               ip -n $ns mptcp limits set add_addr_accepted $addrs subflows $subflows
+       else
+               ip netns exec $ns ./pm_nl_ctl limits $addrs $subflows
+       fi
+}
+
+pm_nl_add_endpoint()
+{
+       local ns=$1
+       local addr=$2
+       local flags
+       local port
+       local dev
+       local id
+       local nr=2
+
+       for p in $@
+       do
+               if [ $p = "flags" ]; then
+                       eval _flags=\$"$nr"
+                       [ ! -z $_flags ]; flags="flags $_flags"
+               fi
+               if [ $p = "dev" ]; then
+                       eval _dev=\$"$nr"
+                       [ ! -z $_dev ]; dev="dev $_dev"
+               fi
+               if [ $p = "id" ]; then
+                       eval _id=\$"$nr"
+                       [ ! -z $_id ]; id="id $_id"
+               fi
+               if [ $p = "port" ]; then
+                       eval _port=\$"$nr"
+                       [ ! -z $_port ]; port="port $_port"
+               fi
+
+               let nr+=1
+       done
+
+       if [ $ip_mptcp -eq 1 ]; then
+               ip -n $ns mptcp endpoint add $addr ${_flags//","/" "} $dev $id $port
+       else
+               ip netns exec $ns ./pm_nl_ctl add $addr $flags $dev $id $port
+       fi
+}
+
+pm_nl_del_endpoint()
+{
+       local ns=$1
+       local id=$2
+       local addr=$3
+
+       if [ $ip_mptcp -eq 1 ]; then
+               ip -n $ns mptcp endpoint delete id $id $addr
+       else
+               ip netns exec $ns ./pm_nl_ctl del $id $addr
+       fi
+}
+
+pm_nl_flush_endpoint()
+{
+       local ns=$1
+
+       if [ $ip_mptcp -eq 1 ]; then
+               ip -n $ns mptcp endpoint flush
+       else
+               ip netns exec $ns ./pm_nl_ctl flush
+       fi
+}
+
 do_transfer()
 {
        listener_ns="$1"
                        else
                                addr="10.0.$counter.1"
                        fi
-                       ip netns exec $ns1 ./pm_nl_ctl add $addr flags signal
+                       pm_nl_add_endpoint $ns1 $addr flags signal
                        let counter+=1
                        let add_nr_ns1-=1
                done
                                do
                                        id=${dump[$pos]}
                                        rm_addr=$(rm_addr_count ${connector_ns})
-                                       ip netns exec ${listener_ns} ./pm_nl_ctl del $id
+                                       pm_nl_del_endpoint ${listener_ns} $id
                                        wait_rm_addr ${connector_ns} ${rm_addr}
                                        let counter+=1
                                        let pos+=5
                                done
                        fi
                elif [ $rm_nr_ns1 -eq 8 ]; then
-                       ip netns exec ${listener_ns} ./pm_nl_ctl flush
+                       pm_nl_flush_endpoint ${listener_ns}
                elif [ $rm_nr_ns1 -eq 9 ]; then
-                       ip netns exec ${listener_ns} ./pm_nl_ctl del 0 ${connect_addr}
+                       pm_nl_del_endpoint ${listener_ns} 0 ${connect_addr}
                fi
        fi
 
                        else
                                addr="10.0.$counter.2"
                        fi
-                       ip netns exec $ns2 ./pm_nl_ctl add $addr flags $flags
+                       pm_nl_add_endpoint $ns2 $addr flags $flags
                        let counter+=1
                        let add_nr_ns2-=1
                done
                                        # rm_addr are serialized, allow the previous one to complete
                                        id=${dump[$pos]}
                                        rm_addr=$(rm_addr_count ${listener_ns})
-                                       ip netns exec ${connector_ns} ./pm_nl_ctl del $id
+                                       pm_nl_del_endpoint ${connector_ns} $id
                                        wait_rm_addr ${listener_ns} ${rm_addr}
                                        let counter+=1
                                        let pos+=5
                                done
                        fi
                elif [ $rm_nr_ns2 -eq 8 ]; then
-                       ip netns exec ${connector_ns} ./pm_nl_ctl flush
+                       pm_nl_flush_endpoint ${connector_ns}
                elif [ $rm_nr_ns2 -eq 9 ]; then
                        local addr
                        if is_v6 "${connect_addr}"; then
                        else
                                addr="10.0.1.2"
                        fi
-                       ip netns exec ${connector_ns} ./pm_nl_ctl del 0 $addr
+                       pm_nl_del_endpoint ${connector_ns} 0 $addr
                fi
        fi
 
 
        # subflow limited by client
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 0
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 0
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 0 0
+       pm_nl_set_limits $ns2 0 0
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "single subflow, limited by client" 0 0 0
 
        # subflow limited by server
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 0
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 0 0
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "single subflow, limited by server" 1 1 0
 
        # subflow
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "single subflow" 1 1 1
 
        # multiple subflows
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_set_limits $ns2 0 2
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "multiple subflows" 2 2 2
 
        # multiple subflows limited by server
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 2
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "multiple subflows, limited by server" 2 2 1
 
        # single subflow, dev
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow dev ns2eth3
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow dev ns2eth3
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "single subflow, dev" 1 1 1
 }
        # If a single subflow is configured, and matches the MPC src
        # address, no additional subflow should be created
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.1.2 flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
        chk_join_nr "no MPC reuse with single endpoint" 0 0 0
 
        # multiple subflows, with subflow creation error
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_set_limits $ns2 0 2
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
        ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT
        run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
        chk_join_nr "multi subflows, with failing subflow" 1 1 1
 
        # multiple subflows, with subflow timeout on MPJ
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_set_limits $ns2 0 2
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
        ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j DROP
        run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
        chk_join_nr "multi subflows, with subflow timeout" 1 1 1
        # closed subflow (due to reset) is not reused if additional
        # subflows are added later
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT
        run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow &
 
 
        # mpj subflow will be in TW after the reset
        wait_for_tw $ns2
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
        wait
 
        # additional subflow could be created only if the PM select
 {
        # add_address, unused
        reset
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "unused signal address" 0 0 0
        chk_add_nr 1 1
 
        # accept and use add_addr
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 1 1
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "signal address" 1 1 1
        chk_add_nr 1 1
        # belong to different subnets or one of the listed local address could be
        # used for 'add_addr' subflow
        reset
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 2
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_set_limits $ns2 1 2
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "subflow and signal" 2 2 2
        chk_add_nr 1 1
 
        # accept and use add_addr with additional subflows
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 3
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 3
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
+       pm_nl_set_limits $ns1 0 3
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_set_limits $ns2 1 3
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "multiple subflows and signal" 3 3 3
        chk_add_nr 1 1
 
        # signal addresses
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 3 3
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 3 3
+       pm_nl_set_limits $ns1 3 3
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
+       pm_nl_set_limits $ns2 3 3
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "signal addresses" 3 3 3
        chk_add_nr 3 3
 
        # signal invalid addresses
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 3 3
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 3 3
+       pm_nl_set_limits $ns1 3 3
+       pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
+       pm_nl_set_limits $ns2 3 3
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "signal invalid addresses" 1 1 1
        chk_add_nr 3 3
 
        # signal addresses race test
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 4 4
-       ip netns exec $ns2 ./pm_nl_ctl limits 4 4
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.1.2 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags signal
+       pm_nl_set_limits $ns1 4 4
+       pm_nl_set_limits $ns2 4 4
+       pm_nl_add_endpoint $ns1 10.0.1.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
+       pm_nl_add_endpoint $ns2 10.0.1.2 flags signal
+       pm_nl_add_endpoint $ns2 10.0.2.2 flags signal
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags signal
+       pm_nl_add_endpoint $ns2 10.0.4.2 flags signal
        run_tests $ns1 $ns2 10.0.1.1
 
        # the server will not signal the address terminating
        # active backup and link switch-over.
        # Let's set some arbitrary (low) virtual link limits.
        init_shapers
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 3
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 dev ns1eth2 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 3
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 dev ns2eth3 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 dev ns2eth4 flags subflow
+       pm_nl_set_limits $ns1 0 3
+       pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
+       pm_nl_set_limits $ns2 1 3
+       pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
        run_tests $ns1 $ns2 10.0.1.1 1
        chk_join_nr "multiple flows, signal, link failure" 3 3 3
        chk_add_nr 1 1
        # for bidirectional transfer
        reset
        init_shapers
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 3
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 dev ns1eth2 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 3
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 dev ns2eth3 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 dev ns2eth4 flags subflow
+       pm_nl_set_limits $ns1 0 3
+       pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
+       pm_nl_set_limits $ns2 1 3
+       pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
        run_tests $ns1 $ns2 10.0.1.1 2
        chk_join_nr "multi flows, signal, bidi, link fail" 3 3 3
        chk_add_nr 1 1
        # will never be used
        reset
        init_shapers
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 dev ns1eth2 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 2
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
+       pm_nl_set_limits $ns2 1 2
        export FAILING_LINKS="1"
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 dev ns2eth3 flags subflow,backup
+       pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
        run_tests $ns1 $ns2 10.0.1.1 1
        chk_join_nr "backup subflow unused, link failure" 2 2 2
        chk_add_nr 1 1
        # the traffic
        reset
        init_shapers
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 dev ns1eth2 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 2
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 dev ns2eth3 flags subflow,backup
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
+       pm_nl_set_limits $ns2 1 2
+       pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
        export FAILING_LINKS="1 2"
        run_tests $ns1 $ns2 10.0.1.1 1
        chk_join_nr "backup flow used, multi links fail" 2 2 2
        # for bidirectional transfer
        reset
        init_shapers
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 dev ns1eth2 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 3
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 dev ns2eth3 flags subflow,backup
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
+       pm_nl_set_limits $ns2 1 3
+       pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
        run_tests $ns1 $ns2 10.0.1.1 2
        chk_join_nr "backup flow used, bidi, link failure" 2 2 2
        chk_add_nr 1 1
 {
        # add_addr timeout
        reset_with_add_addr_timeout
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 1 1
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
        run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
        chk_join_nr "signal address, ADD_ADDR timeout" 1 1 1
        chk_add_nr 4 0
 
        # add_addr timeout IPv6
        reset_with_add_addr_timeout 6
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 1 1
+       pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
        run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
        chk_join_nr "signal address, ADD_ADDR6 timeout" 1 1 1
        chk_add_nr 4 0
 
        # signal addresses timeout
        reset_with_add_addr_timeout
-       ip netns exec $ns1 ./pm_nl_ctl limits 2 2
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 2 2
+       pm_nl_set_limits $ns1 2 2
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+       pm_nl_set_limits $ns2 2 2
        run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
        chk_join_nr "signal addresses, ADD_ADDR timeout" 2 2 2
        chk_add_nr 8 0
 
        # signal invalid addresses timeout
        reset_with_add_addr_timeout
-       ip netns exec $ns1 ./pm_nl_ctl limits 2 2
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 2 2
+       pm_nl_set_limits $ns1 2 2
+       pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+       pm_nl_set_limits $ns2 2 2
        run_tests $ns1 $ns2 10.0.1.1 0 0 0 least
        chk_join_nr "invalid address, ADD_ADDR timeout" 1 1 1
        chk_add_nr 8 0
 {
        # single subflow, remove
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow
        chk_join_nr "remove single subflow" 1 1 1
        chk_rm_nr 1 1
 
        # multiple subflows, remove
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_set_limits $ns2 0 2
+       pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow
        chk_join_nr "remove multiple subflows" 2 2 2
        chk_rm_nr 2 2
 
        # single address, remove
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_set_limits $ns2 1 1
        run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
        chk_join_nr "remove single address" 1 1 1
        chk_add_nr 1 1
 
        # subflow and signal, remove
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 2
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_set_limits $ns2 1 2
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
        chk_join_nr "remove subflow and signal" 2 2 2
        chk_add_nr 1 1
 
        # subflows and signal, remove
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 3
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 3
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
+       pm_nl_set_limits $ns1 0 3
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_set_limits $ns2 1 3
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1 0 -1 -2 slow
        chk_join_nr "remove subflows and signal" 3 3 3
        chk_add_nr 1 1
 
        # addresses remove
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 3 3
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal id 250
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 3 3
+       pm_nl_set_limits $ns1 3 3
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250
+       pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
+       pm_nl_set_limits $ns2 3 3
        run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
        chk_join_nr "remove addresses" 3 3 3
        chk_add_nr 3 3
 
        # invalid addresses remove
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 3 3
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 3 3
+       pm_nl_set_limits $ns1 3 3
+       pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
+       pm_nl_set_limits $ns2 3 3
        run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
        chk_join_nr "remove invalid addresses" 1 1 1
        chk_add_nr 3 3
 
        # subflows and signal, flush
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 3
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 3
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
+       pm_nl_set_limits $ns1 0 3
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_set_limits $ns2 1 3
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
        chk_join_nr "flush subflows and signal" 3 3 3
        chk_add_nr 1 1
 
        # subflows flush
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 3 3
-       ip netns exec $ns2 ./pm_nl_ctl limits 3 3
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow id 150
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
+       pm_nl_set_limits $ns1 3 3
+       pm_nl_set_limits $ns2 3 3
+       pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow id 150
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
        chk_join_nr "flush subflows" 3 3 3
        chk_rm_nr 3 3
 
        # addresses flush
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 3 3
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal id 250
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.4.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 3 3
+       pm_nl_set_limits $ns1 3 3
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal id 250
+       pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.4.1 flags signal
+       pm_nl_set_limits $ns2 3 3
        run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
        chk_join_nr "flush addresses" 3 3 3
        chk_add_nr 3 3
 
        # invalid addresses flush
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 3 3
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.12.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.14.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 3 3
+       pm_nl_set_limits $ns1 3 3
+       pm_nl_add_endpoint $ns1 10.0.12.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
+       pm_nl_add_endpoint $ns1 10.0.14.1 flags signal
+       pm_nl_set_limits $ns2 3 3
        run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow
        chk_join_nr "flush invalid addresses" 1 1 1
        chk_add_nr 3 3
 
        # remove id 0 subflow
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1 0 0 -9 slow
        chk_join_nr "remove id 0 subflow" 1 1 1
        chk_rm_nr 1 1
 
        # remove id 0 address
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_set_limits $ns2 1 1
        run_tests $ns1 $ns2 10.0.1.1 0 -9 0 slow
        chk_join_nr "remove id 0 address" 1 1 1
        chk_add_nr 1 1
 {
        # add single subflow
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
        run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow
        chk_join_nr "add single subflow" 1 1 1
 
        # add signal address
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 1 1
        run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
        chk_join_nr "add signal address" 1 1 1
        chk_add_nr 1 1
 
        # add multiple subflows
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 2
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_set_limits $ns2 0 2
        run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow
        chk_join_nr "add multiple subflows" 2 2 2
 
        # add multiple subflows IPv6
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 2
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_set_limits $ns2 0 2
        run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow
        chk_join_nr "add multiple subflows IPv6" 2 2 2
 
        # add multiple addresses IPv6
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl limits 2 2
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_set_limits $ns2 2 2
        run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow
        chk_join_nr "add multiple addresses IPv6" 2 2 2
        chk_add_nr 2 2
 {
        # subflow IPv6
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 dev ns2eth3 flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
        run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
        chk_join_nr "single subflow IPv6" 1 1 1
 
        # add_address, unused IPv6
        reset
-       ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
+       pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
        run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
        chk_join_nr "unused signal address IPv6" 0 0 0
        chk_add_nr 1 1
 
        # signal address IPv6
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
+       pm_nl_set_limits $ns2 1 1
        run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
        chk_join_nr "single address IPv6" 1 1 1
        chk_add_nr 1 1
 
        # single address IPv6, remove
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
+       pm_nl_set_limits $ns2 1 1
        run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow
        chk_join_nr "remove single address IPv6" 1 1 1
        chk_add_nr 1 1
 
        # subflow and signal IPv6, remove
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns1 ./pm_nl_ctl add dead:beef:2::1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 2
-       ip netns exec $ns2 ./pm_nl_ctl add dead:beef:3::2 dev ns2eth3 flags subflow
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
+       pm_nl_set_limits $ns2 1 2
+       pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow
        run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow
        chk_join_nr "remove subflow and signal IPv6" 2 2 2
        chk_add_nr 1 1
 {
        # subflow IPv4-mapped to IPv4-mapped
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add "::ffff:10.0.3.2" flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
        run_tests $ns1 $ns2 "::ffff:10.0.1.1"
        chk_join_nr "single subflow IPv4-mapped" 1 1 1
 
        # signal address IPv4-mapped with IPv4-mapped sk
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns1 ./pm_nl_ctl add "::ffff:10.0.2.1" flags signal
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 1 1
+       pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
        run_tests $ns1 $ns2 "::ffff:10.0.1.1"
        chk_join_nr "signal address IPv4-mapped" 1 1 1
        chk_add_nr 1 1
 
        # subflow v4-map-v6
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 "::ffff:10.0.1.1"
        chk_join_nr "single subflow v4-map-v6" 1 1 1
 
        # signal address v4-map-v6
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 1 1
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
        run_tests $ns1 $ns2 "::ffff:10.0.1.1"
        chk_join_nr "signal address v4-map-v6" 1 1 1
        chk_add_nr 1 1
 
        # subflow v6-map-v4
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add "::ffff:10.0.3.2" flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "single subflow v6-map-v4" 1 1 1
 
        # signal address v6-map-v4
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns1 ./pm_nl_ctl add "::ffff:10.0.2.1" flags signal
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 1 1
+       pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "signal address v6-map-v4" 1 1 1
        chk_add_nr 1 1
 
        # no subflow IPv6 to v4 address
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add dead:beef:2::2 flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "no JOIN with diff families v4-v6" 0 0 0
 
        # no subflow IPv6 to v4 address even if v6 has a valid v4 at the end
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add dead:beef:2::10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "no JOIN with diff families v4-v6-2" 0 0 0
 
        # no subflow IPv4 to v6 address, no need to slow down too then
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 dead:beef:1::1
        chk_join_nr "no JOIN with diff families v6-v4" 0 0 0
 }
 {
        # single subflow, backup
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow,backup
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,backup
        run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup
        chk_join_nr "single subflow, backup" 1 1 1
        chk_prio_nr 0 1
 
        # single address, backup
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_set_limits $ns2 1 1
        run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
        chk_join_nr "single address, backup" 1 1 1
        chk_add_nr 1 1
 
        # single address with port, backup
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+       pm_nl_set_limits $ns2 1 1
        run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
        chk_join_nr "single address with port, backup" 1 1 1
        chk_add_nr 1 1
 {
        # signal address with port
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 1 1
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "signal address with port" 1 1 1
        chk_add_nr 1 1 1
 
        # subflow and signal with port
        reset
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 2
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_set_limits $ns2 1 2
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "subflow and signal with port" 2 2 2
        chk_add_nr 1 1 1
 
        # single address with port, remove
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+       pm_nl_set_limits $ns2 1 1
        run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
        chk_join_nr "remove single address with port" 1 1 1
        chk_add_nr 1 1 1
 
        # subflow and signal with port, remove
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 2
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+       pm_nl_set_limits $ns2 1 2
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
        chk_join_nr "remove subflow and signal with port" 2 2 2
        chk_add_nr 1 1 1
 
        # subflows and signal with port, flush
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 3
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 3
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
+       pm_nl_set_limits $ns1 0 3
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+       pm_nl_set_limits $ns2 1 3
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1 0 -8 -2 slow
        chk_join_nr "flush subflows and signal with port" 3 3 3
        chk_add_nr 1 1
 
        # multiple addresses with port
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 2 2
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal port 10100
-       ip netns exec $ns2 ./pm_nl_ctl limits 2 2
+       pm_nl_set_limits $ns1 2 2
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+       pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10100
+       pm_nl_set_limits $ns2 2 2
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "multiple addresses with port" 2 2 2
        chk_add_nr 2 2 2
 
        # multiple addresses with ports
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 2 2
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal port 10100
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.3.1 flags signal port 10101
-       ip netns exec $ns2 ./pm_nl_ctl limits 2 2
+       pm_nl_set_limits $ns1 2 2
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
+       pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10101
+       pm_nl_set_limits $ns2 2 2
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "multiple addresses with ports" 2 2 2
        chk_add_nr 2 2 2
 {
        # single subflow, syncookies
        reset_with_cookies
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "single subflow with syn cookies" 1 1 1
 
        # multiple subflows with syn cookies
        reset_with_cookies
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_set_limits $ns2 0 2
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "multiple subflows with syn cookies" 2 2 2
 
        # multiple subflows limited by server
        reset_with_cookies
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 2
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "subflows limited by server w cookies" 2 1 1
 
        # test signal address with cookies
        reset_with_cookies
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 1 1
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "signal address with syn cookies" 1 1 1
        chk_add_nr 1 1
 
        # test cookie with subflow and signal
        reset_with_cookies
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 2
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 2
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_set_limits $ns1 0 2
+       pm_nl_set_limits $ns2 1 2
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "subflow and signal w cookies" 2 2 2
        chk_add_nr 1 1
 
        # accept and use add_addr with additional subflows
        reset_with_cookies
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 3
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 3
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
+       pm_nl_set_limits $ns1 0 3
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_set_limits $ns2 1 3
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
+       pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "subflows and signal w. cookies" 3 3 3
        chk_add_nr 1 1
 {
        # checksum test 0 0
        reset_with_checksum 0 0
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
        run_tests $ns1 $ns2 10.0.1.1
        chk_csum_nr "checksum test 0 0"
 
        # checksum test 1 1
        reset_with_checksum 1 1
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
        run_tests $ns1 $ns2 10.0.1.1
        chk_csum_nr "checksum test 1 1"
 
        # checksum test 0 1
        reset_with_checksum 0 1
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
        run_tests $ns1 $ns2 10.0.1.1
        chk_csum_nr "checksum test 0 1"
 
        # checksum test 1 0
        reset_with_checksum 1 0
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 0 1
+       pm_nl_set_limits $ns1 0 1
+       pm_nl_set_limits $ns2 0 1
        run_tests $ns1 $ns2 10.0.1.1
        chk_csum_nr "checksum test 1 0"
 }
 {
        # subflow allow join id0 ns1
        reset_with_allow_join_id0 1 0
-       ip netns exec $ns1 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 1 1
+       pm_nl_set_limits $ns2 1 1
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "single subflow allow join id0 ns1" 1 1 1
 
        # subflow allow join id0 ns2
        reset_with_allow_join_id0 0 1
-       ip netns exec $ns1 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 1 1
+       pm_nl_set_limits $ns2 1 1
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "single subflow allow join id0 ns2" 0 0 0
 
        # signal address allow join id0 ns1
        # ADD_ADDRs are not affected by allow_join_id0 value.
        reset_with_allow_join_id0 1 0
-       ip netns exec $ns1 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
+       pm_nl_set_limits $ns1 1 1
+       pm_nl_set_limits $ns2 1 1
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "signal address allow join id0 ns1" 1 1 1
        chk_add_nr 1 1
        # signal address allow join id0 ns2
        # ADD_ADDRs are not affected by allow_join_id0 value.
        reset_with_allow_join_id0 0 1
-       ip netns exec $ns1 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 1
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
+       pm_nl_set_limits $ns1 1 1
+       pm_nl_set_limits $ns2 1 1
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "signal address allow join id0 ns2" 1 1 1
        chk_add_nr 1 1
 
        # subflow and address allow join id0 ns1
        reset_with_allow_join_id0 1 0
-       ip netns exec $ns1 ./pm_nl_ctl limits 2 2
-       ip netns exec $ns2 ./pm_nl_ctl limits 2 2
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 2 2
+       pm_nl_set_limits $ns2 2 2
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "subflow and address allow join id0 1" 2 2 2
 
        # subflow and address allow join id0 ns2
        reset_with_allow_join_id0 0 1
-       ip netns exec $ns1 ./pm_nl_ctl limits 2 2
-       ip netns exec $ns2 ./pm_nl_ctl limits 2 2
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
+       pm_nl_set_limits $ns1 2 2
+       pm_nl_set_limits $ns2 2 2
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
        run_tests $ns1 $ns2 10.0.1.1
        chk_join_nr "subflow and address allow join id0 2" 1 1 1
 }
        # 2 fullmesh addrs in ns2, added before the connection,
        # 1 non-fullmesh addr in ns1, added during the connection.
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 0 4
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 4
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow,fullmesh
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow,fullmesh
+       pm_nl_set_limits $ns1 0 4
+       pm_nl_set_limits $ns2 1 4
+       pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,fullmesh
+       pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,fullmesh
        run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
        chk_join_nr "fullmesh test 2x1" 4 4 4
        chk_add_nr 1 1
        # 1 non-fullmesh addr in ns1, added before the connection,
        # 1 fullmesh addr in ns2, added during the connection.
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 1 3
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 3
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
+       pm_nl_set_limits $ns1 1 3
+       pm_nl_set_limits $ns2 1 3
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
        run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow
        chk_join_nr "fullmesh test 1x1" 3 3 3
        chk_add_nr 1 1
        # 1 non-fullmesh addr in ns1, added before the connection,
        # 2 fullmesh addrs in ns2, added during the connection.
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 2 5
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 5
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
+       pm_nl_set_limits $ns1 2 5
+       pm_nl_set_limits $ns2 1 5
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
        run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow
        chk_join_nr "fullmesh test 1x2" 5 5 5
        chk_add_nr 1 1
        # 2 fullmesh addrs in ns2, added during the connection,
        # limit max_subflows to 4.
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 2 4
-       ip netns exec $ns2 ./pm_nl_ctl limits 1 4
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags signal
+       pm_nl_set_limits $ns1 2 4
+       pm_nl_set_limits $ns2 1 4
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
        run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow
        chk_join_nr "fullmesh test 1x2, limited" 4 4 4
        chk_add_nr 1 1
 
        # set fullmesh flag
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 4 4
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl limits 4 4
+       pm_nl_set_limits $ns1 4 4
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
+       pm_nl_set_limits $ns2 4 4
        run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow fullmesh
        chk_join_nr "set fullmesh flag test" 2 2 2
        chk_rm_nr 0 1
 
        # set nofullmesh flag
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 4 4
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags subflow,fullmesh
-       ip netns exec $ns2 ./pm_nl_ctl limits 4 4
+       pm_nl_set_limits $ns1 4 4
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow,fullmesh
+       pm_nl_set_limits $ns2 4 4
        run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow nofullmesh
        chk_join_nr "set nofullmesh flag test" 2 2 2
        chk_rm_nr 0 1
 
        # set backup,fullmesh flags
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 4 4
-       ip netns exec $ns1 ./pm_nl_ctl add 10.0.2.1 flags subflow
-       ip netns exec $ns2 ./pm_nl_ctl limits 4 4
+       pm_nl_set_limits $ns1 4 4
+       pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
+       pm_nl_set_limits $ns2 4 4
        run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow backup,fullmesh
        chk_join_nr "set backup,fullmesh flags test" 2 2 2
        chk_prio_nr 0 1
 
        # set nobackup,nofullmesh flags
        reset
-       ip netns exec $ns1 ./pm_nl_ctl limits 4 4
-       ip netns exec $ns2 ./pm_nl_ctl limits 4 4
-       ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow,backup,fullmesh
+       pm_nl_set_limits $ns1 4 4
+       pm_nl_set_limits $ns2 4 4
+       pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,backup,fullmesh
        run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup,nofullmesh
        chk_join_nr "set nobackup,nofullmesh flags test" 2 2 2
        chk_prio_nr 0 1