From a72e514dc5a3783b884998caeeb527a21e453c8f Mon Sep 17 00:00:00 2001 From: evgeny Date: Sat, 17 Oct 2026 23:38:52 +0200 Subject: [PATCH] fix(nat): keep fresh ingress checks active during profile rechecks --- doc/nat_detection.txt | 5 +++++ src/routing_layer/nat_detection.c | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/doc/nat_detection.txt b/doc/nat_detection.txt index 53c9e8b7..cba89420 100644 --- a/doc/nat_detection.txt +++ b/doc/nat_detection.txt @@ -77,6 +77,11 @@ IP:порт тестового сокета на том же локальном Уже знакомый помощник пригоден для измерения типа NAT, хотя проверить незнакомый вход через него нельзя. Потеря результата входящих не останавливает сравнение адресов через доступные публичные узлы; ожидание одного этапа ограничено по времени. +Измеренный mapping сохраняется сразу, а проверка незнакомого входа продолжается +через остальных помощников. Порядок обхода фиксирован на его начало; фактический +source всегда проверяется по актуальной истории. При паузе по общему бюджету +незавершённая попытка повторяется с новыми идентификаторами, без сброса обхода. +Старый сохранённый результат входящих не считается успехом новой проверки. Соединения по LAN работают независимо и не сбрасывают интернет-профиль. Если доступны только локальные узлы, измерить тип интернет-NAT для UDP нельзя. diff --git a/src/routing_layer/nat_detection.c b/src/routing_layer/nat_detection.c index 48bfc789..bdad12f6 100644 --- a/src/routing_layer/nat_detection.c +++ b/src/routing_layer/nat_detection.c @@ -1421,7 +1421,8 @@ uint64_t nat_detection_probe_delay(struct NAT_DETECTION *detector) { if (state->socket->is_tcp || !state->reservation_fingerprint || state->cold_until <= now || (!detector->automatic && !state->phase && !state->forced) || (state->completed_tb && !state->phase && !state->cycling && !state->forced && state->due > now + 2500) || - (state->measured_profile.source == ADDRESS_SOURCE_ETCP && state->measured_profile.mapping && state->measured_profile.inbound)) + (!state->phase && !state->cycling && !state->forced && state->measured_profile.source == ADDRESS_SOURCE_ETCP && + state->measured_profile.mapping && state->measured_profile.inbound)) continue; if (state->cold_until - now > delay) delay = state->cold_until - now; } @@ -1437,7 +1438,8 @@ int nat_detection_ping_allowed(struct NAT_DETECTION *detector, struct ETCP_SOCKE if (!state || (!state->reservation_fingerprint && !state->available_fingerprint) || state->cold_until <= get_time_tb() || (!detector->automatic && !state->phase && !state->forced) || (state->completed_tb && !state->phase && !state->cycling && !state->forced && state->due > get_time_tb() + 2500) || - (state->measured_profile.source == ADDRESS_SOURCE_ETCP && state->measured_profile.mapping && state->measured_profile.inbound)) return 1; + (!state->phase && !state->cycling && !state->forced && state->measured_profile.source == ADDRESS_SOURCE_ETCP && + state->measured_profile.mapping && state->measured_profile.inbound)) return 1; uint64_t peer = sc_derive_node_id_from_pubkey(peer_key); if (!(flags & ETCP_PING_FLAG_OBSERVE)) { history_load(state);