Skip to content

Commit

Permalink
mptcp: use "middlebox interference" RST when no DSS
Browse files Browse the repository at this point in the history
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: multipath-tcp/mptcp_net-next#518
Signed-off-by: Davide Caratti <[email protected]>
Signed-off-by: Matthieu Baerts (NGI0) <[email protected]>
Signed-off-by: NipaLocal <nipa@local>
  • Loading branch information
dcaratti authored and NipaLocal committed Oct 27, 2024
1 parent 1ef212a commit 8ca3244
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions net/mptcp/subflow.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -1396,7 +1398,9 @@ 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;
subflow->reset_reason = status == MAPPING_NODSS ?
MPTCP_RST_EMIDDLEBOX :
MPTCP_RST_EMPTCP;

reset:
WRITE_ONCE(ssk->sk_err, EBADMSG);
Expand Down

0 comments on commit 8ca3244

Please sign in to comment.