@@ -165,7 +165,6 @@ static void mptcp_parse_option(const struct sock *sk,
mp_opt->use_map = (flags & MPTCP_DSS_HAS_MAP) != 0;
mp_opt->ack64 = (flags & MPTCP_DSS_ACK64) != 0;
mp_opt->use_ack = (flags & MPTCP_DSS_HAS_ACK);
- mp_opt->csum_reqd = READ_ONCE(msk->csum_enabled);
pr_debug("data_fin=%d dsn64=%d use_map=%d ack64=%d use_ack=%d",
mp_opt->data_fin, mp_opt->dsn64,
@@ -186,17 +185,13 @@ static void mptcp_parse_option(const struct sock *sk,
expected_opsize += TCPOLEN_MPTCP_DSS_MAP64;
else
expected_opsize += TCPOLEN_MPTCP_DSS_MAP32;
-
- if (mp_opt->csum_reqd)
- expected_opsize += TCPOLEN_MPTCP_DSS_CHECKSUM;
}
- /* 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.
+ /* Always parse any csum presence combination, we will enforce
+ * RFC 8684 Section 3.3.0 checks later in subflow_data_ready
*/
- if (opsize != expected_opsize)
+ if (opsize != expected_opsize &&
+ opsize != expected_opsize + TCPOLEN_MPTCP_DSS_CHECKSUM)
break;
mp_opt->dss = 1;
@@ -228,14 +223,15 @@ static void mptcp_parse_option(const struct sock *sk,
mp_opt->data_len = get_unaligned_be16(ptr);
ptr += 2;
- if (mp_opt->csum_reqd) {
+ if (opsize == expected_opsize + TCPOLEN_MPTCP_DSS_CHECKSUM) {
+ mp_opt->csum_reqd = 1;
mp_opt->csum = (__force __sum16)get_unaligned_be16(ptr);
ptr += 2;
}
- pr_debug("data_seq=%llu subflow_seq=%u data_len=%u csum=%u",
+ pr_debug("data_seq=%llu subflow_seq=%u data_len=%u csum=%d:%u",
mp_opt->data_seq, mp_opt->subflow_seq,
- mp_opt->data_len, mp_opt->csum);
+ mp_opt->data_len, mp_opt->csum_reqd, mp_opt->csum);
}
break;
Similar to the previous squash to patch, always parse the DSS option regardless of csum presence. Signed-off-by: Paolo Abeni <pabeni@redhat.com> --- net/mptcp/options.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-)