Exemple #1
0
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;
}