* [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.