OSDN Git Service

net-core: rx_otherhost_dropped to core_stats
authorJeffrey Ji <jeffreyji@google.com>
Wed, 6 Apr 2022 17:26:00 +0000 (17:26 +0000)
committerJakub Kicinski <kuba@kernel.org>
Fri, 8 Apr 2022 03:32:49 +0000 (20:32 -0700)
Increment rx_otherhost_dropped counter when packet dropped due to
mismatched dest MAC addr.

An example when this drop can occur is when manually crafting raw
packets that will be consumed by a user space application via a tap
device. For testing purposes local traffic was generated using trafgen
for the client and netcat to start a server

Tested: Created 2 netns, sent 1 packet using trafgen from 1 to the other
with "{eth(daddr=$INCORRECT_MAC...}", verified that iproute2 showed the
counter was incremented. (Also had to modify iproute2 to show the stat,
additional patch for that coming next.)

Signed-off-by: Jeffrey Ji <jeffreyji@google.com>
Reviewed-by: Brian Vazquez <brianvv@google.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://lore.kernel.org/r/20220406172600.1141083-1-jeffreyjilinux@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/linux/netdevice.h
include/uapi/linux/if_link.h
net/core/dev.c
net/ipv4/ip_input.c
net/ipv6/ip6_input.c

index 7e7b2a7..28ea4f8 100644 (file)
@@ -203,6 +203,7 @@ struct net_device_core_stats {
        local_t         rx_dropped;
        local_t         tx_dropped;
        local_t         rx_nohandler;
+       local_t         rx_otherhost_dropped;
 } __aligned(4 * sizeof(local_t));
 
 #include <linux/cache.h>
@@ -3837,6 +3838,7 @@ static inline void dev_core_stats_##FIELD##_inc(struct net_device *dev)           \
 DEV_CORE_STATS_INC(rx_dropped)
 DEV_CORE_STATS_INC(tx_dropped)
 DEV_CORE_STATS_INC(rx_nohandler)
+DEV_CORE_STATS_INC(rx_otherhost_dropped)
 
 static __always_inline int ____dev_forward_skb(struct net_device *dev,
                                               struct sk_buff *skb,
index cc284c0..d1e6008 100644 (file)
@@ -211,6 +211,9 @@ struct rtnl_link_stats {
  * @rx_nohandler: Number of packets received on the interface
  *   but dropped by the networking stack because the device is
  *   not designated to receive packets (e.g. backup link in a bond).
+ *
+ * @rx_otherhost_dropped: Number of packets dropped due to mismatch
+ *   in destination MAC address.
  */
 struct rtnl_link_stats64 {
        __u64   rx_packets;
@@ -243,6 +246,8 @@ struct rtnl_link_stats64 {
        __u64   rx_compressed;
        __u64   tx_compressed;
        __u64   rx_nohandler;
+
+       __u64   rx_otherhost_dropped;
 };
 
 /* Subset of link stats useful for in-HW collection. Meaning of the fields is as
index f00d298..e027410 100644 (file)
@@ -10358,6 +10358,7 @@ struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,
                        storage->rx_dropped += local_read(&core_stats->rx_dropped);
                        storage->tx_dropped += local_read(&core_stats->tx_dropped);
                        storage->rx_nohandler += local_read(&core_stats->rx_nohandler);
+                       storage->rx_otherhost_dropped += local_read(&core_stats->rx_otherhost_dropped);
                }
        }
        return storage;
index 95f7bb0..b1165f7 100644 (file)
@@ -451,6 +451,7 @@ static struct sk_buff *ip_rcv_core(struct sk_buff *skb, struct net *net)
         * that it receives, do not try to analyse it.
         */
        if (skb->pkt_type == PACKET_OTHERHOST) {
+               dev_core_stats_rx_otherhost_dropped_inc(skb->dev);
                drop_reason = SKB_DROP_REASON_OTHERHOST;
                goto drop;
        }
index 5b5ea35..b4880c7 100644 (file)
@@ -150,6 +150,7 @@ static struct sk_buff *ip6_rcv_core(struct sk_buff *skb, struct net_device *dev,
        struct inet6_dev *idev;
 
        if (skb->pkt_type == PACKET_OTHERHOST) {
+               dev_core_stats_rx_otherhost_dropped_inc(skb->dev);
                kfree_skb(skb);
                return NULL;
        }