[PATCH mptcp-next 05/16] mptcp: pm: retrans ADD_ADDR: skip inactive subflows

Matthieu Baerts (NGI0) posted 16 patches 1 day, 14 hours ago
There is a newer version of this series
[PATCH mptcp-next 05/16] mptcp: pm: retrans ADD_ADDR: skip inactive subflows
Posted by Matthieu Baerts (NGI0) 1 day, 14 hours ago
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: 30549eebc4d8 ("mptcp: make ADD_ADDR retransmission timeout adaptive")
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
---
 net/mptcp/pm.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 78a2ad71700b..e954dc46e6bc 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -305,20 +305,27 @@ 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 {
 			max = icsk->icsk_rto;
+		}
 	}
 
-	if (max && max < rto)
-		rto = max;
+	if (max)
+		return max < rto ? max : rto;
 
-	return rto;
+	return max_stale && max_stale < rto ? max_stale : rto;
 }
 
 static void mptcp_pm_add_timer(struct timer_list *timer)

-- 
2.53.0
Re: [PATCH mptcp-next 05/16] mptcp: pm: retrans ADD_ADDR: skip inactive subflows
Posted by Matthieu Baerts 1 day, 2 hours ago
Hello

On 09/04/2026 22:51, Matthieu Baerts (NGI0) wrote:
> 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: 30549eebc4d8 ("mptcp: make ADD_ADDR retransmission timeout adaptive")
> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
> ---
>  net/mptcp/pm.c | 17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)
> 
> diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
> index 78a2ad71700b..e954dc46e6bc 100644
> --- a/net/mptcp/pm.c
> +++ b/net/mptcp/pm.c
> @@ -305,20 +305,27 @@ 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 {

I accidentally removed the condition here, it should be:

  } else if (icsk->icsk_rto > max) {

>  			max = icsk->icsk_rto;
> +		}
>  	}
>  
> -	if (max && max < rto)
> -		rto = max;
> +	if (max)
> +		return max < rto ? max : rto;
>  
> -	return rto;
> +	return max_stale && max_stale < rto ? max_stale : rto;
>  }
>  
>  static void mptcp_pm_add_timer(struct timer_list *timer)
> 

Cheers,
Matt
-- 
Sponsored by the NGI0 Core fund.