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:
Jason Xing 2024-04-25 11:13:39 +08:00 committed by Paolo Abeni
parent 3e140491dd
commit 215d40248b
3 changed files with 14 additions and 7 deletions

View File

@ -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);

View File

@ -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)
{ {

View File

@ -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;
} }