]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mptcp: pm: ADD_ADDR rtx: skip inactive subflows
authorMatthieu Baerts (NGI0) <matttbe@kernel.org>
Tue, 5 May 2026 15:00:55 +0000 (17:00 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 7 May 2026 01:16:45 +0000 (18:16 -0700)
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")
Cc: stable@vger.kernel.org
Reviewed-by: Mat Martineau <martineau@kernel.org>
Signed-off-by: Matthieu 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: Jakub Kicinski <kuba@kernel.org>
net/mptcp/pm.c

index 29d1bb6a69cffe6dcd65390292f874a07c75d0d1..8a5dba7fe66eca004182773936ca1b86b58f04d2 100644 (file)
@@ -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 && max < rto)
-               rto = max;
+       if (max)
+               return min(max, rto);
+
+       if (max_stale)
+               return min(max_stale, rto);
 
        return rto;
 }