nat: publish observed working addresses with tentative STUN profiles
This commit is contained in:
1 parent
88ac08333e
commit
417b848b50
3 files changed
+7
-5
No files matched your search
@@ -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) {
|
||||
|
||||
@@ -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) останавливает модуль и освобождает его ресурсы.
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user