This commit is contained in:
Evgeny committed 2026-04-15 15:15:15 +03:00
1 parent 1a171d5a24
commit 8bad15b7bb
7 files changed
+91 -19

No files matched your search

+2 -12
View File
@@ -926,7 +926,7 @@ static int etcp_send_ping_raw(struct ETCP_DGRAM* dgram, socket_t fd, sc_context_
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "sendto failed for ping, err=%d", socket_get_error());
return -1;
}
DEBUG_TRACE(DEBUG_CATEGORY_BGP, "ping sendto succeeded, sent=%zd bytes", sent);
DEBUG_TRACE(DEBUG_CATEGORY_BGP, "ping sendto succeeded to %s sent=%zd bytes", sent, sockaddr_storage_to_str(addr).str);
return (int)sent;
}
@@ -1593,18 +1593,8 @@ int init_sockets(struct UTUN_INSTANCE* instance) {
}
success_count++;
// Convert IP to string for logging
char addr_str[INET6_ADDRSTRLEN + 10];
if (server->ip.ss_family == AF_INET) {
struct sockaddr_in* sin = (struct sockaddr_in*)&server->ip;
snprintf(addr_str, sizeof(addr_str), "%s:%d", ip_to_str(&sin->sin_addr, AF_INET).str, ntohs(sin->sin_port));
} else {
struct sockaddr_in6* sin6 = (struct sockaddr_in6*)&server->ip;
snprintf(addr_str, sizeof(addr_str), "%s:%d", ip_to_str(&sin6->sin6_addr, AF_INET6).str, ntohs(sin6->sin6_port));
}
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "Initialized server %s on %s (links: %zu)",
server->name, addr_str, e_sock->num_channels);
server->name, sockaddr_storage_to_str(&server->ip).str, e_sock->num_channels);
server = server->next;
}
+10 -6
View File
@@ -424,7 +424,7 @@ void route_bgp_new_conn(struct ETCP_CONN* conn) {
while (c) {
struct ETCP_LINK* l = c->links;
while (l) {
if (l->initialized && l->conn && l->nat_check_status == NAT_CHECK_NONE) {
if (l->initialized && l->conn && l->nat_check_status < NAT_CHECK_IN_PROGRESS) {
route_bgp_start_link_nat_check(bgp, l);
}
l = l->next;
@@ -687,9 +687,10 @@ static void route_bgp_start_link_nat_check(struct ROUTE_BGP* bgp, struct ETCP_LI
// Find third node to send ping through
struct ETCP_CONN* third_conn = route_bgp_find_third_node(bgp, link->etcp);
if (!third_conn) {
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "route_bgp_start_link_nat_check: no third node found for link");
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "no third node found for link");
return;
}
// Get target address - use nat_ip/nat_port if set, otherwise use remote_addr
uint32_t target_ip;
uint16_t target_port;
@@ -701,6 +702,9 @@ static void route_bgp_start_link_nat_check(struct ROUTE_BGP* bgp, struct ETCP_LI
target_ip = ntohl(sin->sin_addr.s_addr);
target_port = ntohs(sin->sin_port);
}
if (is_local_subnet(target_ip)) { DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "local ip: %s, skip nat check", ip_to_str(&target_ip, AF_INET).str); return; }
// Allocate callback arg
struct nat_check_arg* arg = u_calloc(1, sizeof(struct nat_check_arg));
if (!arg) return;
@@ -711,7 +715,7 @@ static void route_bgp_start_link_nat_check(struct ROUTE_BGP* bgp, struct ETCP_LI
const uint8_t* pubkey = link->etcp->crypto_ctx.peer_key_set ? link->etcp->crypto_ctx.peer_public_key : NULL;
if (!pubkey) {
u_free(arg);
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "route_bgp_start_link_nat_check: no peer pubkey for link=%p", (void*)link);
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "no peer pubkey for link=%p", (void*)link);
return;
}
// Send ping via third node - embed peer pubkey for NAT detection
@@ -720,11 +724,11 @@ static void route_bgp_start_link_nat_check(struct ROUTE_BGP* bgp, struct ETCP_LI
pubkey);
if (ret == 0) {
link->nat_check_status = NAT_CHECK_IN_PROGRESS;
DEBUG_INFO(DEBUG_CATEGORY_BGP, "route_bgp_start_link_nat_check: started for link=%p via=%s",
(void*)link, third_conn->log_name);
DEBUG_INFO(DEBUG_CATEGORY_BGP, "ping remote request via=%s (%s:%d)",
(void*)link, third_conn->log_name, ip_to_str(&target_ip, AF_INET).str, target_port);
} else {
u_free(arg);
DEBUG_WARN(DEBUG_CATEGORY_BGP, "route_bgp_start_link_nat_check: failed to start for link=%p",
DEBUG_WARN(DEBUG_CATEGORY_BGP, "failed to start for link=%p",
(void*)link);
}
}
+16
View File
@@ -24,3 +24,19 @@ bgp_update local nodelist:
bgp_withdraw(struct ROUTE_BGP bgp, uint64_t node_to_del, uint64_t wd_source) - wd_source это узел который захотел withdraw.
- находим у себя node to del. удаляем если в hoplist найден wd_node (или мы = wd_node)
если удалили - распространяем по всем линкам с этими же аргументами
===============================
определение nat
определяем что оба узла в локальной сети:
-если обе ноды имеют локальные адреса сокетов пробуем пинг по локальным адресам
если узел подключился и его сокетовый ip:port отличается от connection ip:port - устанавливаем флаг nat. и инициируем проверку пингом третьим узлом:
проверка считается успешной если по результату пинга ip источника пинга отличается от ip запросившего пинг узла.
проверка типа nat узла который подключился:
- пингуем узел с целью зафиксировать свой ip (в сокете может быть например 0.0.0.0)
- даём команду третьему узлу пингануть этот узел.
- по результатам двух пингов определяем тип nat