mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	selftests: mptcp: add implicit endpoint test case
Ensure implicit endpoint are created when expected and that the user-space can update them Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net> Co-developed-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
		
							parent
							
								
									4cf86ae84c
								
							
						
					
					
						commit
						69c6ce7b6e
					
				
					 2 changed files with 126 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -310,6 +310,21 @@ wait_rm_addr()
 | 
			
		|||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
wait_mpj()
 | 
			
		||||
{
 | 
			
		||||
	local ns="${1}"
 | 
			
		||||
	local cnt old_cnt
 | 
			
		||||
 | 
			
		||||
	old_cnt=$(ip netns exec ${ns} nstat -as | grep MPJoinAckRx | awk '{print $2}')
 | 
			
		||||
 | 
			
		||||
	local i
 | 
			
		||||
	for i in $(seq 10); do
 | 
			
		||||
		cnt=$(ip netns exec ${ns} nstat -as | grep MPJoinAckRx | awk '{print $2}')
 | 
			
		||||
		[ "$cnt" = "${old_cnt}" ] || break
 | 
			
		||||
		sleep 0.1
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pm_nl_set_limits()
 | 
			
		||||
{
 | 
			
		||||
	local ns=$1
 | 
			
		||||
| 
						 | 
				
			
			@ -410,6 +425,80 @@ pm_nl_change_endpoint()
 | 
			
		|||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pm_nl_check_endpoint()
 | 
			
		||||
{
 | 
			
		||||
	local line expected_line
 | 
			
		||||
	local title="$1"
 | 
			
		||||
	local msg="$2"
 | 
			
		||||
	local ns=$3
 | 
			
		||||
	local addr=$4
 | 
			
		||||
	local _flags=""
 | 
			
		||||
	local flags
 | 
			
		||||
	local _port
 | 
			
		||||
	local port
 | 
			
		||||
	local dev
 | 
			
		||||
	local _id
 | 
			
		||||
	local id
 | 
			
		||||
 | 
			
		||||
	if [ -n "${title}" ]; then
 | 
			
		||||
		printf "%03u %-36s %s" "${TEST_COUNT}" "${title}" "${msg}"
 | 
			
		||||
	else
 | 
			
		||||
		printf "%-${nr_blank}s %s" " " "${msg}"
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	shift 4
 | 
			
		||||
	while [ -n "$1" ]; do
 | 
			
		||||
		if [ $1 = "flags" ]; then
 | 
			
		||||
			_flags=$2
 | 
			
		||||
			[ ! -z $_flags ]; flags="flags $_flags"
 | 
			
		||||
			shift
 | 
			
		||||
		elif [ $1 = "dev" ]; then
 | 
			
		||||
			[ ! -z $2 ]; dev="dev $1"
 | 
			
		||||
			shift
 | 
			
		||||
		elif [ $1 = "id" ]; then
 | 
			
		||||
			_id=$2
 | 
			
		||||
			[ ! -z $_id ]; id="id $_id"
 | 
			
		||||
			shift
 | 
			
		||||
		elif [ $1 = "port" ]; then
 | 
			
		||||
			_port=$2
 | 
			
		||||
			[ ! -z $_port ]; port=" port $_port"
 | 
			
		||||
			shift
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		shift
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	if [ -z "$id" ]; then
 | 
			
		||||
		echo "[skip] bad test - missing endpoint id"
 | 
			
		||||
		return
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	if [ $ip_mptcp -eq 1 ]; then
 | 
			
		||||
		line=$(ip -n $ns mptcp endpoint show $id)
 | 
			
		||||
		# the dump order is: address id flags port dev
 | 
			
		||||
		expected_line="$addr"
 | 
			
		||||
		[ -n "$addr" ] && expected_line="$expected_line $addr"
 | 
			
		||||
		expected_line="$expected_line $id"
 | 
			
		||||
		[ -n "$_flags" ] && expected_line="$expected_line ${_flags//","/" "}"
 | 
			
		||||
		[ -n "$dev" ] && expected_line="$expected_line $dev"
 | 
			
		||||
		[ -n "$port" ] && expected_line="$expected_line $port"
 | 
			
		||||
	else
 | 
			
		||||
		line=$(ip netns exec $ns ./pm_nl_ctl get $_id)
 | 
			
		||||
		# the dump order is: id flags dev address port
 | 
			
		||||
		expected_line="$id"
 | 
			
		||||
		[ -n "$flags" ] && expected_line="$expected_line $flags"
 | 
			
		||||
		[ -n "$dev" ] && expected_line="$expected_line $dev"
 | 
			
		||||
		[ -n "$addr" ] && expected_line="$expected_line $addr"
 | 
			
		||||
		[ -n "$_port" ] && expected_line="$expected_line $_port"
 | 
			
		||||
	fi
 | 
			
		||||
	if [ "$line" = "$expected_line" ]; then
 | 
			
		||||
		echo "[ ok ]"
 | 
			
		||||
	else
 | 
			
		||||
		echo "[fail] expected '$expected_line' found '$line'"
 | 
			
		||||
		ret=1
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
do_transfer()
 | 
			
		||||
{
 | 
			
		||||
	listener_ns="$1"
 | 
			
		||||
| 
						 | 
				
			
			@ -2269,6 +2358,30 @@ fastclose_tests()
 | 
			
		|||
	chk_rst_nr 1 1 invert
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
implicit_tests()
 | 
			
		||||
{
 | 
			
		||||
	# userspace pm type prevents add_addr
 | 
			
		||||
	reset
 | 
			
		||||
	pm_nl_set_limits $ns1 2 2
 | 
			
		||||
	pm_nl_set_limits $ns2 2 2
 | 
			
		||||
	pm_nl_add_endpoint $ns1 10.0.2.1 flags signal
 | 
			
		||||
	run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow &
 | 
			
		||||
 | 
			
		||||
	wait_mpj $ns1
 | 
			
		||||
	TEST_COUNT=$((TEST_COUNT + 1))
 | 
			
		||||
	pm_nl_check_endpoint "implicit EP" "creation" \
 | 
			
		||||
		$ns2 10.0.2.2 id 1 flags implicit
 | 
			
		||||
 | 
			
		||||
	pm_nl_add_endpoint $ns2 10.0.2.2 id 33
 | 
			
		||||
	pm_nl_check_endpoint "" "ID change is prevented" \
 | 
			
		||||
		$ns2 10.0.2.2 id 1 flags implicit
 | 
			
		||||
 | 
			
		||||
	pm_nl_add_endpoint $ns2 10.0.2.2 flags signal
 | 
			
		||||
	pm_nl_check_endpoint "" "modif is allowed" \
 | 
			
		||||
		$ns2 10.0.2.2 id 1 flags signal
 | 
			
		||||
	wait
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
all_tests()
 | 
			
		||||
{
 | 
			
		||||
	subflows_tests
 | 
			
		||||
| 
						 | 
				
			
			@ -2287,6 +2400,7 @@ all_tests()
 | 
			
		|||
	deny_join_id0_tests
 | 
			
		||||
	fullmesh_tests
 | 
			
		||||
	fastclose_tests
 | 
			
		||||
	implicit_tests
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# [$1: error message]
 | 
			
		||||
| 
						 | 
				
			
			@ -2314,6 +2428,7 @@ usage()
 | 
			
		|||
	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 enable data checksum"
 | 
			
		||||
	echo "  -i use ip mptcp"
 | 
			
		||||
| 
						 | 
				
			
			@ -2324,7 +2439,7 @@ usage()
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
tests=()
 | 
			
		||||
while getopts 'fesltra64bpkdmchzCSi' opt; do
 | 
			
		||||
while getopts 'fesltra64bpkdmchzICSi' opt; do
 | 
			
		||||
	case $opt in
 | 
			
		||||
		f)
 | 
			
		||||
			tests+=(subflows_tests)
 | 
			
		||||
| 
						 | 
				
			
			@ -2374,6 +2489,9 @@ while getopts 'fesltra64bpkdmchzCSi' opt; do
 | 
			
		|||
		z)
 | 
			
		||||
			tests+=(fastclose_tests)
 | 
			
		||||
			;;
 | 
			
		||||
		I)
 | 
			
		||||
			tests+=(implicit_tests)
 | 
			
		||||
			;;
 | 
			
		||||
		c)
 | 
			
		||||
			capture=1
 | 
			
		||||
			;;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -436,6 +436,13 @@ static void print_addr(struct rtattr *attrs, int len)
 | 
			
		|||
					printf(",");
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (flags & MPTCP_PM_ADDR_FLAG_IMPLICIT) {
 | 
			
		||||
				printf("implicit");
 | 
			
		||||
				flags &= ~MPTCP_PM_ADDR_FLAG_IMPLICIT;
 | 
			
		||||
				if (flags)
 | 
			
		||||
					printf(",");
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/* bump unknown flags, if any */
 | 
			
		||||
			if (flags)
 | 
			
		||||
				printf("0x%x", flags);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue