Merge 5.15.43 into android14-5.15

Changes in 5.15.43
	mptcp: Do TCP fallback on early DSS checksum failure
	Linux 5.15.43

Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I5536d79dc8ed2b566c4614cd9f7e10896abfc817
This commit is contained in:
Greg Kroah-Hartman
2022-06-09 15:53:02 +02:00
3 changed files with 21 additions and 5 deletions

View File

@@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 5 VERSION = 5
PATCHLEVEL = 15 PATCHLEVEL = 15
SUBLEVEL = 42 SUBLEVEL = 43
EXTRAVERSION = EXTRAVERSION =
NAME = Trick or Treat NAME = Trick or Treat

View File

@@ -436,7 +436,8 @@ struct mptcp_subflow_context {
rx_eof : 1, rx_eof : 1,
can_ack : 1, /* only after processing the remote a key */ can_ack : 1, /* only after processing the remote a key */
disposable : 1, /* ctx can be free at ulp release time */ disposable : 1, /* ctx can be free at ulp release time */
stale : 1; /* unable to snd/rcv data, do not use for xmit */ stale : 1, /* unable to snd/rcv data, do not use for xmit */
valid_csum_seen : 1; /* at least one csum validated */
enum mptcp_data_avail data_avail; enum mptcp_data_avail data_avail;
u32 remote_nonce; u32 remote_nonce;
u64 thmac; u64 thmac;

View File

@@ -913,11 +913,14 @@ static enum mapping_status validate_data_csum(struct sock *ssk, struct sk_buff *
subflow->map_data_csum); subflow->map_data_csum);
if (unlikely(csum)) { if (unlikely(csum)) {
MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DATACSUMERR); MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_DATACSUMERR);
if (subflow->mp_join || subflow->valid_csum_seen) {
subflow->send_mp_fail = 1; subflow->send_mp_fail = 1;
MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_MPFAILTX); MPTCP_INC_STATS(sock_net(ssk), MPTCP_MIB_MPFAILTX);
}
return subflow->mp_join ? MAPPING_INVALID : MAPPING_DUMMY; return subflow->mp_join ? MAPPING_INVALID : MAPPING_DUMMY;
} }
subflow->valid_csum_seen = 1;
return MAPPING_OK; return MAPPING_OK;
} }
@@ -1099,6 +1102,18 @@ static void subflow_sched_work_if_closed(struct mptcp_sock *msk, struct sock *ss
} }
} }
static bool subflow_can_fallback(struct mptcp_subflow_context *subflow)
{
struct mptcp_sock *msk = mptcp_sk(subflow->conn);
if (subflow->mp_join)
return false;
else if (READ_ONCE(msk->csum_enabled))
return !subflow->valid_csum_seen;
else
return !subflow->fully_established;
}
static bool subflow_check_data_avail(struct sock *ssk) static bool subflow_check_data_avail(struct sock *ssk)
{ {
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
@@ -1176,7 +1191,7 @@ fallback:
return true; return true;
} }
if (subflow->mp_join || subflow->fully_established) { if (!subflow_can_fallback(subflow)) {
/* fatal protocol error, close the socket. /* fatal protocol error, close the socket.
* subflow_error_report() will introduce the appropriate barriers * subflow_error_report() will introduce the appropriate barriers
*/ */