From d178eb2908f898319fb5d2791280086901092dba Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Tue, 5 Nov 2024 16:53:24 +0200 Subject: [PATCH] net: stats: ipv4: pmtu: Add Path MTU Discovery statistics Add information about PMTU related packets received/sent/dropped for IPv4. Signed-off-by: Jukka Rissanen --- include/zephyr/net/net_stats.h | 30 ++++++++++++++++++++++++++++++ samples/net/stats/src/main.c | 7 +++++++ subsys/net/ip/Kconfig.stats | 7 +++++++ subsys/net/ip/net_stats.c | 18 ++++++++++++++++++ subsys/net/ip/net_stats.h | 23 +++++++++++++++++++++++ subsys/net/lib/shell/stats.c | 7 +++++++ 6 files changed, 92 insertions(+) diff --git a/include/zephyr/net/net_stats.h b/include/zephyr/net/net_stats.h index 93f34da6236..2fb28b6104c 100644 --- a/include/zephyr/net/net_stats.h +++ b/include/zephyr/net/net_stats.h @@ -212,6 +212,20 @@ struct net_stats_ipv6_pmtu { net_stats_t sent; }; +/** + * @brief IPv4 Path MTU Discovery statistics + */ +struct net_stats_ipv4_pmtu { + /** Number of dropped IPv4 PMTU packets. */ + net_stats_t drop; + + /** Number of received IPv4 PMTU packets. */ + net_stats_t recv; + + /** Number of sent IPv4 PMTU packets. */ + net_stats_t sent; +}; + /** * @brief IPv6 multicast listener daemon statistics */ @@ -398,6 +412,11 @@ struct net_stats { struct net_stats_ipv6_pmtu ipv6_pmtu; #endif +#if defined(CONFIG_NET_STATISTICS_IPV4_PMTU) + /** IPv4 Path MTU Discovery statistics */ + struct net_stats_ipv4_pmtu ipv4_pmtu; +#endif + #if defined(CONFIG_NET_STATISTICS_MLD) /** IPv6 MLD statistics */ struct net_stats_ipv6_mld ipv6_mld; @@ -685,6 +704,7 @@ enum net_request_stats_cmd { NET_REQUEST_STATS_CMD_GET_IPV6, NET_REQUEST_STATS_CMD_GET_IPV6_ND, NET_REQUEST_STATS_CMD_GET_IPV6_PMTU, + NET_REQUEST_STATS_CMD_GET_IPV4_PMTU, NET_REQUEST_STATS_CMD_GET_ICMP, NET_REQUEST_STATS_CMD_GET_UDP, NET_REQUEST_STATS_CMD_GET_TCP, @@ -762,6 +782,16 @@ NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_IPV6_PMTU); /** @endcond */ #endif /* CONFIG_NET_STATISTICS_IPV6_PMTU */ +#if defined(CONFIG_NET_STATISTICS_IPV4_PMTU) +/** Request IPv4 Path MTU Discovery statistics */ +#define NET_REQUEST_STATS_GET_IPV4_PMTU \ + (_NET_STATS_BASE | NET_REQUEST_STATS_CMD_GET_IPV4_PMTU) + +/** @cond INTERNAL_HIDDEN */ +NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_STATS_GET_IPV4_PMTU); +/** @endcond */ +#endif /* CONFIG_NET_STATISTICS_IPV4_PMTU */ + #if defined(CONFIG_NET_STATISTICS_ICMP) /** Request ICMPv4 and ICMPv6 statistics */ #define NET_REQUEST_STATS_GET_ICMP \ diff --git a/samples/net/stats/src/main.c b/samples/net/stats/src/main.c index f6e35a89e90..fdfb7e4339c 100644 --- a/samples/net/stats/src/main.c +++ b/samples/net/stats/src/main.c @@ -74,6 +74,13 @@ static void print_stats(struct net_if *iface, struct net_stats *data) GET_STAT(iface, ip_errors.chkerr), GET_STAT(iface, ip_errors.protoerr)); +#if defined(CONFIG_NET_IPV4_PMTU) + printk("IPv4 PMTU recv %d\tsent\t%d\tdrop\t%d\n", + GET_STAT(iface, ipv4_pmtu.recv), + GET_STAT(iface, ipv4_pmtu.sent), + GET_STAT(iface, ipv4_pmtu.drop)); +#endif /* CONFIG_NET_IPV4_PMTU */ + printk("ICMP recv %d\tsent\t%d\tdrop\t%d\n", GET_STAT(iface, icmp.recv), GET_STAT(iface, icmp.sent), diff --git a/subsys/net/ip/Kconfig.stats b/subsys/net/ip/Kconfig.stats index 9851e5063fd..cdd59c11685 100644 --- a/subsys/net/ip/Kconfig.stats +++ b/subsys/net/ip/Kconfig.stats @@ -64,6 +64,13 @@ config NET_STATISTICS_IPV6_PMTU help Keep track of IPv6 Path MTU Discovery related statistics +config NET_STATISTICS_IPV4_PMTU + bool "IPv4 PMTU statistics" + depends on NET_IPV4_PMTU + default y + help + Keep track of IPv4 Path MTU Discovery related statistics + config NET_STATISTICS_ICMP bool "ICMP statistics" depends on NET_IPV6 || NET_IPV4 diff --git a/subsys/net/ip/net_stats.c b/subsys/net/ip/net_stats.c index ab6d7855ee0..69579b9ec6f 100644 --- a/subsys/net/ip/net_stats.c +++ b/subsys/net/ip/net_stats.c @@ -122,6 +122,13 @@ static inline void stats(struct net_if *iface) GET_STAT(iface, ip_errors.chkerr), GET_STAT(iface, ip_errors.protoerr)); +#if defined(CONFIG_NET_STATISTICS_IPV4_PMTU) + NET_INFO("IPv4 PMTU recv %d\tsent\t%d\tdrop\t%d", + GET_STAT(iface, ipv4_pmtu.recv), + GET_STAT(iface, ipv4_pmtu.sent), + GET_STAT(iface, ipv4_pmtu.drop)); +#endif /* CONFIG_NET_STATISTICS_IPV4_PMTU */ + NET_INFO("ICMP recv %d\tsent\t%d\tdrop\t%d", GET_STAT(iface, icmp.recv), GET_STAT(iface, icmp.sent), @@ -291,6 +298,12 @@ static int net_stats_get(uint32_t mgmt_request, struct net_if *iface, src = GET_STAT_ADDR(iface, ipv6_pmtu); break; #endif +#if defined(CONFIG_NET_STATISTICS_IPV4_PMTU) + case NET_REQUEST_STATS_CMD_GET_IPV4_PMTU: + len_chk = sizeof(struct net_stats_ipv4_pmtu); + src = GET_STAT_ADDR(iface, ipv4_pmtu); + break; +#endif #if defined(CONFIG_NET_STATISTICS_ICMP) case NET_REQUEST_STATS_CMD_GET_ICMP: len_chk = sizeof(struct net_stats_icmp); @@ -358,6 +371,11 @@ NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_IPV6_PMTU, net_stats_get); #endif +#if defined(CONFIG_NET_STATISTICS_IPV4_PMTU) +NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_IPV4_PMTU, + net_stats_get); +#endif + #if defined(CONFIG_NET_STATISTICS_ICMP) NET_MGMT_REGISTER_REQUEST_HANDLER(NET_REQUEST_STATS_GET_ICMP, net_stats_get); diff --git a/subsys/net/ip/net_stats.h b/subsys/net/ip/net_stats.h index 54ae8ff3773..60777d06f1e 100644 --- a/subsys/net/ip/net_stats.h +++ b/subsys/net/ip/net_stats.h @@ -136,6 +136,29 @@ static inline void net_stats_update_ipv6_pmtu_drop(struct net_if *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 */ diff --git a/subsys/net/lib/shell/stats.c b/subsys/net/lib/shell/stats.c index 3bd7f09a6d8..3556ec0269a 100644 --- a/subsys/net/lib/shell/stats.c +++ b/subsys/net/lib/shell/stats.c @@ -498,6 +498,13 @@ static void net_shell_print_statistics(struct net_if *iface, void *user_data) GET_STAT(iface, ip_errors.chkerr), GET_STAT(iface, ip_errors.protoerr)); +#if defined(CONFIG_NET_STATISTICS_IPV4_PMTU) + PR("IPv4 PMTU recv %d\tsent\t%d\tdrop\t%d\n", + GET_STAT(iface, ipv4_pmtu.recv), + GET_STAT(iface, ipv4_pmtu.sent), + GET_STAT(iface, ipv4_pmtu.drop)); +#endif /* CONFIG_NET_STATISTICS_IPV4_PMTU */ + #if defined(CONFIG_NET_STATISTICS_ICMP) && defined(CONFIG_NET_NATIVE_IPV4) PR("ICMP recv %d\tsent\t%d\tdrop\t%d\n", GET_STAT(iface, icmp.recv),