Skip to content

Commit 0348c69

Browse files
geliangtangdavem330
authored andcommitted
mptcp: add the fallback check
This patch adds the fallback check in subflow_check_data_avail(). Only do the fallback when the msk hasn't fallen back yet. Suggested-by: Paolo Abeni <[email protected]> Signed-off-by: Geliang Tang <[email protected]> Signed-off-by: Mat Martineau <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 1761fed commit 0348c69

File tree

1 file changed

+24
-21
lines changed

1 file changed

+24
-21
lines changed

net/mptcp/subflow.c

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,35 +1203,38 @@ static bool subflow_check_data_avail(struct sock *ssk)
12031203
return false;
12041204

12051205
fallback:
1206-
/* RFC 8684 section 3.7. */
1207-
if (subflow->send_mp_fail) {
1208-
if (mptcp_has_another_subflow(ssk)) {
1206+
if (!__mptcp_check_fallback(msk)) {
1207+
/* RFC 8684 section 3.7. */
1208+
if (subflow->send_mp_fail) {
1209+
if (mptcp_has_another_subflow(ssk)) {
1210+
ssk->sk_err = EBADMSG;
1211+
tcp_set_state(ssk, TCP_CLOSE);
1212+
subflow->reset_transient = 0;
1213+
subflow->reset_reason = MPTCP_RST_EMIDDLEBOX;
1214+
tcp_send_active_reset(ssk, GFP_ATOMIC);
1215+
while ((skb = skb_peek(&ssk->sk_receive_queue)))
1216+
sk_eat_skb(ssk, skb);
1217+
}
1218+
WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA);
1219+
return true;
1220+
}
1221+
1222+
if (subflow->mp_join || subflow->fully_established) {
1223+
/* fatal protocol error, close the socket.
1224+
* subflow_error_report() will introduce the appropriate barriers
1225+
*/
12091226
ssk->sk_err = EBADMSG;
12101227
tcp_set_state(ssk, TCP_CLOSE);
12111228
subflow->reset_transient = 0;
1212-
subflow->reset_reason = MPTCP_RST_EMIDDLEBOX;
1229+
subflow->reset_reason = MPTCP_RST_EMPTCP;
12131230
tcp_send_active_reset(ssk, GFP_ATOMIC);
1214-
while ((skb = skb_peek(&ssk->sk_receive_queue)))
1215-
sk_eat_skb(ssk, skb);
1231+
WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA);
1232+
return false;
12161233
}
1217-
WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA);
1218-
return true;
1219-
}
12201234

1221-
if (subflow->mp_join || subflow->fully_established) {
1222-
/* fatal protocol error, close the socket.
1223-
* subflow_error_report() will introduce the appropriate barriers
1224-
*/
1225-
ssk->sk_err = EBADMSG;
1226-
tcp_set_state(ssk, TCP_CLOSE);
1227-
subflow->reset_transient = 0;
1228-
subflow->reset_reason = MPTCP_RST_EMPTCP;
1229-
tcp_send_active_reset(ssk, GFP_ATOMIC);
1230-
WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA);
1231-
return false;
1235+
__mptcp_do_fallback(msk);
12321236
}
12331237

1234-
__mptcp_do_fallback(msk);
12351238
skb = skb_peek(&ssk->sk_receive_queue);
12361239
subflow->map_valid = 1;
12371240
subflow->map_seq = READ_ONCE(msk->ack_seq);

0 commit comments

Comments
 (0)