Commit d8caa2ed authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'mptcp-refactoring-for-one-selftest-and-csum-validation'

Mat Martineau says:

====================
mptcp: Refactoring for one selftest and csum validation

Patch 1 changes the MPTCP join self tests to depend more on events
rather than delays, so the script runs faster and has more consistent
results.

Patches 2 and 3 get rid of some duplicate code in MPTCP's checksum
validation by modifying and leveraging an existing helper function.
====================

Link: https://lore.kernel.org/r/20220107192524.445137-1-mathew.j.martineau@linux.intel.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 5cad43a5 8401e87f
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -1233,7 +1233,7 @@ static void mptcp_set_rwin(const struct tcp_sock *tp)
		WRITE_ONCE(msk->rcv_wnd_sent, ack_seq);
}

static u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __sum16 sum)
u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __wsum sum)
{
	struct csum_pseudo_header header;
	__wsum csum;
@@ -1248,14 +1248,14 @@ static u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __sum1
	header.data_len = htons(data_len);
	header.csum = 0;

	csum = csum_partial(&header, sizeof(header), ~csum_unfold(sum));
	csum = csum_partial(&header, sizeof(header), sum);
	return (__force u16)csum_fold(csum);
}

static u16 mptcp_make_csum(const struct mptcp_ext *mpext)
{
	return __mptcp_make_csum(mpext->data_seq, mpext->subflow_seq, mpext->data_len,
				 mpext->csum);
				 ~csum_unfold(mpext->csum));
}

void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
@@ -1376,7 +1376,7 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
					   __mptcp_make_csum(opts->data_seq,
							     opts->subflow_seq,
							     opts->data_len,
							     opts->csum), ptr);
							     ~csum_unfold(opts->csum)), ptr);
		} else {
			put_unaligned_be32(opts->data_len << 16 |
					   TCPOPT_NOP << 8 | TCPOPT_NOP, ptr);
+1 −0
Original line number Diff line number Diff line
@@ -725,6 +725,7 @@ void mptcp_token_destroy(struct mptcp_sock *msk);
void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn);

void mptcp_crypto_hmac_sha(u64 key1, u64 key2, u8 *msg, int len, void *hmac);
u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __wsum sum);

void __init mptcp_pm_init(void);
void mptcp_pm_data_init(struct mptcp_sock *msk);
+6 −9
Original line number Diff line number Diff line
@@ -845,9 +845,8 @@ static enum mapping_status validate_data_csum(struct sock *ssk, struct sk_buff *
					      bool csum_reqd)
{
	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
	struct csum_pseudo_header header;
	u32 offset, seq, delta;
	__wsum csum;
	u16 csum;
	int len;

	if (!csum_reqd)
@@ -908,13 +907,11 @@ static enum mapping_status validate_data_csum(struct sock *ssk, struct sk_buff *
	 * while the pseudo header requires the original DSS data len,
	 * including that
	 */
	header.data_seq = cpu_to_be64(subflow->map_seq);
	header.subflow_seq = htonl(subflow->map_subflow_seq);
	header.data_len = htons(subflow->map_data_len + subflow->map_data_fin);
	header.csum = 0;

	csum = csum_partial(&header, sizeof(header), subflow->map_data_csum);
	if (unlikely(csum_fold(csum))) {
	csum = __mptcp_make_csum(subflow->map_seq,
				 subflow->map_subflow_seq,
				 subflow->map_data_len + subflow->map_data_fin,
				 subflow->map_data_csum);
	if (unlikely(csum)) {
		MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DATACSUMERR);
		subflow->send_mp_fail = 1;
		MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_MPFAILTX);
+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