TEST_COUNT=0
 
+# generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) ||
+#                                (ip6 && (ip6[74] & 0xf0) == 0x30)'"
+CBPF_MPTCP_SUBOPTION_ADD_ADDR="14,
+                              48 0 0 0,
+                              84 0 0 240,
+                              21 0 3 64,
+                              48 0 0 54,
+                              84 0 0 240,
+                              21 6 7 48,
+                              48 0 0 0,
+                              84 0 0 240,
+                              21 0 4 96,
+                              48 0 0 74,
+                              84 0 0 240,
+                              21 0 1 48,
+                              6 0 0 65535,
+                              6 0 0 0"
+
 init()
 {
        capout=$(mktemp)
        done
 }
 
+reset_with_add_addr_timeout()
+{
+       local ip="${1:-4}"
+       local tables
+
+       tables="iptables"
+       if [ $ip -eq 6 ]; then
+               tables="ip6tables"
+       fi
+
+       reset
+
+       ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
+       ip netns exec $ns2 $tables -A OUTPUT -p tcp \
+               -m tcp --tcp-option 30 \
+               -m bpf --bytecode \
+               "$CBPF_MPTCP_SUBOPTION_ADD_ADDR" \
+               -j DROP
+}
+
 for arg in "$@"; do
        if [ "$arg" = "-c" ]; then
                capture=1
        exit $ksft_skip
 fi
 
+iptables -V > /dev/null 2>&1
+if [ $? -ne 0 ];then
+       echo "SKIP: Could not run all tests without iptables tool"
+       exit $ksft_skip
+fi
+
+ip6tables -V > /dev/null 2>&1
+if [ $? -ne 0 ];then
+       echo "SKIP: Could not run all tests without ip6tables tool"
+       exit $ksft_skip
+fi
 
 check_transfer()
 {
        connect_addr="$5"
        rm_nr_ns1="$6"
        rm_nr_ns2="$7"
+       speed="$8"
 
        port=$((10000+$TEST_COUNT))
        TEST_COUNT=$((TEST_COUNT+1))
                sleep 1
        fi
 
-       if [[ $rm_nr_ns1 -eq 0 && $rm_nr_ns2 -eq 0 ]]; then
+       if [ $speed = "fast" ]; then
                mptcp_connect="./mptcp_connect -j"
        else
                mptcp_connect="./mptcp_connect -r"
        listener_ns="$1"
        connector_ns="$2"
        connect_addr="$3"
+       rm_nr_ns1="${4:-0}"
+       rm_nr_ns2="${5:-0}"
+       speed="${6:-fast}"
        lret=0
 
-       do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} 0 0
-       lret=$?
-       if [ $lret -ne 0 ]; then
-               ret=$lret
-               return
-       fi
-}
-
-run_remove_tests()
-{
-       listener_ns="$1"
-       connector_ns="$2"
-       connect_addr="$3"
-       rm_nr_ns1="$4"
-       rm_nr_ns2="$5"
-       lret=0
-
-       do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} ${rm_nr_ns1} ${rm_nr_ns2}
+       do_transfer ${listener_ns} ${connector_ns} MPTCP MPTCP ${connect_addr} \
+               ${rm_nr_ns1} ${rm_nr_ns2} ${speed}
        lret=$?
        if [ $lret -ne 0 ]; then
                ret=$lret
 chk_join_nr "multiple subflows and signal" 3 3 3
 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
+run_tests $ns1 $ns2 10.0.1.1 0 0 slow
+chk_join_nr "signal address, ADD_ADDR timeout" 1 1 1
+chk_add_nr 4 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
-run_remove_tests $ns1 $ns2 10.0.1.1 0 1
+run_tests $ns1 $ns2 10.0.1.1 0 1 slow
 chk_join_nr "remove single subflow" 1 1 1
 chk_rm_nr 1 1
 
 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
-run_remove_tests $ns1 $ns2 10.0.1.1 0 2
+run_tests $ns1 $ns2 10.0.1.1 0 2 slow
 chk_join_nr "remove multiple subflows" 2 2 2
 chk_rm_nr 2 2
 
 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
-run_remove_tests $ns1 $ns2 10.0.1.1 1 0
+run_tests $ns1 $ns2 10.0.1.1 1 0 slow
 chk_join_nr "remove single address" 1 1 1
 chk_add_nr 1 1
 chk_rm_nr 0 0
 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
-run_remove_tests $ns1 $ns2 10.0.1.1 1 1
+run_tests $ns1 $ns2 10.0.1.1 1 1 slow
 chk_join_nr "remove subflow and signal" 2 2 2
 chk_add_nr 1 1
 chk_rm_nr 1 1
 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
-run_remove_tests $ns1 $ns2 10.0.1.1 1 2
+run_tests $ns1 $ns2 10.0.1.1 1 2 slow
 chk_join_nr "remove subflows and signal" 3 3 3
 chk_add_nr 1 1
 chk_rm_nr 2 2