Commit c6d395e2 authored by Matthieu Baerts (NGI0)'s avatar Matthieu Baerts (NGI0) Committed by Jakub Kicinski
Browse files

mptcp: pm: ADD_ADDR rtx: skip inactive subflows



When looking at the maximum RTO amongst the subflows, inactive subflows
were taken into account: that includes stale ones, and the initial one
if it has been already been closed.

Unusable subflows are now simply skipped. Stale ones are used as an
alternative: if there are only stale ones, to take their maximum RTO and
avoid to eventually fallback to net.mptcp.add_addr_timeout, which is set
to 2 minutes by default.

Fixes: 30549eeb ("mptcp: make ADD_ADDR retransmission timeout adaptive")
Cc: stable@vger.kernel.org
Reviewed-by: default avatarMat Martineau <martineau@kernel.org>
Signed-off-by: default avatarMatthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20260505-net-mptcp-pm-fixes-7-1-rc3-v1-7-fca8091060a4@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 3cf12492
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -306,18 +306,28 @@ static unsigned int mptcp_adjust_add_addr_timeout(struct mptcp_sock *msk)
	const struct net *net = sock_net((struct sock *)msk);
	unsigned int rto = mptcp_get_add_addr_timeout(net);
	struct mptcp_subflow_context *subflow;
	unsigned int max = 0;
	unsigned int max = 0, max_stale = 0;

	mptcp_for_each_subflow(msk, subflow) {
		struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
		struct inet_connection_sock *icsk = inet_csk(ssk);

		if (icsk->icsk_rto > max)
		if (!__mptcp_subflow_active(subflow))
			continue;

		if (unlikely(subflow->stale)) {
			if (icsk->icsk_rto > max_stale)
				max_stale = icsk->icsk_rto;
		} else if (icsk->icsk_rto > max) {
			max = icsk->icsk_rto;
		}
	}

	if (max)
		return min(max, rto);

	if (max && max < rto)
		rto = max;
	if (max_stale)
		return min(max_stale, rto);

	return rto;
}