diff --git a/doc/node_snapshot.md b/doc/node_snapshot.md index 50b95410..c8c55f3b 100644 --- a/doc/node_snapshot.md +++ b/doc/node_snapshot.md @@ -98,6 +98,12 @@ NAT-профиль и обязательные метаданные REALITY. IPv `node_conn_direct_open_node` сверяет переданную запись с реестром/БД. Более свежая подписанная запись принимается целиком, старая уступает уже известной. Bootstrap-адреса не перекрывают подписанную запись даже при DOWN. +ID узла проверяется по public_key. Ошибка запуска возвращает NULL handle и не снимает +прежний FIN_WAIT. Отдельно принятый snapshot и уже добавленные линки при частичной +ошибке могут сохраниться; новый handle публикуется после подготовки ресурсов. +Явный specific_sock задаёт локальную политику, сохраняя проверки family/протокола/цели/REALITY; +автоматическое появление сокета использует обычную политику подбора. + LAN discovery предоставляет отдельные адреса подключения и не меняет подписанный снимок. Открытое объявление рабочих сокетов и ответ на проверку имеют Ed25519-подпись; публичные ключи в этих пакетах отсутствуют. Получатель использует известный ключ @@ -126,12 +132,6 @@ NCD использует эти кандидаты при проверке со метаданных из известного снимка; прямые LAN TCP-пробы при глобальном SOCKS выключены. Диагностика: discovery для подписи/nonce/адресов, etcp для NCD-проб и их удаления. -ID узла проверяется по public_key. Ошибка запуска возвращает NULL handle и не снимает -прежний FIN_WAIT. Отдельно принятый snapshot и уже добавленные линки при частичной -ошибке могут сохраниться; новый handle публикуется после подготовки ресурсов. -Явный specific_sock задаёт локальную политику, сохраняя проверки family/протокола/цели/REALITY; -автоматическое появление сокета использует обычную политику подбора. - Конфигурационные подключения UTUN используют один адаптер `init_client_connections` для старта и reload. Все адреса, TCP и REALITY передаются NCD; адаптер не создаёт ETCP-линки. Новый набор handles открывается diff --git a/src/transport_layer/node_conn_direct.c b/src/transport_layer/node_conn_direct.c index 1642b649..1da89626 100644 --- a/src/transport_layer/node_conn_direct.c +++ b/src/transport_layer/node_conn_direct.c @@ -586,10 +586,12 @@ int node_conn_direct_update_local(struct UTUN_INSTANCE* inst, uint64_t node_id) struct ETCP_CONN* conn = entry->conn; if (etcp_conn_ref_take(conn) < 0) return -1; entry->active_calls++; - struct TOPO_NODE* known = ncd_lookup_node(inst, node_id); + struct local_route route; + int has_routes = local_transport_route(inst->local_transport, node_id, 0, &route); + struct TOPO_NODE* known = has_routes ? ncd_lookup_node(inst, node_id) : NULL; struct TOPO_NODE* copy = known ? ncd_copy_node(inst, known) : NULL; if (known) topo_node_registry_unref(inst->topo_groups, node_id); - int result = copy ? ncd_create_lan_links(entry, copy, NULL, NULL) : known ? -1 : 0; + int result = copy ? ncd_create_lan_links(entry, copy, NULL, NULL) : has_routes ? -1 : 0; if (!copy) ncd_prune_lan(entry, 0); topo_node_destroy(inst->topo_groups, copy); entry->active_calls--; ncd_collect(entry); etcp_conn_ref_free(conn);