static struct rtnl_link_stats64 *vlan_dev_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) { #if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE) struct rtnl_link_stats64 hw_nat_stats; memset(&hw_nat_stats, 0, sizeof(hw_nat_stats)); if (ra_sw_nat_hook_get_stats) if (!ra_sw_nat_hook_get_stats(dev->name, &hw_nat_stats)) { struct netdev_queue *txq = netdev_get_tx_queue(dev, 0); txq->tx_bytes += hw_nat_stats.tx_bytes; txq->tx_packets += hw_nat_stats.tx_packets; } #endif dev_txq_stats_fold(dev, stats); if (vlan_dev_info(dev)->vlan_rx_stats) { struct vlan_rx_stats *p, accum = {0}; int i; #if defined(CONFIG_RA_HW_NAT) || defined(CONFIG_RA_HW_NAT_MODULE) p = per_cpu_ptr(vlan_dev_info(dev)->vlan_rx_stats, 0); p->rx_packets += hw_nat_stats.rx_packets; p->rx_bytes += hw_nat_stats.rx_bytes; #endif for_each_possible_cpu(i) { u64 rxpackets, rxbytes, rxmulticast; unsigned int start; p = per_cpu_ptr(vlan_dev_info(dev)->vlan_rx_stats, i); do { start = u64_stats_fetch_begin_bh(&p->syncp); rxpackets = p->rx_packets; rxbytes = p->rx_bytes; rxmulticast = p->rx_multicast; } while (u64_stats_fetch_retry_bh(&p->syncp, start)); accum.rx_packets += rxpackets; accum.rx_bytes += rxbytes; accum.rx_multicast += rxmulticast; /* rx_errors is an ulong, not protected by syncp */ accum.rx_errors += p->rx_errors; } stats->rx_packets = accum.rx_packets; stats->rx_bytes = accum.rx_bytes; stats->rx_errors = accum.rx_errors; stats->multicast = accum.rx_multicast; } return stats; }
static struct net_device_stats *vlan_dev_get_stats(struct net_device *dev) { struct net_device_stats *stats = &dev->stats; dev_txq_stats_fold(dev, stats); if (vlan_dev_info(dev)->vlan_rx_stats) { struct vlan_rx_stats *p, rx = {0}; int i; for_each_possible_cpu(i) { p = per_cpu_ptr(vlan_dev_info(dev)->vlan_rx_stats, i); rx.rx_packets += p->rx_packets; rx.rx_bytes += p->rx_bytes; rx.rx_errors += p->rx_errors; rx.multicast += p->multicast; } stats->rx_packets = rx.rx_packets; stats->rx_bytes = rx.rx_bytes; stats->rx_errors = rx.rx_errors; stats->multicast = rx.multicast; } return stats; }