fix(tcp): MUX模式网口失联 — 对端关闭时用tcp_abort替代tcp_close避免TIME_WAIT耗尽pcb池
根因: tcp_close()将对端关闭的pcb推入TIME_WAIT(120s), 占用MEMP_TCP_PCB池(仅4个), 多连接同时断开后pcb池耗尽, tcp_new()返回NULL, 新连接无法建立直到120s超时释放。 核心修复: - tcp_server/client: 对端关闭(p=NULL)时tcp_abort替代tcp_close, pcb立即释放 - ch390_runtime: PKT_ERR恢复强制OR上RCR_RXEN(与WCH官方一致) - ch390_runtime: TX连续超时3次自动emergency reset - ch390_runtime: 每5秒health_check读VID验证芯片存活 - main: App_StartLinksIfNeeded失败时不标记g_links_started, 允许重试 - main: MUX逐帧RTT printf改为#if DEBUG门控, 减少主循环延迟 - uart_trans: MUX帧解析改为先搜0x7E再消费header, 非法帧只丢1字节
This commit is contained in:
+5
-5
@@ -52,12 +52,10 @@ static err_t tcp_server_on_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p,
|
||||
tcp_recv(pcb, NULL);
|
||||
tcp_sent(pcb, NULL);
|
||||
tcp_err(pcb, NULL);
|
||||
if (tcp_close(pcb) != ERR_OK) {
|
||||
tcp_abort(pcb);
|
||||
}
|
||||
tcp_abort(pcb);
|
||||
ctx->client_pcb = NULL;
|
||||
ctx->status.state = ctx->config.enabled ? TCP_SERVER_STATE_LISTENING : TCP_SERVER_STATE_IDLE;
|
||||
return ERR_OK;
|
||||
return ERR_ABRT;
|
||||
}
|
||||
|
||||
for (q = p; q != NULL; q = q->next) {
|
||||
@@ -205,7 +203,9 @@ int tcp_server_stop(uint8_t instance)
|
||||
if (ctx->listen_pcb != NULL) {
|
||||
tcp_arg(ctx->listen_pcb, NULL);
|
||||
tcp_accept(ctx->listen_pcb, NULL);
|
||||
tcp_close(ctx->listen_pcb);
|
||||
if (tcp_close(ctx->listen_pcb) != ERR_OK) {
|
||||
tcp_abort(ctx->listen_pcb);
|
||||
}
|
||||
ctx->listen_pcb = NULL;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user