From e3450fd0adf4d226322d9f627194f1fef6fa8a02 Mon Sep 17 00:00:00 2001 From: xiao Date: Wed, 22 Apr 2026 23:59:46 +0800 Subject: [PATCH] fix: harden tcp tasks around link readiness and connect retries --- App/tcp_client.c | 38 +++++++++++++++++++++++++++++++------- App/tcp_server.c | 7 ++----- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/App/tcp_client.c b/App/tcp_client.c index d672fc9..cf2add9 100644 --- a/App/tcp_client.c +++ b/App/tcp_client.c @@ -9,8 +9,11 @@ #include "app_runtime.h" #include "config.h" #include "debug_log.h" +#include "ethernetif.h" #include "route_msg.h" +#define TCP_CLIENT_CONNECT_TIMEOUT_MS 5000 + static err_t tcp_client_worker(struct netconn *conn, uint8_t link_index) { struct netbuf *buf; @@ -62,20 +65,15 @@ static void tcp_client_task(uint8_t link_index) err_t err; uint8_t first_connect_deferred; + netconn_thread_init(); first_connect_deferred = (link_index == CONFIG_LINK_C1) ? 1u : 0u; for (;;) { - while (g_netif_ready == pdFALSE) { + while ((g_netif_ready == pdFALSE) || (ethernetif_link_is_up() == 0u)) { vTaskDelay(pdMS_TO_TICKS(100)); } cfg = config_get(); - debug_log_printf("[CLI] idx=%u hwm=%lu en=%u lport=%u rport=%u\r\n", - (unsigned int)link_index, - (unsigned long)uxTaskGetStackHighWaterMark(NULL), - (unsigned int)cfg->links[link_index].enabled, - (unsigned int)cfg->links[link_index].local_port, - (unsigned int)cfg->links[link_index].remote_port); if (cfg->links[link_index].enabled == 0u) { vTaskDelay(pdMS_TO_TICKS(500)); continue; @@ -99,6 +97,10 @@ static void tcp_client_task(uint8_t link_index) if (cfg->links[link_index].local_port != 0u) { err = netconn_bind(conn, IP_ADDR_ANY, cfg->links[link_index].local_port); if (err != ERR_OK) { + debug_log_printf("[CLI] idx=%u bind-fail err=%d lport=%u\r\n", + (unsigned int)link_index, + (int)err, + (unsigned int)cfg->links[link_index].local_port); netconn_delete(conn); vTaskDelay(pdMS_TO_TICKS(delay_ms)); continue; @@ -111,9 +113,31 @@ static void tcp_client_task(uint8_t link_index) cfg->links[link_index].remote_ip[2], cfg->links[link_index].remote_ip[3]); + netconn_set_recvtimeout(conn, TCP_CLIENT_CONNECT_TIMEOUT_MS); err = netconn_connect(conn, &remote_ip, cfg->links[link_index].remote_port); if (err == ERR_OK) { + debug_log_printf("[CLI] idx=%u connect-ok\r\n", (unsigned int)link_index); (void)tcp_client_worker(conn, link_index); + } else { + if (err == ERR_TIMEOUT) { + debug_log_printf("[CLI] idx=%u connect-timeout ms=%u rip=%u.%u.%u.%u rport=%u\r\n", + (unsigned int)link_index, + (unsigned int)TCP_CLIENT_CONNECT_TIMEOUT_MS, + (unsigned int)cfg->links[link_index].remote_ip[0], + (unsigned int)cfg->links[link_index].remote_ip[1], + (unsigned int)cfg->links[link_index].remote_ip[2], + (unsigned int)cfg->links[link_index].remote_ip[3], + (unsigned int)cfg->links[link_index].remote_port); + } else { + debug_log_printf("[CLI] idx=%u connect-fail err=%d rip=%u.%u.%u.%u rport=%u\r\n", + (unsigned int)link_index, + (int)err, + (unsigned int)cfg->links[link_index].remote_ip[0], + (unsigned int)cfg->links[link_index].remote_ip[1], + (unsigned int)cfg->links[link_index].remote_ip[2], + (unsigned int)cfg->links[link_index].remote_ip[3], + (unsigned int)cfg->links[link_index].remote_port); + } } netconn_close(conn); diff --git a/App/tcp_server.c b/App/tcp_server.c index 58dbb7d..0c3d4a3 100644 --- a/App/tcp_server.c +++ b/App/tcp_server.c @@ -58,17 +58,14 @@ static void tcp_server_task(uint8_t link_index) struct netconn *listener; struct netconn *newconn; + netconn_thread_init(); + for (;;) { while (g_netif_ready == pdFALSE) { vTaskDelay(pdMS_TO_TICKS(100)); } cfg = config_get(); - debug_log_printf("[SRV] idx=%u hwm=%lu en=%u port=%u\r\n", - (unsigned int)link_index, - (unsigned long)uxTaskGetStackHighWaterMark(NULL), - (unsigned int)cfg->links[link_index].enabled, - (unsigned int)cfg->links[link_index].local_port); if (cfg->links[link_index].enabled == 0u) { vTaskDelay(pdMS_TO_TICKS(500)); continue;