Boot Linux faster!

Check our new training course

Boot Linux faster!

Check our new training course
and Creative Commons CC-BY-SA
lecture and lab materials

Bootlin logo

Elixir Cross Referencer

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

#ifndef __NET_STATS_H__
#define __NET_STATS_H__

#if defined(CONFIG_NET_STATISTICS)

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

extern struct net_stats net_stats;

#define GET_STAT(s) net_stats.s

/* Core stats */

static inline void net_stats_update_processing_error(void)
{
	net_stats.processing_error++;
}

static inline void net_stats_update_ip_errors_protoerr(void)
{
	net_stats.ip_errors.protoerr++;
}

static inline void net_stats_update_ip_errors_vhlerr(void)
{
	net_stats.ip_errors.vhlerr++;
}

static inline void net_stats_update_bytes_recv(u32_t bytes)
{
	net_stats.bytes.received += bytes;
}

static inline void net_stats_update_bytes_sent(u32_t bytes)
{
	net_stats.bytes.sent += bytes;
}
#else
#define net_stats_update_processing_error()
#define net_stats_update_ip_errors_protoerr()
#define net_stats_update_ip_errors_vhlerr()
#define net_stats_update_bytes_recv(...)
#define net_stats_update_bytes_sent(...)
#endif /* CONFIG_NET_STATISTICS */

#if defined(CONFIG_NET_STATISTICS_IPV6)
/* IPv6 stats */

static inline void net_stats_update_ipv6_sent(void)
{
	net_stats.ipv6.sent++;
}

static inline void net_stats_update_ipv6_recv(void)
{
	net_stats.ipv6.recv++;
}

static inline void net_stats_update_ipv6_drop(void)
{
	net_stats.ipv6.drop++;
}
#else
#define net_stats_update_ipv6_drop()
#define net_stats_update_ipv6_sent()
#define net_stats_update_ipv6_recv()
#endif /* CONFIG_NET_STATISTICS_IPV6 */

#if defined(CONFIG_NET_STATISTICS_IPV6_ND)
/* IPv6 Neighbor Discovery stats*/

static inline void net_stats_update_ipv6_nd_sent(void)
{
	net_stats.ipv6_nd.sent++;
}

static inline void net_stats_update_ipv6_nd_recv(void)
{
	net_stats.ipv6_nd.recv++;
}

static inline void net_stats_update_ipv6_nd_drop(void)
{
	net_stats.ipv6_nd.drop++;
}
#else
#define net_stats_update_ipv6_nd_sent()
#define net_stats_update_ipv6_nd_recv()
#define net_stats_update_ipv6_nd_drop()
#endif /* CONFIG_NET_STATISTICS_IPV6_ND */

#if defined(CONFIG_NET_STATISTICS_IPV4)
/* IPv4 stats */

static inline void net_stats_update_ipv4_drop(void)
{
	net_stats.ipv4.drop++;
}

static inline void net_stats_update_ipv4_sent(void)
{
	net_stats.ipv4.sent++;
}

static inline void net_stats_update_ipv4_recv(void)
{
	net_stats.ipv4.recv++;
}
#else
#define net_stats_update_ipv4_drop()
#define net_stats_update_ipv4_sent()
#define net_stats_update_ipv4_recv()
#endif /* CONFIG_NET_STATISTICS_IPV4 */

#if defined(CONFIG_NET_STATISTICS_ICMP)
/* Common ICMPv4/ICMPv6 stats */
static inline void net_stats_update_icmp_sent(void)
{
	net_stats.icmp.sent++;
}

static inline void net_stats_update_icmp_recv(void)
{
	net_stats.icmp.recv++;
}

static inline void net_stats_update_icmp_drop(void)
{
	net_stats.icmp.drop++;
}
#else
#define net_stats_update_icmp_sent()
#define net_stats_update_icmp_recv()
#define net_stats_update_icmp_drop()
#endif /* CONFIG_NET_STATISTICS_ICMP */

#if defined(CONFIG_NET_STATISTICS_UDP)
/* UDP stats */
static inline void net_stats_update_udp_sent(void)
{
	net_stats.udp.sent++;
}

static inline void net_stats_update_udp_recv(void)
{
	net_stats.udp.recv++;
}

static inline void net_stats_update_udp_drop(void)
{
	net_stats.udp.drop++;
}

static inline void net_stats_update_udp_chkerr(void)
{
	net_stats.udp.chkerr++;
}
#else
#define net_stats_update_udp_sent()
#define net_stats_update_udp_recv()
#define net_stats_update_udp_drop()
#define net_stats_update_udp_chkerr()
#endif /* CONFIG_NET_STATISTICS_UDP */

#if defined(CONFIG_NET_STATISTICS_TCP)
/* TCP stats */
static inline void net_stats_update_tcp_sent(u32_t bytes)
{
	net_stats.tcp.bytes.sent += bytes;
}

static inline void net_stats_update_tcp_recv(u32_t bytes)
{
	net_stats.tcp.bytes.received += bytes;
}

static inline void net_stats_update_tcp_resent(u32_t bytes)
{
	net_stats.tcp.resent += bytes;
}

static inline void net_stats_update_tcp_seg_sent(void)
{
	net_stats.tcp.sent++;
}

static inline void net_stats_update_tcp_seg_recv(void)
{
	net_stats.tcp.recv++;
}

static inline void net_stats_update_tcp_seg_drop(void)
{
	net_stats.tcp.drop++;
}

static inline void net_stats_update_tcp_seg_rst(void)
{
	net_stats.tcp.rst++;
}

static inline void net_stats_update_tcp_seg_conndrop(void)
{
	net_stats.tcp.conndrop++;
}

static inline void net_stats_update_tcp_seg_connrst(void)
{
	net_stats.tcp.connrst++;
}

static inline void net_stats_update_tcp_seg_chkerr(void)
{
	net_stats.tcp.chkerr++;
}

static inline void net_stats_update_tcp_seg_ackerr(void)
{
	net_stats.tcp.ackerr++;
}

static inline void net_stats_update_tcp_seg_rsterr(void)
{
	net_stats.tcp.rsterr++;
}

static inline void net_stats_update_tcp_seg_rexmit(void)
{
	net_stats.tcp.rexmit++;
}
#else
#define net_stats_update_tcp_sent(...)
#define net_stats_update_tcp_resent(...)
#define net_stats_update_tcp_recv(...)
#define net_stats_update_tcp_seg_sent()
#define net_stats_update_tcp_seg_recv()
#define net_stats_update_tcp_seg_drop()
#define net_stats_update_tcp_seg_rst()
#define net_stats_update_tcp_seg_conndrop()
#define net_stats_update_tcp_seg_connrst()
#define net_stats_update_tcp_seg_chkerr()
#define net_stats_update_tcp_seg_ackerr()
#define net_stats_update_tcp_seg_rsterr()
#define net_stats_update_tcp_seg_rexmit()
#endif /* CONFIG_NET_STATISTICS_TCP */

static inline void net_stats_update_per_proto_recv(enum net_ip_protocol proto)
{
	if (IS_ENABLED(CONFIG_NET_UDP) && proto == IPPROTO_UDP) {
		net_stats_update_udp_recv();
	} else if (IS_ENABLED(CONFIG_NET_TCP) && proto == IPPROTO_TCP) {
		net_stats_update_tcp_seg_recv();
	}
}

static inline void net_stats_update_per_proto_drop(enum net_ip_protocol proto)
{
	if (IS_ENABLED(CONFIG_NET_UDP) && proto == IPPROTO_UDP) {
		net_stats_update_udp_drop();
	} else if (IS_ENABLED(CONFIG_NET_TCP) && proto == IPPROTO_TCP) {
		net_stats_update_tcp_seg_drop();
	}
}

#if defined(CONFIG_NET_STATISTICS_RPL)
/* RPL stats */
static inline void net_stats_update_rpl_resets(void)
{
	net_stats.rpl.resets++;
}

static inline void net_stats_update_rpl_mem_overflows(void)
{
	net_stats.rpl.mem_overflows++;
}

static inline void net_stats_update_rpl_parent_switch(void)
{
	net_stats.rpl.parent_switch++;
}

static inline void net_stats_update_rpl_local_repairs(void)
{
	net_stats.rpl.local_repairs++;
}

static inline void net_stats_update_rpl_global_repairs(void)
{
	net_stats.rpl.global_repairs++;
}

static inline void net_stats_update_rpl_root_repairs(void)
{
	net_stats.rpl.root_repairs++;
}

static inline void net_stats_update_rpl_malformed_msgs(void)
{
	net_stats.rpl.malformed_msgs++;
}

static inline void net_stats_update_rpl_forward_errors(void)
{
	net_stats.rpl.forward_errors++;
}

static inline void net_stats_update_rpl_loop_errors(void)
{
	net_stats.rpl.loop_errors++;
}

static inline void net_stats_update_rpl_loop_warnings(void)
{
	net_stats.rpl.loop_warnings++;
}

static inline void net_stats_update_rpl_dis_sent(void)
{
	net_stats.rpl.dis.sent++;
}

static inline void net_stats_update_rpl_dio_sent(void)
{
	net_stats.rpl.dio.sent++;
}

static inline void net_stats_update_rpl_dao_sent(void)
{
	net_stats.rpl.dao.sent++;
}

static inline void net_stats_update_rpl_dao_forwarded(void)
{
	net_stats.rpl.dao.forwarded++;
}

static inline void net_stats_update_rpl_dao_ack_sent(void)
{
	net_stats.rpl.dao_ack.sent++;
}

static inline void net_stats_update_rpl_dao_ack_recv(void)
{
	net_stats.rpl.dao_ack.recv++;
}
#else
#define net_stats_update_rpl_resets()
#define net_stats_update_rpl_mem_overflows()
#define net_stats_update_rpl_parent_switch()
#define net_stats_update_rpl_local_repairs()
#define net_stats_update_rpl_global_repairs()
#define net_stats_update_rpl_root_repairs()
#define net_stats_update_rpl_malformed_msgs()
#define net_stats_update_rpl_forward_errors()
#define net_stats_update_rpl_loop_errors()
#define net_stats_update_rpl_loop_warnings()
#define net_stats_update_rpl_dis_sent()
#define net_stats_update_rpl_dio_sent()
#define net_stats_update_rpl_dao_sent()
#define net_stats_update_rpl_dao_forwarded()
#define net_stats_update_rpl_dao_ack_sent()
#define net_stats_update_rpl_dao_ack_recv()
#endif /* CONFIG_NET_STATISTICS_RPL */

#if defined(CONFIG_NET_STATISTICS_MLD)
static inline void net_stats_update_ipv6_mld_recv(void)
{
	net_stats.ipv6_mld.recv++;
}

static inline void net_stats_update_ipv6_mld_sent(void)
{
	net_stats.ipv6_mld.sent++;
}

static inline void net_stats_update_ipv6_mld_drop(void)
{
	net_stats.ipv6_mld.drop++;
}
#else
#define net_stats_update_ipv6_mld_recv()
#define net_stats_update_ipv6_mld_sent()
#define net_stats_update_ipv6_mld_drop()
#endif /* CONFIG_NET_STATISTICS_MLD */

#if defined(CONFIG_NET_STATISTICS_PERIODIC_OUTPUT)
/* A simple periodic statistic printer, used only in net core */
void net_print_statistics(void);
#else
#define net_print_statistics()
#endif

#endif /* __NET_STATS_H__ */