From ff84d0d9861ef5a7d02a931d7907ab87b3179d6e Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 12 Aug 2026 20:05:13 +0300 Subject: [PATCH] 1 --- src/chat/chat_core_priv.h | 1 + src/routing_layer/route_lib.c | 1 + src/routing_layer/route_lib.h | 2 +- src/routing_layer/route_lib_doc.md | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/chat/chat_core_priv.h b/src/chat/chat_core_priv.h index a1826df1..4acd683d 100644 --- a/src/chat/chat_core_priv.h +++ b/src/chat/chat_core_priv.h @@ -85,6 +85,7 @@ static inline int addr_type_from_ip(int family, const uint8_t* addr) { if (b0 == 169 && b1 == 254) return ADDR_TYPE_NETIF; if (b0 >= 224 && b0 <= 239) return ADDR_TYPE_NETIF; if (b0 == 172 && b1 >= 16 && b1 <= 31) return ADDR_TYPE_NETIF; + if (b0 == 100 && b1 >= 64 && b1 <= 127) return ADDR_TYPE_NETIF; /* 100.64.0.0/10 (CGNAT) */ if (b0 == 192 && b1 == 168) return ADDR_TYPE_NETIF; { uint32_t ip; memcpy(&ip, addr, 4); if (ip == 0 || ip == 0xffffffff) return ADDR_TYPE_NETIF; } return ADDR_TYPE_DIRECT; diff --git a/src/routing_layer/route_lib.c b/src/routing_layer/route_lib.c index ce2f88b2..c035ddc9 100644 --- a/src/routing_layer/route_lib.c +++ b/src/routing_layer/route_lib.c @@ -279,6 +279,7 @@ int is_local_subnet(uint32_t ip) { if (first_octet == 169 && second_octet == 254) return 1; if (first_octet >= 224 && first_octet <= 239) return 1; if (first_octet == 172 && second_octet >= 16 && second_octet <= 31) return 1; + if (first_octet == 100 && second_octet >= 64 && second_octet <= 127) return 1; /* 100.64.0.0/10 (CGNAT) */ if (first_octet == 192 && second_octet == 168) return 1; if (ip==0xffffffff) return 1; DEBUG_TRACE(DEBUG_CATEGORY_BGP, "result: global ip %d.%d : ", first_octet, second_octet); diff --git a/src/routing_layer/route_lib.h b/src/routing_layer/route_lib.h index bbcfed42..6533930a 100644 --- a/src/routing_layer/route_lib.h +++ b/src/routing_layer/route_lib.h @@ -122,7 +122,7 @@ bool route_add_local_subnet(struct ROUTE_TABLE *table, uint32_t network, uint8_t * @brief Проверяет что IP адрес НЕ является публичным (роутится в интернете) * * @param ip IP адрес в сетевом порядке (big-endian) - * @return 0 - публичный (роутится в интернете), 1 - локальный/мультикастовый/зарезервированный + * @return 0 - публичный (роутится в интернете), 1 - локальный/CGNAT/мультикастовый/зарезервированный */ int is_local_subnet(uint32_t ip); diff --git a/src/routing_layer/route_lib_doc.md b/src/routing_layer/route_lib_doc.md index a53747ed..8c51ae99 100644 --- a/src/routing_layer/route_lib_doc.md +++ b/src/routing_layer/route_lib_doc.md @@ -54,7 +54,7 @@ route_table_destroy(rt); | `route_lookup(table, dest_ip)` | LPM-поиск. Возвращает `ROUTE_ENTRY*` или NULL. Инкрементит `stats` (hits/misses) | | `route_table_print(table)` | Печатает содержимое таблицы в лог | | `parse_subnet(str, network, prefix_length)` | Парсит `"a.b.c.d/n"` → network (BE) + prefix_length. Возвращает 0/-1 | -| `is_local_subnet(ip)` | Проверяет, является ли IP локальным/мультикастовым/зарезервированным (0=true). RFC1918 + 0.0.0.0/8 + 127.0.0.0/8 + АPIPA + multicast + broadcast | +| `is_local_subnet(ip)` | Проверяет, является ли IP локальным/мультикастовым/зарезервированным (0=true). RFC1918 + 0.0.0.0/8 + 127.0.0.0/8 + АPIPA + multicast + broadcast + CGNAT (100.64.0.0/10) | | `route_add_local_subnet(table, network, prefix_length)` | **Объявлена в .h, но не реализована** | ### Внутренние функции