From: Menglong Dong <imaged...@tencent.com>

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 <imaged...@tencent.com>
Reviewed-by: Jiang Biao <benbji...@tencent.com>
Reviewed-by: Hao Peng <flyingp...@tencent.com>
Signed-off-by: David S. Miller <da...@davemloft.net>
Acked-by: Nikolay Borisov <nbori...@suse.com>
Signed-off-by: Nikolay Borisov <nikolay.bori...@virtuozzo.com>
---
 include/linux/skbuff.h     | 7 +++++++
 include/trace/events/skb.h | 2 ++
 net/ipv4/route.c           | 6 +++++-
 3 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 47047dc588aa..cd9977a9fddd 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -445,6 +445,13 @@ 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,
 };
 
diff --git a/include/trace/events/skb.h b/include/trace/events/skb.h
index ab554e14e651..729db7a7471a 100644
--- a/include/trace/events/skb.h
+++ b/include/trace/events/skb.h
@@ -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
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 2e39c674c213..587a0c44d1e1 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -952,6 +952,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;
 
@@ -971,10 +972,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;
                }
@@ -990,6 +993,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:
@@ -1016,7 +1020,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;
 }
 
-- 
2.34.1

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to