Define grouped NAT probe tags and a routed control service

This commit is contained in:
evgeny committed 2026-10-12 17:43:27 +02:00
1 parent a97589e4a6
commit 2e7da4f3cc
3 files changed
+15 -14

No files matched your search

+8 -8
View File
@@ -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;
}
+5 -5
View File
@@ -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
}