OSDN Git Service

net: tcp: use tcp_drop_reason() for tcp_rcv_established()
authorMenglong Dong <imagedong@tencent.com>
Sun, 20 Feb 2022 07:06:35 +0000 (15:06 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 20 Feb 2022 13:55:31 +0000 (13:55 +0000)
Replace tcp_drop() used in tcp_rcv_established() with tcp_drop_reason().
Following drop reasons are added:

SKB_DROP_REASON_TCP_FLAGS

Reviewed-by: Mengen Sun <mengensun@tencent.com>
Reviewed-by: Hao Peng <flyingpeng@tencent.com>
Signed-off-by: Menglong Dong <imagedong@tencent.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h
include/trace/events/skb.h
net/ipv4/tcp_input.c

index f7f33c7..671db9f 100644 (file)
@@ -362,6 +362,7 @@ enum skb_drop_reason {
                                         * backlog (see
                                         * LINUX_MIB_TCPBACKLOGDROP)
                                         */
+       SKB_DROP_REASON_TCP_FLAGS,      /* TCP flags invalid */
        SKB_DROP_REASON_MAX,
 };
 
index bfccd77..d332e73 100644 (file)
@@ -32,6 +32,7 @@
           TCP_MD5UNEXPECTED)                                   \
        EM(SKB_DROP_REASON_TCP_MD5FAILURE, TCP_MD5FAILURE)      \
        EM(SKB_DROP_REASON_SOCKET_BACKLOG, SOCKET_BACKLOG)      \
+       EM(SKB_DROP_REASON_TCP_FLAGS, TCP_FLAGS)                \
        EMe(SKB_DROP_REASON_MAX, MAX)
 
 #undef EM
index 0f41fdf..2d8495a 100644 (file)
@@ -5787,6 +5787,7 @@ discard:
  */
 void tcp_rcv_established(struct sock *sk, struct sk_buff *skb)
 {
+       enum skb_drop_reason reason = SKB_DROP_REASON_NOT_SPECIFIED;
        const struct tcphdr *th = (const struct tcphdr *)skb->data;
        struct tcp_sock *tp = tcp_sk(sk);
        unsigned int len = skb->len;
@@ -5875,6 +5876,7 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb)
                                tp->rcv_rtt_last_tsecr = tp->rx_opt.rcv_tsecr;
                                return;
                        } else { /* Header too small */
+                               reason = SKB_DROP_REASON_PKT_TOO_SMALL;
                                TCP_INC_STATS(sock_net(sk), TCP_MIB_INERRS);
                                goto discard;
                        }
@@ -5930,8 +5932,10 @@ slow_path:
        if (len < (th->doff << 2) || tcp_checksum_complete(skb))
                goto csum_error;
 
-       if (!th->ack && !th->rst && !th->syn)
+       if (!th->ack && !th->rst && !th->syn) {
+               reason = SKB_DROP_REASON_TCP_FLAGS;
                goto discard;
+       }
 
        /*
         *      Standard slow path.
@@ -5957,12 +5961,13 @@ step5:
        return;
 
 csum_error:
+       reason = SKB_DROP_REASON_TCP_CSUM;
        trace_tcp_bad_csum(skb);
        TCP_INC_STATS(sock_net(sk), TCP_MIB_CSUMERRORS);
        TCP_INC_STATS(sock_net(sk), TCP_MIB_INERRS);
 
 discard:
-       tcp_drop(sk, skb);
+       tcp_drop_reason(sk, skb, reason);
 }
 EXPORT_SYMBOL(tcp_rcv_established);