mirror of
https://github.com/torvalds/linux
synced 2024-09-06 09:51:23 +00:00
mptcp: support rstreason for passive reset
It relies on what reset options in the skb are as rfc8684 says. Reusing this logic can save us much energy. This patch replaces most of the prior NOT_SPECIFIED reasons. Signed-off-by: Jason Xing <kernelxing@tencent.com> Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org> Reviewed-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
120391ef9c
commit
3e140491dd
|
@ -581,6 +581,33 @@ mptcp_subflow_ctx_reset(struct mptcp_subflow_context *subflow)
|
|||
WRITE_ONCE(subflow->local_id, -1);
|
||||
}
|
||||
|
||||
/* Convert reset reasons in MPTCP to enum sk_rst_reason type */
|
||||
static inline enum sk_rst_reason
|
||||
sk_rst_convert_mptcp_reason(u32 reason)
|
||||
{
|
||||
switch (reason) {
|
||||
case MPTCP_RST_EUNSPEC:
|
||||
return SK_RST_REASON_MPTCP_RST_EUNSPEC;
|
||||
case MPTCP_RST_EMPTCP:
|
||||
return SK_RST_REASON_MPTCP_RST_EMPTCP;
|
||||
case MPTCP_RST_ERESOURCE:
|
||||
return SK_RST_REASON_MPTCP_RST_ERESOURCE;
|
||||
case MPTCP_RST_EPROHIBIT:
|
||||
return SK_RST_REASON_MPTCP_RST_EPROHIBIT;
|
||||
case MPTCP_RST_EWQ2BIG:
|
||||
return SK_RST_REASON_MPTCP_RST_EWQ2BIG;
|
||||
case MPTCP_RST_EBADPERF:
|
||||
return SK_RST_REASON_MPTCP_RST_EBADPERF;
|
||||
case MPTCP_RST_EMIDDLEBOX:
|
||||
return SK_RST_REASON_MPTCP_RST_EMIDDLEBOX;
|
||||
default:
|
||||
/* It should not happen, or else errors may occur
|
||||
* in MPTCP layer
|
||||
*/
|
||||
return SK_RST_REASON_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
static inline u64
|
||||
mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow)
|
||||
{
|
||||
|
|
|
@ -309,8 +309,13 @@ static struct dst_entry *subflow_v4_route_req(const struct sock *sk,
|
|||
return dst;
|
||||
|
||||
dst_release(dst);
|
||||
if (!req->syncookie)
|
||||
tcp_request_sock_ops.send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
|
||||
if (!req->syncookie) {
|
||||
struct mptcp_ext *mpext = mptcp_get_ext(skb);
|
||||
enum sk_rst_reason reason;
|
||||
|
||||
reason = sk_rst_convert_mptcp_reason(mpext->reset_reason);
|
||||
tcp_request_sock_ops.send_reset(sk, skb, reason);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -377,8 +382,13 @@ static struct dst_entry *subflow_v6_route_req(const struct sock *sk,
|
|||
return dst;
|
||||
|
||||
dst_release(dst);
|
||||
if (!req->syncookie)
|
||||
tcp6_request_sock_ops.send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
|
||||
if (!req->syncookie) {
|
||||
struct mptcp_ext *mpext = mptcp_get_ext(skb);
|
||||
enum sk_rst_reason reason;
|
||||
|
||||
reason = sk_rst_convert_mptcp_reason(mpext->reset_reason);
|
||||
tcp6_request_sock_ops.send_reset(sk, skb, reason);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
@ -783,6 +793,7 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
|
|||
struct mptcp_subflow_request_sock *subflow_req;
|
||||
struct mptcp_options_received mp_opt;
|
||||
bool fallback, fallback_is_fatal;
|
||||
enum sk_rst_reason reason;
|
||||
struct mptcp_sock *owner;
|
||||
struct sock *child;
|
||||
|
||||
|
@ -913,7 +924,8 @@ static struct sock *subflow_syn_recv_sock(const struct sock *sk,
|
|||
tcp_rsk(req)->drop_req = true;
|
||||
inet_csk_prepare_for_destroy_sock(child);
|
||||
tcp_done(child);
|
||||
req->rsk_ops->send_reset(sk, skb, SK_RST_REASON_NOT_SPECIFIED);
|
||||
reason = sk_rst_convert_mptcp_reason(mptcp_get_ext(skb)->reset_reason);
|
||||
req->rsk_ops->send_reset(sk, skb, reason);
|
||||
|
||||
/* The last child reference will be released by the caller */
|
||||
return child;
|
||||
|
|
Loading…
Reference in a new issue