提交 0348c690 编写于 作者: G Geliang Tang 提交者: David S. Miller

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: NPaolo Abeni <pabeni@redhat.com>
Signed-off-by: NGeliang Tang <geliang.tang@suse.com>
Signed-off-by: NMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 1761fed2
...@@ -1203,35 +1203,38 @@ static bool subflow_check_data_avail(struct sock *ssk) ...@@ -1203,35 +1203,38 @@ static bool subflow_check_data_avail(struct sock *ssk)
return false; return false;
fallback: fallback:
/* RFC 8684 section 3.7. */ if (!__mptcp_check_fallback(msk)) {
if (subflow->send_mp_fail) { /* RFC 8684 section 3.7. */
if (mptcp_has_another_subflow(ssk)) { if (subflow->send_mp_fail) {
if (mptcp_has_another_subflow(ssk)) {
ssk->sk_err = EBADMSG;
tcp_set_state(ssk, TCP_CLOSE);
subflow->reset_transient = 0;
subflow->reset_reason = MPTCP_RST_EMIDDLEBOX;
tcp_send_active_reset(ssk, GFP_ATOMIC);
while ((skb = skb_peek(&ssk->sk_receive_queue)))
sk_eat_skb(ssk, skb);
}
WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA);
return true;
}
if (subflow->mp_join || subflow->fully_established) {
/* fatal protocol error, close the socket.
* subflow_error_report() will introduce the appropriate barriers
*/
ssk->sk_err = EBADMSG; ssk->sk_err = EBADMSG;
tcp_set_state(ssk, TCP_CLOSE); tcp_set_state(ssk, TCP_CLOSE);
subflow->reset_transient = 0; subflow->reset_transient = 0;
subflow->reset_reason = MPTCP_RST_EMIDDLEBOX; subflow->reset_reason = MPTCP_RST_EMPTCP;
tcp_send_active_reset(ssk, GFP_ATOMIC); tcp_send_active_reset(ssk, GFP_ATOMIC);
while ((skb = skb_peek(&ssk->sk_receive_queue))) WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA);
sk_eat_skb(ssk, skb); return false;
} }
WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA);
return true;
}
if (subflow->mp_join || subflow->fully_established) { __mptcp_do_fallback(msk);
/* fatal protocol error, close the socket.
* subflow_error_report() will introduce the appropriate barriers
*/
ssk->sk_err = EBADMSG;
tcp_set_state(ssk, TCP_CLOSE);
subflow->reset_transient = 0;
subflow->reset_reason = MPTCP_RST_EMPTCP;
tcp_send_active_reset(ssk, GFP_ATOMIC);
WRITE_ONCE(subflow->data_avail, MPTCP_SUBFLOW_NODATA);
return false;
} }
__mptcp_do_fallback(msk);
skb = skb_peek(&ssk->sk_receive_queue); skb = skb_peek(&ssk->sk_receive_queue);
subflow->map_valid = 1; subflow->map_valid = 1;
subflow->map_seq = READ_ONCE(msk->ack_seq); subflow->map_seq = READ_ONCE(msk->ack_seq);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册