diff --git a/src/routing_layer/address_profile.h b/src/routing_layer/address_profile.h index 84d0fea0..92de64ba 100644 --- a/src/routing_layer/address_profile.h +++ b/src/routing_layer/address_profile.h @@ -1,5 +1,5 @@ /* Профиль конкретного endpoint: изменение адреса и доступность входа независимы. - * Последнее успешное измерение действует до изменения endpoint или нового результата. + * Измерение ETCP действует до изменения endpoint или нового результата; STUN — временная оценка того же IP/netif. * Профиль помогает выбирать попытки; работоспособность подтверждает транспорт. */ #ifndef ADDRESS_PROFILE_H #define ADDRESS_PROFILE_H @@ -24,7 +24,7 @@ enum address_profile_source { ADDRESS_SOURCE_NONE, ADDRESS_SOURCE_ETCP, ADDRESS_ struct address_profile { uint8_t mapping; uint8_t inbound; - uint8_t source; /* Источник фактов; native-детектор публикует только измерение этого endpoint (ETCP). */ + uint8_t source; /* ETCP — измерение рабочего endpoint; STUN — предварительный EIM? с неизвестным входом. */ }; static inline const char *address_mapping_name(uint8_t value) { diff --git a/src/routing_layer/nat_detection.h b/src/routing_layer/nat_detection.h index 80deb7f4..86091cb3 100644 --- a/src/routing_layer/nat_detection.h +++ b/src/routing_layer/nat_detection.h @@ -8,6 +8,8 @@ * и публикуется как NAT-кандидат. Это не адрес интерфейса и не подтверждение открытого входа. * Для UDP сочетания EIM+OPEN и EIM+CONTACT означают eim open и eim filtered. TCP-вход проверяется отдельно. * EIM+UNKNOWN отображается как EIM?: внешний адрес совпал, незнакомый вход не удалось проверить. + * Если своего измерения mapping нет, совпадение у двух STUN-серверов на том же IP/интерфейсе даёт предварительный EIM?. + * Его source=STUN, inbound=UNKNOWN; внешний порт берётся только из наблюдения рабочего сокета, а не из STUN. * create(instance) запускает автоматические асинхронные проверки через доступные узлы сети. * get_status(detector, socket, &status) возвращает результат в status.effective_profile и ход проверки в остальных полях. * request_check_*() запрашивает повторную проверку; destroy(detector) останавливает модуль и освобождает его ресурсы. diff --git a/src/routing_layer/topo_node.c b/src/routing_layer/topo_node.c index 638b432c..0592c9bc 100644 --- a/src/routing_layer/topo_node.c +++ b/src/routing_layer/topo_node.c @@ -1166,10 +1166,10 @@ int topo_node_update_my_addresses(struct UTUN_INSTANCE* instance) { a->type = TOPO_ADDR_INTERFACE; a->socket_id = e_sock->sock_id; a->protocol = TOPO_PROTO_UDP; a->next = v4_head; v4_head = a; } - /* Одно наблюдение даёт NAT-кандидат с типом UNKNOWN; только EIM подтверждает общий внешний адрес. */ + /* nat_addr получен для рабочего порта; STUN может уточнить только его предварительный тип EIM?. */ if (e_sock->nat_addr.ss_family == AF_INET && nat_sin->sin_addr.s_addr != 0 && (e_sock->address_profile.mapping == ADDRESS_MAP_UNKNOWN || e_sock->address_profile.mapping == ADDRESS_MAP_EIM) && - e_sock->address_profile.source == ADDRESS_SOURCE_ETCP) { + e_sock->address_profile.source != ADDRESS_SOURCE_NONE) { struct TOPO_ADDR4* a = memory_pool_alloc(instance->topo_groups->v4_addr_pool); if (!a) goto allocation_failed; memcpy(a->addr, &nat_sin->sin_addr.s_addr, 4); a->port = ntohs(nat_sin->sin_port); @@ -1190,7 +1190,7 @@ int topo_node_update_my_addresses(struct UTUN_INSTANCE* instance) { a6->next = v6_head; v6_head = a6; } if (e_sock->nat_addr.ss_family == AF_INET6 && (e_sock->address_profile.mapping == ADDRESS_MAP_UNKNOWN || e_sock->address_profile.mapping == ADDRESS_MAP_EIM) && - e_sock->address_profile.source == ADDRESS_SOURCE_ETCP) { + e_sock->address_profile.source != ADDRESS_SOURCE_NONE) { const struct sockaddr_in6 *mapped = (const struct sockaddr_in6 *)&e_sock->nat_addr; struct TOPO_ADDR6 *a6 = memory_pool_alloc(instance->topo_groups->v6_addr_pool); if (!a6) goto allocation_failed;