net: ipv4: use kfree_skb_reason() in ip_rcv_core()
authorMenglong Dong <imagedong@tencent.com>
Sat, 5 Feb 2022 07:47:35 +0000 (15:47 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 7 Feb 2022 11:18:49 +0000 (11:18 +0000)
Replace kfree_skb() with kfree_skb_reason() in ip_rcv_core(). Three new
drop reasons are introduced:

SKB_DROP_REASON_OTHERHOST
SKB_DROP_REASON_IP_CSUM
SKB_DROP_REASON_IP_INHDR

Signed-off-by: Menglong Dong <imagedong@tencent.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/ip_input.c

index 9060159..8e82130 100644 (file)
@@ -321,6 +321,15 @@ enum skb_drop_reason {
        SKB_DROP_REASON_SOCKET_FILTER,  /* dropped by socket filter */
        SKB_DROP_REASON_UDP_CSUM,       /* UDP checksum error */
        SKB_DROP_REASON_NETFILTER_DROP, /* dropped by netfilter */
+       SKB_DROP_REASON_OTHERHOST,      /* packet don't belong to current
+                                        * host (interface is in promisc
+                                        * mode)
+                                        */
+       SKB_DROP_REASON_IP_CSUM,        /* IP checksum error */
+       SKB_DROP_REASON_IP_INHDR,       /* there is something wrong with
+                                        * IP header (see
+                                        * IPSTATS_MIB_INHDRERRORS)
+                                        */
        SKB_DROP_REASON_MAX,
 };
 
index 3d89f7b..f2b1778 100644 (file)
@@ -17,6 +17,9 @@
        EM(SKB_DROP_REASON_SOCKET_FILTER, SOCKET_FILTER)        \
        EM(SKB_DROP_REASON_UDP_CSUM, UDP_CSUM)                  \
        EM(SKB_DROP_REASON_NETFILTER_DROP, NETFILTER_DROP)      \
+       EM(SKB_DROP_REASON_OTHERHOST, OTHERHOST)                \
+       EM(SKB_DROP_REASON_IP_CSUM, IP_CSUM)                    \
+       EM(SKB_DROP_REASON_IP_INHDR, IP_INHDR)                  \
        EMe(SKB_DROP_REASON_MAX, MAX)
 
 #undef EM
index 3a025c0..7be18de 100644 (file)
@@ -436,13 +436,16 @@ static int ip_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
 static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net)
 {
        const struct iphdr *iph;
+       int drop_reason;
        u32 len;
 
        /* When the interface is in promisc. mode, drop all the crap
         * that it receives, do not try to analyse it.
         */
-       if (skb->pkt_type == PACKET_OTHERHOST)
+       if (skb->pkt_type == PACKET_OTHERHOST) {
+               drop_reason = SKB_DROP_REASON_OTHERHOST;
                goto drop;
+       }
 
        __IP_UPD_PO_STATS(net, IPSTATS_MIB_IN, skb->len);
 
@@ -452,6 +455,7 @@ static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net)
                goto out;
        }
 
+       drop_reason = SKB_DROP_REASON_NOT_SPECIFIED;
        if (!pskb_may_pull(skb, sizeof(struct iphdr)))
                goto inhdr_error;
 
@@ -488,6 +492,7 @@ static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net)
 
        len = ntohs(iph->tot_len);
        if (skb->len < len) {
+               drop_reason = SKB_DROP_REASON_PKT_TOO_SMALL;
                __IP_INC_STATS(net, IPSTATS_MIB_INTRUNCATEDPKTS);
                goto drop;
        } else if (len < (iph->ihl*4))
@@ -516,11 +521,14 @@ static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net)
        return skb;
 
 csum_error:
+       drop_reason = SKB_DROP_REASON_IP_CSUM;
        __IP_INC_STATS(net, IPSTATS_MIB_CSUMERRORS);
 inhdr_error:
+       if (drop_reason == SKB_DROP_REASON_NOT_SPECIFIED)
+               drop_reason = SKB_DROP_REASON_IP_INHDR;
        __IP_INC_STATS(net, IPSTATS_MIB_INHDRERRORS);
 drop:
-       kfree_skb(skb);
+       kfree_skb_reason(skb, drop_reason);
 out:
        return NULL;
 }