All of lore.kernel.org
 help / color / mirror / Atom feed
* [MPTCP] [PATCH 4/6] mptcp: Re-factor subflow 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: 6107 bytes --]

Re-factor subflow_rebuild_header, init_req, conn_request,
syn_recv_sock, and finish_connect to separate af-specific
and functional parts.

squash unfortunately is complicated:
subflow_v4_finish_connect: Handle MP_CAPABLE options for outgoing...
subflow_v4_rebuild_header: Add key generation and token tree
subflow_v4_conn_request,
subflow_v4_syn_recv_sock,
subflow_v4_init_req: Create SUBFLOW socket for incoming connections

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

diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index 13e207458e0b..758b4b36644a 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -25,7 +25,7 @@ static inline void SUBFLOW_REQ_INC_STATS(struct request_sock *req,
 	MPTCP_INC_STATS(sock_net(req_to_sk(req)), field);
 }
 
-static struct inet_connection_sock_af_ops subflow_specific;
+static struct inet_connection_sock_af_ops subflow_v4_specific;
 
 static int subflow_rebuild_header(struct sock *sk)
 {
@@ -44,6 +44,14 @@ static int subflow_rebuild_header(struct sock *sk)
 		} while (!subflow->local_nonce);
 	}
 
+	return err;
+}
+
+static int subflow_v4_rebuild_header(struct sock *sk)
+{
+	int err;
+
+	err = subflow_rebuild_header(sk);
 	if (err)
 		return err;
 
@@ -92,19 +100,14 @@ static bool subflow_token_join_request(struct request_sock *req,
 	return true;
 }
 
-static void subflow_v4_init_req(struct request_sock *req,
-				const struct sock *sk_listener,
-				struct sk_buff *skb)
+static void subflow_init_req(struct request_sock *req,
+			     const struct sock *sk_listener,
+			     struct sk_buff *skb)
 {
 	struct mptcp_subflow_context *listener = mptcp_subflow_ctx(sk_listener);
 	struct mptcp_subflow_request_sock *subflow_req = mptcp_subflow_rsk(req);
 	struct tcp_options_received rx_opt;
 
-	tcp_rsk(req)->is_mptcp = 1;
-	pr_debug("subflow_req=%p, listener=%p", subflow_req, listener);
-
-	tcp_request_sock_ipv4_ops.init_req(req, sk_listener, skb);
-
 	memset(&rx_opt.mptcp, 0, sizeof(rx_opt.mptcp));
 	mptcp_get_options(skb, &rx_opt);
 
@@ -148,6 +151,17 @@ static void subflow_v4_init_req(struct request_sock *req,
 	}
 }
 
+static void subflow_v4_init_req(struct request_sock *req,
+				const struct sock *sk_listener,
+				struct sk_buff *skb)
+{
+	tcp_rsk(req)->is_mptcp = 1;
+
+	tcp_request_sock_ipv4_ops.init_req(req, sk_listener, skb);
+
+	subflow_init_req(req, sk_listener, skb);
+}
+
 /* validate received truncated hmac and create hmac for third ACK */
 static bool subflow_thmac_valid(struct mptcp_subflow_context *subflow)
 {
@@ -171,8 +185,6 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
 {
 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
 
-	ipv4_specific.sk_rx_dst_set(sk, skb);
-
 	if (!subflow->conn)
 		return;
 
@@ -207,10 +219,18 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb)
 	}
 }
 
+static void subflow_v4_finish_connect(struct sock *sk,
+				      const struct sk_buff *skb)
+{
+	ipv4_specific.sk_rx_dst_set(sk, skb);
+
+	subflow_finish_connect(sk, skb);
+}
+
 static struct request_sock_ops subflow_request_sock_ops;
 static struct tcp_request_sock_ops subflow_request_sock_ipv4_ops;
 
-static int subflow_conn_request(struct sock *sk, struct sk_buff *skb)
+static int subflow_v4_conn_request(struct sock *sk, struct sk_buff *skb)
 {
 	struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
 
@@ -259,7 +279,8 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
 					  struct request_sock *req,
 					  struct dst_entry *dst,
 					  struct request_sock *req_unhash,
-					  bool *own_req)
+					  bool *own_req,
+					  const struct inet_connection_sock_af_ops *af_ops)
 {
 	struct mptcp_subflow_context *listener = mptcp_subflow_ctx(sk);
 	struct mptcp_subflow_request_sock *subflow_req;
@@ -278,7 +299,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
 			return NULL;
 	}
 
-	child = ipv4_specific.syn_recv_sock(sk, skb, req, dst, req_unhash,
+	child = af_ops->syn_recv_sock(sk, skb, req, dst, req_unhash,
 					    own_req);
 
 	if (child && *own_req) {
@@ -312,6 +333,21 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
 	return NULL;
 }
 
+static struct sock *subflow_v4_syn_recv_sock(const struct sock *sk,
+					     struct sk_buff *skb,
+					     struct request_sock *req,
+					     struct dst_entry *dst,
+					     struct request_sock *req_unhash,
+					     bool *own_req)
+{
+	struct sock *child;
+
+	child = subflow_syn_recv_sock(sk, skb, req, dst, req_unhash, own_req,
+				      &ipv4_specific);
+
+	return child;
+}
+
 enum mapping_status {
 	MAPPING_OK,
 	MAPPING_INVALID,
@@ -770,7 +806,7 @@ static int subflow_ulp_init(struct sock *sk)
 	pr_debug("subflow=%p", ctx);
 
 	tp->is_mptcp = 1;
-	icsk->icsk_af_ops = &subflow_specific;
+	icsk->icsk_af_ops = &subflow_v4_specific;
 	ctx->tcp_sk_data_ready = sk->sk_data_ready;
 	sk->sk_data_ready = subflow_data_ready;
 	sk->sk_write_space = subflow_write_space;
@@ -862,11 +898,11 @@ void mptcp_subflow_init(void)
 	subflow_request_sock_ipv4_ops = tcp_request_sock_ipv4_ops;
 	subflow_request_sock_ipv4_ops.init_req = subflow_v4_init_req;
 
-	subflow_specific = ipv4_specific;
-	subflow_specific.conn_request = subflow_conn_request;
-	subflow_specific.syn_recv_sock = subflow_syn_recv_sock;
-	subflow_specific.sk_rx_dst_set = subflow_finish_connect;
-	subflow_specific.rebuild_header = subflow_rebuild_header;
+	subflow_v4_specific = ipv4_specific;
+	subflow_v4_specific.conn_request = subflow_v4_conn_request;
+	subflow_v4_specific.syn_recv_sock = subflow_v4_syn_recv_sock;
+	subflow_v4_specific.sk_rx_dst_set = subflow_v4_finish_connect;
+	subflow_v4_specific.rebuild_header = subflow_v4_rebuild_header;
 
 	mptcp_diag_subflow_init(&subflow_ulp_ops);
 
-- 
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 4/6] mptcp: Re-factor subflow 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.