]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mptcp: blackhole: avoid checking the state twice
authorMatthieu Baerts (NGI0) <matttbe@kernel.org>
Fri, 21 Feb 2025 15:44:03 +0000 (16:44 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 25 Feb 2025 02:23:44 +0000 (18:23 -0800)
A small cleanup, reordering the conditions to avoid checking things
twice.

The code here is called in case of timeout on a TCP connection, before
triggering a retransmission. But it only acts on SYN + MPC packets.

So the conditions can be re-order to exit early in case of non-MPTCP
SYN + MPC. This also reduce the indentation levels.

Reviewed-by: Mat Martineau <martineau@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20250221-net-next-mptcp-pm-misc-cleanup-3-v1-10-2b70ab1cee79@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/ctrl.c

index 2dd81e6c26bdb5220abed68e26d70d2dc3ab14fb..be6c0237e10bfd7520edd3c57ec43ce4377b97d5 100644 (file)
@@ -401,26 +401,30 @@ void mptcp_active_enable(struct sock *sk)
 void mptcp_active_detect_blackhole(struct sock *ssk, bool expired)
 {
        struct mptcp_subflow_context *subflow;
+       u8 timeouts, to_max;
+       struct net *net;
 
-       if (!sk_is_mptcp(ssk))
+       /* Only check MPTCP SYN ... */
+       if (likely(!sk_is_mptcp(ssk) || ssk->sk_state != TCP_SYN_SENT))
                return;
 
        subflow = mptcp_subflow_ctx(ssk);
 
-       if (subflow->request_mptcp && ssk->sk_state == TCP_SYN_SENT) {
-               struct net *net = sock_net(ssk);
-               u8 timeouts, to_max;
+       /* ... + MP_CAPABLE */
+       if (!subflow->request_mptcp) {
+               /* Mark as blackhole iif the 1st non-MPTCP SYN is accepted */
+               subflow->mpc_drop = 0;
+               return;
+       }
 
-               timeouts = inet_csk(ssk)->icsk_retransmits;
-               to_max = mptcp_get_pernet(net)->syn_retrans_before_tcp_fallback;
+       net = sock_net(ssk);
+       timeouts = inet_csk(ssk)->icsk_retransmits;
+       to_max = mptcp_get_pernet(net)->syn_retrans_before_tcp_fallback;
 
-               if (timeouts == to_max || (timeouts < to_max && expired)) {
-                       MPTCP_INC_STATS(net, MPTCP_MIB_MPCAPABLEACTIVEDROP);
-                       subflow->mpc_drop = 1;
-                       mptcp_subflow_early_fallback(mptcp_sk(subflow->conn), subflow);
-               }
-       } else if (ssk->sk_state == TCP_SYN_SENT) {
-               subflow->mpc_drop = 0;
+       if (timeouts == to_max || (timeouts < to_max && expired)) {
+               MPTCP_INC_STATS(net, MPTCP_MIB_MPCAPABLEACTIVEDROP);
+               subflow->mpc_drop = 1;
+               mptcp_subflow_early_fallback(mptcp_sk(subflow->conn), subflow);
        }
 }