From 2e7da4f3cc950f981a6f232d5c374d8e110725ab Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 12 Oct 2026 17:43:27 +0200 Subject: [PATCH] Define grouped NAT probe tags and a routed control service --- src/routing_layer/route_ping.c | 16 ++++++++-------- src/routing_layer/route_ping.h | 10 +++++----- src/transport_layer/etcp_api.h | 3 ++- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/routing_layer/route_ping.c b/src/routing_layer/route_ping.c index 5a495625..e5f2a4f7 100644 --- a/src/routing_layer/route_ping.c +++ b/src/routing_layer/route_ping.c @@ -50,26 +50,26 @@ int route_ping_addr_equal(const struct sockaddr_storage *a, const struct sockadd return 0; } -void route_ping_make_tag(uint8_t out[ROUTE_OBSERVE_TAG_SIZE], const struct ETCP_SOCKET *socket, uint64_t round) { - memcpy(out, "NAT2UDP!", 8); out[8] = socket->sock_id; - write64(out + 9, socket->generation); write64(out + 17, round); +void route_ping_make_tag(uint8_t out[ROUTE_OBSERVE_TAG_SIZE], const struct ETCP_SOCKET *socket, uint64_t group, uint64_t round) { + memcpy(out, "NAT3UDP!", 8); out[8] = socket->sock_id; + write64(out + 9, socket->generation); write64(out + 17, round); write64(out + 25, group); } int route_ping_observe(struct ETCP_SOCKET *socket, const uint8_t peer_key[SC_PUBKEY_SIZE], - const struct sockaddr_storage *peer_address, uint64_t round, int timeout_ms, + const struct sockaddr_storage *peer_address, uint64_t group, uint64_t round, int timeout_ms, etcp_ping_callback_t callback, void *arg) { - if (!socket || !socket->generation || !round) { DEBUG_ERROR(DEBUG_CATEGORY_NAT, "observe: invalid endpoint/round"); return -1; } - uint8_t tag[ROUTE_OBSERVE_TAG_SIZE]; route_ping_make_tag(tag, socket, round); + if (!socket || !socket->generation || !group || !round) { DEBUG_ERROR(DEBUG_CATEGORY_NAT, "observe: invalid endpoint/group/round"); return -1; } + uint8_t tag[ROUTE_OBSERVE_TAG_SIZE]; route_ping_make_tag(tag, socket, group, round); return etcp_send_ping_to_socket(socket->instance, socket, peer_key, peer_address, timeout_ms, callback, arg, tag, sizeof(tag), ETCP_PING_FLAG_OBSERVE); } int route_ping_observation(const uint8_t *data, size_t length, const struct ETCP_SOCKET *socket, - uint64_t round, struct sockaddr_storage *observed) { + uint64_t group, uint64_t round, struct sockaddr_storage *observed) { if (!data || !socket || length != ROUTE_ADDR_WIRE_SIZE + ROUTE_OBSERVE_TAG_SIZE) { DEBUG_WARN(DEBUG_CATEGORY_NAT, "observation: invalid size=%zu", length); return -1; } - uint8_t tag[ROUTE_OBSERVE_TAG_SIZE]; route_ping_make_tag(tag, socket, round); + uint8_t tag[ROUTE_OBSERVE_TAG_SIZE]; route_ping_make_tag(tag, socket, group, round); if (memcmp(data + ROUTE_ADDR_WIRE_SIZE, tag, sizeof(tag))) { DEBUG_WARN(DEBUG_CATEGORY_NAT, "observation: stale endpoint generation/round"); return -1; } diff --git a/src/routing_layer/route_ping.h b/src/routing_layer/route_ping.h index 6c81b397..0f21f666 100644 --- a/src/routing_layer/route_ping.h +++ b/src/routing_layer/route_ping.h @@ -12,19 +12,19 @@ extern "C" { #endif #define ROUTE_ADDR_WIRE_SIZE 19 -#define ROUTE_OBSERVE_TAG_SIZE 25 +#define ROUTE_OBSERVE_TAG_SIZE 33 int route_ping_addr_encode(uint8_t out[ROUTE_ADDR_WIRE_SIZE], const struct sockaddr_storage *address); int route_ping_addr_decode(const uint8_t in[ROUTE_ADDR_WIRE_SIZE], struct sockaddr_storage *address); int route_ping_addr_equal(const struct sockaddr_storage *a, const struct sockaddr_storage *b, int include_port); -/* Ответ: address(19) || tag(25), все числа BE, IP — неизменённые сетевые байты. */ +/* Ответ: address(19) || tag(33); tag связывает socket/generation/round/group. Числа BE, IP — сетевые байты. */ int route_ping_observe(struct ETCP_SOCKET *socket, const uint8_t peer_key[SC_PUBKEY_SIZE], - const struct sockaddr_storage *peer_address, uint64_t round, int timeout_ms, + const struct sockaddr_storage *peer_address, uint64_t group, uint64_t round, int timeout_ms, etcp_ping_callback_t callback, void *arg); int route_ping_observation(const uint8_t *data, size_t length, const struct ETCP_SOCKET *socket, - uint64_t round, struct sockaddr_storage *observed); -void route_ping_make_tag(uint8_t out[ROUTE_OBSERVE_TAG_SIZE], const struct ETCP_SOCKET *socket, uint64_t round); + uint64_t group, uint64_t round, struct sockaddr_storage *observed); +void route_ping_make_tag(uint8_t out[ROUTE_OBSERVE_TAG_SIZE], const struct ETCP_SOCKET *socket, uint64_t group, uint64_t round); #ifdef __cplusplus } diff --git a/src/transport_layer/etcp_api.h b/src/transport_layer/etcp_api.h index 67555a44..d28d54e0 100644 --- a/src/transport_layer/etcp_api.h +++ b/src/transport_layer/etcp_api.h @@ -43,7 +43,7 @@ extern "C" { // router: 0x00 DATA, 0x02 NAT, 0x04 TCP_PROXY_SERVER, 0x05 UDP_PROXY, // 0x06 ICMP_PROXY, 0x07 MEDIA_DELIVERY, 0x08 TCP_PROXY_CLIENT, // 0x11 CONN_MGR, 0x32 ADMIN_KEY, 0x33 JOIN, 0x34 DM, -// 0x35 DM_MAILBOX, 0x36 CALL, 0x37 FILE_TRANSFER, 0x38 DM_MEDIA, 0x39 STREAM +// 0x35 DM_MAILBOX, 0x36 CALL, 0x37 FILE_TRANSFER, 0x38 DM_MEDIA, 0x39 STREAM, 0x3A GROUP_AVATAR, 0x3B NAT_DETECTION // // !!! Новый ID: впиши его в нужный реестр выше и убедись, что значение // не занято в том же пространстве. @@ -84,6 +84,7 @@ extern "C" { #define ETCP_RT_ID_DM_MEDIA 0x38 // dm_media — custody, location и подтверждения медиа #define ETCP_RT_ID_MEMBER_FILES 0x39 // member_files — каталоги и файлы участников группы #define ETCP_RT_ID_GROUP_AVATAR 0x3A // подписанная аватарка группы, блоки до 4 КиБ +#define ETCP_RT_ID_NAT_DETECTION 0x3B // управление NAT-пробами через маршруты выбранной группы // Connection status events (instance-level callback). // NEW начинает жизнь объекта, UP/DOWN отражают доступность, DELETE завершает её.