All of lore.kernel.org
 help / color / mirror / Atom feed
* [MPTCP] Re: [PATCH] mptcp: check for plain TCP sock at accept time
@ 2020-06-17  0:34 Mat Martineau
  0 siblings, 0 replies; only message in thread
From: Mat Martineau @ 2020-06-17  0:34 UTC (permalink / raw)
  To: mptcp

[-- Attachment #1: Type: text/plain, Size: 4649 bytes --]


On Tue, 16 Jun 2020, Paolo Abeni wrote:

> This cleanup the code a bit and avoid corrupted states
> on weird syscall sequence (accept(), connect()).
>
> Signed-off-by: Paolo Abeni <pabeni(a)redhat.com>
> ---
> net/mptcp/protocol.c | 61 +++-----------------------------------------
> 1 file changed, 3 insertions(+), 58 deletions(-)
>
> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> index faa804f63c81..590009a2591a 100644
> --- a/net/mptcp/protocol.c
> +++ b/net/mptcp/protocol.c
> @@ -56,9 +56,6 @@ static struct socket *mptcp_is_tcpsk(struct sock *sk)

The returned pointer isn't used other than for a null check now, so it 
could return a bool instead.

Other than that, looks good to clean things up this way! Thanks.


Mat


> {
> 	struct socket *sock = sk->sk_socket;
>
> -	if (sock->sk != sk)
> -		return NULL;
> -
> 	if (unlikely(sk->sk_prot == &tcp_prot)) {
> 		/* we are being invoked after mptcp_accept() has
> 		 * accepted a non-mp-capable flow: sk is a tcp_sk,
> @@ -81,14 +78,8 @@ static struct socket *mptcp_is_tcpsk(struct sock *sk)
>
> static struct socket *__mptcp_tcp_fallback(struct mptcp_sock *msk)
> {
> -	struct socket *sock;
> -
> 	sock_owned_by_me((const struct sock *)msk);
>
> -	sock = mptcp_is_tcpsk((struct sock *)msk);
> -	if (unlikely(sock))
> -		return sock;
> -
> 	if (likely(!__mptcp_check_fallback(msk)))
> 		return NULL;
>
> @@ -1574,7 +1565,6 @@ static struct sock *mptcp_accept(struct sock *sk, int flags, int *err,
> 		return NULL;
>
> 	pr_debug("msk=%p, subflow is mptcp=%d", msk, sk_is_mptcp(newsk));
> -
> 	if (sk_is_mptcp(newsk)) {
> 		struct mptcp_subflow_context *subflow;
> 		struct sock *new_mptcp_sock;
> @@ -1932,42 +1922,6 @@ static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr,
> 	return err;
> }
>
> -static int mptcp_v4_getname(struct socket *sock, struct sockaddr *uaddr,
> -			    int peer)
> -{
> -	if (sock->sk->sk_prot == &tcp_prot) {
> -		/* we are being invoked from __sys_accept4, after
> -		 * mptcp_accept() has just accepted a non-mp-capable
> -		 * flow: sk is a tcp_sk, not an mptcp one.
> -		 *
> -		 * Hand the socket over to tcp so all further socket ops
> -		 * bypass mptcp.
> -		 */
> -		sock->ops = &inet_stream_ops;
> -	}
> -
> -	return inet_getname(sock, uaddr, peer);
> -}
> -
> -#if IS_ENABLED(CONFIG_MPTCP_IPV6)
> -static int mptcp_v6_getname(struct socket *sock, struct sockaddr *uaddr,
> -			    int peer)
> -{
> -	if (sock->sk->sk_prot == &tcpv6_prot) {
> -		/* we are being invoked from __sys_accept4 after
> -		 * mptcp_accept() has accepted a non-mp-capable
> -		 * subflow: sk is a tcp_sk, not mptcp.
> -		 *
> -		 * Hand the socket over to tcp so all further
> -		 * socket ops bypass mptcp.
> -		 */
> -		sock->ops = &inet6_stream_ops;
> -	}
> -
> -	return inet6_getname(sock, uaddr, peer);
> -}
> -#endif
> -
> static int mptcp_listen(struct socket *sock, int backlog)
> {
> 	struct mptcp_sock *msk = mptcp_sk(sock->sk);
> @@ -1996,15 +1950,6 @@ static int mptcp_listen(struct socket *sock, int backlog)
> 	return err;
> }
>
> -static bool is_tcp_proto(const struct proto *p)
> -{
> -#if IS_ENABLED(CONFIG_MPTCP_IPV6)
> -	return p == &tcp_prot || p == &tcpv6_prot;
> -#else
> -	return p == &tcp_prot;
> -#endif
> -}
> -
> static int mptcp_stream_accept(struct socket *sock, struct socket *newsock,
> 			       int flags, bool kern)
> {
> @@ -2027,7 +1972,7 @@ static int mptcp_stream_accept(struct socket *sock, struct socket *newsock,
> 	release_sock(sock->sk);
>
> 	err = ssock->ops->accept(sock, newsock, flags, kern);
> -	if (err == 0 && !is_tcp_proto(newsock->sk->sk_prot)) {
> +	if (err == 0 && !mptcp_is_tcpsk(newsock->sk)) {
> 		struct mptcp_sock *msk = mptcp_sk(newsock->sk);
> 		struct mptcp_subflow_context *subflow;
>
> @@ -2142,7 +2087,7 @@ static const struct proto_ops mptcp_stream_ops = {
> 	.connect	   = mptcp_stream_connect,
> 	.socketpair	   = sock_no_socketpair,
> 	.accept		   = mptcp_stream_accept,
> -	.getname	   = mptcp_v4_getname,
> +	.getname	   = inet_getname,
> 	.poll		   = mptcp_poll,
> 	.ioctl		   = inet_ioctl,
> 	.gettstamp	   = sock_gettstamp,
> @@ -2202,7 +2147,7 @@ static const struct proto_ops mptcp_v6_stream_ops = {
> 	.connect	   = mptcp_stream_connect,
> 	.socketpair	   = sock_no_socketpair,
> 	.accept		   = mptcp_stream_accept,
> -	.getname	   = mptcp_v6_getname,
> +	.getname	   = inet6_getname,
> 	.poll		   = mptcp_poll,
> 	.ioctl		   = inet6_ioctl,
> 	.gettstamp	   = sock_gettstamp,
> -- 
> 2.26.2

--
Mat Martineau
Intel

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-06-17  0:34 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-17  0:34 [MPTCP] Re: [PATCH] mptcp: check for plain TCP sock at accept time Mat Martineau

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.