All of lore.kernel.org
 help / color / mirror / Atom feed
* [MPTCP] [PATCH 3/6] mptcp: Re-factor mptcp_stream_ops routines to be af-agnostic
@ 2019-10-30 23:38 Peter Krystad
  0 siblings, 0 replies; only message in thread
From: Peter Krystad @ 2019-10-30 23:38 UTC (permalink / raw)
  To: mptcp

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

Split mptcp_bind/getname/listen into two parts: af-specific
part and functional part.

squashto: Associate MPTCP context with TCP socket (mptcp_bind)
and Create SUBFLOW socket for incoming connections (rest)

Signed-off-by: Peter Krystad <peter.krystad(a)linux.intel.com>
---
 net/mptcp/protocol.c | 84 +++++++++++++++++++++++++++++---------------
 1 file changed, 56 insertions(+), 28 deletions(-)

diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index ee108e246dcf..9659afc9b444 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1104,24 +1104,32 @@ static struct socket *mptcp_socket_create_get(struct mptcp_sock *msk,
 	return ssock;
 }
 
-static int mptcp_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
+static int mptcp_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len,
+		      sa_family_t family, const struct proto_ops *ops)
 {
 	struct mptcp_sock *msk = mptcp_sk(sock->sk);
 	struct socket *ssock;
-	int err = -ENOTSUPP;
-
-	if (uaddr->sa_family != AF_INET) // @@ allow only IPv4 for now
-		return err;
+	int err;
 
-	ssock = mptcp_socket_create_get(msk, AF_INET);
+	ssock = mptcp_socket_create_get(msk, family);
 	if (IS_ERR(ssock))
 		return PTR_ERR(ssock);
 
-	err = inet_bind(ssock, uaddr, addr_len);
+	err = ops->bind(ssock, uaddr, addr_len);
 	sock_put(ssock->sk);
 	return err;
 }
 
+static int mptcp_v4_bind(struct socket *sock, struct sockaddr *uaddr,
+			 int addr_len)
+{
+	int err;
+
+	err = mptcp_bind(sock, uaddr, addr_len, AF_INET, &inet_stream_ops);
+
+	return err;
+}
+
 static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr,
 				int addr_len, int flags)
 {
@@ -1142,31 +1150,19 @@ static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr,
 }
 
 static int mptcp_getname(struct socket *sock, struct sockaddr *uaddr,
-			 int peer)
+			 int peer, const struct proto_ops *ops)
 {
 	struct mptcp_sock *msk = mptcp_sk(sock->sk);
 	struct socket *ssock;
 	struct sock *ssk;
 	int ret;
 
-	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);
-	}
-
 	lock_sock(sock->sk);
 	ssock = __mptcp_fallback_get_ref(msk);
 	if (ssock) {
 		release_sock(sock->sk);
 		pr_debug("subflow=%p", ssock->sk);
-		ret = inet_getname(ssock, uaddr, peer);
+		ret = ops->getname(ssock, uaddr, peer);
 		sock_put(ssock->sk);
 		return ret;
 	}
@@ -1181,12 +1177,35 @@ static int mptcp_getname(struct socket *sock, struct sockaddr *uaddr,
 		return -ENOTCONN;
 	}
 
-	ret = inet_getname(ssk->sk_socket, uaddr, peer);
+	ret = ops->getname(ssk->sk_socket, uaddr, peer);
 	release_sock(sock->sk);
 	return ret;
 }
 
-static int mptcp_listen(struct socket *sock, int backlog)
+static int mptcp_v4_getname(struct socket *sock, struct sockaddr *uaddr,
+			    int peer)
+{
+	int ret;
+
+	if (sock->sk->sk_prot == &tcp_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 = &inet_stream_ops;
+		return sock->ops->getname(sock, uaddr, peer);
+	}
+
+	ret = mptcp_getname(sock, uaddr, peer, &inet_stream_ops);
+
+	return ret;
+}
+
+static int mptcp_listen(struct socket *sock, int backlog, sa_family_t family,
+			const struct proto_ops *ops)
 {
 	struct mptcp_sock *msk = mptcp_sk(sock->sk);
 	struct socket *ssock;
@@ -1194,15 +1213,24 @@ static int mptcp_listen(struct socket *sock, int backlog)
 
 	pr_debug("msk=%p", msk);
 
-	ssock = mptcp_socket_create_get(msk, AF_INET);
+	ssock = mptcp_socket_create_get(msk, family);
 	if (IS_ERR(ssock))
 		return PTR_ERR(ssock);
 
-	err = inet_listen(ssock, backlog);
+	err = ops->listen(ssock, backlog);
 	sock_put(ssock->sk);
 	return err;
 }
 
+static int mptcp_v4_listen(struct socket *sock, int backlog)
+{
+	int ret;
+
+	ret = mptcp_listen(sock, backlog, AF_INET, &inet_stream_ops);
+
+	return ret;
+}
+
 static int mptcp_stream_accept(struct socket *sock, struct socket *newsock,
 			       int flags, bool kern)
 {
@@ -1298,12 +1326,12 @@ void mptcp_proto_init(void)
 {
 	mptcp_prot.h.hashinfo = tcp_prot.h.hashinfo;
 	mptcp_stream_ops = inet_stream_ops;
-	mptcp_stream_ops.bind = mptcp_bind;
+	mptcp_stream_ops.bind = mptcp_v4_bind;
 	mptcp_stream_ops.connect = mptcp_stream_connect;
 	mptcp_stream_ops.poll = mptcp_poll;
 	mptcp_stream_ops.accept = mptcp_stream_accept;
-	mptcp_stream_ops.getname = mptcp_getname;
-	mptcp_stream_ops.listen = mptcp_listen;
+	mptcp_stream_ops.getname = mptcp_v4_getname;
+	mptcp_stream_ops.listen = mptcp_v4_listen;
 	mptcp_stream_ops.shutdown = mptcp_shutdown;
 
 	if (percpu_counter_init(&mptcp_sockets_allocated, 0, GFP_KERNEL))
-- 
2.17.2

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

only message in thread, other threads:[~2019-10-30 23:38 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-30 23:38 [MPTCP] [PATCH 3/6] mptcp: Re-factor mptcp_stream_ops routines to be af-agnostic Peter Krystad

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.