tcp: rstreason: handle timewait cases in the receive path
authorJason Xing <kernelxing@tencent.com>
Fri, 10 May 2024 12:25:01 +0000 (20:25 +0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 14 May 2024 00:33:57 +0000 (17:33 -0700)
There are two possible cases where TCP layer can send an RST. Since they
happen in the same place, I think using one independent reason is enough
to identify this special situation.

Signed-off-by: Jason Xing <kernelxing@tencent.com>
Link: https://lore.kernel.org/r/20240510122502.27850-5-kerneljasonxing@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/rstreason.h
net/ipv4/tcp_ipv4.c
net/ipv6/tcp_ipv6.c

index fc1b99702771fc32cd110caaddf647fe373cca4c..7ae5bb55559ba2472b3d0a6b846c6372947c0395 100644 (file)
@@ -15,6 +15,7 @@
        FN(TCP_FLAGS)                   \
        FN(TCP_OLD_ACK)                 \
        FN(TCP_ABORT_ON_DATA)           \
+       FN(TCP_TIMEWAIT_SOCKET)         \
        FN(MPTCP_RST_EUNSPEC)           \
        FN(MPTCP_RST_EMPTCP)            \
        FN(MPTCP_RST_ERESOURCE)         \
@@ -72,6 +73,10 @@ enum sk_rst_reason {
         */
        SK_RST_REASON_TCP_ABORT_ON_DATA,
 
+       /* Here start with the independent reasons */
+       /** @SK_RST_REASON_TCP_TIMEWAIT_SOCKET: happen on the timewait socket */
+       SK_RST_REASON_TCP_TIMEWAIT_SOCKET,
+
        /* Copy from include/uapi/linux/mptcp.h.
         * These reset fields will not be changed since they adhere to
         * RFC 8684. So do not touch them. I'm going to list each definition
index 108a438dc2479b85b3001bb9a49094fab7b67afd..30ef0c8f5e92d301c31ea1a05f662c1fc4cf37af 100644 (file)
@@ -2427,7 +2427,7 @@ do_time_wait:
                tcp_v4_timewait_ack(sk, skb);
                break;
        case TCP_TW_RST:
-               tcp_v4_send_reset(sk, skb, sk_rst_convert_drop_reason(drop_reason));
+               tcp_v4_send_reset(sk, skb, SK_RST_REASON_TCP_TIMEWAIT_SOCKET);
                inet_twsk_deschedule_put(inet_twsk(sk));
                goto discard_it;
        case TCP_TW_SUCCESS:;
index 7f6693e794bd011371a8a794f703192f400546e5..4c3605485b68e7c333a0144df3d685b3db9ff45d 100644 (file)
@@ -1999,7 +1999,7 @@ do_time_wait:
                tcp_v6_timewait_ack(sk, skb);
                break;
        case TCP_TW_RST:
-               tcp_v6_send_reset(sk, skb, sk_rst_convert_drop_reason(drop_reason));
+               tcp_v6_send_reset(sk, skb, SK_RST_REASON_TCP_TIMEWAIT_SOCKET);
                inet_twsk_deschedule_put(inet_twsk(sk));
                goto discard_it;
        case TCP_TW_SUCCESS: