From: Peter Krystad <peter.krystad at linux.intel.com>
To: mptcp at lists.01.org
Subject: [MPTCP] [PATCH] mptcp: Remove all traces of checksum support
Date: Mon, 16 Sep 2019 15:10:16 -0700 [thread overview]
Message-ID: <20190916221016.16210-1-peter.krystad@linux.intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 9307 bytes --]
Since checksum support is not planned remove any references
that look it may be supported.
Also re-factor DSS option size calculation and make
DSS option size check for exactly correct lengths.
Signed-off-by: Peter Krystad <peter.krystad(a)linux.intel.com>
---
net/mptcp/options.c | 69 +++++++++++++++++---------------------------
net/mptcp/protocol.c | 13 ++++-----
net/mptcp/protocol.h | 4 +--
net/mptcp/subflow.c | 5 ----
4 files changed, 32 insertions(+), 59 deletions(-)
diff --git a/net/mptcp/options.c b/net/mptcp/options.c
index b82557af3fae..ec56a25e6948 100644
--- a/net/mptcp/options.c
+++ b/net/mptcp/options.c
@@ -130,7 +130,6 @@ void mptcp_parse_option(const unsigned char *ptr, int opsize,
*/
case MPTCPOPT_DSS:
pr_debug("DSS");
- mp_opt->dss = 1;
ptr++;
mp_opt->dss_flags = (*ptr++) & MPTCP_DSS_FLAG_MASK;
@@ -152,10 +151,27 @@ void mptcp_parse_option(const unsigned char *ptr, int opsize,
expected_opsize += TCPOLEN_MPTCP_DSS_ACK64;
else
expected_opsize += TCPOLEN_MPTCP_DSS_ACK32;
+ }
+
+ if (mp_opt->use_map) {
+ if (mp_opt->dsn64)
+ expected_opsize += TCPOLEN_MPTCP_DSS_MAP64;
+ else
+ expected_opsize += TCPOLEN_MPTCP_DSS_MAP32;
+ }
- if (opsize < expected_opsize)
- break;
+ /* RFC 6824, Section 3.3:
+ * If a checksum is present, but its use had
+ * not been negotiated in the MP_CAPABLE handshake,
+ * the checksum field MUST be ignored.
+ */
+ if (opsize != expected_opsize &&
+ opsize != expected_opsize + TCPOLEN_MPTCP_DSS_CHECKSUM)
+ break;
+ mp_opt->dss = 1;
+
+ if (mp_opt->use_ack) {
if (mp_opt->ack64) {
mp_opt->data_ack = get_unaligned_be64(ptr);
ptr += 8;
@@ -163,19 +179,10 @@ void mptcp_parse_option(const unsigned char *ptr, int opsize,
mp_opt->data_ack = get_unaligned_be32(ptr);
ptr += 4;
}
-
pr_debug("data_ack=%llu", mp_opt->data_ack);
}
if (mp_opt->use_map) {
- if (mp_opt->dsn64)
- expected_opsize += TCPOLEN_MPTCP_DSS_MAP64;
- else
- expected_opsize += TCPOLEN_MPTCP_DSS_MAP32;
-
- if (opsize < expected_opsize)
- break;
-
if (mp_opt->dsn64) {
mp_opt->data_seq = get_unaligned_be64(ptr);
ptr += 8;
@@ -190,13 +197,11 @@ void mptcp_parse_option(const unsigned char *ptr, int opsize,
mp_opt->data_len = get_unaligned_be16(ptr);
ptr += 2;
- /* Checksum not currently supported */
- mp_opt->checksum = 0;
-
- pr_debug("data_seq=%llu subflow_seq=%u data_len=%u ck=%u",
+ pr_debug("data_seq=%llu subflow_seq=%u data_len=%u",
mp_opt->data_seq, mp_opt->subflow_seq,
- mp_opt->data_len, mp_opt->checksum);
+ mp_opt->data_len);
}
+
break;
/* MPTCPOPT_ADD_ADDR
@@ -390,12 +395,8 @@ static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb,
if (!skb || (mpext && mpext->use_map)) {
unsigned int map_size;
- bool use_csum;
map_size = TCPOLEN_MPTCP_DSS_BASE + TCPOLEN_MPTCP_DSS_MAP64;
- use_csum = subflow_ctx(sk)->use_checksum;
- if (use_csum)
- map_size += TCPOLEN_MPTCP_DSS_CHECKSUM;
if (map_size <= remaining) {
remaining -= map_size;
@@ -404,10 +405,8 @@ static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb,
opts->ext_copy.data_seq = mpext->data_seq;
opts->ext_copy.subflow_seq = mpext->subflow_seq;
opts->ext_copy.data_len = mpext->data_len;
- opts->ext_copy.checksum = mpext->checksum;
opts->ext_copy.use_map = 1;
opts->ext_copy.dsn64 = mpext->dsn64;
- opts->ext_copy.use_checksum = use_csum;
}
} else {
opts->ext_copy.use_map = 0;
@@ -573,10 +572,8 @@ void mptcp_incoming_options(struct sock *sk, struct sk_buff *skb,
mpext->data_seq = mp_opt->data_seq;
mpext->subflow_seq = mp_opt->subflow_seq;
mpext->data_len = mp_opt->data_len;
- mpext->checksum = mp_opt->checksum;
mpext->use_map = 1;
mpext->dsn64 = mp_opt->dsn64;
- mpext->use_checksum = mp_opt->use_checksum;
}
if (mp_opt->use_ack) {
@@ -676,12 +673,8 @@ void mptcp_write_options(__be32 *ptr, struct mptcp_out_options *opts)
}
if (mpext->use_map) {
- pr_debug("Updating DSS length and flags for map");
len += TCPOLEN_MPTCP_DSS_MAP64;
- if (mpext->use_checksum)
- len += TCPOLEN_MPTCP_DSS_CHECKSUM;
-
/* Use only 64-bit mapping flags for now, add
* support for optional 32-bit mappings later.
*/
@@ -690,10 +683,7 @@ void mptcp_write_options(__be32 *ptr, struct mptcp_out_options *opts)
flags |= MPTCP_DSS_DATA_FIN;
}
- *ptr++ = htonl((TCPOPT_MPTCP << 24) |
- (len << 16) |
- (MPTCPOPT_DSS << 12) |
- (flags));
+ *ptr++ = mptcp_option(MPTCPOPT_DSS, len, 0, flags);
if (mpext->use_ack) {
put_unaligned_be64(mpext->data_ack, ptr);
@@ -701,18 +691,11 @@ void mptcp_write_options(__be32 *ptr, struct mptcp_out_options *opts)
}
if (mpext->use_map) {
- __sum16 checksum;
-
- pr_debug("Writing map values");
put_unaligned_be64(mpext->data_seq, ptr);
ptr += 2;
- *ptr++ = htonl(mpext->subflow_seq);
-
- if (mpext->use_checksum)
- checksum = mpext->checksum;
- else
- checksum = TCPOPT_NOP << 8 | TCPOPT_NOP;
- *ptr = htonl(mpext->data_len << 16 | checksum);
+ put_unaligned_be32(mpext->subflow_seq, ptr);
+ ptr += 1;
+ put_unaligned_be16(mpext->data_len, ptr);
}
}
}
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 9c019e696fc7..5c6295611d2d 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -156,13 +156,12 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk,
mpext->data_seq = msk->write_seq;
mpext->subflow_seq = subflow_ctx(ssk)->rel_write_seq;
mpext->data_len = ret;
- mpext->checksum = 0xbeef;
mpext->use_map = 1;
mpext->dsn64 = 1;
- pr_debug("data_seq=%llu subflow_seq=%u data_len=%u checksum=%u, dsn64=%d",
+ pr_debug("data_seq=%llu subflow_seq=%u data_len=%u dsn64=%d",
mpext->data_seq, mpext->subflow_seq, mpext->data_len,
- mpext->checksum, mpext->dsn64);
+ mpext->dsn64);
}
/* TODO: else fallback; allocation can fail, but we can't easily retire
* skbs from the write_queue, as we need to roll-back TCP status
@@ -337,9 +336,8 @@ static enum mapping_status mptcp_get_mapping(struct sock *ssk)
goto del_out;
}
- pr_debug("seq=%llu is64=%d ssn=%u data_len=%u ck=%u",
- mpext->data_seq, mpext->dsn64, mpext->subflow_seq,
- mpext->data_len, mpext->checksum);
+ pr_debug("seq=%llu is64=%d ssn=%u data_len=%u", mpext->data_seq,
+ mpext->dsn64, mpext->subflow_seq, mpext->data_len);
if (mpext->data_len == 0) {
pr_err("Infinite mapping not handled");
@@ -912,8 +910,7 @@ static struct socket *mptcp_socket_create_get(struct mptcp_sock *msk)
msk->subflow = ssock;
subflow = subflow_ctx(msk->subflow->sk);
subflow->request_mptcp = 1; /* @@ if MPTCP enabled */
- subflow->request_cksum = 0; /* checksum not supported */
- subflow->request_version = 0; /* only v0 supported */
+ subflow->request_version = 0; /* currently only v0 supported */
sock_hold(ssock->sk);
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 40f0efaef55e..d263b64cfcfd 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -140,7 +140,7 @@ struct subflow_request_sock {
struct tcp_request_sock sk;
u8 mp_capable : 1,
mp_join : 1,
- checksum : 1,
+ unused : 1,
backup : 1,
version : 4;
u8 local_id;
@@ -175,14 +175,12 @@ struct subflow_context {
u16 map_data_len;
u16 request_mptcp : 1, /* send MP_CAPABLE */
request_join : 1, /* send MP_JOIN */
- request_cksum : 1,
request_bkup : 1,
request_version : 4,
mp_capable : 1, /* remote is MPTCP capable */
mp_join : 1, /* remote is JOINing */
fourth_ack : 1, /* send initial DSS */
conn_finished : 1,
- use_checksum : 1,
map_valid : 1,
backup : 1;
u32 remote_nonce;
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index a49cc5ed1b27..9b39c0e26b26 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -117,9 +117,6 @@ static void subflow_v4_init_req(struct request_sock *req,
subflow_req->version = listener->request_version;
else
subflow_req->version = rx_opt.mptcp.version;
- if ((rx_opt.mptcp.flags & MPTCP_CAP_CHECKSUM_REQD) ||
- listener->request_cksum)
- subflow_req->checksum = 1;
subflow_req->remote_key = rx_opt.mptcp.sndr_key;
pr_debug("syn seq=%u", TCP_SKB_CB(skb)->seq);
subflow_req->ssn_offset = TCP_SKB_CB(skb)->seq;
@@ -435,7 +432,6 @@ static int subflow_ulp_init(struct sock *sk)
tp->is_mptcp = 1;
icsk->icsk_af_ops = &subflow_specific;
ctx->tcp_sk_data_ready = sk->sk_data_ready;
- ctx->use_checksum = 0;
sk->sk_data_ready = subflow_data_ready;
out:
return err;
@@ -470,7 +466,6 @@ static void subflow_ulp_clone(const struct request_sock *req,
new_ctx->conn = NULL;
new_ctx->conn_finished = 1;
new_ctx->tcp_sk_data_ready = old_ctx->tcp_sk_data_ready;
- new_ctx->use_checksum = old_ctx->use_checksum;
if (subflow_req->mp_capable) {
new_ctx->mp_capable = 1;
--
2.17.2
next reply other threads:[~2019-09-16 22:10 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-16 22:10 Peter Krystad [this message]
-- strict thread matches above, loose matches on Subject: below --
2019-09-17 9:24 [MPTCP] [PATCH] mptcp: Remove all traces of checksum support Paolo Abeni
2019-09-17 21:20 Peter Krystad
2019-09-17 21:35 Mat Martineau
2019-09-24 18:44 Peter Krystad
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=20190916221016.16210-1-peter.krystad@linux.intel.com \
--to=unknown@example.com \
/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.