mptcp: introducing a helper into active reset logic
Since we have mapped every mptcp reset reason definition in enum sk_rst_reason, introducing a new helper can cover some missing places where we have already set the subflow->reset_reason. Note: using SK_RST_REASON_NOT_SPECIFIED is the same as SK_RST_REASON_MPTCP_RST_EUNSPEC. They are both unknown. So we can convert it directly. Suggested-by: Paolo Abeni <pabeni@redhat.com> 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
3e140491dd
commit
215d40248b
@ -21,7 +21,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#include <net/mptcp.h>
|
#include <net/mptcp.h>
|
||||||
#include <net/xfrm.h>
|
#include <net/xfrm.h>
|
||||||
#include <net/rstreason.h>
|
|
||||||
#include <asm/ioctls.h>
|
#include <asm/ioctls.h>
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "mib.h"
|
#include "mib.h"
|
||||||
@ -2570,8 +2569,7 @@ static void mptcp_check_fastclose(struct mptcp_sock *msk)
|
|||||||
|
|
||||||
slow = lock_sock_fast(tcp_sk);
|
slow = lock_sock_fast(tcp_sk);
|
||||||
if (tcp_sk->sk_state != TCP_CLOSE) {
|
if (tcp_sk->sk_state != TCP_CLOSE) {
|
||||||
tcp_send_active_reset(tcp_sk, GFP_ATOMIC,
|
mptcp_send_active_reset_reason(tcp_sk);
|
||||||
SK_RST_REASON_NOT_SPECIFIED);
|
|
||||||
tcp_set_state(tcp_sk, TCP_CLOSE);
|
tcp_set_state(tcp_sk, TCP_CLOSE);
|
||||||
}
|
}
|
||||||
unlock_sock_fast(tcp_sk, slow);
|
unlock_sock_fast(tcp_sk, slow);
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <net/inet_connection_sock.h>
|
#include <net/inet_connection_sock.h>
|
||||||
#include <uapi/linux/mptcp.h>
|
#include <uapi/linux/mptcp.h>
|
||||||
#include <net/genetlink.h>
|
#include <net/genetlink.h>
|
||||||
|
#include <net/rstreason.h>
|
||||||
|
|
||||||
#include "mptcp_pm_gen.h"
|
#include "mptcp_pm_gen.h"
|
||||||
|
|
||||||
@ -608,6 +609,16 @@ sk_rst_convert_mptcp_reason(u32 reason)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
mptcp_send_active_reset_reason(struct sock *sk)
|
||||||
|
{
|
||||||
|
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
|
||||||
|
enum sk_rst_reason reason;
|
||||||
|
|
||||||
|
reason = sk_rst_convert_mptcp_reason(subflow->reset_reason);
|
||||||
|
tcp_send_active_reset(sk, GFP_ATOMIC, reason);
|
||||||
|
}
|
||||||
|
|
||||||
static inline u64
|
static inline u64
|
||||||
mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow)
|
mptcp_subflow_get_map_offset(const struct mptcp_subflow_context *subflow)
|
||||||
{
|
{
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
#include <net/transp_v6.h>
|
#include <net/transp_v6.h>
|
||||||
#endif
|
#endif
|
||||||
#include <net/mptcp.h>
|
#include <net/mptcp.h>
|
||||||
#include <net/rstreason.h>
|
|
||||||
|
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "mib.h"
|
#include "mib.h"
|
||||||
@ -424,7 +423,7 @@ void mptcp_subflow_reset(struct sock *ssk)
|
|||||||
/* must hold: tcp_done() could drop last reference on parent */
|
/* must hold: tcp_done() could drop last reference on parent */
|
||||||
sock_hold(sk);
|
sock_hold(sk);
|
||||||
|
|
||||||
tcp_send_active_reset(ssk, GFP_ATOMIC, SK_RST_REASON_NOT_SPECIFIED);
|
mptcp_send_active_reset_reason(ssk);
|
||||||
tcp_done(ssk);
|
tcp_done(ssk);
|
||||||
if (!test_and_set_bit(MPTCP_WORK_CLOSE_SUBFLOW, &mptcp_sk(sk)->flags))
|
if (!test_and_set_bit(MPTCP_WORK_CLOSE_SUBFLOW, &mptcp_sk(sk)->flags))
|
||||||
mptcp_schedule_work(sk);
|
mptcp_schedule_work(sk);
|
||||||
@ -1362,8 +1361,7 @@ reset:
|
|||||||
tcp_set_state(ssk, TCP_CLOSE);
|
tcp_set_state(ssk, TCP_CLOSE);
|
||||||
while ((skb = skb_peek(&ssk->sk_receive_queue)))
|
while ((skb = skb_peek(&ssk->sk_receive_queue)))
|
||||||
sk_eat_skb(ssk, skb);
|
sk_eat_skb(ssk, skb);
|
||||||
tcp_send_active_reset(ssk, GFP_ATOMIC,
|
mptcp_send_active_reset_reason(ssk);
|
||||||
SK_RST_REASON_NOT_SPECIFIED);
|
|
||||||
WRITE_ONCE(subflow->data_avail, false);
|
WRITE_ONCE(subflow->data_avail, false);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user