From 58755dd75efaec5f1ee57f73ac373b6b97c2fdf7 Mon Sep 17 00:00:00 2001 From: evgeny Date: Sat, 17 Oct 2026 18:19:23 +0200 Subject: [PATCH] nat: distinguish EIM with unverified unsolicited ingress --- src/chat/chat_member.c | 2 ++ src/routing_layer/topo_node.h | 1 + src/routing_layer/topo_node_sqlite.c | 5 +++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/chat/chat_member.c b/src/chat/chat_member.c index 1d86ce78..a286cec1 100644 --- a/src/chat/chat_member.c +++ b/src/chat/chat_member.c @@ -218,6 +218,7 @@ int chat_core_get_member_list(struct UTUN_INSTANCE* inst, const char* ch_id, uin " CASE WHEN MAX(addr_type=1) THEN 1" " WHEN MAX(addr_type=5) THEN 5" " WHEN MAX(addr_type=2) THEN 2" + " WHEN MAX(addr_type=6) THEN 6" " WHEN MAX(addr_type=4) THEN 4" " WHEN MAX(addr_type=3) THEN 3" " ELSE 0 END" @@ -320,6 +321,7 @@ int chat_core_get_single_member(struct UTUN_INSTANCE* inst, const char* ch_id, u " CASE WHEN MAX(addr_type=1) THEN 1" " WHEN MAX(addr_type=5) THEN 5" " WHEN MAX(addr_type=2) THEN 2" + " WHEN MAX(addr_type=6) THEN 6" " WHEN MAX(addr_type=4) THEN 4" " WHEN MAX(addr_type=3) THEN 3" " ELSE 0 END" diff --git a/src/routing_layer/topo_node.h b/src/routing_layer/topo_node.h index 4d2d6c38..805ba942 100644 --- a/src/routing_layer/topo_node.h +++ b/src/routing_layer/topo_node.h @@ -44,6 +44,7 @@ struct reality_client_config; #define ADDR_TYPE_NAT_STRICT 3 #define ADDR_TYPE_NAT 4 /* за NAT, тип неизвестен */ #define ADDR_TYPE_CONTACT 5 /* адрес не изменён, вход требует предварительного контакта */ +#define ADDR_TYPE_NAT_EIM_UNVERIFIED 6 /* EIM наблюдается, незнакомый вход не проверен: EIM? */ #define PROBE_STATUS_NONE 0 #define PROBE_STATUS_IN_PROGRESS 1 diff --git a/src/routing_layer/topo_node_sqlite.c b/src/routing_layer/topo_node_sqlite.c index 14531ba7..c054f64c 100644 --- a/src/routing_layer/topo_node_sqlite.c +++ b/src/routing_layer/topo_node_sqlite.c @@ -65,7 +65,8 @@ static int addr_type_from_ip(int family, const uint8_t* addr) { static int addr_type_classify(int kind, int config_type, int global, const struct address_profile *profile) { if (config_type == CFG_SERVER_TYPE_PRIVATE || config_type == CFG_SERVER_TYPE_LOCAL) return ADDR_TYPE_NETIF; if (!profile) return ADDR_TYPE_NAT; - if (profile->mapping == ADDRESS_MAP_EIM) return ADDR_TYPE_NAT_EIM; + if (profile->mapping == ADDRESS_MAP_EIM) + return profile->inbound == ADDRESS_IN_UNKNOWN ? ADDR_TYPE_NAT_EIM_UNVERIFIED : ADDR_TYPE_NAT_EIM; if (profile->mapping == ADDRESS_MAP_DEPENDENT) return ADDR_TYPE_NAT_STRICT; if (kind == TOPO_ADDR_NAT) return ADDR_TYPE_NAT; /* Публичный адрес интерфейса известен без определения входящих и не становится NAT из-за UNKNOWN. */ @@ -912,7 +913,7 @@ int topo_node_sqlite_nodeinfo_updated(sqlite3* db, uint64_t node_id) { } static const int at2type[] = { [ADDR_TYPE_NETIF]=1, [ADDR_TYPE_DIRECT]=1, [ADDR_TYPE_NAT_EIM]=2, - [ADDR_TYPE_NAT_STRICT]=1, [ADDR_TYPE_NAT]=2, [ADDR_TYPE_CONTACT]=2 }; + [ADDR_TYPE_NAT_STRICT]=1, [ADDR_TYPE_NAT]=2, [ADDR_TYPE_CONTACT]=2, [ADDR_TYPE_NAT_EIM_UNVERIFIED]=2 }; int base_type = best_at < 0 || (unsigned)best_at >= sizeof(at2type) / sizeof(at2type[0]) ? 0 : at2type[best_at]; if (best_at >= 0 && (unsigned)best_at >= sizeof(at2type) / sizeof(at2type[0])) DEBUG_WARN(DEBUG_CATEGORY_BGP, "invalid projected address type=%d node=%016llx", best_at, (unsigned long long)node_id);