|
|
|
|
@ -450,9 +450,8 @@ void route_connectivity_probe_node(struct UTUN_INSTANCE* instance, struct TOPO_G
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Отсоединяет все влётные пробы узла: зануляет ctx->nq (чтобы conn_probe_finish не
|
|
|
|
|
* трогал освобождаемый nq) и досрочно закрывает влётные TCP-пинги. UDP-пробы не имеют |
|
|
|
|
* хендла — они отсоединяются и освобождаются своим штатным ping_timeout/PONG. */ |
|
|
|
|
/* Отменяет все пробы узла и освобождает контексты до закрытия сокетов/группы.
|
|
|
|
|
* TCP destroy вызывает callback; UDP cancel удаляет pending без callback. */ |
|
|
|
|
static void conn_probe_cancel_nq(struct TOPO_GROUP_NODE* nq) { |
|
|
|
|
if (!nq) return; |
|
|
|
|
struct route_nat_defer *deferred = nq->connectivity.nat_probe_wait; |
|
|
|
|
@ -478,6 +477,7 @@ static void conn_probe_cancel_nq(struct TOPO_GROUP_NODE* nq) {
|
|
|
|
|
ctx->nq = NULL; |
|
|
|
|
struct stcp_client* cli = ctx->tcp_cli; |
|
|
|
|
if (cli) stcp_client_destroy(cli); // синхронно: ping_close_cb → conn_probe_finish → u_free(ctx)
|
|
|
|
|
else { etcp_cancel_pings(ctx->instance, conn_probe_single_cb, ctx); u_free(ctx); } |
|
|
|
|
ctx = next; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|