net: ipv4: add skb drop reasons to ip_error()
authorMenglong Dong <imagedong@tencent.com>
Wed, 13 Apr 2022 08:15:53 +0000 (16:15 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 13 Apr 2022 12:09:57 +0000 (13:09 +0100)
Eventually, I find out the handler function for inputting route lookup
fail: ip_error().

The drop reasons we used in ip_error() are almost corresponding to
IPSTATS_MIB_*, and following new reasons are introduced:

SKB_DROP_REASON_IP_INADDRERRORS
SKB_DROP_REASON_IP_INNOROUTES

Isn't the name SKB_DROP_REASON_IP_HOSTUNREACH and
SKB_DROP_REASON_IP_NETUNREACH more accurate? To make them corresponding
to IPSTATS_MIB_*, we keep their name still.

Signed-off-by: Menglong Dong <imagedong@tencent.com>
Reviewed-by: Jiang Biao <benbjiang@tencent.com>
Reviewed-by: Hao Peng <flyingpeng@tencent.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h
include/trace/events/skb.h
net/ipv4/route.c

index 0cbd6ada957c054024817dd8bf1e164c5124e9ac..886e83ac4b70d06c3bd850e61d182ef26ed0836b 100644 (file)
@@ -447,6 +447,12 @@ enum skb_drop_reason {
                                         * 2211, such as a broadcasts
                                         * ICMP_TIMESTAMP
                                         */
+       SKB_DROP_REASON_IP_INADDRERRORS,        /* host unreachable, corresponding
+                                                * to IPSTATS_MIB_INADDRERRORS
+                                                */
+       SKB_DROP_REASON_IP_INNOROUTES,  /* network unreachable, corresponding
+                                        * to IPSTATS_MIB_INADDRERRORS
+                                        */
        SKB_DROP_REASON_MAX,
 };
 
index 42647114fffe725ca5d438ff647372fa1386e0d4..0acac7e5a019fd065c3ebf2cb58a2489a6ed8783 100644 (file)
@@ -63,6 +63,8 @@
        EM(SKB_DROP_REASON_TAP_TXFILTER, TAP_TXFILTER)          \
        EM(SKB_DROP_REASON_ICMP_CSUM, ICMP_CSUM)                \
        EM(SKB_DROP_REASON_INVALID_PROTO, INVALID_PROTO)        \
+       EM(SKB_DROP_REASON_IP_INADDRERRORS, IP_INADDRERRORS)    \
+       EM(SKB_DROP_REASON_IP_INNOROUTES, IP_INNOROUTES)        \
        EMe(SKB_DROP_REASON_MAX, MAX)
 
 #undef EM
index 80f96170876c79c17380e98e877dbb0838a8417d..e839d424b8611eef177989ea2da08c3384c72826 100644 (file)
@@ -945,6 +945,7 @@ static int ip_error(struct sk_buff *skb)
        struct inet_peer *peer;
        unsigned long now;
        struct net *net;
+       SKB_DR(reason);
        bool send;
        int code;
 
@@ -964,10 +965,12 @@ static int ip_error(struct sk_buff *skb)
        if (!IN_DEV_FORWARD(in_dev)) {
                switch (rt->dst.error) {
                case EHOSTUNREACH:
+                       SKB_DR_SET(reason, IP_INADDRERRORS);
                        __IP_INC_STATS(net, IPSTATS_MIB_INADDRERRORS);
                        break;
 
                case ENETUNREACH:
+                       SKB_DR_SET(reason, IP_INNOROUTES);
                        __IP_INC_STATS(net, IPSTATS_MIB_INNOROUTES);
                        break;
                }
@@ -983,6 +986,7 @@ static int ip_error(struct sk_buff *skb)
                break;
        case ENETUNREACH:
                code = ICMP_NET_UNREACH;
+               SKB_DR_SET(reason, IP_INNOROUTES);
                __IP_INC_STATS(net, IPSTATS_MIB_INNOROUTES);
                break;
        case EACCES:
@@ -1009,7 +1013,7 @@ static int ip_error(struct sk_buff *skb)
        if (send)
                icmp_send(skb, ICMP_DEST_UNREACH, code, 0);
 
-out:   kfree_skb(skb);
+out:   kfree_skb_reason(skb, reason);
        return 0;
 }