fix: stop network tasks cleanly on restart
This commit is contained in:
+66
-5
@@ -11,6 +11,32 @@
|
||||
#include "debug_log.h"
|
||||
#include "route_msg.h"
|
||||
|
||||
#define TCP_SERVER_ACCEPT_TIMEOUT_MS 100
|
||||
#define TCP_SERVER_STOP_POLL_MS 50u
|
||||
|
||||
static BaseType_t tcp_server_stop_requested(void)
|
||||
{
|
||||
return (app_network_task_stop_requested() != pdFALSE) ? pdTRUE : pdFALSE;
|
||||
}
|
||||
|
||||
static BaseType_t tcp_server_delay_with_stop(uint32_t delay_ms)
|
||||
{
|
||||
uint32_t remaining_ms = delay_ms;
|
||||
|
||||
while (remaining_ms > 0u) {
|
||||
uint32_t slice_ms = (remaining_ms > TCP_SERVER_STOP_POLL_MS) ? TCP_SERVER_STOP_POLL_MS : remaining_ms;
|
||||
|
||||
if (tcp_server_stop_requested() != pdFALSE) {
|
||||
return pdFALSE;
|
||||
}
|
||||
|
||||
vTaskDelay(pdMS_TO_TICKS(slice_ms));
|
||||
remaining_ms -= slice_ms;
|
||||
}
|
||||
|
||||
return (tcp_server_stop_requested() == pdFALSE) ? pdTRUE : pdFALSE;
|
||||
}
|
||||
|
||||
static err_t tcp_server_worker(struct netconn *conn, uint8_t link_index)
|
||||
{
|
||||
struct netbuf *buf;
|
||||
@@ -24,6 +50,10 @@ static err_t tcp_server_worker(struct netconn *conn, uint8_t link_index)
|
||||
netconn_set_recvtimeout(conn, 10);
|
||||
|
||||
for (;;) {
|
||||
if (tcp_server_stop_requested() != pdFALSE) {
|
||||
return ERR_CLSD;
|
||||
}
|
||||
|
||||
err = netconn_recv(conn, &buf);
|
||||
if (err == ERR_OK) {
|
||||
do {
|
||||
@@ -47,11 +77,19 @@ static err_t tcp_server_worker(struct netconn *conn, uint8_t link_index)
|
||||
}
|
||||
} while (netbuf_next(buf) >= 0);
|
||||
netbuf_delete(buf);
|
||||
} else if (err != ERR_TIMEOUT) {
|
||||
} else if (err == ERR_TIMEOUT) {
|
||||
if (tcp_server_stop_requested() != pdFALSE) {
|
||||
return ERR_CLSD;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
while (xQueueReceive(xLinkTxQueues[link_index], &tx_msg, 0) == pdPASS) {
|
||||
if (tcp_server_stop_requested() != pdFALSE) {
|
||||
route_msg_free(tx_msg);
|
||||
return ERR_CLSD;
|
||||
}
|
||||
err = netconn_write(conn, tx_msg->data, tx_msg->len, NETCONN_COPY);
|
||||
route_msg_free(tx_msg);
|
||||
if (err != ERR_OK) {
|
||||
@@ -72,31 +110,49 @@ static void tcp_server_task(uint8_t link_index)
|
||||
netconn_thread_init();
|
||||
|
||||
for (;;) {
|
||||
if (tcp_server_stop_requested() != pdFALSE) {
|
||||
break;
|
||||
}
|
||||
|
||||
while (g_netif_ready == pdFALSE) {
|
||||
if (tcp_server_stop_requested() != pdFALSE) {
|
||||
goto exit_task;
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
}
|
||||
|
||||
cfg = config_get();
|
||||
if (cfg->links[link_index].enabled == 0u) {
|
||||
vTaskDelay(pdMS_TO_TICKS(500));
|
||||
if (tcp_server_stop_requested() != pdFALSE) {
|
||||
break;
|
||||
}
|
||||
if (tcp_server_delay_with_stop(500u) == pdFALSE) {
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
listener = netconn_new(NETCONN_TCP);
|
||||
if (listener == NULL) {
|
||||
vTaskDelay(pdMS_TO_TICKS(500));
|
||||
if (tcp_server_delay_with_stop(500u) == pdFALSE) {
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
netconn_set_recvtimeout(listener, TCP_SERVER_ACCEPT_TIMEOUT_MS);
|
||||
|
||||
if (netconn_bind(listener, IP_ADDR_ANY, cfg->links[link_index].local_port) != ERR_OK ||
|
||||
netconn_listen(listener) != ERR_OK) {
|
||||
netconn_delete(listener);
|
||||
vTaskDelay(pdMS_TO_TICKS(500));
|
||||
if (tcp_server_delay_with_stop(500u) == pdFALSE) {
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
if (cfg->links[link_index].enabled == 0u) {
|
||||
if (tcp_server_stop_requested() != pdFALSE || cfg->links[link_index].enabled == 0u) {
|
||||
break;
|
||||
}
|
||||
if (netconn_accept(listener, &newconn) == ERR_OK) {
|
||||
@@ -109,6 +165,11 @@ static void tcp_server_task(uint8_t link_index)
|
||||
netconn_close(listener);
|
||||
netconn_delete(listener);
|
||||
}
|
||||
|
||||
exit_task:
|
||||
netconn_thread_cleanup();
|
||||
app_on_network_task_exit(xTaskGetCurrentTaskHandle());
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
|
||||
void TcpSrvTask_S1(void *argument)
|
||||
|
||||
Reference in New Issue
Block a user