/* * Copyright (c) 2016 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ #if defined(CONFIG_NET_STATISTICS_PERIODIC_OUTPUT) #define SYS_LOG_DOMAIN "net/stats" #define NET_SYS_LOG_LEVEL SYS_LOG_LEVEL_INFO #define NET_LOG_ENABLED 1 #endif #include #include #include #include #include "net_stats.h" struct net_stats net_stats; #ifdef CONFIG_NET_STATISTICS_PERIODIC_OUTPUT #define PRINT_STATISTICS_INTERVAL (30 * MSEC_PER_SEC) static inline void stats(void) { static s64_t next_print; s64_t curr = k_uptime_get(); if (!next_print || (next_print < curr && (!((curr - next_print) > PRINT_STATISTICS_INTERVAL)))) { s64_t new_print; #if defined(CONFIG_NET_STATISTICS_IPV6) NET_INFO("IPv6 recv %d\tsent\t%d\tdrop\t%d\tforwarded\t%d", GET_STAT(ipv6.recv), GET_STAT(ipv6.sent), GET_STAT(ipv6.drop), GET_STAT(ipv6.forwarded)); #if defined(CONFIG_NET_STATISTICS_IPV6_ND) NET_INFO("IPv6 ND recv %d\tsent\t%d\tdrop\t%d", GET_STAT(ipv6_nd.recv), GET_STAT(ipv6_nd.sent), GET_STAT(ipv6_nd.drop)); #endif /* CONFIG_NET_STATISTICS_IPV6_ND */ #if defined(CONFIG_NET_STATISTICS_MLD) NET_INFO("IPv6 MLD recv %d\tsent\t%d\tdrop\t%d", GET_STAT(ipv6_mld.recv), GET_STAT(ipv6_mld.sent), GET_STAT(ipv6_mld.drop)); #endif /* CONFIG_NET_STATISTICS_MLD */ #endif /* CONFIG_NET_STATISTICS_IPV6 */ #if defined(CONFIG_NET_STATISTICS_IPV4) NET_INFO("IPv4 recv %d\tsent\t%d\tdrop\t%d\tforwarded\t%d", GET_STAT(ipv4.recv), GET_STAT(ipv4.sent), GET_STAT(ipv4.drop), GET_STAT(ipv4.forwarded)); #endif /* CONFIG_NET_STATISTICS_IPV4 */ NET_INFO("IP vhlerr %d\thblener\t%d\tlblener\t%d", GET_STAT(ip_errors.vhlerr), GET_STAT(ip_errors.hblenerr), GET_STAT(ip_errors.lblenerr)); NET_INFO("IP fragerr %d\tchkerr\t%d\tprotoer\t%d", GET_STAT(ip_errors.fragerr), GET_STAT(ip_errors.chkerr), GET_STAT(ip_errors.protoerr)); NET_INFO("ICMP recv %d\tsent\t%d\tdrop\t%d", GET_STAT(icmp.recv), GET_STAT(icmp.sent), GET_STAT(icmp.drop)); NET_INFO("ICMP typeer %d\tchkerr\t%d", GET_STAT(icmp.typeerr), GET_STAT(icmp.chkerr)); #if defined(CONFIG_NET_STATISTICS_UDP) NET_INFO("UDP recv %d\tsent\t%d\tdrop\t%d", GET_STAT(udp.recv), GET_STAT(udp.sent), GET_STAT(udp.drop)); NET_INFO("UDP chkerr %d", GET_STAT(udp.chkerr)); #endif #if defined(CONFIG_NET_STATISTICS_TCP) NET_INFO("TCP bytes recv %u\tsent\t%d", GET_STAT(tcp.bytes.received), GET_STAT(tcp.bytes.sent)); NET_INFO("TCP seg recv %d\tsent\t%d\tdrop\t%d", GET_STAT(tcp.recv), GET_STAT(tcp.sent), GET_STAT(tcp.drop)); NET_INFO("TCP seg resent %d\tchkerr\t%d\tackerr\t%d", GET_STAT(tcp.resent), GET_STAT(tcp.chkerr), GET_STAT(tcp.ackerr)); NET_INFO("TCP seg rsterr %d\trst\t%d\tre-xmit\t%d", GET_STAT(tcp.rsterr), GET_STAT(tcp.rst), GET_STAT(tcp.rexmit)); NET_INFO("TCP conn drop %d\tconnrst\t%d", GET_STAT(tcp.conndrop), GET_STAT(tcp.connrst)); #endif #if defined(CONFIG_NET_STATISTICS_RPL) NET_INFO("RPL DIS recv %d\tsent\t%d\tdrop\t%d", GET_STAT(rpl.dis.recv), GET_STAT(rpl.dis.sent), GET_STAT(rpl.dis.drop)); NET_INFO("RPL DIO recv %d\tsent\t%d\tdrop\t%d", GET_STAT(rpl.dio.recv), GET_STAT(rpl.dio.sent), GET_STAT(rpl.dio.drop)); NET_INFO("RPL DAO recv %d\tsent\t%d\tdrop\t%d\tforwarded\t%d", GET_STAT(rpl.dao.recv), GET_STAT(rpl.dao.sent), GET_STAT(rpl.dao.drop), GET_STAT(rpl.dao.forwarded)); NET_INFO("RPL DAOACK rcv %d\tsent\t%d\tdrop\t%d", GET_STAT(rpl.dao_ack.recv), GET_STAT(rpl.dao_ack.sent), GET_STAT(rpl.dao_ack.drop)); NET_INFO("RPL overflows %d\tl-repairs\t%d\tg-repairs\t%d", GET_STAT(rpl.mem_overflows), GET_STAT(rpl.local_repairs), GET_STAT(rpl.global_repairs)); NET_INFO("RPL malformed %d\tresets \t%d\tp-switch\t%d", GET_STAT(rpl.malformed_msgs), GET_STAT(rpl.resets), GET_STAT(rpl.parent_switch)); NET_INFO("RPL f-errors %d\tl-errors\t%d\tl-warnings\t%d", GET_STAT(rpl.forward_errors), GET_STAT(rpl.loop_errors), GET_STAT(rpl.loop_warnings)); NET_INFO("RPL r-repairs %d", GET_STAT(rpl.root_repairs)); #endif /* CONFIG_NET_STATISTICS_RPL */ NET_INFO("Bytes received %u", GET_STAT(bytes.received)); NET_INFO("Bytes sent %u", GET_STAT(bytes.sent)); NET_INFO("Processing err %d", GET_STAT(processing_error)); new_print = curr + PRINT_STATISTICS_INTERVAL; if (new_print > curr) { next_print = new_print; } else { /* Overflow */ next_print = PRINT_STATISTICS_INTERVAL - (LLONG_MAX - curr); } } } void net_print_statistics(void) { /* In order to make the info print lines shorter, use shorter * function name. */ stats(); } #endif /* CONFIG_NET_STATISTICS_PERIODIC_OUTPUT */ #if defined(CONFIG_NET_STATISTICS_USER_API) static int net_stats_get(u32_t mgmt_request, struct net_if *iface, void *data, size_t len) { size_t len_chk = 0; void *src = NULL; ARG_UNUSED(iface); switch (NET_MGMT_GET_COMMAND(mgmt_request)) { case NET_REQUEST_STATS_CMD_GET_ALL: len_chk = sizeof(struct net_stats); src = &net_stats; break; case NET_REQUEST_STATS_CMD_GET_PROCESSING_ERROR: len_chk = sizeof(net_stats_t); src = &net_stats.processing_error; break; case NET_REQUEST_STATS_CMD_GET_BYTES: len_chk = sizeof(struct net_stats_bytes); src = &net_stats.bytes; break; case NET_REQUEST_STATS_CMD_GET_IP_ERRORS: len_chk = sizeof(struct net_stats_ip_errors); src = &net_stats.ip_errors; break; #if defined(CONFIG_NET_STATISTICS_IPV4) case NET_REQUEST_STATS_CMD_GET_IPV4: len_chk = sizeof(struct net_stats_ip); src = &net_stats.ipv4; break; #endif #if defined(CONFIG_NET_STATISTICS_IPV6) case NET_REQUEST_STATS_CMD_GET_IPV6: len_chk = sizeof(struct net_stats_ip); src = &net_stats.ipv6; break; #endif #if defined(CONFIG_NET_STATISTICS_IPV6_ND) case NET_REQUEST_STATS_CMD_GET_IPV6_ND: len_chk = sizeof(struct net_stats_ipv6_nd); src = &net_stats.ipv6_nd; break; #endif #if defined(CONFIG_NET_STATISTICS_ICMP) case NET_REQUEST_STATS_CMD_GET_ICMP: len_chk = sizeof(struct net_stats_icmp); src = &net_stats.icmp; break; #endif #if defined(CONFIG_NET_STATISTICS_UDP) case NET_REQUEST_STATS_CMD_GET_UDP: len_chk = sizeof(struct net_stats_udp); src = &net_stats.udp; break; #endif #if defined(CONFIG_NET_STATISTICS_TCP) case NET_REQUEST_STATS_CMD_GET_TCP: len_chk = sizeof(struct net_stats_tcp); src = &net_stats.tcp; break; #endif #if defined(CONFIG_NET_STATISTICS_RPL) case NET_REQUEST_STATS_CMD_GET_RPL: len_chk = sizeof(struct net_stats_rpl); src = &net_stats.rpl; break; #endif } if (len != len_chk || !src) { return -EINVAL; } memcpy(src, data, len); return 0; } NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_ALL, net_stats_get); NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_PROCESSING_ERROR, net_stats_get); NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_BYTES, net_stats_get); NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_IP_ERRORS, net_stats_get); #if defined(CONFIG_NET_STATISTICS_IPV4) NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_IPV4, net_stats_get); #endif #if defined(CONFIG_NET_STATISTICS_IPV6) NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_IPV6, net_stats_get); #endif #if defined(CONFIG_NET_STATISTICS_IPV6_ND) NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_IPV6_ND, net_stats_get); #endif #if defined(CONFIG_NET_STATISTICS_ICMP) NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_ICMP, net_stats_get); #endif #if defined(CONFIG_NET_STATISTICS_UDP) NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_UDP, net_stats_get); #endif #if defined(CONFIG_NET_STATISTICS_TCP) NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_TCP, net_stats_get); #endif #if defined(CONFIG_NET_STATISTICS_RPL) NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_RPL, net_stats_get); #endif #endif /* CONFIG_NET_STATISTICS_USER_API */