diff options
author | Jan Engelhardt <jengelh@medozas.de> | 2010-03-11 04:57:29 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-03-17 00:23:22 -0400 |
commit | 10708f37ae729baba9b67bd134c3720709d4ae62 (patch) | |
tree | fa3e20c31e7d6907668d45eee702d02d646cae8f /net/core/rtnetlink.c | |
parent | 6ce1a6df6efbbeaa262a225a1a439ebc30a75d2e (diff) |
net: core: add IFLA_STATS64 support
`ip -s link` shows interface counters truncated to 32 bit. This is
because interface statistics are transported only in 32-bit quantity
to userspace. This commit adds a new IFLA_STATS64 attribute that
exports them in full 64 bit.
References: http://lkml.indiana.edu/hypermail/linux/kernel/0307.3/0215.html
Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/rtnetlink.c')
-rw-r--r-- | net/core/rtnetlink.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 4568120d8533..e1121f0bca6a 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -600,7 +600,39 @@ static void copy_rtnl_link_stats(struct rtnl_link_stats *a, | |||
600 | 600 | ||
601 | a->rx_compressed = b->rx_compressed; | 601 | a->rx_compressed = b->rx_compressed; |
602 | a->tx_compressed = b->tx_compressed; | 602 | a->tx_compressed = b->tx_compressed; |
603 | }; | 603 | } |
604 | |||
605 | static void copy_rtnl_link_stats64(struct rtnl_link_stats64 *a, | ||
606 | const struct net_device_stats *b) | ||
607 | { | ||
608 | a->rx_packets = b->rx_packets; | ||
609 | a->tx_packets = b->tx_packets; | ||
610 | a->rx_bytes = b->rx_bytes; | ||
611 | a->tx_bytes = b->tx_bytes; | ||
612 | a->rx_errors = b->rx_errors; | ||
613 | a->tx_errors = b->tx_errors; | ||
614 | a->rx_dropped = b->rx_dropped; | ||
615 | a->tx_dropped = b->tx_dropped; | ||
616 | |||
617 | a->multicast = b->multicast; | ||
618 | a->collisions = b->collisions; | ||
619 | |||
620 | a->rx_length_errors = b->rx_length_errors; | ||
621 | a->rx_over_errors = b->rx_over_errors; | ||
622 | a->rx_crc_errors = b->rx_crc_errors; | ||
623 | a->rx_frame_errors = b->rx_frame_errors; | ||
624 | a->rx_fifo_errors = b->rx_fifo_errors; | ||
625 | a->rx_missed_errors = b->rx_missed_errors; | ||
626 | |||
627 | a->tx_aborted_errors = b->tx_aborted_errors; | ||
628 | a->tx_carrier_errors = b->tx_carrier_errors; | ||
629 | a->tx_fifo_errors = b->tx_fifo_errors; | ||
630 | a->tx_heartbeat_errors = b->tx_heartbeat_errors; | ||
631 | a->tx_window_errors = b->tx_window_errors; | ||
632 | |||
633 | a->rx_compressed = b->rx_compressed; | ||
634 | a->tx_compressed = b->tx_compressed; | ||
635 | } | ||
604 | 636 | ||
605 | static inline int rtnl_vfinfo_size(const struct net_device *dev) | 637 | static inline int rtnl_vfinfo_size(const struct net_device *dev) |
606 | { | 638 | { |
@@ -698,6 +730,14 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
698 | stats = dev_get_stats(dev); | 730 | stats = dev_get_stats(dev); |
699 | copy_rtnl_link_stats(nla_data(attr), stats); | 731 | copy_rtnl_link_stats(nla_data(attr), stats); |
700 | 732 | ||
733 | attr = nla_reserve(skb, IFLA_STATS64, | ||
734 | sizeof(struct rtnl_link_stats64)); | ||
735 | if (attr == NULL) | ||
736 | goto nla_put_failure; | ||
737 | |||
738 | stats = dev_get_stats(dev); | ||
739 | copy_rtnl_link_stats64(nla_data(attr), stats); | ||
740 | |||
701 | if (dev->netdev_ops->ndo_get_vf_config && dev->dev.parent) { | 741 | if (dev->netdev_ops->ndo_get_vf_config && dev->dev.parent) { |
702 | int i; | 742 | int i; |
703 | struct ifla_vf_info ivi; | 743 | struct ifla_vf_info ivi; |