transport: support one-way authenticated NAT probes

This commit is contained in:
evgeny committed 2026-10-17 15:24:57 +02:00
1 parent 1dc26bf715
commit df80c5745d
2 files changed
+9

No files matched your search

+8
View File
@@ -1797,6 +1797,10 @@ static int handle_ping(struct ETCP_SOCKET* e_sock, struct ETCP_DGRAM* pkt, const
if ((flags & ETCP_PING_FLAG_OBSERVE) && (flags & ETCP_PING_FLAG_ADDRESS_CHECK)) {
DEBUG_WARN(DEBUG_CATEGORY_NAT, "UDP probe has incompatible flags=%02x", flags); return 7;
}
if ((flags & ETCP_PING_FLAG_NO_REPLY) &&
(!(flags & (ETCP_PING_FLAG_OBSERVE | ETCP_PING_FLAG_ADDRESS_CHECK)) || ulen != ROUTE_OBSERVE_TAG_SIZE + 9)) {
DEBUG_WARN(DEBUG_CATEGORY_NAT, "One-way NAT probe has invalid flags=%02x tag_size=%u", flags, ulen); return 7;
}
if (!nat_detection_ping_allowed(e_sock->instance->nat_det, e_sock, decrypted_pubkey, addr, flags, udata, ulen)) {
memory_pool_free(e_sock->instance->pkt_pool, pkt); return 0;
}
@@ -1806,6 +1810,10 @@ static int handle_ping(struct ETCP_SOCKET* e_sock, struct ETCP_DGRAM* pkt, const
if ((flags & ETCP_PING_FLAG_ADDRESS_CHECK) && e_sock->instance->nat_det)
nat_detection_receive_ingress(e_sock->instance->nat_det, e_sock, decrypted_pubkey, addr, udata, ulen);
if (flags & ETCP_PING_FLAG_NO_REPLY) {
memory_pool_free(e_sock->instance->pkt_pool, pkt); return 0;
}
if ((flags & ETCP_PING_FLAG_SEND_RTT) && ulen >= 2) {
uint16_t rtt_val = wire_read16(udata);
topo_node_ping_update_rtt(e_sock->instance->topo_groups, peer_id, rtt_val);
+1
View File
@@ -49,6 +49,7 @@ extern "C" {
#define ETCP_PING_FLAG_SEND_RTT 0x02 // в PING: несу RTT для получателя
#define ETCP_PING_FLAG_OBSERVE 0x04 // PONG несёт фактически наблюдаемый IP:port
#define ETCP_PING_FLAG_ADDRESS_CHECK 0x08 // прямое входящее испытание endpoint
#define ETCP_PING_FLAG_NO_REPLY 0x10 // NAT-проба: результат через router, без автоматического UDP-ответа
/* Адаптивный keepalive */
#define KA_PERIOD_MIN_MS 200