As the network packet filter drops packets without any indication that the packet is dropped, it can be difficult to monitor what is going on in the system when receiving data. The user can now monitor the statistics and see if packets are being dropped because of packet filter activity. Signed-off-by: Jukka Rissanen <jukka.rissanen@nordicsemi.no>
805 lines
23 KiB
C
805 lines
23 KiB
C
/*
|
|
* Copyright (c) 2016 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef __NET_STATS_H__
|
|
#define __NET_STATS_H__
|
|
|
|
#if defined(CONFIG_NET_STATISTICS) && defined(CONFIG_NET_NATIVE)
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <zephyr/net/net_ip.h>
|
|
#include <zephyr/net/net_stats.h>
|
|
#include <zephyr/net/net_if.h>
|
|
|
|
extern struct net_stats net_stats;
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_PER_INTERFACE)
|
|
#define SET_STAT(cmd) (cmd)
|
|
#define GET_STAT(iface, s) (iface ? iface->stats.s : net_stats.s)
|
|
#define GET_STAT_ADDR(iface, s) (iface ? &iface->stats.s : &net_stats.s)
|
|
#else
|
|
#define SET_STAT(cmd)
|
|
#define GET_STAT(iface, s) (net_stats.s)
|
|
#define GET_STAT_ADDR(iface, s) (&GET_STAT(iface, s))
|
|
#endif
|
|
|
|
#define UPDATE_STAT_GLOBAL(cmd) (net_##cmd)
|
|
#define UPDATE_STAT(_iface, _cmd) \
|
|
{ NET_ASSERT(_iface); (UPDATE_STAT_GLOBAL(_cmd)); \
|
|
SET_STAT(_iface->_cmd); }
|
|
/* Core stats */
|
|
|
|
static inline void net_stats_update_processing_error(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.processing_error++);
|
|
}
|
|
|
|
static inline void net_stats_update_ip_errors_protoerr(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ip_errors.protoerr++);
|
|
}
|
|
|
|
static inline void net_stats_update_ip_errors_vhlerr(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ip_errors.vhlerr++);
|
|
}
|
|
|
|
static inline void net_stats_update_bytes_recv(struct net_if *iface,
|
|
uint32_t bytes)
|
|
{
|
|
UPDATE_STAT(iface, stats.bytes.received += bytes);
|
|
}
|
|
|
|
static inline void net_stats_update_bytes_sent(struct net_if *iface,
|
|
uint32_t bytes)
|
|
{
|
|
UPDATE_STAT(iface, stats.bytes.sent += bytes);
|
|
}
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_PKT_FILTER)
|
|
static inline void net_stats_update_filter_rx_drop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.pkt_filter.rx.drop++);
|
|
}
|
|
|
|
static inline void net_stats_update_filter_tx_drop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.pkt_filter.tx.drop++);
|
|
}
|
|
|
|
static inline void net_stats_update_filter_rx_ipv4_drop(struct net_if *iface)
|
|
{
|
|
#if defined(CONFIG_NET_PKT_FILTER_IPV4_HOOK)
|
|
UPDATE_STAT(iface, stats.pkt_filter.rx.ipv4_drop++);
|
|
#endif
|
|
}
|
|
|
|
static inline void net_stats_update_filter_rx_ipv6_drop(struct net_if *iface)
|
|
{
|
|
#if defined(CONFIG_NET_PKT_FILTER_IPV6_HOOK)
|
|
UPDATE_STAT(iface, stats.pkt_filter.rx.ipv6_drop++);
|
|
#endif
|
|
}
|
|
|
|
static inline void net_stats_update_filter_rx_local_drop(struct net_if *iface)
|
|
{
|
|
#if defined(CONFIG_NET_PKT_FILTER_LOCAL_IN_HOOK)
|
|
UPDATE_STAT(iface, stats.pkt_filter.rx.local_drop++);
|
|
#endif
|
|
}
|
|
#else /* CONFIG_NET_STATISTICS_PKT_FILTER */
|
|
#define net_stats_update_filter_rx_drop(iface)
|
|
#define net_stats_update_filter_tx_drop(iface)
|
|
#define net_stats_update_filter_rx_ipv4_drop(iface)
|
|
#define net_stats_update_filter_rx_ipv6_drop(iface)
|
|
#define net_stats_update_filter_rx_local_drop(iface)
|
|
#endif /* CONFIG_NET_STATISTICS_PKT_FILTER */
|
|
#else
|
|
#define net_stats_update_processing_error(iface)
|
|
#define net_stats_update_ip_errors_protoerr(iface)
|
|
#define net_stats_update_ip_errors_vhlerr(iface)
|
|
#define net_stats_update_bytes_recv(iface, bytes)
|
|
#define net_stats_update_bytes_sent(iface, bytes)
|
|
#define net_stats_update_filter_rx_drop(iface)
|
|
#define net_stats_update_filter_tx_drop(iface)
|
|
#define net_stats_update_filter_rx_ipv4_drop(iface)
|
|
#define net_stats_update_filter_rx_ipv6_drop(iface)
|
|
#define net_stats_update_filter_rx_local_drop(iface)
|
|
#endif /* CONFIG_NET_STATISTICS */
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_IPV6) && defined(CONFIG_NET_NATIVE_IPV6)
|
|
/* IPv6 stats */
|
|
|
|
static inline void net_stats_update_ipv6_sent(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv6.sent++);
|
|
}
|
|
|
|
static inline void net_stats_update_ipv6_recv(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv6.recv++);
|
|
}
|
|
|
|
static inline void net_stats_update_ipv6_drop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv6.drop++);
|
|
}
|
|
#else
|
|
#define net_stats_update_ipv6_drop(iface)
|
|
#define net_stats_update_ipv6_sent(iface)
|
|
#define net_stats_update_ipv6_recv(iface)
|
|
#endif /* CONFIG_NET_STATISTICS_IPV6 */
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_IPV6_ND) && defined(CONFIG_NET_NATIVE_IPV6)
|
|
/* IPv6 Neighbor Discovery stats*/
|
|
|
|
static inline void net_stats_update_ipv6_nd_sent(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv6_nd.sent++);
|
|
}
|
|
|
|
static inline void net_stats_update_ipv6_nd_recv(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv6_nd.recv++);
|
|
}
|
|
|
|
static inline void net_stats_update_ipv6_nd_drop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv6_nd.drop++);
|
|
}
|
|
#else
|
|
#define net_stats_update_ipv6_nd_sent(iface)
|
|
#define net_stats_update_ipv6_nd_recv(iface)
|
|
#define net_stats_update_ipv6_nd_drop(iface)
|
|
#endif /* CONFIG_NET_STATISTICS_IPV6_ND */
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_IPV6_PMTU) && defined(CONFIG_NET_NATIVE_IPV6)
|
|
/* IPv6 Path MTU Discovery stats */
|
|
|
|
static inline void net_stats_update_ipv6_pmtu_sent(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv6_pmtu.sent++);
|
|
}
|
|
|
|
static inline void net_stats_update_ipv6_pmtu_recv(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv6_pmtu.recv++);
|
|
}
|
|
|
|
static inline void net_stats_update_ipv6_pmtu_drop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv6_pmtu.drop++);
|
|
}
|
|
#else
|
|
#define net_stats_update_ipv6_pmtu_sent(iface)
|
|
#define net_stats_update_ipv6_pmtu_recv(iface)
|
|
#define net_stats_update_ipv6_pmtu_drop(iface)
|
|
#endif /* CONFIG_NET_STATISTICS_IPV6_PMTU */
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_IPV4_PMTU) && defined(CONFIG_NET_NATIVE_IPV4)
|
|
/* IPv4 Path MTU Discovery stats */
|
|
|
|
static inline void net_stats_update_ipv4_pmtu_sent(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv4_pmtu.sent++);
|
|
}
|
|
|
|
static inline void net_stats_update_ipv4_pmtu_recv(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv4_pmtu.recv++);
|
|
}
|
|
|
|
static inline void net_stats_update_ipv4_pmtu_drop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv4_pmtu.drop++);
|
|
}
|
|
#else
|
|
#define net_stats_update_ipv4_pmtu_sent(iface)
|
|
#define net_stats_update_ipv4_pmtu_recv(iface)
|
|
#define net_stats_update_ipv4_pmtu_drop(iface)
|
|
#endif /* CONFIG_NET_STATISTICS_IPV4_PMTU */
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_IPV4) && defined(CONFIG_NET_NATIVE_IPV4)
|
|
/* IPv4 stats */
|
|
|
|
static inline void net_stats_update_ipv4_drop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv4.drop++);
|
|
}
|
|
|
|
static inline void net_stats_update_ipv4_sent(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv4.sent++);
|
|
}
|
|
|
|
static inline void net_stats_update_ipv4_recv(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv4.recv++);
|
|
}
|
|
#else
|
|
#define net_stats_update_ipv4_drop(iface)
|
|
#define net_stats_update_ipv4_sent(iface)
|
|
#define net_stats_update_ipv4_recv(iface)
|
|
#endif /* CONFIG_NET_STATISTICS_IPV4 */
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_ICMP) && defined(CONFIG_NET_NATIVE_IPV4)
|
|
/* Common ICMPv4/ICMPv6 stats */
|
|
static inline void net_stats_update_icmp_sent(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.icmp.sent++);
|
|
}
|
|
|
|
static inline void net_stats_update_icmp_recv(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.icmp.recv++);
|
|
}
|
|
|
|
static inline void net_stats_update_icmp_drop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.icmp.drop++);
|
|
}
|
|
#else
|
|
#define net_stats_update_icmp_sent(iface)
|
|
#define net_stats_update_icmp_recv(iface)
|
|
#define net_stats_update_icmp_drop(iface)
|
|
#endif /* CONFIG_NET_STATISTICS_ICMP */
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_UDP) && defined(CONFIG_NET_NATIVE_UDP)
|
|
/* UDP stats */
|
|
static inline void net_stats_update_udp_sent(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.udp.sent++);
|
|
}
|
|
|
|
static inline void net_stats_update_udp_recv(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.udp.recv++);
|
|
}
|
|
|
|
static inline void net_stats_update_udp_drop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.udp.drop++);
|
|
}
|
|
|
|
static inline void net_stats_update_udp_chkerr(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.udp.chkerr++);
|
|
}
|
|
#else
|
|
#define net_stats_update_udp_sent(iface)
|
|
#define net_stats_update_udp_recv(iface)
|
|
#define net_stats_update_udp_drop(iface)
|
|
#define net_stats_update_udp_chkerr(iface)
|
|
#endif /* CONFIG_NET_STATISTICS_UDP */
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_TCP) && defined(CONFIG_NET_NATIVE_TCP)
|
|
/* TCP stats */
|
|
static inline void net_stats_update_tcp_sent(struct net_if *iface, uint32_t bytes)
|
|
{
|
|
UPDATE_STAT(iface, stats.tcp.bytes.sent += bytes);
|
|
}
|
|
|
|
static inline void net_stats_update_tcp_recv(struct net_if *iface, uint32_t bytes)
|
|
{
|
|
UPDATE_STAT(iface, stats.tcp.bytes.received += bytes);
|
|
}
|
|
|
|
static inline void net_stats_update_tcp_resent(struct net_if *iface,
|
|
uint32_t bytes)
|
|
{
|
|
UPDATE_STAT(iface, stats.tcp.resent += bytes);
|
|
}
|
|
|
|
static inline void net_stats_update_tcp_drop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.tcp.drop++);
|
|
}
|
|
|
|
static inline void net_stats_update_tcp_seg_sent(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.tcp.sent++);
|
|
}
|
|
|
|
static inline void net_stats_update_tcp_seg_recv(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.tcp.recv++);
|
|
}
|
|
|
|
static inline void net_stats_update_tcp_seg_drop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.tcp.seg_drop++);
|
|
}
|
|
|
|
static inline void net_stats_update_tcp_seg_rst(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.tcp.rst++);
|
|
}
|
|
|
|
static inline void net_stats_update_tcp_seg_conndrop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.tcp.conndrop++);
|
|
}
|
|
|
|
static inline void net_stats_update_tcp_seg_connrst(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.tcp.connrst++);
|
|
}
|
|
|
|
static inline void net_stats_update_tcp_seg_chkerr(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.tcp.chkerr++);
|
|
}
|
|
|
|
static inline void net_stats_update_tcp_seg_ackerr(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.tcp.ackerr++);
|
|
}
|
|
|
|
static inline void net_stats_update_tcp_seg_rsterr(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.tcp.rsterr++);
|
|
}
|
|
|
|
static inline void net_stats_update_tcp_seg_rexmit(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.tcp.rexmit++);
|
|
}
|
|
#else
|
|
#define net_stats_update_tcp_sent(iface, bytes)
|
|
#define net_stats_update_tcp_resent(iface, bytes)
|
|
#define net_stats_update_tcp_recv(iface, bytes)
|
|
#define net_stats_update_tcp_drop(iface)
|
|
#define net_stats_update_tcp_seg_sent(iface)
|
|
#define net_stats_update_tcp_seg_recv(iface)
|
|
#define net_stats_update_tcp_seg_drop(iface)
|
|
#define net_stats_update_tcp_seg_rst(iface)
|
|
#define net_stats_update_tcp_seg_conndrop(iface)
|
|
#define net_stats_update_tcp_seg_connrst(iface)
|
|
#define net_stats_update_tcp_seg_chkerr(iface)
|
|
#define net_stats_update_tcp_seg_ackerr(iface)
|
|
#define net_stats_update_tcp_seg_rsterr(iface)
|
|
#define net_stats_update_tcp_seg_rexmit(iface)
|
|
#endif /* CONFIG_NET_STATISTICS_TCP */
|
|
|
|
static inline void net_stats_update_per_proto_recv(struct net_if *iface,
|
|
enum net_ip_protocol proto)
|
|
{
|
|
if (!IS_ENABLED(CONFIG_NET_NATIVE)) {
|
|
return;
|
|
}
|
|
|
|
if (IS_ENABLED(CONFIG_NET_UDP) && proto == IPPROTO_UDP) {
|
|
net_stats_update_udp_recv(iface);
|
|
} else if (IS_ENABLED(CONFIG_NET_TCP) && proto == IPPROTO_TCP) {
|
|
net_stats_update_tcp_seg_recv(iface);
|
|
}
|
|
}
|
|
|
|
static inline void net_stats_update_per_proto_drop(struct net_if *iface,
|
|
enum net_ip_protocol proto)
|
|
{
|
|
if (!IS_ENABLED(CONFIG_NET_NATIVE)) {
|
|
return;
|
|
}
|
|
|
|
if (IS_ENABLED(CONFIG_NET_UDP) && proto == IPPROTO_UDP) {
|
|
net_stats_update_udp_drop(iface);
|
|
} else if (IS_ENABLED(CONFIG_NET_TCP) && proto == IPPROTO_TCP) {
|
|
net_stats_update_tcp_drop(iface);
|
|
}
|
|
}
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_MLD) && defined(CONFIG_NET_NATIVE)
|
|
static inline void net_stats_update_ipv6_mld_recv(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv6_mld.recv++);
|
|
}
|
|
|
|
static inline void net_stats_update_ipv6_mld_sent(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv6_mld.sent++);
|
|
}
|
|
|
|
static inline void net_stats_update_ipv6_mld_drop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv6_mld.drop++);
|
|
}
|
|
#else
|
|
#define net_stats_update_ipv6_mld_recv(iface)
|
|
#define net_stats_update_ipv6_mld_sent(iface)
|
|
#define net_stats_update_ipv6_mld_drop(iface)
|
|
#endif /* CONFIG_NET_STATISTICS_MLD */
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_IGMP) && defined(CONFIG_NET_NATIVE)
|
|
static inline void net_stats_update_ipv4_igmp_recv(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv4_igmp.recv++);
|
|
}
|
|
|
|
static inline void net_stats_update_ipv4_igmp_sent(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv4_igmp.sent++);
|
|
}
|
|
|
|
static inline void net_stats_update_ipv4_igmp_drop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.ipv4_igmp.drop++);
|
|
}
|
|
#else
|
|
#define net_stats_update_ipv4_igmp_recv(iface)
|
|
#define net_stats_update_ipv4_igmp_sent(iface)
|
|
#define net_stats_update_ipv4_igmp_drop(iface)
|
|
#endif /* CONFIG_NET_STATISTICS_IGMP */
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_DNS)
|
|
static inline void net_stats_update_dns_recv(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.dns.recv++);
|
|
}
|
|
|
|
static inline void net_stats_update_dns_sent(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.dns.sent++);
|
|
}
|
|
|
|
static inline void net_stats_update_dns_drop(struct net_if *iface)
|
|
{
|
|
UPDATE_STAT(iface, stats.dns.drop++);
|
|
}
|
|
#else
|
|
#define net_stats_update_dns_recv(iface)
|
|
#define net_stats_update_dns_sent(iface)
|
|
#define net_stats_update_dns_drop(iface)
|
|
#endif /* CONFIG_NET_STATISTICS_DNS */
|
|
|
|
#if defined(CONFIG_NET_PKT_TXTIME_STATS) && defined(CONFIG_NET_STATISTICS)
|
|
static inline void net_stats_update_tx_time(struct net_if *iface,
|
|
uint32_t start_time,
|
|
uint32_t end_time)
|
|
{
|
|
uint32_t diff = end_time - start_time;
|
|
|
|
UPDATE_STAT(iface, stats.tx_time.sum +=
|
|
k_cyc_to_ns_floor64(diff) / 1000);
|
|
UPDATE_STAT(iface, stats.tx_time.count += 1);
|
|
}
|
|
#else
|
|
#define net_stats_update_tx_time(iface, start_time, end_time)
|
|
#endif /* NET_PKT_TXTIME_STATS && NET_STATISTICS */
|
|
|
|
#if defined(CONFIG_NET_PKT_TXTIME_STATS_DETAIL)
|
|
static inline void net_stats_update_tx_time_detail(struct net_if *iface,
|
|
uint32_t detail_stat[])
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < NET_PKT_DETAIL_STATS_COUNT; i++) {
|
|
UPDATE_STAT(iface,
|
|
stats.tx_time_detail[i].sum +=
|
|
k_cyc_to_ns_floor64(detail_stat[i]) / 1000);
|
|
UPDATE_STAT(iface,
|
|
stats.tx_time_detail[i].count += 1);
|
|
}
|
|
}
|
|
#else
|
|
#define net_stats_update_tx_time_detail(iface, detail_stat)
|
|
#endif /* NET_PKT_TXTIME_STATS_DETAIL */
|
|
|
|
#if defined(CONFIG_NET_PKT_RXTIME_STATS) && defined(CONFIG_NET_STATISTICS)
|
|
static inline void net_stats_update_rx_time(struct net_if *iface,
|
|
uint32_t start_time,
|
|
uint32_t end_time)
|
|
{
|
|
uint32_t diff = end_time - start_time;
|
|
|
|
UPDATE_STAT(iface, stats.rx_time.sum +=
|
|
k_cyc_to_ns_floor64(diff) / 1000);
|
|
UPDATE_STAT(iface, stats.rx_time.count += 1);
|
|
}
|
|
#else
|
|
#define net_stats_update_rx_time(iface, start_time, end_time)
|
|
#endif /* NET_PKT_RXTIME_STATS && STATISTICS */
|
|
|
|
#if defined(CONFIG_NET_PKT_RXTIME_STATS_DETAIL)
|
|
static inline void net_stats_update_rx_time_detail(struct net_if *iface,
|
|
uint32_t detail_stat[])
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < NET_PKT_DETAIL_STATS_COUNT; i++) {
|
|
UPDATE_STAT(iface,
|
|
stats.rx_time_detail[i].sum +=
|
|
k_cyc_to_ns_floor64(detail_stat[i]) / 1000);
|
|
UPDATE_STAT(iface,
|
|
stats.rx_time_detail[i].count += 1);
|
|
}
|
|
}
|
|
#else
|
|
#define net_stats_update_rx_time_detail(iface, detail_stat)
|
|
#endif /* NET_PKT_RXTIME_STATS_DETAIL */
|
|
|
|
#if (NET_TC_COUNT > 1) && defined(CONFIG_NET_STATISTICS) \
|
|
&& defined(CONFIG_NET_NATIVE)
|
|
static inline void net_stats_update_tc_sent_pkt(struct net_if *iface, uint8_t tc)
|
|
{
|
|
UPDATE_STAT(iface, stats.tc.sent[tc].pkts++);
|
|
}
|
|
|
|
static inline void net_stats_update_tc_sent_dropped(struct net_if *iface, uint8_t tc)
|
|
{
|
|
UPDATE_STAT(iface, stats.tc.sent[tc].dropped++);
|
|
}
|
|
|
|
static inline void net_stats_update_tc_sent_bytes(struct net_if *iface,
|
|
uint8_t tc, size_t bytes)
|
|
{
|
|
UPDATE_STAT(iface, stats.tc.sent[tc].bytes += bytes);
|
|
}
|
|
|
|
static inline void net_stats_update_tc_sent_priority(struct net_if *iface,
|
|
uint8_t tc, uint8_t priority)
|
|
{
|
|
UPDATE_STAT(iface, stats.tc.sent[tc].priority = priority);
|
|
}
|
|
|
|
#if defined(CONFIG_NET_PKT_TXTIME_STATS) && \
|
|
defined(CONFIG_NET_STATISTICS) && defined(CONFIG_NET_NATIVE)
|
|
static inline void net_stats_update_tc_tx_time(struct net_if *iface,
|
|
uint8_t priority,
|
|
uint32_t start_time,
|
|
uint32_t end_time)
|
|
{
|
|
uint32_t diff = end_time - start_time;
|
|
int tc = net_tx_priority2tc(priority);
|
|
|
|
UPDATE_STAT(iface, stats.tc.sent[tc].tx_time.sum +=
|
|
k_cyc_to_ns_floor64(diff) / 1000);
|
|
UPDATE_STAT(iface, stats.tc.sent[tc].tx_time.count += 1);
|
|
|
|
net_stats_update_tx_time(iface, start_time, end_time);
|
|
}
|
|
#else
|
|
#define net_stats_update_tc_tx_time(iface, tc, start_time, end_time)
|
|
#endif /* NET_PKT_TXTIME_STATS && NET_STATISTICS && NET_NATIVE */
|
|
|
|
#if defined(CONFIG_NET_PKT_TXTIME_STATS_DETAIL)
|
|
static inline void net_stats_update_tc_tx_time_detail(struct net_if *iface,
|
|
uint8_t priority,
|
|
uint32_t detail_stat[])
|
|
{
|
|
int tc = net_tx_priority2tc(priority);
|
|
int i;
|
|
|
|
for (i = 0; i < NET_PKT_DETAIL_STATS_COUNT; i++) {
|
|
UPDATE_STAT(iface,
|
|
stats.tc.sent[tc].tx_time_detail[i].sum +=
|
|
k_cyc_to_ns_floor64(detail_stat[i]) / 1000);
|
|
UPDATE_STAT(iface,
|
|
stats.tc.sent[tc].tx_time_detail[i].count += 1);
|
|
}
|
|
|
|
net_stats_update_tx_time_detail(iface, detail_stat);
|
|
}
|
|
#else
|
|
#define net_stats_update_tc_tx_time_detail(iface, tc, detail_stat)
|
|
#endif /* CONFIG_NET_PKT_TXTIME_STATS_DETAIL */
|
|
|
|
#if defined(CONFIG_NET_PKT_RXTIME_STATS) && defined(CONFIG_NET_STATISTICS) \
|
|
&& defined(CONFIG_NET_NATIVE)
|
|
static inline void net_stats_update_tc_rx_time(struct net_if *iface,
|
|
uint8_t priority,
|
|
uint32_t start_time,
|
|
uint32_t end_time)
|
|
{
|
|
uint32_t diff = end_time - start_time;
|
|
int tc = net_rx_priority2tc(priority);
|
|
|
|
UPDATE_STAT(iface, stats.tc.recv[tc].rx_time.sum +=
|
|
k_cyc_to_ns_floor64(diff) / 1000);
|
|
UPDATE_STAT(iface, stats.tc.recv[tc].rx_time.count += 1);
|
|
|
|
net_stats_update_rx_time(iface, start_time, end_time);
|
|
}
|
|
#else
|
|
#define net_stats_update_tc_rx_time(iface, tc, start_time, end_time)
|
|
#endif /* NET_PKT_RXTIME_STATS && NET_STATISTICS */
|
|
|
|
#if defined(CONFIG_NET_PKT_RXTIME_STATS_DETAIL)
|
|
static inline void net_stats_update_tc_rx_time_detail(struct net_if *iface,
|
|
uint8_t priority,
|
|
uint32_t detail_stat[])
|
|
{
|
|
int tc = net_rx_priority2tc(priority);
|
|
int i;
|
|
|
|
for (i = 0; i < NET_PKT_DETAIL_STATS_COUNT; i++) {
|
|
UPDATE_STAT(iface,
|
|
stats.tc.recv[tc].rx_time_detail[i].sum +=
|
|
k_cyc_to_ns_floor64(detail_stat[i]) / 1000);
|
|
UPDATE_STAT(iface,
|
|
stats.tc.recv[tc].rx_time_detail[i].count += 1);
|
|
}
|
|
|
|
net_stats_update_rx_time_detail(iface, detail_stat);
|
|
}
|
|
#else
|
|
#define net_stats_update_tc_rx_time_detail(iface, tc, detail_stat)
|
|
#endif /* CONFIG_NET_PKT_RXTIME_STATS_DETAIL */
|
|
|
|
static inline void net_stats_update_tc_recv_pkt(struct net_if *iface, uint8_t tc)
|
|
{
|
|
UPDATE_STAT(iface, stats.tc.recv[tc].pkts++);
|
|
}
|
|
|
|
static inline void net_stats_update_tc_recv_dropped(struct net_if *iface, uint8_t tc)
|
|
{
|
|
UPDATE_STAT(iface, stats.tc.recv[tc].dropped++);
|
|
}
|
|
|
|
static inline void net_stats_update_tc_recv_bytes(struct net_if *iface,
|
|
uint8_t tc, size_t bytes)
|
|
{
|
|
UPDATE_STAT(iface, stats.tc.recv[tc].bytes += bytes);
|
|
}
|
|
|
|
static inline void net_stats_update_tc_recv_priority(struct net_if *iface,
|
|
uint8_t tc, uint8_t priority)
|
|
{
|
|
UPDATE_STAT(iface, stats.tc.recv[tc].priority = priority);
|
|
}
|
|
#else
|
|
static inline void net_stats_update_tc_sent_pkt(struct net_if *iface, uint8_t tc)
|
|
{
|
|
ARG_UNUSED(iface);
|
|
ARG_UNUSED(tc);
|
|
}
|
|
|
|
static inline void net_stats_update_tc_sent_dropped(struct net_if *iface, uint8_t tc)
|
|
{
|
|
ARG_UNUSED(iface);
|
|
ARG_UNUSED(tc);
|
|
}
|
|
|
|
static inline void net_stats_update_tc_sent_bytes(struct net_if *iface,
|
|
uint8_t tc, size_t bytes)
|
|
{
|
|
ARG_UNUSED(iface);
|
|
ARG_UNUSED(tc);
|
|
ARG_UNUSED(bytes);
|
|
}
|
|
|
|
static inline void net_stats_update_tc_sent_priority(struct net_if *iface,
|
|
uint8_t tc, uint8_t priority)
|
|
{
|
|
ARG_UNUSED(iface);
|
|
ARG_UNUSED(tc);
|
|
ARG_UNUSED(priority);
|
|
}
|
|
|
|
static inline void net_stats_update_tc_recv_pkt(struct net_if *iface, uint8_t tc)
|
|
{
|
|
ARG_UNUSED(iface);
|
|
ARG_UNUSED(tc);
|
|
}
|
|
|
|
static inline void net_stats_update_tc_recv_dropped(struct net_if *iface, uint8_t tc)
|
|
{
|
|
ARG_UNUSED(iface);
|
|
ARG_UNUSED(tc);
|
|
}
|
|
|
|
static inline void net_stats_update_tc_recv_bytes(struct net_if *iface,
|
|
uint8_t tc, size_t bytes)
|
|
{
|
|
ARG_UNUSED(iface);
|
|
ARG_UNUSED(tc);
|
|
ARG_UNUSED(bytes);
|
|
}
|
|
|
|
static inline void net_stats_update_tc_recv_priority(struct net_if *iface,
|
|
uint8_t tc, uint8_t priority)
|
|
{
|
|
ARG_UNUSED(iface);
|
|
ARG_UNUSED(tc);
|
|
ARG_UNUSED(priority);
|
|
}
|
|
|
|
#if defined(CONFIG_NET_PKT_TXTIME_STATS) && \
|
|
defined(CONFIG_NET_STATISTICS) && defined(CONFIG_NET_NATIVE)
|
|
static inline void net_stats_update_tc_tx_time(struct net_if *iface,
|
|
uint8_t pkt_priority,
|
|
uint32_t start_time,
|
|
uint32_t end_time)
|
|
{
|
|
ARG_UNUSED(pkt_priority);
|
|
|
|
net_stats_update_tx_time(iface, start_time, end_time);
|
|
}
|
|
#else
|
|
#define net_stats_update_tc_tx_time(iface, priority, start_time, end_time)
|
|
#endif /* NET_PKT_TXTIME_STATS && NET_STATISTICS && NET_NATIVE */
|
|
|
|
#if defined(CONFIG_NET_PKT_TXTIME_STATS_DETAIL)
|
|
static inline void net_stats_update_tc_tx_time_detail(struct net_if *iface,
|
|
uint8_t pkt_priority,
|
|
uint32_t detail_stat[])
|
|
{
|
|
ARG_UNUSED(pkt_priority);
|
|
|
|
net_stats_update_tx_time_detail(iface, detail_stat);
|
|
}
|
|
#else
|
|
#define net_stats_update_tc_tx_time_detail(iface, pkt_priority, detail_stat)
|
|
#endif /* CONFIG_NET_PKT_TXTIME_STATS_DETAIL */
|
|
|
|
#if defined(CONFIG_NET_PKT_RXTIME_STATS) && defined(CONFIG_NET_STATISTICS) \
|
|
&& defined(CONFIG_NET_NATIVE)
|
|
static inline void net_stats_update_tc_rx_time(struct net_if *iface,
|
|
uint8_t pkt_priority,
|
|
uint32_t start_time,
|
|
uint32_t end_time)
|
|
{
|
|
ARG_UNUSED(pkt_priority);
|
|
|
|
net_stats_update_rx_time(iface, start_time, end_time);
|
|
}
|
|
#else
|
|
#define net_stats_update_tc_rx_time(iface, priority, start_time, end_time)
|
|
#endif /* NET_PKT_RXTIME_STATS && NET_STATISTICS */
|
|
|
|
#if defined(CONFIG_NET_PKT_RXTIME_STATS_DETAIL)
|
|
static inline void net_stats_update_tc_rx_time_detail(struct net_if *iface,
|
|
uint8_t pkt_priority,
|
|
uint32_t detail_stat[])
|
|
{
|
|
ARG_UNUSED(pkt_priority);
|
|
|
|
net_stats_update_rx_time_detail(iface, detail_stat);
|
|
}
|
|
#else
|
|
#define net_stats_update_tc_rx_time_detail(iface, pkt_priority, detail_stat)
|
|
#endif /* CONFIG_NET_PKT_RXTIME_STATS_DETAIL */
|
|
#endif /* NET_TC_COUNT > 1 */
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_POWER_MANAGEMENT) \
|
|
&& defined(CONFIG_NET_STATISTICS) && defined(CONFIG_NET_NATIVE)
|
|
static inline void net_stats_add_suspend_start_time(struct net_if *iface,
|
|
uint32_t time)
|
|
{
|
|
UPDATE_STAT(iface, stats.pm.start_time = time);
|
|
}
|
|
|
|
static inline void net_stats_add_suspend_end_time(struct net_if *iface,
|
|
uint32_t time)
|
|
{
|
|
uint32_t diff_time =
|
|
k_cyc_to_ms_floor32(time - GET_STAT(iface, pm.start_time));
|
|
|
|
UPDATE_STAT(iface, stats.pm.start_time = 0);
|
|
UPDATE_STAT(iface, stats.pm.last_suspend_time = diff_time);
|
|
UPDATE_STAT(iface, stats.pm.suspend_count++);
|
|
UPDATE_STAT(iface, stats.pm.overall_suspend_time += diff_time);
|
|
}
|
|
#else
|
|
#define net_stats_add_suspend_start_time(iface, time)
|
|
#define net_stats_add_suspend_end_time(iface, time)
|
|
#endif
|
|
|
|
#if defined(CONFIG_NET_STATISTICS_PERIODIC_OUTPUT) \
|
|
&& defined(CONFIG_NET_NATIVE)
|
|
/* A simple periodic statistic printer, used only in net core */
|
|
void net_print_statistics_all(void);
|
|
void net_print_statistics_iface(struct net_if *iface);
|
|
void net_print_statistics(void);
|
|
#else
|
|
#define net_print_statistics_all()
|
|
#define net_print_statistics_iface(iface)
|
|
#define net_print_statistics()
|
|
#endif
|
|
|
|
void net_stats_reset(struct net_if *iface);
|
|
#endif /* __NET_STATS_H__ */
|