diff mbox series

[v2,3/4] mptcp: create first subflow at msk creation time

Message ID 308362689215103c03232eeb0273c046c2ce096c.1592477699.git.pabeni@redhat.com
State Accepted, archived
Delegated to: Matthieu Baerts
Headers show
Series mptcp: fallback refactor follow-up | expand

Commit Message

Paolo Abeni June 18, 2020, 10:55 a.m. UTC
This clean the code a bit and will simplify the next
patch, too.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
 net/mptcp/protocol.c | 53 +++++++++++++++++---------------------------
 1 file changed, 20 insertions(+), 33 deletions(-)

Comments

Mat Martineau June 18, 2020, 11:46 p.m. UTC | #1
On Thu, 18 Jun 2020, Paolo Abeni wrote:

> This clean the code a bit and will simplify the next
> patch, too.

This is a helpful simplification, thanks! Looks good to merge.

>
> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
> ---
> net/mptcp/protocol.c | 53 +++++++++++++++++---------------------------
> 1 file changed, 20 insertions(+), 33 deletions(-)
>
> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> index ff160b95cc84..75a96d8665e9 100644
> --- a/net/mptcp/protocol.c
> +++ b/net/mptcp/protocol.c
> @@ -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;
> @@ -119,10 +103,7 @@ static struct socket *__mptcp_socket_create(struct mptcp_sock *msk, int state)
> 	list_add(&subflow->node, &msk->conn_list);
> 	subflow->request_mptcp = 1;
>
> -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,
> @@ -1342,6 +1323,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_rcvbuf = sock_net(sk)->ipv4.sysctl_tcp_rmem[1];
> 	sk->sk_sndbuf = sock_net(sk)->ipv4.sysctl_tcp_wmem[2];
> @@ -1853,9 +1838,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;
> 	}
>
> @@ -1885,13 +1870,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
> @@ -1929,13 +1915,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);
> -- 
> 2.26.2

--
Mat Martineau
Intel
diff mbox series

Patch

diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index ff160b95cc84..75a96d8665e9 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -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;
@@ -119,10 +103,7 @@  static struct socket *__mptcp_socket_create(struct mptcp_sock *msk, int state)
 	list_add(&subflow->node, &msk->conn_list);
 	subflow->request_mptcp = 1;
 
-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,
@@ -1342,6 +1323,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_rcvbuf = sock_net(sk)->ipv4.sysctl_tcp_rmem[1];
 	sk->sk_sndbuf = sock_net(sk)->ipv4.sysctl_tcp_wmem[2];
@@ -1853,9 +1838,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;
 	}
 
@@ -1885,13 +1870,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
@@ -1929,13 +1915,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);