fix: harden tcp tasks around link readiness and connect retries
This commit is contained in:
+31
-7
@@ -9,8 +9,11 @@
|
|||||||
#include "app_runtime.h"
|
#include "app_runtime.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "debug_log.h"
|
#include "debug_log.h"
|
||||||
|
#include "ethernetif.h"
|
||||||
#include "route_msg.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)
|
static err_t tcp_client_worker(struct netconn *conn, uint8_t link_index)
|
||||||
{
|
{
|
||||||
struct netbuf *buf;
|
struct netbuf *buf;
|
||||||
@@ -62,20 +65,15 @@ static void tcp_client_task(uint8_t link_index)
|
|||||||
err_t err;
|
err_t err;
|
||||||
uint8_t first_connect_deferred;
|
uint8_t first_connect_deferred;
|
||||||
|
|
||||||
|
netconn_thread_init();
|
||||||
first_connect_deferred = (link_index == CONFIG_LINK_C1) ? 1u : 0u;
|
first_connect_deferred = (link_index == CONFIG_LINK_C1) ? 1u : 0u;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
while (g_netif_ready == pdFALSE) {
|
while ((g_netif_ready == pdFALSE) || (ethernetif_link_is_up() == 0u)) {
|
||||||
vTaskDelay(pdMS_TO_TICKS(100));
|
vTaskDelay(pdMS_TO_TICKS(100));
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg = config_get();
|
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) {
|
if (cfg->links[link_index].enabled == 0u) {
|
||||||
vTaskDelay(pdMS_TO_TICKS(500));
|
vTaskDelay(pdMS_TO_TICKS(500));
|
||||||
continue;
|
continue;
|
||||||
@@ -99,6 +97,10 @@ static void tcp_client_task(uint8_t link_index)
|
|||||||
if (cfg->links[link_index].local_port != 0u) {
|
if (cfg->links[link_index].local_port != 0u) {
|
||||||
err = netconn_bind(conn, IP_ADDR_ANY, cfg->links[link_index].local_port);
|
err = netconn_bind(conn, IP_ADDR_ANY, cfg->links[link_index].local_port);
|
||||||
if (err != ERR_OK) {
|
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);
|
netconn_delete(conn);
|
||||||
vTaskDelay(pdMS_TO_TICKS(delay_ms));
|
vTaskDelay(pdMS_TO_TICKS(delay_ms));
|
||||||
continue;
|
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[2],
|
||||||
cfg->links[link_index].remote_ip[3]);
|
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);
|
err = netconn_connect(conn, &remote_ip, cfg->links[link_index].remote_port);
|
||||||
if (err == ERR_OK) {
|
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);
|
(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);
|
netconn_close(conn);
|
||||||
|
|||||||
+2
-5
@@ -58,17 +58,14 @@ static void tcp_server_task(uint8_t link_index)
|
|||||||
struct netconn *listener;
|
struct netconn *listener;
|
||||||
struct netconn *newconn;
|
struct netconn *newconn;
|
||||||
|
|
||||||
|
netconn_thread_init();
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
while (g_netif_ready == pdFALSE) {
|
while (g_netif_ready == pdFALSE) {
|
||||||
vTaskDelay(pdMS_TO_TICKS(100));
|
vTaskDelay(pdMS_TO_TICKS(100));
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg = config_get();
|
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) {
|
if (cfg->links[link_index].enabled == 0u) {
|
||||||
vTaskDelay(pdMS_TO_TICKS(500));
|
vTaskDelay(pdMS_TO_TICKS(500));
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
Reference in New Issue
Block a user