/*
 * Copyright (c) 2018 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef __ETH_STATS_H__
#define __ETH_STATS_H__

#if defined(CONFIG_NET_STATISTICS_ETHERNET)

#include <net/net_ip.h>
#include <net/net_stats.h>
#include <net/net_if.h>

static inline void eth_stats_update_bytes_rx(struct net_if *iface,
					     u32_t bytes)
{
	const struct ethernet_api *api = (const struct ethernet_api *)
		net_if_get_device(iface)->driver_api;
	struct net_stats_eth *stats;

	if (!api->get_stats) {
		return;
	}

	stats = api->get_stats(net_if_get_device(iface));
	if (!stats) {
		return;
	}

	stats->bytes.received += bytes;
}

static inline void eth_stats_update_bytes_tx(struct net_if *iface,
					     u32_t bytes)
{
	const struct ethernet_api *api = (const struct ethernet_api *)
		net_if_get_device(iface)->driver_api;
	struct net_stats_eth *stats;

	if (!api->get_stats) {
		return;
	}

	stats = api->get_stats(net_if_get_device(iface));
	if (!stats) {
		return;
	}

	stats->bytes.sent += bytes;
}

static inline void eth_stats_update_pkts_rx(struct net_if *iface)
{
	const struct ethernet_api *api = (const struct ethernet_api *)
		net_if_get_device(iface)->driver_api;
	struct net_stats_eth *stats;

	if (!api->get_stats) {
		return;
	}

	stats = api->get_stats(net_if_get_device(iface));
	if (!stats) {
		return;
	}

	stats->pkts.rx++;
}

static inline void eth_stats_update_pkts_tx(struct net_if *iface)
{
	const struct ethernet_api *api = (const struct ethernet_api *)
		net_if_get_device(iface)->driver_api;
	struct net_stats_eth *stats;

	if (!api->get_stats) {
		return;
	}

	stats = api->get_stats(net_if_get_device(iface));
	if (!stats) {
		return;
	}

	stats->pkts.tx++;
}

static inline void eth_stats_update_broadcast_rx(struct net_if *iface)
{
	const struct ethernet_api *api = (const struct ethernet_api *)
		net_if_get_device(iface)->driver_api;
	struct net_stats_eth *stats;

	if (!api->get_stats) {
		return;
	}

	stats = api->get_stats(net_if_get_device(iface));
	if (!stats) {
		return;
	}

	stats->broadcast.rx++;
}

static inline void eth_stats_update_broadcast_tx(struct net_if *iface)
{
	const struct ethernet_api *api = (const struct ethernet_api *)
		net_if_get_device(iface)->driver_api;
	struct net_stats_eth *stats;

	if (!api->get_stats) {
		return;
	}

	stats = api->get_stats(net_if_get_device(iface));
	if (!stats) {
		return;
	}

	stats->broadcast.tx++;
}

static inline void eth_stats_update_multicast_rx(struct net_if *iface)
{
	const struct ethernet_api *api = (const struct ethernet_api *)
		net_if_get_device(iface)->driver_api;
	struct net_stats_eth *stats;

	if (!api->get_stats) {
		return;
	}

	stats = api->get_stats(net_if_get_device(iface));
	if (!stats) {
		return;
	}

	stats->multicast.rx++;
}

static inline void eth_stats_update_multicast_tx(struct net_if *iface)
{
	const struct ethernet_api *api = (const struct ethernet_api *)
		net_if_get_device(iface)->driver_api;
	struct net_stats_eth *stats;

	if (!api->get_stats) {
		return;
	}

	stats = api->get_stats(net_if_get_device(iface));
	if (!stats) {
		return;
	}

	stats->multicast.tx++;
}


static inline void eth_stats_update_errors_rx(struct net_if *iface)
{
	struct net_stats_eth *stats;
	const struct ethernet_api *api = ((const struct ethernet_api *)
		net_if_get_device(iface)->driver_api);

	if (!api->get_stats) {
		return;
	}

	stats = api->get_stats(net_if_get_device(iface));
	if (!stats) {
		return;
	}

	stats->errors.rx++;
}

static inline void eth_stats_update_errors_tx(struct net_if *iface)
{
	struct net_stats_eth *stats;
	const struct ethernet_api *api = ((const struct ethernet_api *)
		net_if_get_device(iface)->driver_api);

	if (!api->get_stats) {
		return;
	}

	stats = api->get_stats(net_if_get_device(iface));
	if (!stats) {
		return;
	}

	stats->errors.tx++;
}

#else /* CONFIG_NET_STATISTICS_ETHERNET */

#define eth_stats_update_bytes_rx(iface, bytes)
#define eth_stats_update_bytes_tx(iface, bytes)
#define eth_stats_update_pkts_rx(iface)
#define eth_stats_update_pkts_tx(iface)
#define eth_stats_update_broadcast_rx(iface)
#define eth_stats_update_broadcast_tx(iface)
#define eth_stats_update_multicast_rx(iface)
#define eth_stats_update_multicast_tx(iface)
#define eth_stats_update_errors_rx(iface)
#define eth_stats_update_errors_tx(iface)

#endif /* CONFIG_NET_STATISTICS_ETHERNET */

#endif /* __ETH_STATS_H__ */
