nat: distinguish EIM with unverified unsolicited ingress

This commit is contained in:
evgeny committed 2026-10-17 18:19:23 +02:00
1 parent bbb8cff4a6
commit 58755dd75e
3 files changed
+6 -2

No files matched your search

+1
View File
@@ -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
+3 -2
View File
@@ -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);