From patchwork Wed Nov 6 04:41:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Krystad X-Patchwork-Id: 1190120 X-Patchwork-Delegate: matthieu.baerts@tessares.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.01.org (client-ip=198.145.21.10; helo=ml01.01.org; envelope-from=mptcp-bounces@lists.01.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Received: from ml01.01.org (ml01.01.org [198.145.21.10]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 477DQH57Cqz9sQp for ; Wed, 6 Nov 2019 15:41:42 +1100 (AEDT) Received: from new-ml01.vlan13.01.org (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 514D8100DC3D0; Tue, 5 Nov 2019 20:44:16 -0800 (PST) Received-SPF: Pass (helo) identity=helo; client-ip=192.55.52.136; helo=mga12.intel.com; envelope-from=peter.krystad@linux.intel.com; receiver= Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 79535100EA61C for ; Tue, 5 Nov 2019 20:44:13 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Nov 2019 20:41:35 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,272,1569308400"; d="scan'208";a="232731848" Received: from pkrystad-mobl4.sea.intel.com (HELO localhost.localdomain) ([10.252.132.183]) by fmsmga002.fm.intel.com with ESMTP; 05 Nov 2019 20:41:35 -0800 From: Peter Krystad To: mptcp@lists.01.org Date: Tue, 5 Nov 2019 20:41:28 -0800 Message-Id: <20191106044133.14418-2-peter.krystad@linux.intel.com> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20191106044133.14418-1-peter.krystad@linux.intel.com> References: <20191106044133.14418-1-peter.krystad@linux.intel.com> Message-ID-Hash: VQY754H5BQVMFKPMNG3CG4JK46GQHETH X-Message-ID-Hash: VQY754H5BQVMFKPMNG3CG4JK46GQHETH X-MailFrom: peter.krystad@linux.intel.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.1.1 Precedence: list Subject: [MPTCP] [PATCH v2 1/6] mptcp: Reference icsk_af_ops routines through saved pointer List-Id: Discussions regarding MPTCP upstreaming Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Save a pointer to the original TCP address-family-specific routines in the subflow context, which can then be called by the MPTCP versions of the same routines. This eliminates the need to directly reference inet_xxx routines, or indirectly through the ipv4_specific struct. This approach will also save a lot of cut-n-paste code for IPv6 support. squashto: Handle MP_CAPABLE options for outgoing connections (new ctx field and sk_rx_dst_set changes) Create SUBFLOW socket for incoming connections (conn_request and syn_recv_sock changes) Add key generation and token tree (subflow_rebuild_header changes) Signed-off-by: Peter Krystad --- net/mptcp/protocol.h | 1 + net/mptcp/subflow.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 56e1b8d097b3..7f783ca65f43 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -227,6 +227,7 @@ struct mptcp_subflow_context { struct socket *tcp_sock; /* underlying tcp_sock */ struct sock *conn; /* parent mptcp_sock */ + const struct inet_connection_sock_af_ops *icsk_af_ops; void (*tcp_sk_data_ready)(struct sock *sk); struct rcu_head rcu; }; diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 704dfc49f0d5..6aa02001a06d 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -45,7 +45,7 @@ static int subflow_rebuild_header(struct sock *sk) if (err) return err; - return inet_sk_rebuild_header(sk); + return subflow->icsk_af_ops->rebuild_header(sk); } static void subflow_req_destructor(struct request_sock *req) @@ -169,7 +169,7 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *skb) { struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); - inet_sk_rx_dst_set(sk, skb); + subflow->icsk_af_ops->sk_rx_dst_set(sk, skb); if (!subflow->conn) return; @@ -208,7 +208,7 @@ static void subflow_finish_connect(struct sock *sk, const struct sk_buff *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); @@ -276,7 +276,8 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk, return NULL; } - child = tcp_v4_syn_recv_sock(sk, skb, req, dst, req_unhash, own_req); + child = listener->icsk_af_ops->syn_recv_sock(sk, skb, req, dst, + req_unhash, own_req); if (child && *own_req) { struct mptcp_subflow_context *ctx = mptcp_subflow_ctx(child); @@ -768,6 +769,7 @@ static int subflow_ulp_init(struct sock *sk) pr_debug("subflow=%p", ctx); tp->is_mptcp = 1; + ctx->icsk_af_ops = icsk->icsk_af_ops; icsk->icsk_af_ops = &subflow_specific; ctx->tcp_sk_data_ready = sk->sk_data_ready; sk->sk_data_ready = subflow_data_ready; @@ -805,6 +807,7 @@ static void subflow_ulp_clone(const struct request_sock *req, new_ctx->conn = NULL; new_ctx->conn_finished = 1; + new_ctx->icsk_af_ops = old_ctx->icsk_af_ops; new_ctx->tcp_sk_data_ready = old_ctx->tcp_sk_data_ready; if (subflow_req->mp_capable) { @@ -861,7 +864,7 @@ void mptcp_subflow_init(void) subflow_request_sock_ipv4_ops.init_req = subflow_v4_init_req; subflow_specific = ipv4_specific; - subflow_specific.conn_request = subflow_conn_request; + subflow_specific.conn_request = subflow_v4_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; From patchwork Wed Nov 6 04:41:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Krystad X-Patchwork-Id: 1190118 X-Patchwork-Delegate: matthieu.baerts@tessares.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.01.org (client-ip=2001:19d0:306:5::1; helo=ml01.01.org; envelope-from=mptcp-bounces@lists.01.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Received: from ml01.01.org (ml01.01.org [IPv6:2001:19d0:306:5::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 477DQH3PtTz9sPF for ; Wed, 6 Nov 2019 15:41:42 +1100 (AEDT) Received: from new-ml01.vlan13.01.org (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 57CA8100DC3D4; Tue, 5 Nov 2019 20:44:16 -0800 (PST) Received-SPF: Pass (helo) identity=helo; client-ip=192.55.52.136; helo=mga12.intel.com; envelope-from=peter.krystad@linux.intel.com; receiver= Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 941DB100EA61C for ; Tue, 5 Nov 2019 20:44:13 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Nov 2019 20:41:35 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,272,1569308400"; d="scan'208";a="232731849" Received: from pkrystad-mobl4.sea.intel.com (HELO localhost.localdomain) ([10.252.132.183]) by fmsmga002.fm.intel.com with ESMTP; 05 Nov 2019 20:41:35 -0800 From: Peter Krystad To: mptcp@lists.01.org Date: Tue, 5 Nov 2019 20:41:29 -0800 Message-Id: <20191106044133.14418-3-peter.krystad@linux.intel.com> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20191106044133.14418-1-peter.krystad@linux.intel.com> References: <20191106044133.14418-1-peter.krystad@linux.intel.com> Message-ID-Hash: JRZD75FNYSNW6YD3LCUOAO2R6SOPXCIS X-Message-ID-Hash: JRZD75FNYSNW6YD3LCUOAO2R6SOPXCIS X-MailFrom: peter.krystad@linux.intel.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.1.1 Precedence: list Subject: [MPTCP] [PATCH v2 2/6] mptcp: Reference inet_stream_ops routines through socket->ops List-Id: Discussions regarding MPTCP upstreaming Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Call protocol routines on the subflow through the existing proto_ops pointer in socket structure instead of calling them directly. This will make all of the mptcp proto_ops routines work for both IPv4 and IPv6. squashto: Associate MPTCP context with TCP socket (bind and stream_connect changes) Create SUBFLOW socket for incoming connections (getname, listen, and stream_accept changes) Add tcp_poll (poll changes) Signed-off-by: Peter Krystad --- net/mptcp/protocol.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index c2b29f8d0377..b3263a7f6458 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1115,7 +1115,7 @@ static int mptcp_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) if (IS_ERR(ssock)) return PTR_ERR(ssock); - err = inet_bind(ssock, uaddr, addr_len); + err = ssock->ops->bind(ssock, uaddr, addr_len); sock_put(ssock->sk); return err; } @@ -1134,7 +1134,7 @@ static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr, if (IS_ERR(ssock)) return PTR_ERR(ssock); - err = inet_stream_connect(ssock, uaddr, addr_len, flags); + err = ssock->ops->connect(ssock, uaddr, addr_len, flags); sock_put(ssock->sk); return err; } @@ -1156,7 +1156,7 @@ static int mptcp_getname(struct socket *sock, struct sockaddr *uaddr, * bypass mptcp. */ sock->ops = &inet_stream_ops; - return inet_getname(sock, uaddr, peer); + return sock->ops->getname(sock, uaddr, peer); } lock_sock(sock->sk); @@ -1164,7 +1164,7 @@ static int mptcp_getname(struct socket *sock, struct sockaddr *uaddr, if (ssock) { release_sock(sock->sk); pr_debug("subflow=%p", ssock->sk); - ret = inet_getname(ssock, uaddr, peer); + ret = ssock->ops->getname(ssock, uaddr, peer); sock_put(ssock->sk); return ret; } @@ -1179,7 +1179,7 @@ static int mptcp_getname(struct socket *sock, struct sockaddr *uaddr, return -ENOTCONN; } - ret = inet_getname(ssk->sk_socket, uaddr, peer); + ret = ssk->sk_socket->ops->getname(ssk->sk_socket, uaddr, peer); release_sock(sock->sk); return ret; } @@ -1196,7 +1196,7 @@ static int mptcp_listen(struct socket *sock, int backlog) if (IS_ERR(ssock)) return PTR_ERR(ssock); - err = inet_listen(ssock, backlog); + err = ssock->ops->listen(ssock, backlog); sock_put(ssock->sk); return err; } @@ -1214,7 +1214,7 @@ static int mptcp_stream_accept(struct socket *sock, struct socket *newsock, if (!ssock) return -EINVAL; - err = inet_accept(sock, newsock, flags, kern); + err = ssock->ops->accept(sock, newsock, flags, kern); sock_put(ssock->sk); return err; } @@ -1233,7 +1233,7 @@ static __poll_t mptcp_poll(struct file *file, struct socket *sock, ssock = __mptcp_fallback_get_ref(msk); if (ssock) { release_sock(sk); - ret = tcp_poll(file, ssock, wait); + ret = ssock->ops->poll(file, ssock, wait); sock_put(ssock->sk); return ret; } From patchwork Wed Nov 6 04:41:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Krystad X-Patchwork-Id: 1190116 X-Patchwork-Delegate: matthieu.baerts@tessares.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.01.org (client-ip=2001:19d0:306:5::1; helo=ml01.01.org; envelope-from=mptcp-bounces@lists.01.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Received: from ml01.01.org (ml01.01.org [IPv6:2001:19d0:306:5::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 477DQH3mcCz9sPv for ; Wed, 6 Nov 2019 15:41:42 +1100 (AEDT) Received: from new-ml01.vlan13.01.org (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 5E13A100DC3D8; Tue, 5 Nov 2019 20:44:16 -0800 (PST) Received-SPF: Pass (helo) identity=helo; client-ip=192.55.52.136; helo=mga12.intel.com; envelope-from=peter.krystad@linux.intel.com; receiver= Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id AF040100EA61C for ; Tue, 5 Nov 2019 20:44:13 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Nov 2019 20:41:35 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,272,1569308400"; d="scan'208";a="232731850" Received: from pkrystad-mobl4.sea.intel.com (HELO localhost.localdomain) ([10.252.132.183]) by fmsmga002.fm.intel.com with ESMTP; 05 Nov 2019 20:41:35 -0800 From: Peter Krystad To: mptcp@lists.01.org Date: Tue, 5 Nov 2019 20:41:30 -0800 Message-Id: <20191106044133.14418-4-peter.krystad@linux.intel.com> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20191106044133.14418-1-peter.krystad@linux.intel.com> References: <20191106044133.14418-1-peter.krystad@linux.intel.com> Message-ID-Hash: JRZMVYPY2HC3RWAOSXKOLNMRL2WH5XW4 X-Message-ID-Hash: JRZMVYPY2HC3RWAOSXKOLNMRL2WH5XW4 X-MailFrom: peter.krystad@linux.intel.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.1.1 Precedence: list Subject: [MPTCP] [PATCH v2 3/6] mptcp: Re-factor mptcp_getname routine to be af-agnostic List-Id: Discussions regarding MPTCP upstreaming Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Split mptcp_getname into two parts: af-specific part and functional part. squashto: Create SUBFLOW socket for incoming connections Signed-off-by: Peter Krystad --- net/mptcp/protocol.c | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index b3263a7f6458..323b3e65dba2 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -1147,18 +1147,6 @@ static int mptcp_getname(struct socket *sock, struct sockaddr *uaddr, 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 sock->ops->getname(sock, uaddr, peer); - } - lock_sock(sock->sk); ssock = __mptcp_fallback_get_ref(msk); if (ssock) { @@ -1184,6 +1172,28 @@ static int mptcp_getname(struct socket *sock, struct sockaddr *uaddr, return ret; } +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 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 sock->ops->getname(sock, uaddr, peer); + } + + ret = mptcp_getname(sock, uaddr, peer); + + return ret; +} + static int mptcp_listen(struct socket *sock, int backlog) { struct mptcp_sock *msk = mptcp_sk(sock->sk); @@ -1300,7 +1310,7 @@ void mptcp_proto_init(void) 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.getname = mptcp_v4_getname; mptcp_stream_ops.listen = mptcp_listen; mptcp_stream_ops.shutdown = mptcp_shutdown; From patchwork Wed Nov 6 04:41:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Krystad X-Patchwork-Id: 1190119 X-Patchwork-Delegate: matthieu.baerts@tessares.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.01.org (client-ip=198.145.21.10; helo=ml01.01.org; envelope-from=mptcp-bounces@lists.01.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Received: from ml01.01.org (ml01.01.org [198.145.21.10]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 477DQH3h7vz9sPk for ; Wed, 6 Nov 2019 15:41:42 +1100 (AEDT) Received: from new-ml01.vlan13.01.org (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 6438A100DC3DC; Tue, 5 Nov 2019 20:44:16 -0800 (PST) Received-SPF: Pass (helo) identity=helo; client-ip=192.55.52.136; helo=mga12.intel.com; envelope-from=peter.krystad@linux.intel.com; receiver= Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id D3C25100EA61C for ; Tue, 5 Nov 2019 20:44:13 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Nov 2019 20:41:35 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,272,1569308400"; d="scan'208";a="232731852" Received: from pkrystad-mobl4.sea.intel.com (HELO localhost.localdomain) ([10.252.132.183]) by fmsmga002.fm.intel.com with ESMTP; 05 Nov 2019 20:41:35 -0800 From: Peter Krystad To: mptcp@lists.01.org Date: Tue, 5 Nov 2019 20:41:31 -0800 Message-Id: <20191106044133.14418-5-peter.krystad@linux.intel.com> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20191106044133.14418-1-peter.krystad@linux.intel.com> References: <20191106044133.14418-1-peter.krystad@linux.intel.com> Message-ID-Hash: RLITKOR3QLW2PRMM3EPVECLVQQZCBIIQ X-Message-ID-Hash: RLITKOR3QLW2PRMM3EPVECLVQQZCBIIQ X-MailFrom: peter.krystad@linux.intel.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.1.1 Precedence: list Subject: [MPTCP] [PATCH v2 4/6] mptcp: Re-factor subflow_v4_conn_request to be af-agnostic List-Id: Discussions regarding MPTCP upstreaming Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Split subflow_v4_init_req into separate af-specific and functional parts. squashto: Create SUBFLOW socket for incoming connections Signed-off-by: Peter Krystad --- net/mptcp/subflow.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 6aa02001a06d..586713537124 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -90,19 +90,16 @@ 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); @@ -146,6 +143,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) { From patchwork Wed Nov 6 04:41:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Krystad X-Patchwork-Id: 1190122 X-Patchwork-Delegate: matthieu.baerts@tessares.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.01.org (client-ip=2001:19d0:306:5::1; helo=ml01.01.org; envelope-from=mptcp-bounces@lists.01.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Received: from ml01.01.org (ml01.01.org [IPv6:2001:19d0:306:5::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 477DQL06Vkz9sPv for ; Wed, 6 Nov 2019 15:41:45 +1100 (AEDT) Received: from new-ml01.vlan13.01.org (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 6AB2F100DC3E0; Tue, 5 Nov 2019 20:44:16 -0800 (PST) Received-SPF: Pass (helo) identity=helo; client-ip=192.55.52.136; helo=mga12.intel.com; envelope-from=peter.krystad@linux.intel.com; receiver= Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 06991100EA61C for ; Tue, 5 Nov 2019 20:44:14 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Nov 2019 20:41:36 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,272,1569308400"; d="scan'208";a="232731853" Received: from pkrystad-mobl4.sea.intel.com (HELO localhost.localdomain) ([10.252.132.183]) by fmsmga002.fm.intel.com with ESMTP; 05 Nov 2019 20:41:36 -0800 From: Peter Krystad To: mptcp@lists.01.org Date: Tue, 5 Nov 2019 20:41:32 -0800 Message-Id: <20191106044133.14418-6-peter.krystad@linux.intel.com> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20191106044133.14418-1-peter.krystad@linux.intel.com> References: <20191106044133.14418-1-peter.krystad@linux.intel.com> Message-ID-Hash: 2IRQRDNXJIX7ZX53ZO57XUWGBSLHBXZG X-Message-ID-Hash: 2IRQRDNXJIX7ZX53ZO57XUWGBSLHBXZG X-MailFrom: peter.krystad@linux.intel.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.1.1 Precedence: list Subject: [MPTCP] [PATCH v2 5/6] mptcp: Export low-level routines for IPv6 List-Id: Discussions regarding MPTCP upstreaming Archived-At: <> List-Archive: <> List-Help: List-Post: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 ipv6_specific and tcp_request_sock_ipv6_ops will be referenced during TCP subflow creation. squashto: tcp: Export TCP functions and ops Signed-off-by: Peter Krystad --- include/net/tcp.h | 3 +++ net/ipv6/tcp_ipv6.c | 9 +++++---- net/mptcp/protocol.h | 3 +++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/net/tcp.h b/include/net/tcp.h index f1a0bdb7d1b1..74840bb2a4f3 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1990,6 +1990,9 @@ struct tcp_request_sock_ops { }; extern const struct tcp_request_sock_ops tcp_request_sock_ipv4_ops; +#if IS_ENABLED(CONFIG_IPV6) +extern const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops; +#endif #ifdef CONFIG_SYN_COOKIES static inline __u32 cookie_init_sequence(const struct tcp_request_sock_ops *ops, diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 4804b6dc5e65..50f6f21bbdb1 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -75,7 +75,7 @@ static void tcp_v6_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb, static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb); static const struct inet_connection_sock_af_ops ipv6_mapped; -static const struct inet_connection_sock_af_ops ipv6_specific; +const struct inet_connection_sock_af_ops ipv6_specific; #ifdef CONFIG_TCP_MD5SIG static const struct tcp_sock_af_ops tcp_sock_ipv6_specific; static const struct tcp_sock_af_ops tcp_sock_ipv6_mapped_specific; @@ -785,7 +785,7 @@ struct request_sock_ops tcp6_request_sock_ops __read_mostly = { .syn_ack_timeout = tcp_syn_ack_timeout, }; -static const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = { +const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = { .mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr), #ifdef CONFIG_TCP_MD5SIG @@ -1111,7 +1111,8 @@ static void tcp_v6_restore_cb(struct sk_buff *skb) sizeof(struct inet6_skb_parm)); } -static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *skb, +static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, + struct sk_buff *skb, struct request_sock *req, struct dst_entry *dst, struct request_sock *req_unhash, @@ -1739,7 +1740,7 @@ static struct timewait_sock_ops tcp6_timewait_sock_ops = { .twsk_destructor = tcp_twsk_destructor, }; -static const struct inet_connection_sock_af_ops ipv6_specific = { +const struct inet_connection_sock_af_ops ipv6_specific = { .queue_xmit = inet6_csk_xmit, .send_check = tcp_v6_send_check, .rebuild_header = inet6_sk_rebuild_header, diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 7f783ca65f43..c6102ca3c79e 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -269,6 +269,9 @@ int mptcp_subflow_connect(struct sock *sk, struct sockaddr *local, int mptcp_subflow_create_socket(struct sock *sk, struct socket **new_sock); extern const struct inet_connection_sock_af_ops ipv4_specific; +#if IS_ENABLED(CONFIG_MPTCP_IPV6) +extern const struct inet_connection_sock_af_ops ipv6_specific; +#endif void mptcp_proto_init(void); From patchwork Wed Nov 6 04:41:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Krystad X-Patchwork-Id: 1190121 X-Patchwork-Delegate: matthieu.baerts@tessares.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.01.org (client-ip=198.145.21.10; helo=ml01.01.org; envelope-from=mptcp-bounces@lists.01.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Received: from ml01.01.org (ml01.01.org [198.145.21.10]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 477DQL062lz9sPn for ; Wed, 6 Nov 2019 15:41:45 +1100 (AEDT) Received: from new-ml01.vlan13.01.org (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 70D18100DC3E4; Tue, 5 Nov 2019 20:44:16 -0800 (PST) Received-SPF: Pass (helo) identity=helo; client-ip=192.55.52.136; helo=mga12.intel.com; envelope-from=peter.krystad@linux.intel.com; receiver= Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 18BFF100EA61C for ; Tue, 5 Nov 2019 20:44:14 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Nov 2019 20:41:36 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,272,1569308400"; d="scan'208";a="232731854" Received: from pkrystad-mobl4.sea.intel.com (HELO localhost.localdomain) ([10.252.132.183]) by fmsmga002.fm.intel.com with ESMTP; 05 Nov 2019 20:41:36 -0800 From: Peter Krystad To: mptcp@lists.01.org Date: Tue, 5 Nov 2019 20:41:33 -0800 Message-Id: <20191106044133.14418-7-peter.krystad@linux.intel.com> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20191106044133.14418-1-peter.krystad@linux.intel.com> References: <20191106044133.14418-1-peter.krystad@linux.intel.com> Message-ID-Hash: SREBY45MD3VCIF3NFNR5EYKEUC6LI3U2 X-Message-ID-Hash: SREBY45MD3VCIF3NFNR5EYKEUC6LI3U2 X-MailFrom: peter.krystad@linux.intel.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.1.1 Precedence: list Subject: [MPTCP] [PATCH v2 6/6] mptcp: Add IPv6 support List-Id: Discussions regarding MPTCP upstreaming Archived-At: <> List-Archive: <> List-Help: List-Post: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add hooks for IPv6 as needed and initialize MPTCP IPv6 support. Signed-off-by: Peter Krystad --- include/net/mptcp.h | 10 +++++++ net/ipv6/tcp_ipv6.c | 7 +++++ net/mptcp/ctrl.c | 11 ++++++++ net/mptcp/protocol.c | 67 ++++++++++++++++++++++++++++++++++++++------ net/mptcp/protocol.h | 3 ++ net/mptcp/subflow.c | 61 ++++++++++++++++++++++++++++++++++++++-- 6 files changed, 149 insertions(+), 10 deletions(-) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 1196a5588ce1..d19bc31a6250 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -152,4 +152,14 @@ static inline bool mptcp_sk_is_subflow(const struct sock *sk) static inline void mptcp_seq_show(struct seq_file *seq) { } #endif /* CONFIG_MPTCP */ + +#if IS_ENABLED(CONFIG_MPTCP_IPV6) +int mptcpv6_init(void); +#elif IS_ENABLED(CONFIG_IPV6) +static inline int mptcpv6_init(void) +{ + return 0; +} +#endif + #endif /* __NET_MPTCP_H */ diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 50f6f21bbdb1..10d1c033d458 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -2109,9 +2109,16 @@ int __init tcpv6_init(void) ret = register_pernet_subsys(&tcpv6_net_ops); if (ret) goto out_tcpv6_protosw; + + ret = mptcpv6_init(); + if (ret) + goto out_tcpv6_pernet_subsys; + out: return ret; +out_tcpv6_pernet_subsys: + unregister_pernet_subsys(&tcpv6_net_ops); out_tcpv6_protosw: inet6_unregister_protosw(&tcpv6_protosw); out_tcpv6_protocol: diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c index 6023c9f722ea..8e39585d37f3 100644 --- a/net/mptcp/ctrl.c +++ b/net/mptcp/ctrl.c @@ -117,3 +117,14 @@ void __init mptcp_init(void) if (register_pernet_subsys(&mptcp_pernet_ops) < 0) panic("Failed to register MPTCP pernet subsystem.\n"); } + +#if IS_ENABLED(CONFIG_MPTCP_IPV6) +int __init mptcpv6_init(void) +{ + int err; + + err = mptcp_proto_v6_init(); + + return err; +} +#endif diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 323b3e65dba2..0bb9af3bef02 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -16,6 +16,9 @@ #include #include #include +#if IS_ENABLED(CONFIG_MPTCP_IPV6) +#include +#endif #include #include "protocol.h" #include "mib.h" @@ -1106,10 +1109,7 @@ static int mptcp_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) { 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); if (IS_ERR(ssock)) @@ -1125,10 +1125,7 @@ static int mptcp_stream_connect(struct socket *sock, struct sockaddr *uaddr, { 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); if (IS_ERR(ssock)) @@ -1194,6 +1191,30 @@ static int mptcp_v4_getname(struct socket *sock, struct sockaddr *uaddr, return ret; } +#if IS_ENABLED(CONFIG_MPTCP_IPV6) +static int mptcp_v6_getname(struct socket *sock, struct sockaddr *uaddr, + int peer) +{ + int ret; + + 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 sock->ops->getname(sock, uaddr, peer); + } + + ret = mptcp_getname(sock, uaddr, peer); + + return ret; +} +#endif + static int mptcp_listen(struct socket *sock, int backlog) { struct mptcp_sock *msk = mptcp_sk(sock->sk); @@ -1325,3 +1346,33 @@ void mptcp_proto_init(void) inet_register_protosw(&mptcp_protosw); } + +#if IS_ENABLED(CONFIG_MPTCP_IPV6) +static struct proto_ops mptcp_v6_stream_ops; + +static struct inet_protosw mptcp_v6_protosw = { + .type = SOCK_STREAM, + .protocol = IPPROTO_MPTCP, + .prot = &mptcp_prot, + .ops = &mptcp_v6_stream_ops, + .flags = INET_PROTOSW_ICSK, +}; + +int mptcp_proto_v6_init(void) +{ + int err; + + mptcp_v6_stream_ops = inet6_stream_ops; + mptcp_v6_stream_ops.bind = mptcp_bind; + mptcp_v6_stream_ops.connect = mptcp_stream_connect; + mptcp_v6_stream_ops.poll = mptcp_poll; + mptcp_v6_stream_ops.accept = mptcp_stream_accept; + mptcp_v6_stream_ops.getname = mptcp_v6_getname; + mptcp_v6_stream_ops.listen = mptcp_listen; + mptcp_v6_stream_ops.shutdown = mptcp_shutdown; + + err = inet6_register_protosw(&mptcp_v6_protosw); + + return err; +} +#endif diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index c6102ca3c79e..90942e0c3112 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -274,6 +274,9 @@ extern const struct inet_connection_sock_af_ops ipv6_specific; #endif void mptcp_proto_init(void); +#if IS_ENABLED(CONFIG_MPTCP_IPV6) +int mptcp_proto_v6_init(void); +#endif struct mptcp_read_arg { struct msghdr *msg; diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 586713537124..b945460456b4 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -15,6 +15,9 @@ #include #include #include +#if IS_ENABLED(CONFIG_MPTCP_IPV6) +#include +#endif #include #include "protocol.h" #include "mib.h" @@ -154,6 +157,19 @@ static void subflow_v4_init_req(struct request_sock *req, subflow_init_req(req, sk_listener, skb); } +#if IS_ENABLED(CONFIG_MPTCP_IPV6) +static void subflow_v6_init_req(struct request_sock *req, + const struct sock *sk_listener, + struct sk_buff *skb) +{ + tcp_rsk(req)->is_mptcp = 1; + + tcp_request_sock_ipv6_ops.init_req(req, sk_listener, skb); + + subflow_init_req(req, sk_listener, skb); +} +#endif + /* validate received truncated hmac and create hmac for third ACK */ static bool subflow_thmac_valid(struct mptcp_subflow_context *subflow) { @@ -234,6 +250,31 @@ static int subflow_v4_conn_request(struct sock *sk, struct sk_buff *skb) return 0; } +#if IS_ENABLED(CONFIG_MPTCP_IPV6) +static struct tcp_request_sock_ops subflow_request_sock_ipv6_ops; +static struct inet_connection_sock_af_ops subflow_v6_specific; + +static int subflow_v6_conn_request(struct sock *sk, struct sk_buff *skb) +{ + struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); + + pr_debug("subflow=%p", subflow); + + if (skb->protocol == htons(ETH_P_IP)) + return tcp_v4_conn_request(sk, skb); + + if (!ipv6_unicast_destination(skb)) + goto drop; + + return tcp_conn_request(&subflow_request_sock_ops, + &subflow_request_sock_ipv6_ops, sk, skb); + +drop: + tcp_listendrop(sk); + return 0; /* don't send reset */ +} +#endif + /* validate hmac received in third ACK */ static bool subflow_hmac_valid(const struct request_sock *req, const struct tcp_options_received *rx_opt) @@ -690,7 +731,8 @@ int mptcp_subflow_create_socket(struct sock *sk, struct socket **new_sock) struct socket *sf; int err; - err = sock_create_kern(net, PF_INET, SOCK_STREAM, IPPROTO_TCP, &sf); + err = sock_create_kern(net, sk->sk_family, SOCK_STREAM, IPPROTO_TCP, + &sf); if (err) return err; @@ -774,11 +816,15 @@ static int subflow_ulp_init(struct sock *sk) goto out; } - pr_debug("subflow=%p", ctx); + pr_debug("subflow=%p, family=%d", ctx, sk->sk_family); tp->is_mptcp = 1; ctx->icsk_af_ops = icsk->icsk_af_ops; icsk->icsk_af_ops = &subflow_specific; +#if IS_ENABLED(CONFIG_MPTCP_IPV6) + if (sk->sk_family == AF_INET6) + icsk->icsk_af_ops = &subflow_v6_specific; +#endif ctx->tcp_sk_data_ready = sk->sk_data_ready; sk->sk_data_ready = subflow_data_ready; sk->sk_write_space = subflow_write_space; @@ -877,6 +923,17 @@ void mptcp_subflow_init(void) subflow_specific.sk_rx_dst_set = subflow_finish_connect; subflow_specific.rebuild_header = subflow_rebuild_header; +#if IS_ENABLED(CONFIG_MPTCP_IPV6) + subflow_request_sock_ipv6_ops = tcp_request_sock_ipv6_ops; + subflow_request_sock_ipv6_ops.init_req = subflow_v6_init_req; + + subflow_v6_specific = ipv6_specific; + subflow_v6_specific.conn_request = subflow_v6_conn_request; + subflow_v6_specific.syn_recv_sock = subflow_syn_recv_sock; + subflow_v6_specific.sk_rx_dst_set = subflow_finish_connect; + subflow_v6_specific.rebuild_header = subflow_rebuild_header; +#endif + mptcp_diag_subflow_init(&subflow_ulp_ops); if (tcp_register_ulp(&subflow_ulp_ops) != 0)