|
|
|
|
@ -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; |
|
|
|
|
} |
|
|
|
|
|