Commit 2a9eef86 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'mptcp-selftests-refactor-join-tests'

Mat Martineau says:

====================
mptcp: selftests: Refactor join tests

The mptcp_join.sh selftest is the largest and most complex self test for
MPTCP, and it is frequently used by MPTCP developers to reproduce bugs
and verify fixes. As it grew in size and execution time, it became more
cumbersome to use.

These changes do some much-needed cleanup, and add developer-friendly
features to make it easier to see failures and run a subset of the tests
when verifying fixes.
====================

Link: https://lore.kernel.org/r/20220309191636.258232-1-mathew.j.martineau@linux.intel.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 3126b731 d8d08302
#!/bin/bash #!/bin/bash
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# Double quotes to prevent globbing and word splitting is recommended in new
# code but we accept it, especially because there were too many before having
# address all other issues detected by shellcheck.
#shellcheck disable=SC2086
ret=0 ret=0
sin="" sin=""
sinfail="" sinfail=""
...@@ -9,6 +14,9 @@ cin="" ...@@ -9,6 +14,9 @@ cin=""
cinfail="" cinfail=""
cinsent="" cinsent=""
cout="" cout=""
capout=""
ns1=""
ns2=""
ksft_skip=4 ksft_skip=4
timeout_poll=30 timeout_poll=30
timeout_test=$((timeout_poll * 2 + 1)) timeout_test=$((timeout_poll * 2 + 1))
...@@ -16,11 +24,19 @@ capture=0 ...@@ -16,11 +24,19 @@ capture=0
checksum=0 checksum=0
ip_mptcp=0 ip_mptcp=0
check_invert=0 check_invert=0
validate_checksum=0
init=0 init=0
declare -A all_tests
declare -a only_tests_ids
declare -a only_tests_names
declare -A failed_tests
TEST_COUNT=0 TEST_COUNT=0
TEST_NAME=""
nr_blank=40 nr_blank=40
export FAILING_LINKS=""
# generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) || # generated using "nfbpf_compile '(ip && (ip[54] & 0xf0) == 0x30) ||
# (ip6 && (ip6[74] & 0xf0) == 0x30)'" # (ip6 && (ip6[74] & 0xf0) == 0x30)'"
CBPF_MPTCP_SUBOPTION_ADD_ADDR="14, CBPF_MPTCP_SUBOPTION_ADD_ADDR="14,
...@@ -43,12 +59,14 @@ init_partial() ...@@ -43,12 +59,14 @@ init_partial()
{ {
capout=$(mktemp) capout=$(mktemp)
local rndh
rndh=$(mktemp -u XXXXXX) rndh=$(mktemp -u XXXXXX)
ns1="ns1-$rndh" ns1="ns1-$rndh"
ns2="ns2-$rndh" ns2="ns2-$rndh"
for netns in "$ns1" "$ns2";do local netns
for netns in "$ns1" "$ns2"; do
ip netns add $netns || exit $ksft_skip ip netns add $netns || exit $ksft_skip
ip -net $netns link set lo up ip -net $netns link set lo up
ip netns exec $netns sysctl -q net.mptcp.enabled=1 ip netns exec $netns sysctl -q net.mptcp.enabled=1
...@@ -60,6 +78,8 @@ init_partial() ...@@ -60,6 +78,8 @@ init_partial()
done done
check_invert=0 check_invert=0
validate_checksum=$checksum
FAILING_LINKS=""
# ns1 ns2 # ns1 ns2
# ns1eth1 ns2eth1 # ns1eth1 ns2eth1
...@@ -67,7 +87,8 @@ init_partial() ...@@ -67,7 +87,8 @@ init_partial()
# ns1eth3 ns2eth3 # ns1eth3 ns2eth3
# ns1eth4 ns2eth4 # ns1eth4 ns2eth4
for i in `seq 1 4`; do local i
for i in $(seq 1 4); do
ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2" ip link add ns1eth$i netns "$ns1" type veth peer name ns2eth$i netns "$ns2"
ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i ip -net "$ns1" addr add 10.0.$i.1/24 dev ns1eth$i
ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad ip -net "$ns1" addr add dead:beef:$i::1/64 dev ns1eth$i nodad
...@@ -85,7 +106,8 @@ init_partial() ...@@ -85,7 +106,8 @@ init_partial()
init_shapers() init_shapers()
{ {
for i in `seq 1 4`; do local i
for i in $(seq 1 4); do
tc -n $ns1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1 tc -n $ns1 qdisc add dev ns1eth$i root netem rate 20mbit delay 1
tc -n $ns2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1 tc -n $ns2 qdisc add dev ns2eth$i root netem rate 20mbit delay 1
done done
...@@ -95,6 +117,7 @@ cleanup_partial() ...@@ -95,6 +117,7 @@ cleanup_partial()
{ {
rm -f "$capout" rm -f "$capout"
local netns
for netns in "$ns1" "$ns2"; do for netns in "$ns1" "$ns2"; do
ip netns del $netns ip netns del $netns
rm -f /tmp/$netns.{nstat,out} rm -f /tmp/$netns.{nstat,out}
...@@ -143,8 +166,38 @@ cleanup() ...@@ -143,8 +166,38 @@ cleanup()
cleanup_partial cleanup_partial
} }
skip_test()
{
if [ "${#only_tests_ids[@]}" -eq 0 ] && [ "${#only_tests_names[@]}" -eq 0 ]; then
return 1
fi
local i
for i in "${only_tests_ids[@]}"; do
if [ "${TEST_COUNT}" -eq "${i}" ]; then
return 1
fi
done
for i in "${only_tests_names[@]}"; do
if [ "${TEST_NAME}" = "${i}" ]; then
return 1
fi
done
return 0
}
# $1: test name
reset() reset()
{ {
TEST_NAME="${1}"
TEST_COUNT=$((TEST_COUNT+1))
if skip_test; then
return 1
fi
if [ "${init}" != "1" ]; then if [ "${init}" != "1" ]; then
init init
else else
...@@ -152,29 +205,34 @@ reset() ...@@ -152,29 +205,34 @@ reset()
fi fi
init_partial init_partial
return 0
} }
# $1: test name
reset_with_cookies() reset_with_cookies()
{ {
reset reset "${1}" || return 1
for netns in "$ns1" "$ns2";do local netns
for netns in "$ns1" "$ns2"; do
ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2 ip netns exec $netns sysctl -q net.ipv4.tcp_syncookies=2
done done
} }
# $1: test name
reset_with_add_addr_timeout() reset_with_add_addr_timeout()
{ {
local ip="${1:-4}" local ip="${2:-4}"
local tables local tables
reset "${1}" || return 1
tables="iptables" tables="iptables"
if [ $ip -eq 6 ]; then if [ $ip -eq 6 ]; then
tables="ip6tables" tables="ip6tables"
fi fi
reset
ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
ip netns exec $ns2 $tables -A OUTPUT -p tcp \ ip netns exec $ns2 $tables -A OUTPUT -p tcp \
-m tcp --tcp-option 30 \ -m tcp --tcp-option 30 \
...@@ -183,28 +241,46 @@ reset_with_add_addr_timeout() ...@@ -183,28 +241,46 @@ reset_with_add_addr_timeout()
-j DROP -j DROP
} }
# $1: test name
reset_with_checksum() reset_with_checksum()
{ {
local ns1_enable=$1 local ns1_enable=$1
local ns2_enable=$2 local ns2_enable=$2
reset reset "checksum test ${1} ${2}" || return 1
ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable ip netns exec $ns1 sysctl -q net.mptcp.checksum_enabled=$ns1_enable
ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable ip netns exec $ns2 sysctl -q net.mptcp.checksum_enabled=$ns2_enable
validate_checksum=1
} }
reset_with_allow_join_id0() reset_with_allow_join_id0()
{ {
local ns1_enable=$1 local ns1_enable=$2
local ns2_enable=$2 local ns2_enable=$3
reset reset "${1}" || return 1
ip netns exec $ns1 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns1_enable ip netns exec $ns1 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns1_enable
ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable ip netns exec $ns2 sysctl -q net.mptcp.allow_join_initial_addr_port=$ns2_enable
} }
fail_test()
{
ret=1
failed_tests[${TEST_COUNT}]="${TEST_NAME}"
}
get_failed_tests_ids()
{
# sorted
local i
for i in "${!failed_tests[@]}"; do
echo "${i}"
done | sort -n
}
print_file_err() print_file_err()
{ {
ls -l "$1" 1>&2 ls -l "$1" 1>&2
...@@ -214,23 +290,23 @@ print_file_err() ...@@ -214,23 +290,23 @@ print_file_err()
check_transfer() check_transfer()
{ {
in=$1 local in=$1
out=$2 local out=$2
what=$3 local what=$3
local i a b
cmp -l "$in" "$out" | while read line; do
local arr=($line) local line
cmp -l "$in" "$out" | while read -r i a b; do
let sum=0${arr[1]}+0${arr[2]} local sum=$((0${a} + 0${b}))
if [ $check_invert -eq 0 ] || [ $sum -ne $((0xff)) ]; then if [ $check_invert -eq 0 ] || [ $sum -ne $((0xff)) ]; then
echo "[ FAIL ] $what does not match (in, out):" echo "[ FAIL ] $what does not match (in, out):"
print_file_err "$in" print_file_err "$in"
print_file_err "$out" print_file_err "$out"
ret=1 fail_test
return 1 return 1
else else
echo "$what has inverted byte at ${arr[0]}" echo "$what has inverted byte at ${i}"
fi fi
done done
...@@ -239,28 +315,28 @@ check_transfer() ...@@ -239,28 +315,28 @@ check_transfer()
do_ping() do_ping()
{ {
listener_ns="$1" local listener_ns="$1"
connector_ns="$2" local connector_ns="$2"
connect_addr="$3" local connect_addr="$3"
ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null if ! ip netns exec ${connector_ns} ping -q -c 1 $connect_addr >/dev/null; then
if [ $? -ne 0 ] ; then
echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2 echo "$listener_ns -> $connect_addr connectivity [ FAIL ]" 1>&2
ret=1 fail_test
fi fi
} }
link_failure() link_failure()
{ {
ns="$1" local ns="$1"
if [ -z "$FAILING_LINKS" ]; then if [ -z "$FAILING_LINKS" ]; then
l=$((RANDOM%4)) l=$((RANDOM%4))
FAILING_LINKS=$((l+1)) FAILING_LINKS=$((l+1))
fi fi
local l
for l in $FAILING_LINKS; do for l in $FAILING_LINKS; do
veth="ns1eth$l" local veth="ns1eth$l"
ip -net "$ns" link set "$veth" down ip -net "$ns" link set "$veth" down
done done
} }
...@@ -277,9 +353,10 @@ wait_local_port_listen() ...@@ -277,9 +353,10 @@ wait_local_port_listen()
local listener_ns="${1}" local listener_ns="${1}"
local port="${2}" local port="${2}"
local port_hex i local port_hex
port_hex="$(printf "%04X" "${port}")" port_hex="$(printf "%04X" "${port}")"
local i
for i in $(seq 10); do for i in $(seq 10); do
ip netns exec "${listener_ns}" cat /proc/net/tcp* | \ ip netns exec "${listener_ns}" cat /proc/net/tcp* | \
awk "BEGIN {rc=1} {if (\$2 ~ /:${port_hex}\$/ && \$4 ~ /0A/) {rc=0; exit}} END {exit rc}" && awk "BEGIN {rc=1} {if (\$2 ~ /:${port_hex}\$/ && \$4 ~ /0A/) {rc=0; exit}} END {exit rc}" &&
...@@ -290,7 +367,7 @@ wait_local_port_listen() ...@@ -290,7 +367,7 @@ wait_local_port_listen()
rm_addr_count() rm_addr_count()
{ {
ns=${1} local ns=${1}
ip netns exec ${ns} nstat -as | grep MPTcpExtRmAddr | awk '{print $2}' ip netns exec ${ns} nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'
} }
...@@ -301,8 +378,8 @@ wait_rm_addr() ...@@ -301,8 +378,8 @@ wait_rm_addr()
local ns="${1}" local ns="${1}"
local old_cnt="${2}" local old_cnt="${2}"
local cnt local cnt
local i
local i
for i in $(seq 10); do for i in $(seq 10); do
cnt=$(rm_addr_count ${ns}) cnt=$(rm_addr_count ${ns})
[ "$cnt" = "${old_cnt}" ] || break [ "$cnt" = "${old_cnt}" ] || break
...@@ -342,32 +419,33 @@ pm_nl_add_endpoint() ...@@ -342,32 +419,33 @@ pm_nl_add_endpoint()
{ {
local ns=$1 local ns=$1
local addr=$2 local addr=$2
local flags local flags _flags
local port local port _port
local dev local dev _dev
local id local id _id
local nr=2 local nr=2
for p in $@ local p
for p in "${@}"
do do
if [ $p = "flags" ]; then if [ $p = "flags" ]; then
eval _flags=\$"$nr" eval _flags=\$"$nr"
[ ! -z $_flags ]; flags="flags $_flags" [ -n "$_flags" ]; flags="flags $_flags"
fi fi
if [ $p = "dev" ]; then if [ $p = "dev" ]; then
eval _dev=\$"$nr" eval _dev=\$"$nr"
[ ! -z $_dev ]; dev="dev $_dev" [ -n "$_dev" ]; dev="dev $_dev"
fi fi
if [ $p = "id" ]; then if [ $p = "id" ]; then
eval _id=\$"$nr" eval _id=\$"$nr"
[ ! -z $_id ]; id="id $_id" [ -n "$_id" ]; id="id $_id"
fi fi
if [ $p = "port" ]; then if [ $p = "port" ]; then
eval _port=\$"$nr" eval _port=\$"$nr"
[ ! -z $_port ]; port="port $_port" [ -n "$_port" ]; port="port $_port"
fi fi
let nr+=1 nr=$((nr + 1))
done done
if [ $ip_mptcp -eq 1 ]; then if [ $ip_mptcp -eq 1 ]; then
...@@ -428,7 +506,7 @@ pm_nl_change_endpoint() ...@@ -428,7 +506,7 @@ pm_nl_change_endpoint()
pm_nl_check_endpoint() pm_nl_check_endpoint()
{ {
local line expected_line local line expected_line
local title="$1" local need_title=$1
local msg="$2" local msg="$2"
local ns=$3 local ns=$3
local addr=$4 local addr=$4
...@@ -440,8 +518,8 @@ pm_nl_check_endpoint() ...@@ -440,8 +518,8 @@ pm_nl_check_endpoint()
local _id local _id
local id local id
if [ -n "${title}" ]; then if [ "${need_title}" = 1 ]; then
printf "%03u %-36s %s" "${TEST_COUNT}" "${title}" "${msg}" printf "%03u %-36s %s" "${TEST_COUNT}" "${TEST_NAME}" "${msg}"
else else
printf "%-${nr_blank}s %s" " " "${msg}" printf "%-${nr_blank}s %s" " " "${msg}"
fi fi
...@@ -450,18 +528,18 @@ pm_nl_check_endpoint() ...@@ -450,18 +528,18 @@ pm_nl_check_endpoint()
while [ -n "$1" ]; do while [ -n "$1" ]; do
if [ $1 = "flags" ]; then if [ $1 = "flags" ]; then
_flags=$2 _flags=$2
[ ! -z $_flags ]; flags="flags $_flags" [ -n "$_flags" ]; flags="flags $_flags"
shift shift
elif [ $1 = "dev" ]; then elif [ $1 = "dev" ]; then
[ ! -z $2 ]; dev="dev $1" [ -n "$2" ]; dev="dev $1"
shift shift
elif [ $1 = "id" ]; then elif [ $1 = "id" ]; then
_id=$2 _id=$2
[ ! -z $_id ]; id="id $_id" [ -n "$_id" ]; id="id $_id"
shift shift
elif [ $1 = "port" ]; then elif [ $1 = "port" ]; then
_port=$2 _port=$2
[ ! -z $_port ]; port=" port $_port" [ -n "$_port" ]; port=" port $_port"
shift shift
fi fi
...@@ -495,31 +573,41 @@ pm_nl_check_endpoint() ...@@ -495,31 +573,41 @@ pm_nl_check_endpoint()
echo "[ ok ]" echo "[ ok ]"
else else
echo "[fail] expected '$expected_line' found '$line'" echo "[fail] expected '$expected_line' found '$line'"
ret=1 fail_test
fi fi
} }
filter_tcp_from()
{
local ns="${1}"
local src="${2}"
local target="${3}"
ip netns exec "${ns}" iptables -A INPUT -s "${src}" -p tcp -j "${target}"
}
do_transfer() do_transfer()
{ {
listener_ns="$1" local listener_ns="$1"
connector_ns="$2" local connector_ns="$2"
cl_proto="$3" local cl_proto="$3"
srv_proto="$4" local srv_proto="$4"
connect_addr="$5" local connect_addr="$5"
test_link_fail="$6" local test_link_fail="$6"
addr_nr_ns1="$7" local addr_nr_ns1="$7"
addr_nr_ns2="$8" local addr_nr_ns2="$8"
speed="$9" local speed="$9"
sflags="${10}" local sflags="${10}"
port=$((10000+$TEST_COUNT)) local port=$((10000 + TEST_COUNT - 1))
TEST_COUNT=$((TEST_COUNT+1)) local cappid
:> "$cout" :> "$cout"
:> "$sout" :> "$sout"
:> "$capout" :> "$capout"
if [ $capture -eq 1 ]; then if [ $capture -eq 1 ]; then
local capuser
if [ -z $SUDO_USER ] ; then if [ -z $SUDO_USER ] ; then
capuser="" capuser=""
else else
...@@ -573,7 +661,7 @@ do_transfer() ...@@ -573,7 +661,7 @@ do_transfer()
./mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \ ./mptcp_connect -t ${timeout_poll} -l -p $port -s ${srv_proto} \
$extra_args ${local_addr} < "$sin" > "$sout" & $extra_args ${local_addr} < "$sin" > "$sout" &
fi fi
spid=$! local spid=$!
wait_local_port_listen "${listener_ns}" "${port}" wait_local_port_listen "${listener_ns}" "${port}"
...@@ -590,21 +678,23 @@ do_transfer() ...@@ -590,21 +678,23 @@ do_transfer()
./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \ ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
$extra_args $connect_addr > "$cout" & $extra_args $connect_addr > "$cout" &
else else
cat "$cinfail" | tee "$cinsent" | \ tee "$cinsent" < "$cinfail" | \
timeout ${timeout_test} \ timeout ${timeout_test} \
ip netns exec ${connector_ns} \ ip netns exec ${connector_ns} \
./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \ ./mptcp_connect -t ${timeout_poll} -p $port -s ${cl_proto} \
$extra_args $connect_addr > "$cout" & $extra_args $connect_addr > "$cout" &
fi fi
cpid=$! local cpid=$!
# let the mptcp subflow be established in background before # let the mptcp subflow be established in background before
# do endpoint manipulation # do endpoint manipulation
[ $addr_nr_ns1 = "0" -a $addr_nr_ns2 = "0" ] || sleep 1 if [ $addr_nr_ns1 != "0" ] || [ $addr_nr_ns2 != "0" ]; then
sleep 1
fi
if [ $addr_nr_ns1 -gt 0 ]; then if [ $addr_nr_ns1 -gt 0 ]; then
let add_nr_ns1=addr_nr_ns1 local counter=2
counter=2 local add_nr_ns1=${addr_nr_ns1}
while [ $add_nr_ns1 -gt 0 ]; do while [ $add_nr_ns1 -gt 0 ]; do
local addr local addr
if is_v6 "${connect_addr}"; then if is_v6 "${connect_addr}"; then
...@@ -613,18 +703,21 @@ do_transfer() ...@@ -613,18 +703,21 @@ do_transfer()
addr="10.0.$counter.1" addr="10.0.$counter.1"
fi fi
pm_nl_add_endpoint $ns1 $addr flags signal pm_nl_add_endpoint $ns1 $addr flags signal
let counter+=1 counter=$((counter + 1))
let add_nr_ns1-=1 add_nr_ns1=$((add_nr_ns1 - 1))
done done
elif [ $addr_nr_ns1 -lt 0 ]; then elif [ $addr_nr_ns1 -lt 0 ]; then
let rm_nr_ns1=-addr_nr_ns1 local rm_nr_ns1=$((-addr_nr_ns1))
if [ $rm_nr_ns1 -lt 8 ]; then if [ $rm_nr_ns1 -lt 8 ]; then
counter=0 local counter=0
pm_nl_show_endpoints ${listener_ns} | while read line; do local line
pm_nl_show_endpoints ${listener_ns} | while read -r line; do
# shellcheck disable=SC2206 # we do want to split per word
local arr=($line) local arr=($line)
local nr=0 local nr=0
for i in ${arr[@]}; do local i
for i in "${arr[@]}"; do
if [ $i = "id" ]; then if [ $i = "id" ]; then
if [ $counter -eq $rm_nr_ns1 ]; then if [ $counter -eq $rm_nr_ns1 ]; then
break break
...@@ -633,9 +726,9 @@ do_transfer() ...@@ -633,9 +726,9 @@ do_transfer()
rm_addr=$(rm_addr_count ${connector_ns}) rm_addr=$(rm_addr_count ${connector_ns})
pm_nl_del_endpoint ${listener_ns} $id pm_nl_del_endpoint ${listener_ns} $id
wait_rm_addr ${connector_ns} ${rm_addr} wait_rm_addr ${connector_ns} ${rm_addr}
let counter+=1 counter=$((counter + 1))
fi fi
let nr+=1 nr=$((nr + 1))
done done
done done
elif [ $rm_nr_ns1 -eq 8 ]; then elif [ $rm_nr_ns1 -eq 8 ]; then
...@@ -645,7 +738,7 @@ do_transfer() ...@@ -645,7 +738,7 @@ do_transfer()
fi fi
fi fi
flags="subflow" local flags="subflow"
if [[ "${addr_nr_ns2}" = "fullmesh_"* ]]; then if [[ "${addr_nr_ns2}" = "fullmesh_"* ]]; then
flags="${flags},fullmesh" flags="${flags},fullmesh"
addr_nr_ns2=${addr_nr_ns2:9} addr_nr_ns2=${addr_nr_ns2:9}
...@@ -653,11 +746,11 @@ do_transfer() ...@@ -653,11 +746,11 @@ do_transfer()
# if newly added endpoints must be deleted, give the background msk # if newly added endpoints must be deleted, give the background msk
# some time to created them # some time to created them
[ $addr_nr_ns1 -gt 0 -a $addr_nr_ns2 -lt 0 ] && sleep 1 [ $addr_nr_ns1 -gt 0 ] && [ $addr_nr_ns2 -lt 0 ] && sleep 1
if [ $addr_nr_ns2 -gt 0 ]; then if [ $addr_nr_ns2 -gt 0 ]; then
let add_nr_ns2=addr_nr_ns2 local add_nr_ns2=${addr_nr_ns2}
counter=3 local counter=3
while [ $add_nr_ns2 -gt 0 ]; do while [ $add_nr_ns2 -gt 0 ]; do
local addr local addr
if is_v6 "${connect_addr}"; then if is_v6 "${connect_addr}"; then
...@@ -666,31 +759,35 @@ do_transfer() ...@@ -666,31 +759,35 @@ do_transfer()
addr="10.0.$counter.2" addr="10.0.$counter.2"
fi fi
pm_nl_add_endpoint $ns2 $addr flags $flags pm_nl_add_endpoint $ns2 $addr flags $flags
let counter+=1 counter=$((counter + 1))
let add_nr_ns2-=1 add_nr_ns2=$((add_nr_ns2 - 1))
done done
elif [ $addr_nr_ns2 -lt 0 ]; then elif [ $addr_nr_ns2 -lt 0 ]; then
let rm_nr_ns2=-addr_nr_ns2 local rm_nr_ns2=$((-addr_nr_ns2))
if [ $rm_nr_ns2 -lt 8 ]; then if [ $rm_nr_ns2 -lt 8 ]; then
counter=0 local counter=0
pm_nl_show_endpoints ${connector_ns} | while read line; do local line
pm_nl_show_endpoints ${connector_ns} | while read -r line; do
# shellcheck disable=SC2206 # we do want to split per word
local arr=($line) local arr=($line)
local nr=0 local nr=0
for i in ${arr[@]}; do local i
for i in "${arr[@]}"; do
if [ $i = "id" ]; then if [ $i = "id" ]; then
if [ $counter -eq $rm_nr_ns2 ]; then if [ $counter -eq $rm_nr_ns2 ]; then
break break
fi fi
local id rm_addr
# rm_addr are serialized, allow the previous one to # rm_addr are serialized, allow the previous one to
# complete # complete
id=${arr[$nr+1]} id=${arr[$nr+1]}
rm_addr=$(rm_addr_count ${listener_ns}) rm_addr=$(rm_addr_count ${listener_ns})
pm_nl_del_endpoint ${connector_ns} $id pm_nl_del_endpoint ${connector_ns} $id
wait_rm_addr ${listener_ns} ${rm_addr} wait_rm_addr ${listener_ns} ${rm_addr}
let counter+=1 counter=$((counter + 1))
fi fi
let nr+=1 nr=$((nr + 1))
done done
done done
elif [ $rm_nr_ns2 -eq 8 ]; then elif [ $rm_nr_ns2 -eq 8 ]; then
...@@ -706,19 +803,24 @@ do_transfer() ...@@ -706,19 +803,24 @@ do_transfer()
fi fi
fi fi
if [ ! -z $sflags ]; then if [ -n "${sflags}" ]; then
sleep 1 sleep 1
local netns
for netns in "$ns1" "$ns2"; do for netns in "$ns1" "$ns2"; do
pm_nl_show_endpoints $netns | while read line; do local line
pm_nl_show_endpoints $netns | while read -r line; do
# shellcheck disable=SC2206 # we do want to split per word
local arr=($line) local arr=($line)
local nr=0 local nr=0
local id local id
for i in ${arr[@]}; do local i
for i in "${arr[@]}"; do
if [ $i = "id" ]; then if [ $i = "id" ]; then
id=${arr[$nr+1]} id=${arr[$nr+1]}
fi fi
let nr+=1 nr=$((nr + 1))
done done
pm_nl_change_endpoint $netns $id $sflags pm_nl_change_endpoint $netns $id $sflags
done done
...@@ -726,9 +828,9 @@ do_transfer() ...@@ -726,9 +828,9 @@ do_transfer()
fi fi
wait $cpid wait $cpid
retc=$? local retc=$?
wait $spid wait $spid
rets=$? local rets=$?
if [ $capture -eq 1 ]; then if [ $capture -eq 1 ]; then
sleep 1 sleep 1
...@@ -750,7 +852,7 @@ do_transfer() ...@@ -750,7 +852,7 @@ do_transfer()
cat /tmp/${connector_ns}.out cat /tmp/${connector_ns}.out
cat "$capout" cat "$capout"
ret=1 fail_test
return 1 return 1
fi fi
...@@ -778,9 +880,9 @@ do_transfer() ...@@ -778,9 +880,9 @@ do_transfer()
make_file() make_file()
{ {
name=$1 local name=$1
who=$2 local who=$2
size=$3 local size=$3
dd if=/dev/urandom of="$name" bs=1024 count=$size 2> /dev/null dd if=/dev/urandom of="$name" bs=1024 count=$size 2> /dev/null
echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name" echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name"
...@@ -790,14 +892,16 @@ make_file() ...@@ -790,14 +892,16 @@ make_file()
run_tests() run_tests()
{ {
listener_ns="$1" local listener_ns="$1"
connector_ns="$2" local connector_ns="$2"
connect_addr="$3" local connect_addr="$3"
test_linkfail="${4:-0}" local test_linkfail="${4:-0}"
addr_nr_ns1="${5:-0}" local addr_nr_ns1="${5:-0}"
addr_nr_ns2="${6:-0}" local addr_nr_ns2="${6:-0}"
speed="${7:-fast}" local speed="${7:-fast}"
sflags="${8:-""}" local sflags="${8:-""}"
local size
# The values above 2 are reused to make test files # The values above 2 are reused to make test files
# with the given sizes (KB) # with the given sizes (KB)
...@@ -810,14 +914,14 @@ run_tests() ...@@ -810,14 +914,14 @@ run_tests()
make_file "$cinfail" "client" $size make_file "$cinfail" "client" $size
# create the input file for the failure test when # create the input file for the failure test when
# the first failure test run # the first failure test run
elif [ "$test_linkfail" -ne 0 -a -z "$cinfail" ]; then elif [ "$test_linkfail" -ne 0 ] && [ -z "$cinfail" ]; then
# the client file must be considerably larger # the client file must be considerably larger
# of the maximum expected cwin value, or the # of the maximum expected cwin value, or the
# link utilization will be not predicable # link utilization will be not predicable
size=$((RANDOM%2)) size=$((RANDOM%2))
size=$((size+1)) size=$((size+1))
size=$((size*8192)) size=$((size*8192))
size=$((size + ( $RANDOM % 8192) )) size=$((size + ( RANDOM % 8192) ))
cinfail=$(mktemp) cinfail=$(mktemp)
make_file "$cinfail" "client" $size make_file "$cinfail" "client" $size
...@@ -830,7 +934,7 @@ run_tests() ...@@ -830,7 +934,7 @@ run_tests()
sinfail=$(mktemp) sinfail=$(mktemp)
fi fi
make_file "$sinfail" "server" $size make_file "$sinfail" "server" $size
elif [ "$test_linkfail" -eq 2 -a -z "$sinfail" ]; then elif [ "$test_linkfail" -eq 2 ] && [ -z "$sinfail" ]; then
size=$((RANDOM%16)) size=$((RANDOM%16))
size=$((size+1)) size=$((size+1))
size=$((size*2048)) size=$((size*2048))
...@@ -853,9 +957,8 @@ dump_stats() ...@@ -853,9 +957,8 @@ dump_stats()
chk_csum_nr() chk_csum_nr()
{ {
local msg=${1:-""} local csum_ns1=${1:-0}
local csum_ns1=${2:-0} local csum_ns2=${2:-0}
local csum_ns2=${3:-0}
local count local count
local dump_stats local dump_stats
local allow_multi_errors_ns1=0 local allow_multi_errors_ns1=0
...@@ -870,29 +973,24 @@ chk_csum_nr() ...@@ -870,29 +973,24 @@ chk_csum_nr()
csum_ns2=${csum_ns2:1} csum_ns2=${csum_ns2:1}
fi fi
if [ ! -z "$msg" ]; then printf "%-${nr_blank}s %s" " " "sum"
printf "%03u" "$TEST_COUNT" count=$(ip netns exec $ns1 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}')
else
echo -n " "
fi
printf " %-36s %s" "$msg" "sum"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'`
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != $csum_ns1 -a $allow_multi_errors_ns1 -eq 0 ] || if { [ "$count" != $csum_ns1 ] && [ $allow_multi_errors_ns1 -eq 0 ]; } ||
[ "$count" -lt $csum_ns1 -a $allow_multi_errors_ns1 -eq 1 ]; then { [ "$count" -lt $csum_ns1 ] && [ $allow_multi_errors_ns1 -eq 1 ]; }; then
echo "[fail] got $count data checksum error[s] expected $csum_ns1" echo "[fail] got $count data checksum error[s] expected $csum_ns1"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo -n "[ ok ]" echo -n "[ ok ]"
fi fi
echo -n " - csum " echo -n " - csum "
count=`ip netns exec $ns2 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}'` count=$(ip netns exec $ns2 nstat -as | grep MPTcpExtDataCsumErr | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != $csum_ns2 -a $allow_multi_errors_ns2 -eq 0 ] || if { [ "$count" != $csum_ns2 ] && [ $allow_multi_errors_ns2 -eq 0 ]; } ||
[ "$count" -lt $csum_ns2 -a $allow_multi_errors_ns2 -eq 1 ]; then { [ "$count" -lt $csum_ns2 ] && [ $allow_multi_errors_ns2 -eq 1 ]; }; then
echo "[fail] got $count data checksum error[s] expected $csum_ns2" echo "[fail] got $count data checksum error[s] expected $csum_ns2"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo "[ ok ]" echo "[ ok ]"
...@@ -908,22 +1006,22 @@ chk_fail_nr() ...@@ -908,22 +1006,22 @@ chk_fail_nr()
local dump_stats local dump_stats
printf "%-${nr_blank}s %s" " " "ftx" printf "%-${nr_blank}s %s" " " "ftx"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPFailTx | awk '{print $2}'` count=$(ip netns exec $ns1 nstat -as | grep MPTcpExtMPFailTx | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$fail_tx" ]; then if [ "$count" != "$fail_tx" ]; then
echo "[fail] got $count MP_FAIL[s] TX expected $fail_tx" echo "[fail] got $count MP_FAIL[s] TX expected $fail_tx"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo -n "[ ok ]" echo -n "[ ok ]"
fi fi
echo -n " - failrx" echo -n " - failrx"
count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPFailRx | awk '{print $2}'` count=$(ip netns exec $ns2 nstat -as | grep MPTcpExtMPFailRx | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$fail_rx" ]; then if [ "$count" != "$fail_rx" ]; then
echo "[fail] got $count MP_FAIL[s] RX expected $fail_rx" echo "[fail] got $count MP_FAIL[s] RX expected $fail_rx"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo "[ ok ]" echo "[ ok ]"
...@@ -944,7 +1042,7 @@ chk_fclose_nr() ...@@ -944,7 +1042,7 @@ chk_fclose_nr()
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$fclose_tx" ]; then if [ "$count" != "$fclose_tx" ]; then
echo "[fail] got $count MP_FASTCLOSE[s] TX expected $fclose_tx" echo "[fail] got $count MP_FASTCLOSE[s] TX expected $fclose_tx"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo -n "[ ok ]" echo -n "[ ok ]"
...@@ -955,7 +1053,7 @@ chk_fclose_nr() ...@@ -955,7 +1053,7 @@ chk_fclose_nr()
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$fclose_rx" ]; then if [ "$count" != "$fclose_rx" ]; then
echo "[fail] got $count MP_FASTCLOSE[s] RX expected $fclose_rx" echo "[fail] got $count MP_FASTCLOSE[s] RX expected $fclose_rx"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo "[ ok ]" echo "[ ok ]"
...@@ -986,7 +1084,7 @@ chk_rst_nr() ...@@ -986,7 +1084,7 @@ chk_rst_nr()
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$rst_tx" ]; then if [ "$count" != "$rst_tx" ]; then
echo "[fail] got $count MP_RST[s] TX expected $rst_tx" echo "[fail] got $count MP_RST[s] TX expected $rst_tx"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo -n "[ ok ]" echo -n "[ ok ]"
...@@ -997,7 +1095,7 @@ chk_rst_nr() ...@@ -997,7 +1095,7 @@ chk_rst_nr()
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$rst_rx" ]; then if [ "$count" != "$rst_rx" ]; then
echo "[fail] got $count MP_RST[s] RX expected $rst_rx" echo "[fail] got $count MP_RST[s] RX expected $rst_rx"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo -n "[ ok ]" echo -n "[ ok ]"
...@@ -1010,32 +1108,37 @@ chk_rst_nr() ...@@ -1010,32 +1108,37 @@ chk_rst_nr()
chk_join_nr() chk_join_nr()
{ {
local msg="$1" local syn_nr=$1
local syn_nr=$2 local syn_ack_nr=$2
local syn_ack_nr=$3 local ack_nr=$3
local ack_nr=$4 local csum_ns1=${4:-0}
local csum_ns1=${5:-0} local csum_ns2=${5:-0}
local csum_ns2=${6:-0} local fail_nr=${6:-0}
local fail_nr=${7:-0} local rst_nr=${7:-0}
local rst_nr=${8:-0} local corrupted_pkts=${8:-0}
local count local count
local dump_stats local dump_stats
local with_cookie local with_cookie
local title="${TEST_NAME}"
printf "%03u %-36s %s" "$TEST_COUNT" "$msg" "syn" if [ "${corrupted_pkts}" -gt 0 ]; then
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinSynRx | awk '{print $2}'` title+=": ${corrupted_pkts} corrupted pkts"
fi
printf "%03u %-36s %s" "${TEST_COUNT}" "${title}" "syn"
count=$(ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinSynRx | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$syn_nr" ]; then if [ "$count" != "$syn_nr" ]; then
echo "[fail] got $count JOIN[s] syn expected $syn_nr" echo "[fail] got $count JOIN[s] syn expected $syn_nr"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo -n "[ ok ]" echo -n "[ ok ]"
fi fi
echo -n " - synack" echo -n " - synack"
with_cookie=`ip netns exec $ns2 sysctl -n net.ipv4.tcp_syncookies` with_cookie=$(ip netns exec $ns2 sysctl -n net.ipv4.tcp_syncookies)
count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinSynAckRx | awk '{print $2}'` count=$(ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinSynAckRx | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$syn_ack_nr" ]; then if [ "$count" != "$syn_ack_nr" ]; then
# simult connections exceeding the limit with cookie enabled could go up to # simult connections exceeding the limit with cookie enabled could go up to
...@@ -1045,7 +1148,7 @@ chk_join_nr() ...@@ -1045,7 +1148,7 @@ chk_join_nr()
echo -n "[ ok ]" echo -n "[ ok ]"
else else
echo "[fail] got $count JOIN[s] synack expected $syn_ack_nr" echo "[fail] got $count JOIN[s] synack expected $syn_ack_nr"
ret=1 fail_test
dump_stats=1 dump_stats=1
fi fi
else else
...@@ -1053,18 +1156,18 @@ chk_join_nr() ...@@ -1053,18 +1156,18 @@ chk_join_nr()
fi fi
echo -n " - ack" echo -n " - ack"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinAckRx | awk '{print $2}'` count=$(ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinAckRx | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$ack_nr" ]; then if [ "$count" != "$ack_nr" ]; then
echo "[fail] got $count JOIN[s] ack expected $ack_nr" echo "[fail] got $count JOIN[s] ack expected $ack_nr"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo "[ ok ]" echo "[ ok ]"
fi fi
[ "${dump_stats}" = 1 ] && dump_stats [ "${dump_stats}" = 1 ] && dump_stats
if [ $checksum -eq 1 ]; then if [ $checksum -eq 1 ]; then
chk_csum_nr "" $csum_ns1 $csum_ns2 chk_csum_nr $csum_ns1 $csum_ns2
chk_fail_nr $fail_nr $fail_nr chk_fail_nr $fail_nr $fail_nr
chk_rst_nr $rst_nr $rst_nr chk_rst_nr $rst_nr $rst_nr
fi fi
...@@ -1086,18 +1189,18 @@ chk_stale_nr() ...@@ -1086,18 +1189,18 @@ chk_stale_nr()
local recover_nr local recover_nr
printf "%-${nr_blank}s %-18s" " " "stale" printf "%-${nr_blank}s %-18s" " " "stale"
stale_nr=`ip netns exec $ns nstat -as | grep MPTcpExtSubflowStale | awk '{print $2}'` stale_nr=$(ip netns exec $ns nstat -as | grep MPTcpExtSubflowStale | awk '{print $2}')
[ -z "$stale_nr" ] && stale_nr=0 [ -z "$stale_nr" ] && stale_nr=0
recover_nr=`ip netns exec $ns nstat -as | grep MPTcpExtSubflowRecover | awk '{print $2}'` recover_nr=$(ip netns exec $ns nstat -as | grep MPTcpExtSubflowRecover | awk '{print $2}')
[ -z "$recover_nr" ] && recover_nr=0 [ -z "$recover_nr" ] && recover_nr=0
if [ $stale_nr -lt $stale_min ] || if [ $stale_nr -lt $stale_min ] ||
[ $stale_max -gt 0 -a $stale_nr -gt $stale_max ] || { [ $stale_max -gt 0 ] && [ $stale_nr -gt $stale_max ]; } ||
[ $((stale_nr - $recover_nr)) -ne $stale_delta ]; then [ $((stale_nr - recover_nr)) -ne $stale_delta ]; then
echo "[fail] got $stale_nr stale[s] $recover_nr recover[s], " \ echo "[fail] got $stale_nr stale[s] $recover_nr recover[s], " \
" expected stale in range [$stale_min..$stale_max]," \ " expected stale in range [$stale_min..$stale_max]," \
" stale-recover delta $stale_delta " " stale-recover delta $stale_delta "
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo "[ ok ]" echo "[ ok ]"
...@@ -1124,28 +1227,28 @@ chk_add_nr() ...@@ -1124,28 +1227,28 @@ chk_add_nr()
local dump_stats local dump_stats
local timeout local timeout
timeout=`ip netns exec $ns1 sysctl -n net.mptcp.add_addr_timeout` timeout=$(ip netns exec $ns1 sysctl -n net.mptcp.add_addr_timeout)
printf "%-${nr_blank}s %s" " " "add" printf "%-${nr_blank}s %s" " " "add"
count=`ip netns exec $ns2 nstat -as MPTcpExtAddAddr | grep MPTcpExtAddAddr | awk '{print $2}'` count=$(ip netns exec $ns2 nstat -as MPTcpExtAddAddr | grep MPTcpExtAddAddr | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
# if the test configured a short timeout tolerate greater then expected # if the test configured a short timeout tolerate greater then expected
# add addrs options, due to retransmissions # add addrs options, due to retransmissions
if [ "$count" != "$add_nr" ] && [ "$timeout" -gt 1 -o "$count" -lt "$add_nr" ]; then if [ "$count" != "$add_nr" ] && { [ "$timeout" -gt 1 ] || [ "$count" -lt "$add_nr" ]; }; then
echo "[fail] got $count ADD_ADDR[s] expected $add_nr" echo "[fail] got $count ADD_ADDR[s] expected $add_nr"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo -n "[ ok ]" echo -n "[ ok ]"
fi fi
echo -n " - echo " echo -n " - echo "
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}'` count=$(ip netns exec $ns1 nstat -as | grep MPTcpExtEchoAdd | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$echo_nr" ]; then if [ "$count" != "$echo_nr" ]; then
echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr" echo "[fail] got $count ADD_ADDR echo[s] expected $echo_nr"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo -n "[ ok ]" echo -n "[ ok ]"
...@@ -1153,76 +1256,76 @@ chk_add_nr() ...@@ -1153,76 +1256,76 @@ chk_add_nr()
if [ $port_nr -gt 0 ]; then if [ $port_nr -gt 0 ]; then
echo -n " - pt " echo -n " - pt "
count=`ip netns exec $ns2 nstat -as | grep MPTcpExtPortAdd | awk '{print $2}'` count=$(ip netns exec $ns2 nstat -as | grep MPTcpExtPortAdd | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$port_nr" ]; then if [ "$count" != "$port_nr" ]; then
echo "[fail] got $count ADD_ADDR[s] with a port-number expected $port_nr" echo "[fail] got $count ADD_ADDR[s] with a port-number expected $port_nr"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo "[ ok ]" echo "[ ok ]"
fi fi
printf "%-${nr_blank}s %s" " " "syn" printf "%-${nr_blank}s %s" " " "syn"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortSynRx | count=$(ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortSynRx |
awk '{print $2}'` awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$syn_nr" ]; then if [ "$count" != "$syn_nr" ]; then
echo "[fail] got $count JOIN[s] syn with a different \ echo "[fail] got $count JOIN[s] syn with a different \
port-number expected $syn_nr" port-number expected $syn_nr"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo -n "[ ok ]" echo -n "[ ok ]"
fi fi
echo -n " - synack" echo -n " - synack"
count=`ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinPortSynAckRx | count=$(ip netns exec $ns2 nstat -as | grep MPTcpExtMPJoinPortSynAckRx |
awk '{print $2}'` awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$syn_ack_nr" ]; then if [ "$count" != "$syn_ack_nr" ]; then
echo "[fail] got $count JOIN[s] synack with a different \ echo "[fail] got $count JOIN[s] synack with a different \
port-number expected $syn_ack_nr" port-number expected $syn_ack_nr"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo -n "[ ok ]" echo -n "[ ok ]"
fi fi
echo -n " - ack" echo -n " - ack"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortAckRx | count=$(ip netns exec $ns1 nstat -as | grep MPTcpExtMPJoinPortAckRx |
awk '{print $2}'` awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$ack_nr" ]; then if [ "$count" != "$ack_nr" ]; then
echo "[fail] got $count JOIN[s] ack with a different \ echo "[fail] got $count JOIN[s] ack with a different \
port-number expected $ack_nr" port-number expected $ack_nr"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo "[ ok ]" echo "[ ok ]"
fi fi
printf "%-${nr_blank}s %s" " " "syn" printf "%-${nr_blank}s %s" " " "syn"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortSynRx | count=$(ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortSynRx |
awk '{print $2}'` awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$mis_syn_nr" ]; then if [ "$count" != "$mis_syn_nr" ]; then
echo "[fail] got $count JOIN[s] syn with a mismatched \ echo "[fail] got $count JOIN[s] syn with a mismatched \
port-number expected $mis_syn_nr" port-number expected $mis_syn_nr"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo -n "[ ok ]" echo -n "[ ok ]"
fi fi
echo -n " - ack " echo -n " - ack "
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortAckRx | count=$(ip netns exec $ns1 nstat -as | grep MPTcpExtMismatchPortAckRx |
awk '{print $2}'` awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$mis_ack_nr" ]; then if [ "$count" != "$mis_ack_nr" ]; then
echo "[fail] got $count JOIN[s] ack with a mismatched \ echo "[fail] got $count JOIN[s] ack with a mismatched \
port-number expected $mis_ack_nr" port-number expected $mis_ack_nr"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo "[ ok ]" echo "[ ok ]"
...@@ -1263,22 +1366,23 @@ chk_rm_nr() ...@@ -1263,22 +1366,23 @@ chk_rm_nr()
fi fi
printf "%-${nr_blank}s %s" " " "rm " printf "%-${nr_blank}s %s" " " "rm "
count=`ip netns exec $addr_ns nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'` count=$(ip netns exec $addr_ns nstat -as | grep MPTcpExtRmAddr | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$rm_addr_nr" ]; then if [ "$count" != "$rm_addr_nr" ]; then
echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr" echo "[fail] got $count RM_ADDR[s] expected $rm_addr_nr"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo -n "[ ok ]" echo -n "[ ok ]"
fi fi
echo -n " - rmsf " echo -n " - rmsf "
count=`ip netns exec $subflow_ns nstat -as | grep MPTcpExtRmSubflow | awk '{print $2}'` count=$(ip netns exec $subflow_ns nstat -as | grep MPTcpExtRmSubflow | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ -n "$simult" ]; then if [ -n "$simult" ]; then
local cnt=$(ip netns exec $addr_ns nstat -as | grep MPTcpExtRmSubflow | awk '{print $2}') local cnt suffix
local suffix
cnt=$(ip netns exec $addr_ns nstat -as | grep MPTcpExtRmSubflow | awk '{print $2}')
# in case of simult flush, the subflow removal count on each side is # in case of simult flush, the subflow removal count on each side is
# unreliable # unreliable
...@@ -1290,14 +1394,14 @@ chk_rm_nr() ...@@ -1290,14 +1394,14 @@ chk_rm_nr()
echo "[ ok ] $suffix" echo "[ ok ] $suffix"
else else
echo "[fail] got $count RM_SUBFLOW[s] expected in range [$rm_subflow_nr:$((rm_subflow_nr*2))]" echo "[fail] got $count RM_SUBFLOW[s] expected in range [$rm_subflow_nr:$((rm_subflow_nr*2))]"
ret=1 fail_test
dump_stats=1 dump_stats=1
fi fi
return return
fi fi
if [ "$count" != "$rm_subflow_nr" ]; then if [ "$count" != "$rm_subflow_nr" ]; then
echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr" echo "[fail] got $count RM_SUBFLOW[s] expected $rm_subflow_nr"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo -n "[ ok ]" echo -n "[ ok ]"
...@@ -1316,22 +1420,22 @@ chk_prio_nr() ...@@ -1316,22 +1420,22 @@ chk_prio_nr()
local dump_stats local dump_stats
printf "%-${nr_blank}s %s" " " "ptx" printf "%-${nr_blank}s %s" " " "ptx"
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}'` count=$(ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioTx | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$mp_prio_nr_tx" ]; then if [ "$count" != "$mp_prio_nr_tx" ]; then
echo "[fail] got $count MP_PRIO[s] TX expected $mp_prio_nr_tx" echo "[fail] got $count MP_PRIO[s] TX expected $mp_prio_nr_tx"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo -n "[ ok ]" echo -n "[ ok ]"
fi fi
echo -n " - prx " echo -n " - prx "
count=`ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}'` count=$(ip netns exec $ns1 nstat -as | grep MPTcpExtMPPrioRx | awk '{print $2}')
[ -z "$count" ] && count=0 [ -z "$count" ] && count=0
if [ "$count" != "$mp_prio_nr_rx" ]; then if [ "$count" != "$mp_prio_nr_rx" ]; then
echo "[fail] got $count MP_PRIO[s] RX expected $mp_prio_nr_rx" echo "[fail] got $count MP_PRIO[s] RX expected $mp_prio_nr_rx"
ret=1 fail_test
dump_stats=1 dump_stats=1
else else
echo "[ ok ]" echo "[ ok ]"
...@@ -1346,16 +1450,18 @@ chk_link_usage() ...@@ -1346,16 +1450,18 @@ chk_link_usage()
local link=$2 local link=$2
local out=$3 local out=$3
local expected_rate=$4 local expected_rate=$4
local tx_link=`ip netns exec $ns cat /sys/class/net/$link/statistics/tx_bytes`
local tx_total=`ls -l $out | awk '{print $5}'` local tx_link tx_total
local tx_rate=$((tx_link * 100 / $tx_total)) tx_link=$(ip netns exec $ns cat /sys/class/net/$link/statistics/tx_bytes)
tx_total=$(stat --format=%s $out)
local tx_rate=$((tx_link * 100 / tx_total))
local tolerance=5 local tolerance=5
printf "%-${nr_blank}s %-18s" " " "link usage" printf "%-${nr_blank}s %-18s" " " "link usage"
if [ $tx_rate -lt $((expected_rate - $tolerance)) -o \ if [ $tx_rate -lt $((expected_rate - tolerance)) ] || \
$tx_rate -gt $((expected_rate + $tolerance)) ]; then [ $tx_rate -gt $((expected_rate + tolerance)) ]; then
echo "[fail] got $tx_rate% usage, expected $expected_rate%" echo "[fail] got $tx_rate% usage, expected $expected_rate%"
ret=1 fail_test
else else
echo "[ ok ]" echo "[ ok ]"
fi fi
...@@ -1368,7 +1474,9 @@ wait_attempt_fail() ...@@ -1368,7 +1474,9 @@ wait_attempt_fail()
local ns=$1 local ns=$1
while [ $time -lt $timeout_ms ]; do while [ $time -lt $timeout_ms ]; do
local cnt=$(ip netns exec $ns nstat -as TcpAttemptFails | grep TcpAttemptFails | awk '{print $2}') local cnt
cnt=$(ip netns exec $ns nstat -as TcpAttemptFails | grep TcpAttemptFails | awk '{print $2}')
[ "$cnt" = 1 ] && return 1 [ "$cnt" = 1 ] && return 1
time=$((time + 100)) time=$((time + 100))
...@@ -1379,106 +1487,112 @@ wait_attempt_fail() ...@@ -1379,106 +1487,112 @@ wait_attempt_fail()
subflows_tests() subflows_tests()
{ {
reset if reset "no JOIN"; then
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "no JOIN" "0" "0" "0" chk_join_nr 0 0 0
fi
# subflow limited by client # subflow limited by client
reset if reset "single subflow, limited by client"; then
pm_nl_set_limits $ns1 0 0 pm_nl_set_limits $ns1 0 0
pm_nl_set_limits $ns2 0 0 pm_nl_set_limits $ns2 0 0
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "single subflow, limited by client" 0 0 0 chk_join_nr 0 0 0
fi
# subflow limited by server # subflow limited by server
reset if reset "single subflow, limited by server"; then
pm_nl_set_limits $ns1 0 0 pm_nl_set_limits $ns1 0 0
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "single subflow, limited by server" 1 1 0 chk_join_nr 1 1 0
fi
# subflow # subflow
reset if reset "single subflow"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "single subflow" 1 1 1 chk_join_nr 1 1 1
fi
# multiple subflows # multiple subflows
reset if reset "multiple subflows"; then
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_set_limits $ns2 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.3.2 flags subflow
pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "multiple subflows" 2 2 2 chk_join_nr 2 2 2
fi
# multiple subflows limited by server # multiple subflows limited by server
reset if reset "multiple subflows, limited by server"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 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.3.2 flags subflow
pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "multiple subflows, limited by server" 2 2 1 chk_join_nr 2 2 1
fi
# single subflow, dev # single subflow, dev
reset if reset "single subflow, dev"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow dev ns2eth3 pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow dev ns2eth3
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "single subflow, dev" 1 1 1 chk_join_nr 1 1 1
fi
} }
subflows_error_tests() subflows_error_tests()
{ {
# If a single subflow is configured, and matches the MPC src # If a single subflow is configured, and matches the MPC src
# address, no additional subflow should be created # address, no additional subflow should be created
reset if reset "no MPC reuse with single endpoint"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
chk_join_nr "no MPC reuse with single endpoint" 0 0 0 chk_join_nr 0 0 0
fi
# multiple subflows, with subflow creation error # multiple subflows, with subflow creation error
reset if reset "multi subflows, with failing subflow"; then
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_set_limits $ns2 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.3.2 flags subflow
pm_nl_add_endpoint $ns2 10.0.2.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 filter_tcp_from $ns1 10.0.3.2 REJECT
run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
chk_join_nr "multi subflows, with failing subflow" 1 1 1 chk_join_nr 1 1 1
fi
# multiple subflows, with subflow timeout on MPJ # multiple subflows, with subflow timeout on MPJ
reset if reset "multi subflows, with subflow timeout"; then
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_set_limits $ns2 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.3.2 flags subflow
pm_nl_add_endpoint $ns2 10.0.2.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 filter_tcp_from $ns1 10.0.3.2 DROP
run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
chk_join_nr "multi subflows, with subflow timeout" 1 1 1 chk_join_nr 1 1 1
fi
# multiple subflows, check that the endpoint corresponding to # multiple subflows, check that the endpoint corresponding to
# closed subflow (due to reset) is not reused if additional # closed subflow (due to reset) is not reused if additional
# subflows are added later # subflows are added later
reset if reset "multi subflows, fair usage on close"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow 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 filter_tcp_from $ns1 10.0.3.2 REJECT
run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow & run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow &
# updates in the child shell do not have any effect here, we
# need to bump the test counter for the above case
TEST_COUNT=$((TEST_COUNT+1))
# mpj subflow will be in TW after the reset # mpj subflow will be in TW after the reset
wait_attempt_fail $ns2 wait_attempt_fail $ns2
pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
...@@ -1486,75 +1600,82 @@ subflows_error_tests() ...@@ -1486,75 +1600,82 @@ subflows_error_tests()
# additional subflow could be created only if the PM select # additional subflow could be created only if the PM select
# the later endpoint, skipping the already used one # the later endpoint, skipping the already used one
chk_join_nr "multi subflows, fair usage on close" 1 1 1 chk_join_nr 1 1 1
fi
} }
signal_address_tests() signal_address_tests()
{ {
# add_address, unused # add_address, unused
reset if reset "unused signal address"; then
pm_nl_add_endpoint $ns1 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 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "unused signal address" 0 0 0 chk_join_nr 0 0 0
chk_add_nr 1 1 chk_add_nr 1 1
fi
# accept and use add_addr # accept and use add_addr
reset if reset "signal address"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
pm_nl_add_endpoint $ns1 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 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "signal address" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 chk_add_nr 1 1
fi
# accept and use add_addr with an additional subflow # accept and use add_addr with an additional subflow
# note: signal address in server ns and local addresses in client ns must # note: signal address in server ns and local addresses in client ns must
# belong to different subnets or one of the listed local address could be # belong to different subnets or one of the listed local address could be
# used for 'add_addr' subflow # used for 'add_addr' subflow
reset if reset "subflow and signal"; then
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_set_limits $ns2 1 2 pm_nl_set_limits $ns2 1 2
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "subflow and signal" 2 2 2 chk_join_nr 2 2 2
chk_add_nr 1 1 chk_add_nr 1 1
fi
# accept and use add_addr with additional subflows # accept and use add_addr with additional subflows
reset if reset "multiple subflows and signal"; then
pm_nl_set_limits $ns1 0 3 pm_nl_set_limits $ns1 0 3
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
pm_nl_set_limits $ns2 1 3 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.3.2 flags subflow
pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "multiple subflows and signal" 3 3 3 chk_join_nr 3 3 3
chk_add_nr 1 1 chk_add_nr 1 1
fi
# signal addresses # signal addresses
reset if reset "signal addresses"; then
pm_nl_set_limits $ns1 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.2.1 flags signal
pm_nl_add_endpoint $ns1 10.0.3.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 $ns1 10.0.4.1 flags signal
pm_nl_set_limits $ns2 3 3 pm_nl_set_limits $ns2 3 3
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "signal addresses" 3 3 3 chk_join_nr 3 3 3
chk_add_nr 3 3 chk_add_nr 3 3
fi
# signal invalid addresses # signal invalid addresses
reset if reset "signal invalid addresses"; then
pm_nl_set_limits $ns1 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.12.1 flags signal
pm_nl_add_endpoint $ns1 10.0.3.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_add_endpoint $ns1 10.0.14.1 flags signal
pm_nl_set_limits $ns2 3 3 pm_nl_set_limits $ns2 3 3
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "signal invalid addresses" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 3 3 chk_add_nr 3 3
fi
# signal addresses race test # signal addresses race test
reset if reset "signal addresses race test"; then
pm_nl_set_limits $ns1 4 4 pm_nl_set_limits $ns1 4 4
pm_nl_set_limits $ns2 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.1.1 flags signal
...@@ -1569,18 +1690,18 @@ signal_address_tests() ...@@ -1569,18 +1690,18 @@ signal_address_tests()
# the peer could possibly miss some addr notification, allow retransmission # the peer could possibly miss some addr notification, allow retransmission
ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1 ip netns exec $ns1 sysctl -q net.mptcp.add_addr_timeout=1
run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
chk_join_nr "signal addresses race test" 3 3 3 chk_join_nr 3 3 3
# the server will not signal the address terminating # the server will not signal the address terminating
# the MPC subflow # the MPC subflow
chk_add_nr 3 3 chk_add_nr 3 3
fi
} }
link_failure_tests() link_failure_tests()
{ {
# accept and use add_addr with additional subflows and link loss # accept and use add_addr with additional subflows and link loss
reset if reset "multiple flows, signal, link failure"; then
# without any b/w limit each veth could spool the packets and get # without any b/w limit each veth could spool the packets and get
# them acked at xmit time, so that the corresponding subflow will # them acked at xmit time, so that the corresponding subflow will
# have almost always no outstanding pkts, the scheduler will pick # have almost always no outstanding pkts, the scheduler will pick
...@@ -1594,13 +1715,14 @@ link_failure_tests() ...@@ -1594,13 +1715,14 @@ link_failure_tests()
pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow 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 pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
run_tests $ns1 $ns2 10.0.1.1 1 run_tests $ns1 $ns2 10.0.1.1 1
chk_join_nr "multiple flows, signal, link failure" 3 3 3 chk_join_nr 3 3 3
chk_add_nr 1 1 chk_add_nr 1 1
chk_stale_nr $ns2 1 5 1 chk_stale_nr $ns2 1 5 1
fi
# accept and use add_addr with additional subflows and link loss # accept and use add_addr with additional subflows and link loss
# for bidirectional transfer # for bidirectional transfer
reset if reset "multi flows, signal, bidi, link fail"; then
init_shapers init_shapers
pm_nl_set_limits $ns1 0 3 pm_nl_set_limits $ns1 0 3
pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
...@@ -1608,658 +1730,725 @@ link_failure_tests() ...@@ -1608,658 +1730,725 @@ link_failure_tests()
pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow 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 pm_nl_add_endpoint $ns2 10.0.4.2 dev ns2eth4 flags subflow
run_tests $ns1 $ns2 10.0.1.1 2 run_tests $ns1 $ns2 10.0.1.1 2
chk_join_nr "multi flows, signal, bidi, link fail" 3 3 3 chk_join_nr 3 3 3
chk_add_nr 1 1 chk_add_nr 1 1
chk_stale_nr $ns2 1 -1 1 chk_stale_nr $ns2 1 -1 1
fi
# 2 subflows plus 1 backup subflow with a lossy link, backup # 2 subflows plus 1 backup subflow with a lossy link, backup
# will never be used # will never be used
reset if reset "backup subflow unused, link failure"; then
init_shapers init_shapers
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
pm_nl_set_limits $ns2 1 2 pm_nl_set_limits $ns2 1 2
export FAILING_LINKS="1" FAILING_LINKS="1"
pm_nl_add_endpoint $ns2 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 run_tests $ns1 $ns2 10.0.1.1 1
chk_join_nr "backup subflow unused, link failure" 2 2 2 chk_join_nr 2 2 2
chk_add_nr 1 1 chk_add_nr 1 1
chk_link_usage $ns2 ns2eth3 $cinsent 0 chk_link_usage $ns2 ns2eth3 $cinsent 0
fi
# 2 lossy links after half transfer, backup will get half of # 2 lossy links after half transfer, backup will get half of
# the traffic # the traffic
reset if reset "backup flow used, multi links fail"; then
init_shapers init_shapers
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
pm_nl_set_limits $ns2 1 2 pm_nl_set_limits $ns2 1 2
pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
export FAILING_LINKS="1 2" FAILING_LINKS="1 2"
run_tests $ns1 $ns2 10.0.1.1 1 run_tests $ns1 $ns2 10.0.1.1 1
chk_join_nr "backup flow used, multi links fail" 2 2 2 chk_join_nr 2 2 2
chk_add_nr 1 1 chk_add_nr 1 1
chk_stale_nr $ns2 2 4 2 chk_stale_nr $ns2 2 4 2
chk_link_usage $ns2 ns2eth3 $cinsent 50 chk_link_usage $ns2 ns2eth3 $cinsent 50
fi
# use a backup subflow with the first subflow on a lossy link # use a backup subflow with the first subflow on a lossy link
# for bidirectional transfer # for bidirectional transfer
reset if reset "backup flow used, bidi, link failure"; then
init_shapers init_shapers
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 dev ns1eth2 flags signal
pm_nl_set_limits $ns2 1 3 pm_nl_set_limits $ns2 1 3
pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup pm_nl_add_endpoint $ns2 10.0.3.2 dev ns2eth3 flags subflow,backup
FAILING_LINKS="1 2"
run_tests $ns1 $ns2 10.0.1.1 2 run_tests $ns1 $ns2 10.0.1.1 2
chk_join_nr "backup flow used, bidi, link failure" 2 2 2 chk_join_nr 2 2 2
chk_add_nr 1 1 chk_add_nr 1 1
chk_stale_nr $ns2 1 -1 2 chk_stale_nr $ns2 1 -1 2
chk_link_usage $ns2 ns2eth3 $cinsent 50 chk_link_usage $ns2 ns2eth3 $cinsent 50
fi
} }
add_addr_timeout_tests() add_addr_timeout_tests()
{ {
# add_addr timeout # add_addr timeout
reset_with_add_addr_timeout if reset_with_add_addr_timeout "signal address, ADD_ADDR timeout"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
pm_nl_add_endpoint $ns1 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 0 0 0 slow run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow
chk_join_nr "signal address, ADD_ADDR timeout" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 4 0 chk_add_nr 4 0
fi
# add_addr timeout IPv6 # add_addr timeout IPv6
reset_with_add_addr_timeout 6 if reset_with_add_addr_timeout "signal address, ADD_ADDR6 timeout" 6; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
pm_nl_add_endpoint $ns1 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 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
chk_join_nr "signal address, ADD_ADDR6 timeout" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 4 0 chk_add_nr 4 0
fi
# signal addresses timeout # signal addresses timeout
reset_with_add_addr_timeout if reset_with_add_addr_timeout "signal addresses, ADD_ADDR timeout"; then
pm_nl_set_limits $ns1 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.2.1 flags signal
pm_nl_add_endpoint $ns1 10.0.3.1 flags signal pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
pm_nl_set_limits $ns2 2 2 pm_nl_set_limits $ns2 2 2
run_tests $ns1 $ns2 10.0.1.1 0 0 0 speed_10 run_tests $ns1 $ns2 10.0.1.1 0 0 0 speed_10
chk_join_nr "signal addresses, ADD_ADDR timeout" 2 2 2 chk_join_nr 2 2 2
chk_add_nr 8 0 chk_add_nr 8 0
fi
# signal invalid addresses timeout # signal invalid addresses timeout
reset_with_add_addr_timeout if reset_with_add_addr_timeout "invalid address, ADD_ADDR timeout"; then
pm_nl_set_limits $ns1 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.12.1 flags signal
pm_nl_add_endpoint $ns1 10.0.3.1 flags signal pm_nl_add_endpoint $ns1 10.0.3.1 flags signal
pm_nl_set_limits $ns2 2 2 pm_nl_set_limits $ns2 2 2
run_tests $ns1 $ns2 10.0.1.1 0 0 0 speed_10 run_tests $ns1 $ns2 10.0.1.1 0 0 0 speed_10
chk_join_nr "invalid address, ADD_ADDR timeout" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 8 0 chk_add_nr 8 0
fi
} }
remove_tests() remove_tests()
{ {
# single subflow, remove # single subflow, remove
reset if reset "remove single subflow"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow run_tests $ns1 $ns2 10.0.1.1 0 0 -1 slow
chk_join_nr "remove single subflow" 1 1 1 chk_join_nr 1 1 1
chk_rm_nr 1 1 chk_rm_nr 1 1
fi
# multiple subflows, remove # multiple subflows, remove
reset if reset "remove multiple subflows"; then
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_set_limits $ns2 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.2.2 flags subflow
pm_nl_add_endpoint $ns2 10.0.3.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 run_tests $ns1 $ns2 10.0.1.1 0 0 -2 slow
chk_join_nr "remove multiple subflows" 2 2 2 chk_join_nr 2 2 2
chk_rm_nr 2 2 chk_rm_nr 2 2
fi
# single address, remove # single address, remove
reset if reset "remove single address"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
chk_join_nr "remove single address" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 chk_add_nr 1 1
chk_rm_nr 1 1 invert chk_rm_nr 1 1 invert
fi
# subflow and signal, remove # subflow and signal, remove
reset if reset "remove subflow and signal"; then
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
pm_nl_set_limits $ns2 1 2 pm_nl_set_limits $ns2 1 2
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow
chk_join_nr "remove subflow and signal" 2 2 2 chk_join_nr 2 2 2
chk_add_nr 1 1 chk_add_nr 1 1
chk_rm_nr 1 1 chk_rm_nr 1 1
fi
# subflows and signal, remove # subflows and signal, remove
reset if reset "remove subflows and signal"; then
pm_nl_set_limits $ns1 0 3 pm_nl_set_limits $ns1 0 3
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
pm_nl_set_limits $ns2 1 3 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.3.2 flags subflow
pm_nl_add_endpoint $ns2 10.0.4.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 run_tests $ns1 $ns2 10.0.1.1 0 -1 -2 slow
chk_join_nr "remove subflows and signal" 3 3 3 chk_join_nr 3 3 3
chk_add_nr 1 1 chk_add_nr 1 1
chk_rm_nr 2 2 chk_rm_nr 2 2
fi
# addresses remove # addresses remove
reset if reset "remove addresses"; then
pm_nl_set_limits $ns1 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.2.1 flags signal id 250
pm_nl_add_endpoint $ns1 10.0.3.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 $ns1 10.0.4.1 flags signal
pm_nl_set_limits $ns2 3 3 pm_nl_set_limits $ns2 3 3
run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
chk_join_nr "remove addresses" 3 3 3 chk_join_nr 3 3 3
chk_add_nr 3 3 chk_add_nr 3 3
chk_rm_nr 3 3 invert chk_rm_nr 3 3 invert
fi
# invalid addresses remove # invalid addresses remove
reset if reset "remove invalid addresses"; then
pm_nl_set_limits $ns1 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.12.1 flags signal
pm_nl_add_endpoint $ns1 10.0.3.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_add_endpoint $ns1 10.0.14.1 flags signal
pm_nl_set_limits $ns2 3 3 pm_nl_set_limits $ns2 3 3
run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow run_tests $ns1 $ns2 10.0.1.1 0 -3 0 slow
chk_join_nr "remove invalid addresses" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 3 3 chk_add_nr 3 3
chk_rm_nr 3 1 invert chk_rm_nr 3 1 invert
fi
# subflows and signal, flush # subflows and signal, flush
reset if reset "flush subflows and signal"; then
pm_nl_set_limits $ns1 0 3 pm_nl_set_limits $ns1 0 3
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
pm_nl_set_limits $ns2 1 3 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.3.2 flags subflow
pm_nl_add_endpoint $ns2 10.0.4.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 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
chk_join_nr "flush subflows and signal" 3 3 3 chk_join_nr 3 3 3
chk_add_nr 1 1 chk_add_nr 1 1
chk_rm_nr 1 3 invert simult chk_rm_nr 1 3 invert simult
fi
# subflows flush # subflows flush
reset if reset "flush subflows"; then
pm_nl_set_limits $ns1 3 3 pm_nl_set_limits $ns1 3 3
pm_nl_set_limits $ns2 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.2.2 flags subflow id 150
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
pm_nl_add_endpoint $ns2 10.0.4.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 run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
chk_join_nr "flush subflows" 3 3 3 chk_join_nr 3 3 3
chk_rm_nr 0 3 simult chk_rm_nr 0 3 simult
fi
# addresses flush # addresses flush
reset if reset "flush addresses"; then
pm_nl_set_limits $ns1 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.2.1 flags signal id 250
pm_nl_add_endpoint $ns1 10.0.3.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 $ns1 10.0.4.1 flags signal
pm_nl_set_limits $ns2 3 3 pm_nl_set_limits $ns2 3 3
run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 slow
chk_join_nr "flush addresses" 3 3 3 chk_join_nr 3 3 3
chk_add_nr 3 3 chk_add_nr 3 3
chk_rm_nr 3 3 invert simult chk_rm_nr 3 3 invert simult
fi
# invalid addresses flush # invalid addresses flush
reset if reset "flush invalid addresses"; then
pm_nl_set_limits $ns1 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.12.1 flags signal
pm_nl_add_endpoint $ns1 10.0.3.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_add_endpoint $ns1 10.0.14.1 flags signal
pm_nl_set_limits $ns2 3 3 pm_nl_set_limits $ns2 3 3
run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow run_tests $ns1 $ns2 10.0.1.1 0 -8 0 slow
chk_join_nr "flush invalid addresses" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 3 3 chk_add_nr 3 3
chk_rm_nr 3 1 invert chk_rm_nr 3 1 invert
fi
# remove id 0 subflow # remove id 0 subflow
reset if reset "remove id 0 subflow"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 0 0 -9 slow run_tests $ns1 $ns2 10.0.1.1 0 0 -9 slow
chk_join_nr "remove id 0 subflow" 1 1 1 chk_join_nr 1 1 1
chk_rm_nr 1 1 chk_rm_nr 1 1
fi
# remove id 0 address # remove id 0 address
reset if reset "remove id 0 address"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
run_tests $ns1 $ns2 10.0.1.1 0 -9 0 slow run_tests $ns1 $ns2 10.0.1.1 0 -9 0 slow
chk_join_nr "remove id 0 address" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 chk_add_nr 1 1
chk_rm_nr 1 1 invert chk_rm_nr 1 1 invert
fi
} }
add_tests() add_tests()
{ {
# add single subflow # add single subflow
reset if reset "add single subflow"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow
chk_join_nr "add single subflow" 1 1 1 chk_join_nr 1 1 1
fi
# add signal address # add signal address
reset if reset "add signal address"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
chk_join_nr "add signal address" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 chk_add_nr 1 1
fi
# add multiple subflows # add multiple subflows
reset if reset "add multiple subflows"; then
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_set_limits $ns2 0 2 pm_nl_set_limits $ns2 0 2
run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow run_tests $ns1 $ns2 10.0.1.1 0 0 2 slow
chk_join_nr "add multiple subflows" 2 2 2 chk_join_nr 2 2 2
fi
# add multiple subflows IPv6 # add multiple subflows IPv6
reset if reset "add multiple subflows IPv6"; then
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_set_limits $ns2 0 2 pm_nl_set_limits $ns2 0 2
run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow run_tests $ns1 $ns2 dead:beef:1::1 0 0 2 slow
chk_join_nr "add multiple subflows IPv6" 2 2 2 chk_join_nr 2 2 2
fi
# add multiple addresses IPv6 # add multiple addresses IPv6
reset if reset "add multiple addresses IPv6"; then
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_set_limits $ns2 2 2 pm_nl_set_limits $ns2 2 2
run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow run_tests $ns1 $ns2 dead:beef:1::1 0 2 0 slow
chk_join_nr "add multiple addresses IPv6" 2 2 2 chk_join_nr 2 2 2
chk_add_nr 2 2 chk_add_nr 2 2
fi
} }
ipv6_tests() ipv6_tests()
{ {
# subflow IPv6 # subflow IPv6
reset if reset "single subflow IPv6"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow 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 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
chk_join_nr "single subflow IPv6" 1 1 1 chk_join_nr 1 1 1
fi
# add_address, unused IPv6 # add_address, unused IPv6
reset if reset "unused signal address IPv6"; then
pm_nl_add_endpoint $ns1 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 run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
chk_join_nr "unused signal address IPv6" 0 0 0 chk_join_nr 0 0 0
chk_add_nr 1 1 chk_add_nr 1 1
fi
# signal address IPv6 # signal address IPv6
reset if reset "single address IPv6"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow run_tests $ns1 $ns2 dead:beef:1::1 0 0 0 slow
chk_join_nr "single address IPv6" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 chk_add_nr 1 1
fi
# single address IPv6, remove # single address IPv6, remove
reset if reset "remove single address IPv6"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow run_tests $ns1 $ns2 dead:beef:1::1 0 -1 0 slow
chk_join_nr "remove single address IPv6" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 chk_add_nr 1 1
chk_rm_nr 1 1 invert chk_rm_nr 1 1 invert
fi
# subflow and signal IPv6, remove # subflow and signal IPv6, remove
reset if reset "remove subflow and signal IPv6"; then
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal pm_nl_add_endpoint $ns1 dead:beef:2::1 flags signal
pm_nl_set_limits $ns2 1 2 pm_nl_set_limits $ns2 1 2
pm_nl_add_endpoint $ns2 dead:beef:3::2 dev ns2eth3 flags subflow 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 run_tests $ns1 $ns2 dead:beef:1::1 0 -1 -1 slow
chk_join_nr "remove subflow and signal IPv6" 2 2 2 chk_join_nr 2 2 2
chk_add_nr 1 1 chk_add_nr 1 1
chk_rm_nr 1 1 chk_rm_nr 1 1
fi
} }
v4mapped_tests() v4mapped_tests()
{ {
# subflow IPv4-mapped to IPv4-mapped # subflow IPv4-mapped to IPv4-mapped
reset if reset "single subflow IPv4-mapped"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
run_tests $ns1 $ns2 "::ffff:10.0.1.1" run_tests $ns1 $ns2 "::ffff:10.0.1.1"
chk_join_nr "single subflow IPv4-mapped" 1 1 1 chk_join_nr 1 1 1
fi
# signal address IPv4-mapped with IPv4-mapped sk # signal address IPv4-mapped with IPv4-mapped sk
reset if reset "signal address IPv4-mapped"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
run_tests $ns1 $ns2 "::ffff:10.0.1.1" run_tests $ns1 $ns2 "::ffff:10.0.1.1"
chk_join_nr "signal address IPv4-mapped" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 chk_add_nr 1 1
fi
# subflow v4-map-v6 # subflow v4-map-v6
reset if reset "single subflow v4-map-v6"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 "::ffff:10.0.1.1" run_tests $ns1 $ns2 "::ffff:10.0.1.1"
chk_join_nr "single subflow v4-map-v6" 1 1 1 chk_join_nr 1 1 1
fi
# signal address v4-map-v6 # signal address v4-map-v6
reset if reset "signal address v4-map-v6"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
run_tests $ns1 $ns2 "::ffff:10.0.1.1" run_tests $ns1 $ns2 "::ffff:10.0.1.1"
chk_join_nr "signal address v4-map-v6" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 chk_add_nr 1 1
fi
# subflow v6-map-v4 # subflow v6-map-v4
reset if reset "single subflow v6-map-v4"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow pm_nl_add_endpoint $ns2 "::ffff:10.0.3.2" flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "single subflow v6-map-v4" 1 1 1 chk_join_nr 1 1 1
fi
# signal address v6-map-v4 # signal address v6-map-v4
reset if reset "signal address v6-map-v4"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal pm_nl_add_endpoint $ns1 "::ffff:10.0.2.1" flags signal
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "signal address v6-map-v4" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 chk_add_nr 1 1
fi
# no subflow IPv6 to v4 address # no subflow IPv6 to v4 address
reset if reset "no JOIN with diff families v4-v6"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow pm_nl_add_endpoint $ns2 dead:beef:2::2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "no JOIN with diff families v4-v6" 0 0 0 chk_join_nr 0 0 0
fi
# no subflow IPv6 to v4 address even if v6 has a valid v4 at the end # no subflow IPv6 to v4 address even if v6 has a valid v4 at the end
reset if reset "no JOIN with diff families v4-v6-2"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 dead:beef:2::10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "no JOIN with diff families v4-v6-2" 0 0 0 chk_join_nr 0 0 0
fi
# no subflow IPv4 to v6 address, no need to slow down too then # no subflow IPv4 to v6 address, no need to slow down too then
reset if reset "no JOIN with diff families v6-v4"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 dead:beef:1::1 run_tests $ns1 $ns2 dead:beef:1::1
chk_join_nr "no JOIN with diff families v6-v4" 0 0 0 chk_join_nr 0 0 0
fi
} }
backup_tests() backup_tests()
{ {
# single subflow, backup # single subflow, backup
reset if reset "single subflow, backup"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow,backup 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 run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow nobackup
chk_join_nr "single subflow, backup" 1 1 1 chk_join_nr 1 1 1
chk_prio_nr 0 1 chk_prio_nr 0 1
fi
# single address, backup # single address, backup
reset if reset "single address, backup"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup
chk_join_nr "single address, backup" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 chk_add_nr 1 1
chk_prio_nr 1 1 chk_prio_nr 1 1
fi
# single address with port, backup # single address with port, backup
reset if reset "single address with port, backup"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow backup 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_join_nr 1 1 1
chk_add_nr 1 1 chk_add_nr 1 1
chk_prio_nr 1 1 chk_prio_nr 1 1
fi
} }
add_addr_ports_tests() add_addr_ports_tests()
{ {
# signal address with port # signal address with port
reset if reset "signal address with port"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "signal address with port" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 1 chk_add_nr 1 1 1
fi
# subflow and signal with port # subflow and signal with port
reset if reset "subflow and signal with port"; then
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_set_limits $ns2 1 2 pm_nl_set_limits $ns2 1 2
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "subflow and signal with port" 2 2 2 chk_join_nr 2 2 2
chk_add_nr 1 1 1 chk_add_nr 1 1 1
fi
# single address with port, remove # single address with port, remove
reset if reset "remove single address with port"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow run_tests $ns1 $ns2 10.0.1.1 0 -1 0 slow
chk_join_nr "remove single address with port" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 1 chk_add_nr 1 1 1
chk_rm_nr 1 1 invert chk_rm_nr 1 1 invert
fi
# subflow and signal with port, remove # subflow and signal with port, remove
reset if reset "remove subflow and signal with port"; then
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
pm_nl_set_limits $ns2 1 2 pm_nl_set_limits $ns2 1 2
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 0 -1 -1 slow 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_join_nr 2 2 2
chk_add_nr 1 1 1 chk_add_nr 1 1 1
chk_rm_nr 1 1 chk_rm_nr 1 1
fi
# subflows and signal with port, flush # subflows and signal with port, flush
reset if reset "flush subflows and signal with port"; then
pm_nl_set_limits $ns1 0 3 pm_nl_set_limits $ns1 0 3
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal port 10100
pm_nl_set_limits $ns2 1 3 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.3.2 flags subflow
pm_nl_add_endpoint $ns2 10.0.4.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 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_join_nr 3 3 3
chk_add_nr 1 1 chk_add_nr 1 1
chk_rm_nr 1 3 invert simult chk_rm_nr 1 3 invert simult
fi
# multiple addresses with port # multiple addresses with port
reset if reset "multiple addresses with port"; then
pm_nl_set_limits $ns1 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.2.1 flags signal port 10100
pm_nl_add_endpoint $ns1 10.0.3.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 pm_nl_set_limits $ns2 2 2
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "multiple addresses with port" 2 2 2 chk_join_nr 2 2 2
chk_add_nr 2 2 2 chk_add_nr 2 2 2
fi
# multiple addresses with ports # multiple addresses with ports
reset if reset "multiple addresses with ports"; then
pm_nl_set_limits $ns1 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.2.1 flags signal port 10100
pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10101 pm_nl_add_endpoint $ns1 10.0.3.1 flags signal port 10101
pm_nl_set_limits $ns2 2 2 pm_nl_set_limits $ns2 2 2
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "multiple addresses with ports" 2 2 2 chk_join_nr 2 2 2
chk_add_nr 2 2 2 chk_add_nr 2 2 2
fi
} }
syncookies_tests() syncookies_tests()
{ {
# single subflow, syncookies # single subflow, syncookies
reset_with_cookies if reset_with_cookies "single subflow with syn cookies"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "single subflow with syn cookies" 1 1 1 chk_join_nr 1 1 1
fi
# multiple subflows with syn cookies # multiple subflows with syn cookies
reset_with_cookies if reset_with_cookies "multiple subflows with syn cookies"; then
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_set_limits $ns2 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.3.2 flags subflow
pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "multiple subflows with syn cookies" 2 2 2 chk_join_nr 2 2 2
fi
# multiple subflows limited by server # multiple subflows limited by server
reset_with_cookies if reset_with_cookies "subflows limited by server w cookies"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 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.3.2 flags subflow
pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "subflows limited by server w cookies" 2 1 1 chk_join_nr 2 1 1
fi
# test signal address with cookies # test signal address with cookies
reset_with_cookies if reset_with_cookies "signal address with syn cookies"; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
pm_nl_add_endpoint $ns1 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 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "signal address with syn cookies" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 chk_add_nr 1 1
fi
# test cookie with subflow and signal # test cookie with subflow and signal
reset_with_cookies if reset_with_cookies "subflow and signal w cookies"; then
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
pm_nl_set_limits $ns1 0 2 pm_nl_set_limits $ns1 0 2
pm_nl_set_limits $ns2 1 2 pm_nl_set_limits $ns2 1 2
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "subflow and signal w cookies" 2 2 2 chk_join_nr 2 2 2
chk_add_nr 1 1 chk_add_nr 1 1
fi
# accept and use add_addr with additional subflows # accept and use add_addr with additional subflows
reset_with_cookies if reset_with_cookies "subflows and signal w. cookies"; then
pm_nl_set_limits $ns1 0 3 pm_nl_set_limits $ns1 0 3
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
pm_nl_set_limits $ns2 1 3 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.3.2 flags subflow
pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow pm_nl_add_endpoint $ns2 10.0.4.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "subflows and signal w. cookies" 3 3 3 chk_join_nr 3 3 3
chk_add_nr 1 1 chk_add_nr 1 1
fi
} }
checksum_tests() checksum_tests()
{ {
# checksum test 0 0 # checksum test 0 0
reset_with_checksum 0 0 if reset_with_checksum 0 0; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_csum_nr "checksum test 0 0" chk_join_nr 0 0 0
fi
# checksum test 1 1 # checksum test 1 1
reset_with_checksum 1 1 if reset_with_checksum 1 1; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_csum_nr "checksum test 1 1" chk_join_nr 0 0 0
fi
# checksum test 0 1 # checksum test 0 1
reset_with_checksum 0 1 if reset_with_checksum 0 1; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_csum_nr "checksum test 0 1" chk_join_nr 0 0 0
fi
# checksum test 1 0 # checksum test 1 0
reset_with_checksum 1 0 if reset_with_checksum 1 0; then
pm_nl_set_limits $ns1 0 1 pm_nl_set_limits $ns1 0 1
pm_nl_set_limits $ns2 0 1 pm_nl_set_limits $ns2 0 1
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_csum_nr "checksum test 1 0" chk_join_nr 0 0 0
fi
} }
deny_join_id0_tests() deny_join_id0_tests()
{ {
# subflow allow join id0 ns1 # subflow allow join id0 ns1
reset_with_allow_join_id0 1 0 if reset_with_allow_join_id0 "single subflow allow join id0 ns1" 1 0; then
pm_nl_set_limits $ns1 1 1 pm_nl_set_limits $ns1 1 1
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "single subflow allow join id0 ns1" 1 1 1 chk_join_nr 1 1 1
fi
# subflow allow join id0 ns2 # subflow allow join id0 ns2
reset_with_allow_join_id0 0 1 if reset_with_allow_join_id0 "single subflow allow join id0 ns2" 0 1; then
pm_nl_set_limits $ns1 1 1 pm_nl_set_limits $ns1 1 1
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "single subflow allow join id0 ns2" 0 0 0 chk_join_nr 0 0 0
fi
# signal address allow join id0 ns1 # signal address allow join id0 ns1
# ADD_ADDRs are not affected by allow_join_id0 value. # ADD_ADDRs are not affected by allow_join_id0 value.
reset_with_allow_join_id0 1 0 if reset_with_allow_join_id0 "signal address allow join id0 ns1" 1 0; then
pm_nl_set_limits $ns1 1 1 pm_nl_set_limits $ns1 1 1
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
pm_nl_add_endpoint $ns1 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 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "signal address allow join id0 ns1" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 chk_add_nr 1 1
fi
# signal address allow join id0 ns2 # signal address allow join id0 ns2
# ADD_ADDRs are not affected by allow_join_id0 value. # ADD_ADDRs are not affected by allow_join_id0 value.
reset_with_allow_join_id0 0 1 if reset_with_allow_join_id0 "signal address allow join id0 ns2" 0 1; then
pm_nl_set_limits $ns1 1 1 pm_nl_set_limits $ns1 1 1
pm_nl_set_limits $ns2 1 1 pm_nl_set_limits $ns2 1 1
pm_nl_add_endpoint $ns1 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 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "signal address allow join id0 ns2" 1 1 1 chk_join_nr 1 1 1
chk_add_nr 1 1 chk_add_nr 1 1
fi
# subflow and address allow join id0 ns1 # subflow and address allow join id0 ns1
reset_with_allow_join_id0 1 0 if reset_with_allow_join_id0 "subflow and address allow join id0 1" 1 0; then
pm_nl_set_limits $ns1 2 2 pm_nl_set_limits $ns1 2 2
pm_nl_set_limits $ns2 2 2 pm_nl_set_limits $ns2 2 2
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "subflow and address allow join id0 1" 2 2 2 chk_join_nr 2 2 2
fi
# subflow and address allow join id0 ns2 # subflow and address allow join id0 ns2
reset_with_allow_join_id0 0 1 if reset_with_allow_join_id0 "subflow and address allow join id0 2" 0 1; then
pm_nl_set_limits $ns1 2 2 pm_nl_set_limits $ns1 2 2
pm_nl_set_limits $ns2 2 2 pm_nl_set_limits $ns2 2 2
pm_nl_add_endpoint $ns1 10.0.2.1 flags signal pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow pm_nl_add_endpoint $ns2 10.0.3.2 flags subflow
run_tests $ns1 $ns2 10.0.1.1 run_tests $ns1 $ns2 10.0.1.1
chk_join_nr "subflow and address allow join id0 2" 1 1 1 chk_join_nr 1 1 1
fi
} }
fullmesh_tests() fullmesh_tests()
...@@ -2267,140 +2456,128 @@ fullmesh_tests() ...@@ -2267,140 +2456,128 @@ fullmesh_tests()
# fullmesh 1 # fullmesh 1
# 2 fullmesh addrs in ns2, added before the connection, # 2 fullmesh addrs in ns2, added before the connection,
# 1 non-fullmesh addr in ns1, added during the connection. # 1 non-fullmesh addr in ns1, added during the connection.
reset if reset "fullmesh test 2x1"; then
pm_nl_set_limits $ns1 0 4 pm_nl_set_limits $ns1 0 4
pm_nl_set_limits $ns2 1 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.2.2 flags subflow,fullmesh
pm_nl_add_endpoint $ns2 10.0.3.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 run_tests $ns1 $ns2 10.0.1.1 0 1 0 slow
chk_join_nr "fullmesh test 2x1" 4 4 4 chk_join_nr 4 4 4
chk_add_nr 1 1 chk_add_nr 1 1
fi
# fullmesh 2 # fullmesh 2
# 1 non-fullmesh addr in ns1, added before the connection, # 1 non-fullmesh addr in ns1, added before the connection,
# 1 fullmesh addr in ns2, added during the connection. # 1 fullmesh addr in ns2, added during the connection.
reset if reset "fullmesh test 1x1"; then
pm_nl_set_limits $ns1 1 3 pm_nl_set_limits $ns1 1 3
pm_nl_set_limits $ns2 1 3 pm_nl_set_limits $ns2 1 3
pm_nl_add_endpoint $ns1 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 0 0 fullmesh_1 slow run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow
chk_join_nr "fullmesh test 1x1" 3 3 3 chk_join_nr 3 3 3
chk_add_nr 1 1 chk_add_nr 1 1
fi
# fullmesh 3 # fullmesh 3
# 1 non-fullmesh addr in ns1, added before the connection, # 1 non-fullmesh addr in ns1, added before the connection,
# 2 fullmesh addrs in ns2, added during the connection. # 2 fullmesh addrs in ns2, added during the connection.
reset if reset "fullmesh test 1x2"; then
pm_nl_set_limits $ns1 2 5 pm_nl_set_limits $ns1 2 5
pm_nl_set_limits $ns2 1 5 pm_nl_set_limits $ns2 1 5
pm_nl_add_endpoint $ns1 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 0 0 fullmesh_2 slow run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow
chk_join_nr "fullmesh test 1x2" 5 5 5 chk_join_nr 5 5 5
chk_add_nr 1 1 chk_add_nr 1 1
fi
# fullmesh 4 # fullmesh 4
# 1 non-fullmesh addr in ns1, added before the connection, # 1 non-fullmesh addr in ns1, added before the connection,
# 2 fullmesh addrs in ns2, added during the connection, # 2 fullmesh addrs in ns2, added during the connection,
# limit max_subflows to 4. # limit max_subflows to 4.
reset if reset "fullmesh test 1x2, limited"; then
pm_nl_set_limits $ns1 2 4 pm_nl_set_limits $ns1 2 4
pm_nl_set_limits $ns2 1 4 pm_nl_set_limits $ns2 1 4
pm_nl_add_endpoint $ns1 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 0 0 fullmesh_2 slow run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_2 slow
chk_join_nr "fullmesh test 1x2, limited" 4 4 4 chk_join_nr 4 4 4
chk_add_nr 1 1 chk_add_nr 1 1
fi
# set fullmesh flag # set fullmesh flag
reset if reset "set fullmesh flag test"; then
pm_nl_set_limits $ns1 4 4 pm_nl_set_limits $ns1 4 4
pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
pm_nl_set_limits $ns2 4 4 pm_nl_set_limits $ns2 4 4
run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow fullmesh run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow fullmesh
chk_join_nr "set fullmesh flag test" 2 2 2 chk_join_nr 2 2 2
chk_rm_nr 0 1 chk_rm_nr 0 1
fi
# set nofullmesh flag # set nofullmesh flag
reset if reset "set nofullmesh flag test"; then
pm_nl_set_limits $ns1 4 4 pm_nl_set_limits $ns1 4 4
pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow,fullmesh pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow,fullmesh
pm_nl_set_limits $ns2 4 4 pm_nl_set_limits $ns2 4 4
run_tests $ns1 $ns2 10.0.1.1 0 0 fullmesh_1 slow nofullmesh 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_join_nr 2 2 2
chk_rm_nr 0 1 chk_rm_nr 0 1
fi
# set backup,fullmesh flags # set backup,fullmesh flags
reset if reset "set backup,fullmesh flags test"; then
pm_nl_set_limits $ns1 4 4 pm_nl_set_limits $ns1 4 4
pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow pm_nl_add_endpoint $ns1 10.0.2.1 flags subflow
pm_nl_set_limits $ns2 4 4 pm_nl_set_limits $ns2 4 4
run_tests $ns1 $ns2 10.0.1.1 0 0 1 slow backup,fullmesh 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_join_nr 2 2 2
chk_prio_nr 0 1 chk_prio_nr 0 1
chk_rm_nr 0 1 chk_rm_nr 0 1
fi
# set nobackup,nofullmesh flags # set nobackup,nofullmesh flags
reset if reset "set nobackup,nofullmesh flags test"; then
pm_nl_set_limits $ns1 4 4 pm_nl_set_limits $ns1 4 4
pm_nl_set_limits $ns2 4 4 pm_nl_set_limits $ns2 4 4
pm_nl_add_endpoint $ns2 10.0.2.2 flags subflow,backup,fullmesh 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 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_join_nr 2 2 2
chk_prio_nr 0 1 chk_prio_nr 0 1
chk_rm_nr 0 1 chk_rm_nr 0 1
fi
} }
fastclose_tests() fastclose_tests()
{ {
reset if reset "fastclose test"; then
run_tests $ns1 $ns2 10.0.1.1 1024 0 fastclose_2 run_tests $ns1 $ns2 10.0.1.1 1024 0 fastclose_2
chk_join_nr "fastclose test" 0 0 0 chk_join_nr 0 0 0
chk_fclose_nr 1 1 chk_fclose_nr 1 1
chk_rst_nr 1 1 invert chk_rst_nr 1 1 invert
fi
} }
implicit_tests() implicit_tests()
{ {
# userspace pm type prevents add_addr # userspace pm type prevents add_addr
reset if reset "implicit EP"; then
pm_nl_set_limits $ns1 2 2 pm_nl_set_limits $ns1 2 2
pm_nl_set_limits $ns2 2 2 pm_nl_set_limits $ns2 2 2
pm_nl_add_endpoint $ns1 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 0 0 0 slow & run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow &
wait_mpj $ns1 wait_mpj $ns1
TEST_COUNT=$((TEST_COUNT + 1)) pm_nl_check_endpoint 1 "creation" \
pm_nl_check_endpoint "implicit EP" "creation" \
$ns2 10.0.2.2 id 1 flags implicit $ns2 10.0.2.2 id 1 flags implicit
pm_nl_add_endpoint $ns2 10.0.2.2 id 33 pm_nl_add_endpoint $ns2 10.0.2.2 id 33
pm_nl_check_endpoint "" "ID change is prevented" \ pm_nl_check_endpoint 0 "ID change is prevented" \
$ns2 10.0.2.2 id 1 flags implicit $ns2 10.0.2.2 id 1 flags implicit
pm_nl_add_endpoint $ns2 10.0.2.2 flags signal pm_nl_add_endpoint $ns2 10.0.2.2 flags signal
pm_nl_check_endpoint "" "modif is allowed" \ pm_nl_check_endpoint 0 "modif is allowed" \
$ns2 10.0.2.2 id 1 flags signal $ns2 10.0.2.2 id 1 flags signal
wait wait
} fi
all_tests()
{
subflows_tests
subflows_error_tests
signal_address_tests
link_failure_tests
add_addr_timeout_tests
remove_tests
add_tests
ipv6_tests
v4mapped_tests
backup_tests
add_addr_ports_tests
syncookies_tests
checksum_tests
deny_join_id0_tests
fullmesh_tests
fastclose_tests
implicit_tests
} }
# [$1: error message] # [$1: error message]
...@@ -2412,85 +2589,60 @@ usage() ...@@ -2412,85 +2589,60 @@ usage()
fi fi
echo "mptcp_join usage:" echo "mptcp_join usage:"
echo " -f subflows_tests"
echo " -e subflows_error_tests" local key
echo " -s signal_address_tests" for key in "${!all_tests[@]}"; do
echo " -l link_failure_tests" echo " -${key} ${all_tests[${key}]}"
echo " -t add_addr_timeout_tests" done
echo " -r remove_tests"
echo " -a add_tests"
echo " -6 ipv6_tests"
echo " -4 v4mapped_tests"
echo " -b backup_tests"
echo " -p add_addr_ports_tests"
echo " -k syncookies_tests"
echo " -S checksum_tests"
echo " -d deny_join_id0_tests"
echo " -m fullmesh_tests"
echo " -z fastclose_tests"
echo " -I implicit_tests"
echo " -c capture pcap files" echo " -c capture pcap files"
echo " -C enable data checksum" echo " -C enable data checksum"
echo " -i use ip mptcp" echo " -i use ip mptcp"
echo " -h help" echo " -h help"
echo "[test ids|names]"
exit ${ret} exit ${ret}
} }
# Use a "simple" array to force an specific order we cannot have with an associative one
all_tests_sorted=(
f@subflows_tests
e@subflows_error_tests
s@signal_address_tests
l@link_failure_tests
t@add_addr_timeout_tests
r@remove_tests
a@add_tests
6@ipv6_tests
4@v4mapped_tests
b@backup_tests
p@add_addr_ports_tests
k@syncookies_tests
S@checksum_tests
d@deny_join_id0_tests
m@fullmesh_tests
z@fastclose_tests
I@implicit_tests
)
all_tests_args=""
all_tests_names=()
for subtests in "${all_tests_sorted[@]}"; do
key="${subtests%@*}"
value="${subtests#*@}"
all_tests_args+="${key}"
all_tests_names+=("${value}")
all_tests[${key}]="${value}"
done
tests=() tests=()
while getopts 'fesltra64bpkdmchzICSi' opt; do while getopts "${all_tests_args}cCih" opt; do
case $opt in case $opt in
f) ["${all_tests_args}"])
tests+=(subflows_tests) tests+=("${all_tests[${opt}]}")
;;
e)
tests+=(subflows_error_tests)
;;
s)
tests+=(signal_address_tests)
;;
l)
tests+=(link_failure_tests)
;;
t)
tests+=(add_addr_timeout_tests)
;;
r)
tests+=(remove_tests)
;;
a)
tests+=(add_tests)
;;
6)
tests+=(ipv6_tests)
;;
4)
tests+=(v4mapped_tests)
;;
b)
tests+=(backup_tests)
;;
p)
tests+=(add_addr_ports_tests)
;;
k)
tests+=(syncookies_tests)
;;
S)
tests+=(checksum_tests)
;;
d)
tests+=(deny_join_id0_tests)
;;
m)
tests+=(fullmesh_tests)
;;
z)
tests+=(fastclose_tests)
;;
I)
tests+=(implicit_tests)
;; ;;
c) c)
capture=1 capture=1
...@@ -2510,12 +2662,31 @@ while getopts 'fesltra64bpkdmchzICSi' opt; do ...@@ -2510,12 +2662,31 @@ while getopts 'fesltra64bpkdmchzICSi' opt; do
esac esac
done done
shift $((OPTIND - 1))
for arg in "${@}"; do
if [[ "${arg}" =~ ^[0-9]+$ ]]; then
only_tests_ids+=("${arg}")
else
only_tests_names+=("${arg}")
fi
done
if [ ${#tests[@]} -eq 0 ]; then if [ ${#tests[@]} -eq 0 ]; then
all_tests tests=("${all_tests_names[@]}")
else fi
for subtests in "${tests[@]}"; do
for subtests in "${tests[@]}"; do
"${subtests}" "${subtests}"
done
if [ ${ret} -ne 0 ]; then
echo
echo "${#failed_tests[@]} failure(s) has(ve) been detected:"
for i in $(get_failed_tests_ids); do
echo -e "\t- ${i}: ${failed_tests[${i}]}"
done done
echo
fi fi
exit $ret exit $ret
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment