From 72c6b6f197f9fa51dde398dc5cce25b0534a80a3 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Thu, 23 Apr 2026 20:00:09 +0300 Subject: [PATCH] Reset NAT check status on etcp_conn_reinit when session_id changes When peer's random session_id changes, etcp_conn_reinit() is called. Previously NAT check status was not reset, so route_bgp_new_conn() skipped NAT re-detection because nat_check_status was still NAT_CHECK_IN_PROGRESS from the previous session. Now etcp_conn_reinit(): - Cancels pending NAT-ping requests via route_ping_cancel_for_conn() - Resets nat_type and nat_check_status to UNKNOWN/NONE for all links This ensures NAT type is re-detected for all links after reinit. --- src/etcp.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/etcp.c b/src/etcp.c index 6968e942..1e6bfcf8 100644 --- a/src/etcp.c +++ b/src/etcp.c @@ -5,6 +5,7 @@ #include "etcp_loadbalancer.h" #include "routing.h" #include "route_bgp.h" +#include "route_ping.h" #include "../lib/u_async.h" #include "../lib/ll_queue.h" #include "../lib/debug_config.h" @@ -351,6 +352,19 @@ void etcp_conn_reinit(struct ETCP_CONN* etcp) {// Если сбой в обме etcp->initialized = 0;// еще раз придёт conn_ready_callback + // Отменяем висящие NAT-ping'и для этого соединения + if (etcp->instance && etcp->instance->bgp) { + route_ping_cancel_for_conn(etcp->instance->bgp, etcp); + } + + // Сбрасываем NAT-статус у всех линков этого соединения + struct ETCP_LINK* l = etcp->links; + while (l) { + l->nat_type = NAT_TYPE_UNKNOWN; + l->nat_check_status = NAT_CHECK_NONE; + l = l->next; + } + // Вызываем etcp_conn_reset для сброса состояния etcp_conn_reset(etcp);