mptcp: simplify subflow_syn_recv_sock()
authorPaolo Abeni <pabeni@redhat.com>
Mon, 27 Mar 2023 10:22:22 +0000 (12:22 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 9 Jun 2023 08:34:06 +0000 (10:34 +0200)
[ Upstream commit a88d0092b24b8cddce57fe0e88e60a9e29e0b515 ]

Postpone the msk cloning to the child process creation
so that we can avoid a bunch of conditionals.

Link: https://github.com/multipath-tcp/mptcp_net-next/issues/61
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Stable-dep-of: 7e8b88ec35ee ("mptcp: consolidate passive msk socket initialization")
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/mptcp/subflow.c

index 4995a62..276e620 100644 (file)
@@ -633,14 +633,6 @@ static bool subflow_hmac_valid(const struct request_sock *req,
        return !crypto_memneq(hmac, mp_opt->hmac, MPTCPOPT_HMAC_LEN);
 }
 
-static void mptcp_force_close(struct sock *sk)
-{
-       /* the msk is not yet exposed to user-space, and refcount is 2 */
-       inet_sk_state_store(sk, TCP_CLOSE);
-       sk_common_release(sk);
-       sock_put(sk);
-}
-
 static void subflow_ulp_fallback(struct sock *sk,
                                 struct mptcp_subflow_context *old_ctx)
 {
@@ -693,7 +685,6 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
        struct mptcp_subflow_request_sock *subflow_req;
        struct mptcp_options_received mp_opt;
        bool fallback, fallback_is_fatal;
-       struct sock *new_msk = NULL;
        struct mptcp_sock *owner;
        struct sock *child;
 
@@ -722,14 +713,9 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
                 * options.
                 */
                mptcp_get_options(skb, &mp_opt);
-               if (!(mp_opt.suboptions & OPTIONS_MPTCP_MPC)) {
+               if (!(mp_opt.suboptions & OPTIONS_MPTCP_MPC))
                        fallback = true;
-                       goto create_child;
-               }
 
-               new_msk = mptcp_sk_clone(listener->conn, &mp_opt, req);
-               if (!new_msk)
-                       fallback = true;
        } else if (subflow_req->mp_join) {
                mptcp_get_options(skb, &mp_opt);
                if (!(mp_opt.suboptions & OPTIONS_MPTCP_MPJ) ||
@@ -758,21 +744,23 @@ create_child:
                                subflow_add_reset_reason(skb, MPTCP_RST_EMPTCP);
                                goto dispose_child;
                        }
-
-                       mptcp_subflow_drop_ctx(child);
-                       goto out;
+                       goto fallback;
                }
 
                /* ssk inherits options of listener sk */
                ctx->setsockopt_seq = listener->setsockopt_seq;
 
                if (ctx->mp_capable) {
-                       owner = mptcp_sk(new_msk);
+                       ctx->conn = mptcp_sk_clone(listener->conn, &mp_opt, req);
+                       if (!ctx->conn)
+                               goto fallback;
+
+                       owner = mptcp_sk(ctx->conn);
 
                        /* this can't race with mptcp_close(), as the msk is
                         * not yet exposted to user-space
                         */
-                       inet_sk_state_store((void *)new_msk, TCP_ESTABLISHED);
+                       inet_sk_state_store(ctx->conn, TCP_ESTABLISHED);
 
                        /* record the newly created socket as the first msk
                         * subflow, but don't link it yet into conn_list
@@ -782,11 +770,9 @@ create_child:
                        /* new mpc subflow takes ownership of the newly
                         * created mptcp socket
                         */
-                       mptcp_sk(new_msk)->setsockopt_seq = ctx->setsockopt_seq;
+                       owner->setsockopt_seq = ctx->setsockopt_seq;
                        mptcp_pm_new_connection(owner, child, 1);
                        mptcp_token_accept(subflow_req, owner);
-                       ctx->conn = new_msk;
-                       new_msk = NULL;
 
                        /* set msk addresses early to ensure mptcp_pm_get_local_id()
                         * uses the correct data
@@ -836,11 +822,6 @@ create_child:
                }
        }
 
-out:
-       /* dispose of the left over mptcp master, if any */
-       if (unlikely(new_msk))
-               mptcp_force_close(new_msk);
-
        /* check for expected invariant - should never trigger, just help
         * catching eariler subtle bugs
         */
@@ -858,6 +839,10 @@ dispose_child:
 
        /* The last child reference will be released by the caller */
        return child;
+
+fallback:
+       mptcp_subflow_drop_ctx(child);
+       return child;
 }
 
 static struct inet_connection_sock_af_ops subflow_specific __ro_after_init;