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.