All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Abeni <pabeni@redhat.com>
To: mptcp@lists.linux.dev
Cc: Geliang Tang <geliangtang@gmail.com>
Subject: [PATCH v5 mptcp-next 04/21] mptcp: send out checksum for MP_CAPABLE with data
Date: Tue,  4 May 2021 23:29:14 +0200	[thread overview]
Message-ID: <80e47d3778ba209b088fea808b54868b370f79a8.1620162984.git.pabeni@redhat.com> (raw)
In-Reply-To: <cover.1620162984.git.pabeni@redhat.com>

From: Geliang Tang <geliangtang@gmail.com>

If the checksum is enabled, send out the data checksum with the
MP_CAPABLE suboption with data.

In mptcp_established_options_mp, save the data checksum in
opts->ext_copy.csum. In mptcp_write_options, adjust the option length and
send it out with the MP_CAPABLE suboption.

Signed-off-by: Geliang Tang <geliangtang@gmail.com>
---
 net/mptcp/options.c | 35 ++++++++++++++++++++++++++---------
 1 file changed, 26 insertions(+), 9 deletions(-)

diff --git a/net/mptcp/options.c b/net/mptcp/options.c
index 389d48978004..175635214ce6 100644
--- a/net/mptcp/options.c
+++ b/net/mptcp/options.c
@@ -440,6 +440,8 @@ static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb,
 	struct mptcp_sock *msk = mptcp_sk(subflow->conn);
 	struct mptcp_ext *mpext;
 	unsigned int data_len;
+	__sum16 csum;
+	u8 len;
 
 	/* When skb is not available, we better over-estimate the emitted
 	 * options len. A full DSS option (28 bytes) is longer than
@@ -459,6 +461,7 @@ static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb,
 	if (subflow->mp_capable) {
 		mpext = mptcp_get_ext(skb);
 		data_len = mpext ? mpext->data_len : 0;
+		csum = mpext ? mpext->csum : 0;
 
 		/* we will check ext_copy.data_len in mptcp_write_options() to
 		 * discriminate between TCPOLEN_MPTCP_MPC_ACK_DATA and
@@ -469,16 +472,22 @@ static bool mptcp_established_options_mp(struct sock *sk, struct sk_buff *skb,
 		opts->sndr_key = subflow->local_key;
 		opts->rcvr_key = subflow->remote_key;
 		opts->csum_reqd = READ_ONCE(msk->csum_enabled);
+		if (opts->csum_reqd)
+			opts->ext_copy.csum = csum;
 
 		/* Section 3.1.
 		 * The MP_CAPABLE option is carried on the SYN, SYN/ACK, and ACK
 		 * packets that start the first subflow of an MPTCP connection,
 		 * as well as the first packet that carries data
 		 */
-		if (data_len > 0)
-			*size = ALIGN(TCPOLEN_MPTCP_MPC_ACK_DATA, 4);
-		else
+		if (data_len > 0) {
+			len = TCPOLEN_MPTCP_MPC_ACK_DATA;
+			if (opts->csum_reqd)
+				len += TCPOLEN_MPTCP_DSS_CHECKSUM;
+			*size = ALIGN(len, 4);
+		} else {
 			*size = TCPOLEN_MPTCP_MPC_ACK;
+		}
 
 		pr_debug("subflow=%p, local_key=%llu, remote_key=%llu map_len=%d",
 			 subflow, subflow->local_key, subflow->remote_key,
@@ -1133,14 +1142,17 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
 	     OPTION_MPTCP_MPC_ACK) & opts->suboptions) {
 		u8 len, flag = MPTCP_CAP_HMAC_SHA256;
 
-		if (OPTION_MPTCP_MPC_SYN & opts->suboptions)
+		if (OPTION_MPTCP_MPC_SYN & opts->suboptions) {
 			len = TCPOLEN_MPTCP_MPC_SYN;
-		else if (OPTION_MPTCP_MPC_SYNACK & opts->suboptions)
+		} else if (OPTION_MPTCP_MPC_SYNACK & opts->suboptions) {
 			len = TCPOLEN_MPTCP_MPC_SYNACK;
-		else if (opts->ext_copy.data_len)
+		} else if (opts->ext_copy.data_len) {
 			len = TCPOLEN_MPTCP_MPC_ACK_DATA;
-		else
+			if (opts->csum_reqd)
+				len += TCPOLEN_MPTCP_DSS_CHECKSUM;
+		} else {
 			len = TCPOLEN_MPTCP_MPC_ACK;
+		}
 
 		if (opts->csum_reqd)
 			flag |= MPTCP_CAP_CHECKSUM_REQD;
@@ -1163,8 +1175,13 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
 		if (!opts->ext_copy.data_len)
 			goto mp_capable_done;
 
-		put_unaligned_be32(opts->ext_copy.data_len << 16 |
-				   TCPOPT_NOP << 8 | TCPOPT_NOP, ptr);
+		if (opts->csum_reqd) {
+			put_unaligned_be32(opts->ext_copy.data_len << 16 |
+					   (__force u16)opts->ext_copy.csum, ptr);
+		} else {
+			put_unaligned_be32(opts->ext_copy.data_len << 16 |
+					   TCPOPT_NOP << 8 | TCPOPT_NOP, ptr);
+		}
 		ptr += 1;
 	}
 
-- 
2.26.2


  parent reply	other threads:[~2021-05-04 21:29 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-04 21:29 [PATCH v5 mptcp-next 00/21] mptcp: data checksum support Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 01/21] mptcp: generate the data checksum Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 02/21] Squash-to: "mptcp: generate the data checksum" Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 03/21] mptcp: add csum_reqd in mptcp_out_options Paolo Abeni
2021-05-04 21:29 ` Paolo Abeni [this message]
2021-05-04 21:29 ` [PATCH v5 mptcp-next 05/21] Squash-to: "mptcp: send out checksum for MP_CAPABLE with data" Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 06/21] mptcp: send out checksum for DSS Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 07/21] Squash-to "mptcp: send out checksum for DSS" Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 08/21] mptcp: add sk parameter for mptcp_parse_option Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 09/21] mptcp: add csum_reqd in mptcp_options_received Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 10/21] mptcp: receive checksum for MP_CAPABLE with data Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 11/21] Squash-to: "mptcp: receive checksum for MP_CAPABLE with data" Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 12/21] mptcp: receive checksum for DSS Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 13/21] Squash-to: "mptcp: receive checksum for DSS" Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 14/21] mptcp: validate the data checksum Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 15/21] Squash-to: " Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 16/21] mptcp: cleanup error path in subflow_check_data_avail() Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 17/21] mptcp: tune re-injections for csum enabled mode Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 18/21] mptcp: add the mib for data checksum Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 19/21] mptcp: add a new sysctl checksum_enabled Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 20/21] selftests: mptcp: enable checksum in mptcp_connect.sh Paolo Abeni
2021-05-04 21:29 ` [PATCH v5 mptcp-next 21/21] selftests: mptcp: enable checksum in mptcp_join.sh Paolo Abeni
2021-05-04 21:41 ` [PATCH v5 mptcp-next 00/21] mptcp: data checksum support Paolo Abeni

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=80e47d3778ba209b088fea808b54868b370f79a8.1620162984.git.pabeni@redhat.com \
    --to=pabeni@redhat.com \
    --cc=geliangtang@gmail.com \
    --cc=mptcp@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.