fix(nat): keep fresh ingress checks active during profile rechecks

This commit is contained in:
evgeny committed 2026-10-17 23:38:52 +02:00
1 parent 6ad3674904
commit a72e514dc5
2 files changed
+9 -2

No files matched your search

+5
View File
@@ -77,6 +77,11 @@ IP:порт тестового сокета на том же локальном
Уже знакомый помощник пригоден для измерения типа NAT, хотя проверить незнакомый Уже знакомый помощник пригоден для измерения типа NAT, хотя проверить незнакомый
вход через него нельзя. Потеря результата входящих не останавливает сравнение вход через него нельзя. Потеря результата входящих не останавливает сравнение
адресов через доступные публичные узлы; ожидание одного этапа ограничено по времени. адресов через доступные публичные узлы; ожидание одного этапа ограничено по времени.
Измеренный mapping сохраняется сразу, а проверка незнакомого входа продолжается
через остальных помощников. Порядок обхода фиксирован на его начало; фактический
source всегда проверяется по актуальной истории. При паузе по общему бюджету
незавершённая попытка повторяется с новыми идентификаторами, без сброса обхода.
Старый сохранённый результат входящих не считается успехом новой проверки.
Соединения по LAN работают независимо и не сбрасывают интернет-профиль. Соединения по LAN работают независимо и не сбрасывают интернет-профиль.
Если доступны только локальные узлы, измерить тип интернет-NAT для UDP нельзя. Если доступны только локальные узлы, измерить тип интернет-NAT для UDP нельзя.
+4 -2
View File
@@ -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 || if (state->socket->is_tcp || !state->reservation_fingerprint || state->cold_until <= now ||
(!detector->automatic && !state->phase && !state->forced) || (!detector->automatic && !state->phase && !state->forced) ||
(state->completed_tb && !state->phase && !state->cycling && !state->forced && state->due > now + 2500) || (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; continue;
if (state->cold_until - now > delay) delay = state->cold_until - now; 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() || if (!state || (!state->reservation_fingerprint && !state->available_fingerprint) || state->cold_until <= get_time_tb() ||
(!detector->automatic && !state->phase && !state->forced) || (!detector->automatic && !state->phase && !state->forced) ||
(state->completed_tb && !state->phase && !state->cycling && !state->forced && state->due > get_time_tb() + 2500) || (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); uint64_t peer = sc_derive_node_id_from_pubkey(peer_key);
if (!(flags & ETCP_PING_FLAG_OBSERVE)) { if (!(flags & ETCP_PING_FLAG_OBSERVE)) {
history_load(state); history_load(state);