net: ip: add skb drop reasons for ip egress path
authorMenglong Dong <imagedong@tencent.com>
Sat, 26 Feb 2022 04:18:29 +0000 (12:18 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 26 Feb 2022 12:53:58 +0000 (12:53 +0000)
Replace kfree_skb() which is used in the packet egress path of IP layer
with kfree_skb_reason(). Functions that are involved include:

__ip_queue_xmit()
ip_finish_output()
ip_mc_finish_output()
ip6_output()
ip6_finish_output()
ip6_finish_output2()

Following new drop reasons are introduced:

SKB_DROP_REASON_IP_OUTNOROUTES
SKB_DROP_REASON_BPF_CGROUP_EGRESS
SKB_DROP_REASON_IPV6DISABLED
SKB_DROP_REASON_NEIGH_CREATEFAIL

Reviewed-by: Mengen Sun <mengensun@tencent.com>
Reviewed-by: Hao Peng <flyingpeng@tencent.com>
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_output.c
net/ipv6/ip6_output.c

index 31be380..62b4bed 100644 (file)
@@ -380,6 +380,15 @@ enum skb_drop_reason {
                                         * the ofo queue, corresponding to
                                         * LINUX_MIB_TCPOFOMERGE
                                         */
+       SKB_DROP_REASON_IP_OUTNOROUTES, /* route lookup failed */
+       SKB_DROP_REASON_BPF_CGROUP_EGRESS,      /* dropped by
+                                                * BPF_PROG_TYPE_CGROUP_SKB
+                                                * eBPF program
+                                                */
+       SKB_DROP_REASON_IPV6DISABLED,   /* IPv6 is disabled on the device */
+       SKB_DROP_REASON_NEIGH_CREATEFAIL,       /* failed to create neigh
+                                                * entry
+                                                */
        SKB_DROP_REASON_MAX,
 };
 
index 2ab7193..97f8097 100644 (file)
        EM(SKB_DROP_REASON_TCP_OLD_DATA, TCP_OLD_DATA)          \
        EM(SKB_DROP_REASON_TCP_OVERWINDOW, TCP_OVERWINDOW)      \
        EM(SKB_DROP_REASON_TCP_OFOMERGE, TCP_OFOMERGE)          \
+       EM(SKB_DROP_REASON_IP_OUTNOROUTES, IP_OUTNOROUTES)      \
+       EM(SKB_DROP_REASON_BPF_CGROUP_EGRESS,                   \
+          BPF_CGROUP_EGRESS)                                   \
+       EM(SKB_DROP_REASON_IPV6DISABLED, IPV6DISABLED)          \
+       EM(SKB_DROP_REASON_NEIGH_CREATEFAIL, NEIGH_CREATEFAIL)  \
        EMe(SKB_DROP_REASON_MAX, MAX)
 
 #undef EM
index 2941de5..6df3545 100644 (file)
@@ -233,7 +233,7 @@ static int ip_finish_output2(struct net *net, struct sock *sk, struct sk_buff *s
 
        net_dbg_ratelimited("%s: No header cache and no neighbour!\n",
                            __func__);
-       kfree_skb(skb);
+       kfree_skb_reason(skb, SKB_DROP_REASON_NEIGH_CREATEFAIL);
        return -EINVAL;
 }
 
@@ -317,7 +317,7 @@ static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *sk
        case NET_XMIT_CN:
                return __ip_finish_output(net, sk, skb) ? : ret;
        default:
-               kfree_skb(skb);
+               kfree_skb_reason(skb, SKB_DROP_REASON_BPF_CGROUP_EGRESS);
                return ret;
        }
 }
@@ -337,7 +337,7 @@ static int ip_mc_finish_output(struct net *net, struct sock *sk,
        case NET_XMIT_SUCCESS:
                break;
        default:
-               kfree_skb(skb);
+               kfree_skb_reason(skb, SKB_DROP_REASON_BPF_CGROUP_EGRESS);
                return ret;
        }
 
@@ -536,7 +536,7 @@ packet_routed:
 no_route:
        rcu_read_unlock();
        IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES);
-       kfree_skb(skb);
+       kfree_skb_reason(skb, SKB_DROP_REASON_IP_OUTNOROUTES);
        return -EHOSTUNREACH;
 }
 EXPORT_SYMBOL(__ip_queue_xmit);
index c5c10f7..c5edc86 100644 (file)
@@ -130,7 +130,7 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *
        rcu_read_unlock_bh();
 
        IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTNOROUTES);
-       kfree_skb(skb);
+       kfree_skb_reason(skb, SKB_DROP_REASON_NEIGH_CREATEFAIL);
        return -EINVAL;
 }
 
@@ -202,7 +202,7 @@ static int ip6_finish_output(struct net *net, struct sock *sk, struct sk_buff *s
        case NET_XMIT_CN:
                return __ip6_finish_output(net, sk, skb) ? : ret;
        default:
-               kfree_skb(skb);
+               kfree_skb_reason(skb, SKB_DROP_REASON_BPF_CGROUP_EGRESS);
                return ret;
        }
 }
@@ -217,7 +217,7 @@ int ip6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
 
        if (unlikely(idev->cnf.disable_ipv6)) {
                IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS);
-               kfree_skb(skb);
+               kfree_skb_reason(skb, SKB_DROP_REASON_IPV6DISABLED);
                return 0;
        }