tcp: add four drop reasons to tcp_check_req()
authorEric Dumazet <edumazet@google.com>
Sat, 1 Mar 2025 20:14:20 +0000 (20:14 +0000)
committerJakub Kicinski <kuba@kernel.org>
Mon, 3 Mar 2025 23:44:19 +0000 (15:44 -0800)
Use two existing drop reasons in tcp_check_req():

- TCP_RFC7323_PAWS

- TCP_OVERWINDOW

Add two new ones:

- TCP_RFC7323_TSECR (corresponds to LINUX_MIB_TSECRREJECTED)

- TCP_LISTEN_OVERFLOW (when a listener accept queue is full)

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Jason Xing <kerneljasonxing@gmail.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250301201424.2046477-3-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/dropreason-core.h
net/ipv4/tcp_minisocks.c

index 32a34df..e4fdc6b 100644 (file)
@@ -40,6 +40,8 @@
        FN(TCP_OFOMERGE)                \
        FN(TCP_RFC7323_PAWS)            \
        FN(TCP_RFC7323_PAWS_ACK)        \
+       FN(TCP_RFC7323_TSECR)           \
+       FN(TCP_LISTEN_OVERFLOW)         \
        FN(TCP_OLD_SEQUENCE)            \
        FN(TCP_INVALID_SEQUENCE)        \
        FN(TCP_INVALID_ACK_SEQUENCE)    \
@@ -281,6 +283,13 @@ enum skb_drop_reason {
         * Corresponds to LINUX_MIB_PAWS_OLD_ACK.
         */
        SKB_DROP_REASON_TCP_RFC7323_PAWS_ACK,
+       /**
+        * @SKB_DROP_REASON_TCP_RFC7323_TSECR: PAWS check, invalid TSEcr.
+        * Corresponds to LINUX_MIB_TSECRREJECTED.
+        */
+       SKB_DROP_REASON_TCP_RFC7323_TSECR,
+       /** @SKB_DROP_REASON_TCP_LISTEN_OVERFLOW: listener queue full. */
+       SKB_DROP_REASON_TCP_LISTEN_OVERFLOW,
        /** @SKB_DROP_REASON_TCP_OLD_SEQUENCE: Old SEQ field (duplicate packet) */
        SKB_DROP_REASON_TCP_OLD_SEQUENCE,
        /** @SKB_DROP_REASON_TCP_INVALID_SEQUENCE: Not acceptable SEQ field */
index 46c86c4..ba4a5d7 100644 (file)
@@ -809,10 +809,15 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
                                          LINUX_MIB_TCPACKSKIPPEDSYNRECV,
                                          &tcp_rsk(req)->last_oow_ack_time))
                        req->rsk_ops->send_ack(sk, skb, req);
-               if (paws_reject)
+               if (paws_reject) {
+                       SKB_DR_SET(*drop_reason, TCP_RFC7323_PAWS);
                        NET_INC_STATS(sock_net(sk), LINUX_MIB_PAWSESTABREJECTED);
-               else if (tsecr_reject)
+               } else if (tsecr_reject) {
+                       SKB_DR_SET(*drop_reason, TCP_RFC7323_TSECR);
                        NET_INC_STATS(sock_net(sk), LINUX_MIB_TSECRREJECTED);
+               } else {
+                       SKB_DR_SET(*drop_reason, TCP_OVERWINDOW);
+               }
                return NULL;
        }
 
@@ -882,6 +887,7 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
        return inet_csk_complete_hashdance(sk, child, req, own_req);
 
 listen_overflow:
+       SKB_DR_SET(*drop_reason, TCP_LISTEN_OVERFLOW);
        if (sk != req->rsk_listener)
                __NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPMIGRATEREQFAILURE);