]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
mptcp: use "middlebox interference" RST when no DSS
authorDavide Caratti <dcaratti@redhat.com>
Mon, 21 Oct 2024 15:14:06 +0000 (17:14 +0200)
committerJakub Kicinski <kuba@kernel.org>
Mon, 28 Oct 2024 22:55:45 +0000 (15:55 -0700)
RFC8684 suggests use of "Middlebox interference (code 0x06)" in case of
fully established 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
Signed-off-by: Davide Caratti <dcaratti@redhat.com>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20241021-net-next-mptcp-misc-6-13-v1-4-1ef02746504a@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/subflow.c

index 860903e0642255cf9efb39da9e24c39f6547481f..07352b15f145832572a4203ab4d0427c37675e94 100644 (file)
@@ -971,7 +971,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)
@@ -1128,8 +1129,9 @@ static enum mapping_status get_mapping_status(struct sock *ssk,
                        return MAPPING_EMPTY;
                }
 
+               /* If the required DSS has likely been dropped by a middlebox */
                if (!subflow->map_valid)
-                       return MAPPING_INVALID;
+                       return MAPPING_NODSS;
 
                goto validate_seq;
        }
@@ -1343,7 +1345,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)
@@ -1396,7 +1398,9 @@ fallback:
                         * subflow_error_report() will introduce the appropriate barriers
                         */
                        subflow->reset_transient = 0;
-                       subflow->reset_reason = MPTCP_RST_EMPTCP;
+                       subflow->reset_reason = status == MAPPING_NODSS ?
+                                               MPTCP_RST_EMIDDLEBOX :
+                                               MPTCP_RST_EMPTCP;
 
 reset:
                        WRITE_ONCE(ssk->sk_err, EBADMSG);