From dfc25cfff045ec2d58708a33f91d16cb21459ca7 Mon Sep 17 00:00:00 2001 From: ymj0440 Date: Sun, 11 Oct 2026 22:24:12 +0800 Subject: [PATCH 1/2] fix(netdev): avoid division by zero in ping statistics when all packets lost --- components/net/netdev/src/netdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index 5a4056b97a7b..b57e844504db 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -1425,12 +1425,12 @@ int netdev_cmd_ping(char* target_name, char *netdev_name, rt_uint32_t times, rt_ /* print ping statistics */ loss = (uint32_t)((1 - ((float)received) / index) * 100); - avg_time = (uint32_t)(avg_time / received); rt_kprintf("\n--- %s ping statistics ---\n", inet_ntoa(ping_resp.ip_addr)); rt_kprintf("%d packets transmitted, %d received, %d%% packet loss\n", index, received, loss); if (received > 0) { + avg_time = (uint32_t)(avg_time / received); rt_kprintf("minimum = %dms, maximum = %dms, average = %dms\n", min_time, max_time, avg_time); } From f241103cba8af69bc613235e4733d4d32c1cca53 Mon Sep 17 00:00:00 2001 From: ymj0440 Date: Mon, 12 Oct 2026 20:46:51 +0800 Subject: [PATCH 2/2] fix(netdev): correct ping delay logic for last packet and avoid rt_thread_delay(0) The 'index == times' condition in the delay_tick calculation is never true, so the delay was still applied after the last ping, contrary to the comment. Skip the delay on the final ping by checking 'index != times - 1'. Also only call rt_thread_delay() when delay_tick > 0, since passing 0 returns -RT_EINVAL. --- components/net/netdev/src/netdev.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index b57e844504db..6b6429ed4b86 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -1371,8 +1371,7 @@ int netdev_cmd_ping(char* target_name, char *netdev_name, rt_uint32_t times, rt_ min_time = 0xFFFFFFFF; for (index = 0; index < times; index++) { - int delay_tick = 0; - rt_tick_t start_tick = 0; + rt_tick_t start_tick = 0, cost_tick = 0, delay_tick = 0; rt_memset(&ping_resp, 0x00, sizeof(struct netdev_ping_resp)); start_tick = rt_tick_get(); @@ -1413,8 +1412,19 @@ int netdev_cmd_ping(char* target_name, char *netdev_name, rt_uint32_t times, rt_ } /* if the response time is more than NETDEV_PING_DELAY, no need to delay */ - delay_tick = ((rt_tick_get() - start_tick) > NETDEV_PING_DELAY) || (index == times) ? 0 : NETDEV_PING_DELAY; - rt_thread_delay(delay_tick); + cost_tick = rt_tick_get() - start_tick; + if (index != times - 1) + { + if (cost_tick < NETDEV_PING_DELAY) + { + delay_tick = NETDEV_PING_DELAY - cost_tick; + } + } + + if (delay_tick > 0) + { + rt_thread_delay(delay_tick); + } } if (times == 0)