Commit 327b9a94 authored by Paolo Abeni's avatar Paolo Abeni Committed by Jakub Kicinski
Browse files

selftests: mptcp: more stable join tests-cases



MPTCP join self-tests are a bit fragile as they reply on
delays instead of events to catch-up with the expected
sockets states.

Replace the delay with state checking where possible and
reduce the number of sleeps in the most complex scenarios.

This will both reduce the tests run-time and will improve
stability.

Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 5cad43a5
Loading
Loading
Loading
Loading
+68 −52
Original line number Diff line number Diff line
@@ -238,6 +238,45 @@ is_v6()
	[ -z "${1##*:*}" ]
}

# $1: ns, $2: port
wait_local_port_listen()
{
	local listener_ns="${1}"
	local port="${2}"

	local port_hex i

	port_hex="$(printf "%04X" "${port}")"
	for i in $(seq 10); do
		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}" &&
			break
		sleep 0.1
	done
}

rm_addr_count()
{
	ns=${1}

	ip netns exec ${ns} nstat -as | grep MPTcpExtRmAddr | awk '{print $2}'
}

# $1: ns, $2: old rm_addr counter in $ns
wait_rm_addr()
{
	local ns="${1}"
	local old_cnt="${2}"
	local cnt
	local i

	for i in $(seq 10); do
		cnt=$(rm_addr_count ${ns})
		[ "$cnt" = "${old_cnt}" ] || break
		sleep 0.1
	done
}

do_transfer()
{
	listener_ns="$1"
@@ -307,7 +346,7 @@ do_transfer()
	fi
	spid=$!

	sleep 1
	wait_local_port_listen "${listener_ns}" "${port}"

	if [ "$test_link_fail" -eq 0 ];then
		timeout ${timeout_test} \
@@ -324,10 +363,13 @@ do_transfer()
	fi
	cpid=$!

	# let the mptcp subflow be established in background before
	# do endpoint manipulation
	[ $addr_nr_ns1 = "0" -a $addr_nr_ns2 = "0" ] || sleep 1

	if [ $addr_nr_ns1 -gt 0 ]; then
		let add_nr_ns1=addr_nr_ns1
		counter=2
		sleep 1
		while [ $add_nr_ns1 -gt 0 ]; do
			local addr
			if is_v6 "${connect_addr}"; then
@@ -339,7 +381,6 @@ do_transfer()
			let counter+=1
			let add_nr_ns1-=1
		done
		sleep 1
	elif [ $addr_nr_ns1 -lt 0 ]; then
		let rm_nr_ns1=-addr_nr_ns1
		if [ $rm_nr_ns1 -lt 8 ]; then
@@ -347,22 +388,19 @@ do_transfer()
			pos=1
			dump=(`ip netns exec ${listener_ns} ./pm_nl_ctl dump`)
			if [ ${#dump[@]} -gt 0 ]; then
				sleep 1

				while [ $counter -le $rm_nr_ns1 ]
				do
					id=${dump[$pos]}
					rm_addr=$(rm_addr_count ${connector_ns})
					ip netns exec ${listener_ns} ./pm_nl_ctl del $id
					sleep 1
					wait_rm_addr ${connector_ns} ${rm_addr}
					let counter+=1
					let pos+=5
				done
			fi
		elif [ $rm_nr_ns1 -eq 8 ]; then
			sleep 1
			ip netns exec ${listener_ns} ./pm_nl_ctl flush
		elif [ $rm_nr_ns1 -eq 9 ]; then
			sleep 1
			ip netns exec ${listener_ns} ./pm_nl_ctl del 0 ${connect_addr}
		fi
	fi
@@ -373,10 +411,13 @@ do_transfer()
		addr_nr_ns2=${addr_nr_ns2:9}
	fi

	# if newly added endpoints must be deleted, give the background msk
	# some time to created them
	[ $addr_nr_ns1 -gt 0 -a $addr_nr_ns2 -lt 0 ] && sleep 1

	if [ $addr_nr_ns2 -gt 0 ]; then
		let add_nr_ns2=addr_nr_ns2
		counter=3
		sleep 1
		while [ $add_nr_ns2 -gt 0 ]; do
			local addr
			if is_v6 "${connect_addr}"; then
@@ -388,7 +429,6 @@ do_transfer()
			let counter+=1
			let add_nr_ns2-=1
		done
		sleep 1
	elif [ $addr_nr_ns2 -lt 0 ]; then
		let rm_nr_ns2=-addr_nr_ns2
		if [ $rm_nr_ns2 -lt 8 ]; then
@@ -396,19 +436,18 @@ do_transfer()
			pos=1
			dump=(`ip netns exec ${connector_ns} ./pm_nl_ctl dump`)
			if [ ${#dump[@]} -gt 0 ]; then
				sleep 1

				while [ $counter -le $rm_nr_ns2 ]
				do
					# rm_addr are serialized, allow the previous one to complete
					id=${dump[$pos]}
					rm_addr=$(rm_addr_count ${listener_ns})
					ip netns exec ${connector_ns} ./pm_nl_ctl del $id
					sleep 1
					wait_rm_addr ${listener_ns} ${rm_addr}
					let counter+=1
					let pos+=5
				done
			fi
		elif [ $rm_nr_ns2 -eq 8 ]; then
			sleep 1
			ip netns exec ${connector_ns} ./pm_nl_ctl flush
		elif [ $rm_nr_ns2 -eq 9 ]; then
			local addr
@@ -417,7 +456,6 @@ do_transfer()
			else
				addr="10.0.1.2"
			fi
			sleep 1
			ip netns exec ${connector_ns} ./pm_nl_ctl del 0 $addr
		fi
	fi
@@ -539,6 +577,14 @@ run_tests()
	lret=$?
}

dump_stats()
{
	echo Server ns stats
	ip netns exec $ns1 nstat -as | grep Tcp
	echo Client ns stats
	ip netns exec $ns2 nstat -as | grep Tcp
}

chk_csum_nr()
{
	local msg=${1:-""}
@@ -570,12 +616,7 @@ chk_csum_nr()
	else
		echo "[ ok ]"
	fi
	if [ "${dump_stats}" = 1 ]; then
		echo Server ns stats
		ip netns exec $ns1 nstat -as | grep MPTcp
		echo Client ns stats
		ip netns exec $ns2 nstat -as | grep MPTcp
	fi
	[ "${dump_stats}" = 1 ] && dump_stats
}

chk_fail_nr()
@@ -607,12 +648,7 @@ chk_fail_nr()
		echo "[ ok ]"
	fi

	if [ "${dump_stats}" = 1 ]; then
		echo Server ns stats
		ip netns exec $ns1 nstat -as | grep MPTcp
		echo Client ns stats
		ip netns exec $ns2 nstat -as | grep MPTcp
	fi
	[ "${dump_stats}" = 1 ] && dump_stats
}

chk_join_nr()
@@ -656,12 +692,7 @@ chk_join_nr()
	else
		echo "[ ok ]"
	fi
	if [ "${dump_stats}" = 1 ]; then
		echo Server ns stats
		ip netns exec $ns1 nstat -as | grep MPTcp
		echo Client ns stats
		ip netns exec $ns2 nstat -as | grep MPTcp
	fi
	[ "${dump_stats}" = 1 ] && dump_stats
	if [ $checksum -eq 1 ]; then
		chk_csum_nr
		chk_fail_nr 0 0
@@ -823,12 +854,7 @@ chk_add_nr()
		echo ""
	fi

	if [ "${dump_stats}" = 1 ]; then
		echo Server ns stats
		ip netns exec $ns1 nstat -as | grep MPTcp
		echo Client ns stats
		ip netns exec $ns2 nstat -as | grep MPTcp
	fi
	[ "${dump_stats}" = 1 ] && dump_stats
}

chk_rm_nr()
@@ -871,12 +897,7 @@ chk_rm_nr()
		echo "[ ok ]"
	fi

	if [ "${dump_stats}" = 1 ]; then
		echo Server ns stats
		ip netns exec $ns1 nstat -as | grep MPTcp
		echo Client ns stats
		ip netns exec $ns2 nstat -as | grep MPTcp
	fi
	[ "${dump_stats}" = 1 ] && dump_stats
}

chk_prio_nr()
@@ -908,12 +929,7 @@ chk_prio_nr()
		echo "[ ok ]"
	fi

	if [ "${dump_stats}" = 1 ]; then
		echo Server ns stats
		ip netns exec $ns1 nstat -as | grep MPTcp
		echo Client ns stats
		ip netns exec $ns2 nstat -as | grep MPTcp
	fi
	[ "${dump_stats}" = 1 ] && dump_stats
}

chk_link_usage()
@@ -1651,7 +1667,7 @@ add_addr_ports_tests()
	ip netns exec $ns2 ./pm_nl_ctl limits 1 3
	ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow
	ip netns exec $ns2 ./pm_nl_ctl add 10.0.4.2 flags subflow
	run_tests $ns1 $ns2 10.0.1.1 0 -8 -8 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_add_nr 1 1
	chk_rm_nr 2 2