From 184902b101dcfcd8fc6ed8c248113a3884d77007 Mon Sep 17 00:00:00 2001 From: Davide Caratti Date: Tue, 8 Oct 2024 19:31:00 +0200 Subject: [PATCH] mptcp: use "middlebox interference" for MP_TCPRST in case map_valid is false RFC8684 suggests use of "Middlebox interference (code 0x06)" in case of MPJ subflow that carries data at TCP level with no DSS sub-option. This is generally the case when mpext is NULL or mpext->use_map is 0: use a dedicated value of 'mapping_status' and use it before closing the socket in subflow_check_data_avail(). Link: https://github.com/multipath-tcp/mptcp_net-next/issues/518#issuecomment-2389156143 Signed-off-by: Davide Caratti Message-Id: <4b2cee91613e597a172b46bb0d9d3143053c52da.1728408247.git.dcaratti@redhat.com> --- net/mptcp/subflow.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 61482f8b425b5..77da7a33598a5 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -960,7 +960,8 @@ enum mapping_status { MAPPING_EMPTY, MAPPING_DATA_FIN, MAPPING_DUMMY, - MAPPING_BAD_CSUM + MAPPING_BAD_CSUM, + MAPPING_NODSS }; static void dbg_bad_map(struct mptcp_subflow_context *subflow, u32 ssn) @@ -1118,7 +1119,7 @@ static enum mapping_status get_mapping_status(struct sock *ssk, } if (!subflow->map_valid) - return MAPPING_INVALID; + return MAPPING_NODSS; goto validate_seq; } @@ -1332,7 +1333,7 @@ static bool subflow_check_data_avail(struct sock *ssk) status = get_mapping_status(ssk, msk); trace_subflow_check_data_avail(status, skb_peek(&ssk->sk_receive_queue)); if (unlikely(status == MAPPING_INVALID || status == MAPPING_DUMMY || - status == MAPPING_BAD_CSUM)) + status == MAPPING_BAD_CSUM || status == MAPPING_NODSS)) goto fallback; if (status != MAPPING_OK) @@ -1385,7 +1386,13 @@ static bool subflow_check_data_avail(struct sock *ssk) * subflow_error_report() will introduce the appropriate barriers */ subflow->reset_transient = 0; - subflow->reset_reason = MPTCP_RST_EMPTCP; + switch (status) { + case MAPPING_NODSS: + subflow->reset_reason = MPTCP_RST_EMIDDLEBOX; + break; + default: + subflow->reset_reason = MPTCP_RST_EMPTCP; + } reset: WRITE_ONCE(ssk->sk_err, EBADMSG);