mptcp: create first subflow at msk creation time
authorPaolo Abeni <pabeni@redhat.com>
Mon, 29 Jun 2020 20:26:23 +0000 (22:26 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 30 Jun 2020 00:29:38 +0000 (17:29 -0700)
This cleans the code a bit and makes the behavior more consistent.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Davide Caratti <dcaratti@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/protocol.c

index dbeb6fe374f5394871a1440ee5a02869f8507cc6..ad619bda71cc8a2850b1a349eb7de36a3f1111e6 100644 (file)
@@ -86,32 +86,16 @@ static struct socket *__mptcp_tcp_fallback(struct mptcp_sock *msk)
        return msk->subflow;
 }
 
-static bool __mptcp_can_create_subflow(const struct mptcp_sock *msk)
-{
-       return !msk->first;
-}
-
-static struct socket *__mptcp_socket_create(struct mptcp_sock *msk, int state)
+static int __mptcp_socket_create(struct mptcp_sock *msk)
 {
        struct mptcp_subflow_context *subflow;
        struct sock *sk = (struct sock *)msk;
        struct socket *ssock;
        int err;
 
-       ssock = __mptcp_tcp_fallback(msk);
-       if (unlikely(ssock))
-               return ssock;
-
-       ssock = __mptcp_nmpc_socket(msk);
-       if (ssock)
-               goto set_state;
-
-       if (!__mptcp_can_create_subflow(msk))
-               return ERR_PTR(-EINVAL);
-
        err = mptcp_subflow_create_socket(sk, &ssock);
        if (err)
-               return ERR_PTR(err);
+               return err;
 
        msk->first = ssock->sk;
        msk->subflow = ssock;
@@ -124,10 +108,7 @@ static struct socket *__mptcp_socket_create(struct mptcp_sock *msk, int state)
         */
        RCU_INIT_POINTER(msk->first->sk_wq, &sk->sk_socket->wq);
 
-set_state:
-       if (state != MPTCP_SAME_STATE)
-               inet_sk_state_store(sk, state);
-       return ssock;
+       return 0;
 }
 
 static void __mptcp_move_skb(struct mptcp_sock *msk, struct sock *ssk,
@@ -1255,6 +1236,10 @@ static int mptcp_init_sock(struct sock *sk)
        if (ret)
                return ret;
 
+       ret = __mptcp_socket_create(mptcp_sk(sk));
+       if (ret)
+               return ret;
+
        sk_sockets_allocated_inc(sk);
        sk->sk_sndbuf = sock_net(sk)->ipv4.sysctl_tcp_wmem[2];
 
@@ -1744,9 +1729,9 @@ static int mptcp_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
        int err;
 
        lock_sock(sock->sk);
-       ssock = __mptcp_socket_create(msk, MPTCP_SAME_STATE);
-       if (IS_ERR(ssock)) {
-               err = PTR_ERR(ssock);
+       ssock = __mptcp_nmpc_socket(msk);
+       if (!ssock) {
+               err = -EINVAL;
                goto unlock;
        }
 
@@ -1776,13 +1761,14 @@ static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr,
                goto do_connect;
        }
 
-       mptcp_token_destroy(msk);
-       ssock = __mptcp_socket_create(msk, TCP_SYN_SENT);
-       if (IS_ERR(ssock)) {
-               err = PTR_ERR(ssock);
+       ssock = __mptcp_nmpc_socket(msk);
+       if (!ssock) {
+               err = -EINVAL;
                goto unlock;
        }
 
+       mptcp_token_destroy(msk);
+       inet_sk_state_store(sock->sk, TCP_SYN_SENT);
        subflow = mptcp_subflow_ctx(ssock->sk);
 #ifdef CONFIG_TCP_MD5SIG
        /* no MPTCP if MD5SIG is enabled on this socket or we may run out of
@@ -1820,13 +1806,14 @@ static int mptcp_listen(struct socket *sock, int backlog)
        pr_debug("msk=%p", msk);
 
        lock_sock(sock->sk);
-       mptcp_token_destroy(msk);
-       ssock = __mptcp_socket_create(msk, TCP_LISTEN);
-       if (IS_ERR(ssock)) {
-               err = PTR_ERR(ssock);
+       ssock = __mptcp_nmpc_socket(msk);
+       if (!ssock) {
+               err = -EINVAL;
                goto unlock;
        }
 
+       mptcp_token_destroy(msk);
+       inet_sk_state_store(sock->sk, TCP_LISTEN);
        sock_set_flag(sock->sk, SOCK_RCU_FREE);
 
        err = ssock->ops->listen(ssock, backlog);