Commit 6e7333d3 authored by Jarod Wilson's avatar Jarod Wilson Committed by David S. Miller

net: add rx_nohandler stat counter

This adds an rx_nohandler stat counter, along with a sysfs statistics
node, and copies the counter out via netlink as well.

CC: "David S. Miller" <davem@davemloft.net>
CC: Eric Dumazet <edumazet@google.com>
CC: Jiri Pirko <jiri@mellanox.com>
CC: Daniel Borkmann <daniel@iogearbox.net>
CC: Tom Herbert <tom@herbertland.com>
CC: Jay Vosburgh <j.vosburgh@gmail.com>
CC: Veaceslav Falico <vfalico@gmail.com>
CC: Andy Gospodarek <gospo@cumulusnetworks.com>
CC: netdev@vger.kernel.org
Signed-off-by: default avatarJarod Wilson <jarod@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9256645a
...@@ -1397,6 +1397,8 @@ enum netdev_priv_flags { ...@@ -1397,6 +1397,8 @@ enum netdev_priv_flags {
* do not use this in drivers * do not use this in drivers
* @tx_dropped: Dropped packets by core network, * @tx_dropped: Dropped packets by core network,
* do not use this in drivers * do not use this in drivers
* @rx_nohandler: nohandler dropped packets by core network on
* inactive devices, do not use this in drivers
* *
* @wireless_handlers: List of functions to handle Wireless Extensions, * @wireless_handlers: List of functions to handle Wireless Extensions,
* instead of ioctl, * instead of ioctl,
...@@ -1611,6 +1613,7 @@ struct net_device { ...@@ -1611,6 +1613,7 @@ struct net_device {
atomic_long_t rx_dropped; atomic_long_t rx_dropped;
atomic_long_t tx_dropped; atomic_long_t tx_dropped;
atomic_long_t rx_nohandler;
#ifdef CONFIG_WIRELESS_EXT #ifdef CONFIG_WIRELESS_EXT
const struct iw_handler_def * wireless_handlers; const struct iw_handler_def * wireless_handlers;
......
...@@ -35,6 +35,8 @@ struct rtnl_link_stats { ...@@ -35,6 +35,8 @@ struct rtnl_link_stats {
/* for cslip etc */ /* for cslip etc */
__u32 rx_compressed; __u32 rx_compressed;
__u32 tx_compressed; __u32 tx_compressed;
__u32 rx_nohandler; /* dropped, no handler found */
}; };
/* The main device statistics structure */ /* The main device statistics structure */
...@@ -68,6 +70,8 @@ struct rtnl_link_stats64 { ...@@ -68,6 +70,8 @@ struct rtnl_link_stats64 {
/* for cslip etc */ /* for cslip etc */
__u64 rx_compressed; __u64 rx_compressed;
__u64 tx_compressed; __u64 tx_compressed;
__u64 rx_nohandler; /* dropped, no handler found */
}; };
/* The struct should be in sync with struct ifmap */ /* The struct should be in sync with struct ifmap */
......
...@@ -4154,7 +4154,10 @@ static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc) ...@@ -4154,7 +4154,10 @@ static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc)
ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev); ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
} else { } else {
drop: drop:
atomic_long_inc(&skb->dev->rx_dropped); if (!deliver_exact)
atomic_long_inc(&skb->dev->rx_dropped);
else
atomic_long_inc(&skb->dev->rx_nohandler);
kfree_skb(skb); kfree_skb(skb);
/* Jamal, now you will not able to escape explaining /* Jamal, now you will not able to escape explaining
* me how you were going to use this. :-) * me how you were going to use this. :-)
...@@ -7307,6 +7310,7 @@ struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev, ...@@ -7307,6 +7310,7 @@ struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,
} }
storage->rx_dropped += atomic_long_read(&dev->rx_dropped); storage->rx_dropped += atomic_long_read(&dev->rx_dropped);
storage->tx_dropped += atomic_long_read(&dev->tx_dropped); storage->tx_dropped += atomic_long_read(&dev->tx_dropped);
storage->rx_nohandler += atomic_long_read(&dev->rx_nohandler);
return storage; return storage;
} }
EXPORT_SYMBOL(dev_get_stats); EXPORT_SYMBOL(dev_get_stats);
......
...@@ -574,6 +574,7 @@ NETSTAT_ENTRY(tx_heartbeat_errors); ...@@ -574,6 +574,7 @@ NETSTAT_ENTRY(tx_heartbeat_errors);
NETSTAT_ENTRY(tx_window_errors); NETSTAT_ENTRY(tx_window_errors);
NETSTAT_ENTRY(rx_compressed); NETSTAT_ENTRY(rx_compressed);
NETSTAT_ENTRY(tx_compressed); NETSTAT_ENTRY(tx_compressed);
NETSTAT_ENTRY(rx_nohandler);
static struct attribute *netstat_attrs[] = { static struct attribute *netstat_attrs[] = {
&dev_attr_rx_packets.attr, &dev_attr_rx_packets.attr,
...@@ -599,6 +600,7 @@ static struct attribute *netstat_attrs[] = { ...@@ -599,6 +600,7 @@ static struct attribute *netstat_attrs[] = {
&dev_attr_tx_window_errors.attr, &dev_attr_tx_window_errors.attr,
&dev_attr_rx_compressed.attr, &dev_attr_rx_compressed.attr,
&dev_attr_tx_compressed.attr, &dev_attr_tx_compressed.attr,
&dev_attr_rx_nohandler.attr,
NULL NULL
}; };
......
...@@ -804,6 +804,8 @@ static void copy_rtnl_link_stats(struct rtnl_link_stats *a, ...@@ -804,6 +804,8 @@ static void copy_rtnl_link_stats(struct rtnl_link_stats *a,
a->rx_compressed = b->rx_compressed; a->rx_compressed = b->rx_compressed;
a->tx_compressed = b->tx_compressed; a->tx_compressed = b->tx_compressed;
a->rx_nohandler = b->rx_nohandler;
} }
static void copy_rtnl_link_stats64(void *v, const struct rtnl_link_stats64 *b) static void copy_rtnl_link_stats64(void *v, const struct rtnl_link_stats64 *b)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment