Browse Source

tcp_proxy_client: skip tcp_shutdown on TIME_WAIT/CLOSED pcb

handle_fin вызывает tcp_shutdown(pcb,0,1) на любом PCB, включая TIME_WAIT.
При active close (FIN_WAIT_1→FIN_WAIT_2→TIME_WAIT) PCB уже в tw_pcbs,
tcp_shutdown на нём портит состояние → tw_pcbs зацикливается → lwip_tcp_input зависает.

Проверка state != TIME_WAIT && != CLOSED перед вызовом.
etcp-inflight-fix
Evgeny 4 months ago
parent
commit
483bf440fb
  1. 3
      src/proxy/tcp_proxy_client.c

3
src/proxy/tcp_proxy_client.c

@ -470,7 +470,8 @@ static void tcp_proxy_client_handle_fin(struct tcp_proxy_client* p, uint32_t str
if (!pc || !pc->pcb) return; if (!pc || !pc->pcb) return;
DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "PROXY FIN FROM exit sid=%08x — shutdown read", stream_id); DEBUG_INFO(DEBUG_CATEGORY_SOCKET, "PROXY FIN FROM exit sid=%08x — shutdown read", stream_id);
pc->fin_remote = 1; pc->fin_remote = 1;
tcp_shutdown(pc->pcb, 0, 1); if (pc->pcb->state != TIME_WAIT && pc->pcb->state != CLOSED)
tcp_shutdown(pc->pcb, 0, 1);
if (pc->fin_local && !pc->close_sent && !pc->close_pending) if (pc->fin_local && !pc->close_sent && !pc->close_pending)
tcp_proxy_client_send_close(pc); tcp_proxy_client_send_close(pc);
} }

Loading…
Cancel
Save