diff --git a/src/transport_layer/etcp_connections.c b/src/transport_layer/etcp_connections.c index ca32a76d..deec78ca 100644 --- a/src/transport_layer/etcp_connections.c +++ b/src/transport_layer/etcp_connections.c @@ -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); diff --git a/src/transport_layer/etcp_connections.h b/src/transport_layer/etcp_connections.h index e5005d0f..04f5a248 100644 --- a/src/transport_layer/etcp_connections.h +++ b/src/transport_layer/etcp_connections.h @@ -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