|
|
|
|
@ -65,30 +65,31 @@ int main(void) {
|
|
|
|
|
struct ETCP_SOCKET *peer = test_etcp_bound_socket(observer, "udp"); |
|
|
|
|
const uint64_t round = UINT64_C(0x0102030405060708); |
|
|
|
|
struct result result = {0}; |
|
|
|
|
assert(route_ping_observe(socket, observer->my_keys.public_key, &peer->local_addr, round, 500, ping_done, &result) == 0); |
|
|
|
|
assert(route_ping_observe(socket, observer->my_keys.public_key, &peer->local_addr, TOPO_GROUP_UTUN, round, 500, ping_done, &result) == 0); |
|
|
|
|
wait_result(&fixture, &result); |
|
|
|
|
struct sockaddr_storage observed; |
|
|
|
|
assert(result.success && route_ping_observation(result.data, result.length, socket, round, &observed) == 0); |
|
|
|
|
assert(result.success && route_ping_observation(result.data, result.length, socket, TOPO_GROUP_UTUN, round, &observed) == 0); |
|
|
|
|
assert(route_ping_addr_equal(&observed, &socket->local_addr, 1)); |
|
|
|
|
assert(route_ping_observation(result.data, result.length, socket, round + 1, &observed) < 0); |
|
|
|
|
assert(route_ping_observation(result.data, result.length, socket, TOPO_GROUP_UTUN, round + 1, &observed) < 0); |
|
|
|
|
assert(route_ping_observation(result.data, result.length, socket, TOPO_GROUP_UTUN + 1, round, &observed) < 0); |
|
|
|
|
assert(socket->address_profile.mapping == ADDRESS_MAP_UNKNOWN); /* один ответ не назначает NAT-тип */ |
|
|
|
|
|
|
|
|
|
memset(&result, 0, sizeof(result)); |
|
|
|
|
struct ETCP_SOCKET *untrusted = test_etcp_bound_socket(foreign, "udp"); |
|
|
|
|
assert(route_ping_observe(socket, observer->my_keys.public_key, &untrusted->local_addr, |
|
|
|
|
round + 1, 300, ping_done, &result) == 0); |
|
|
|
|
TOPO_GROUP_UTUN, round + 1, 300, ping_done, &result) == 0); |
|
|
|
|
assert(owner->pending_pings); |
|
|
|
|
send_foreign_pong(foreign, socket, owner->pending_pings->nonce); |
|
|
|
|
wait_result(&fixture, &result); |
|
|
|
|
assert(!result.success && !owner->pending_pings); |
|
|
|
|
|
|
|
|
|
memset(&result, 0, sizeof(result)); |
|
|
|
|
assert(route_ping_observe(socket, observer->my_keys.public_key, &peer->local_addr, round + 2, 300, ping_done, &result) == 0); |
|
|
|
|
assert(route_ping_observe(socket, observer->my_keys.public_key, &peer->local_addr, TOPO_GROUP_UTUN, round + 2, 300, ping_done, &result) == 0); |
|
|
|
|
uint64_t generation = socket->generation; socket->generation = generation == UINT64_MAX ? generation - 1 : generation + 1; |
|
|
|
|
wait_result(&fixture, &result); assert(!result.success); socket->generation = generation; |
|
|
|
|
|
|
|
|
|
memset(&result, 0, sizeof(result)); |
|
|
|
|
assert(route_ping_observe(socket, observer->my_keys.public_key, &peer->local_addr, round + 3, 500, ping_done, &result) == 0); |
|
|
|
|
assert(route_ping_observe(socket, observer->my_keys.public_key, &peer->local_addr, TOPO_GROUP_UTUN, round + 3, 500, ping_done, &result) == 0); |
|
|
|
|
etcp_cancel_pings(owner, ping_done, &result); assert(!owner->pending_pings); |
|
|
|
|
uint64_t end = get_time_tb() + 6000; |
|
|
|
|
while (get_time_tb() < end) uasync_poll(fixture.ua, 10); |
|
|
|
|
|