From 68761527cd2711188b76a36012f9b0025e4bf9f1 Mon Sep 17 00:00:00 2001 From: ymj0440 Date: Mon, 12 Oct 2026 20:46:51 +0800 Subject: [PATCH] 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 b57e844504d..6b6429ed4b8 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)