You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
3.6 KiB
52 lines
3.6 KiB
/* Политика не заменяет измерение; неопределённость разрешает ограниченную пробу. */ |
|
#include <assert.h> |
|
#include <string.h> |
|
#include "routing_layer/sock_match.h" |
|
#include "routing_layer/topo_node.h" |
|
#include "config_parser.h" |
|
#include "../lib/platform_compat.h" |
|
#include "../lib/debug_config.h" |
|
|
|
int main(void) { |
|
debug_config_init(); debug_set_level(DEBUG_LEVEL_WARN); |
|
const uint64_t now = UINT64_C(1700000000000000); |
|
const uint32_t public_ip = htonl(UINT32_C(0xc633640b)); |
|
const uint32_t private_ip = htonl(UINT32_C(0x0a400102)); |
|
struct address_profile unknown = {0}; |
|
struct address_profile open = {.mapping = ADDRESS_MAP_EIM, .inbound = ADDRESS_IN_OPEN, .source = ADDRESS_SOURCE_ETCP, |
|
.evidence_id = 1, .checked_at = now}; |
|
struct address_profile contact = open; contact.inbound = ADDRESS_IN_CONTACT; |
|
struct address_profile dependent = open; dependent.mapping = ADDRESS_MAP_DEPENDENT; dependent.inbound = ADDRESS_IN_UNKNOWN; |
|
|
|
assert(sock_target_class(TOPO_ADDR_INTERFACE, CFG_SERVER_TYPE_PUBLIC, &unknown, 1, now) == SOCK_TC_PROBE); |
|
assert(sock_target_class(TOPO_ADDR_INTERFACE, CFG_SERVER_TYPE_PUBLIC, &open, 0, now) == SOCK_TC_PRIV); |
|
assert(sock_target_class(TOPO_ADDR_NAT, CFG_SERVER_TYPE_NAT, &open, 1, now) == SOCK_TC_PUB); |
|
assert(sock_target_class(TOPO_ADDR_NAT, CFG_SERVER_TYPE_NAT, &contact, 1, now) == SOCK_TC_CONTACT); |
|
assert(sock_target_class(TOPO_ADDR_NAT, CFG_SERVER_TYPE_NAT, &unknown, 1, now) == SOCK_TC_PROBE); |
|
assert(sock_target_class(TOPO_ADDR_NAT, CFG_SERVER_TYPE_NAT, &dependent, 1, now) == SOCK_TC_UNREACH); |
|
assert(sock_target_class(TOPO_ADDR_INTERFACE, CFG_SERVER_TYPE_NAT, &dependent, 0, now) == SOCK_TC_PRIV); |
|
assert(sock_target_class(TOPO_ADDR_INTERFACE, CFG_SERVER_TYPE_LOCAL, &open, 1, now) == SOCK_TC_PRIV); |
|
assert(sock_target_class(TOPO_ADDR_INTERFACE, CFG_SERVER_TYPE_PRIVATE, &open, 1, now) == SOCK_TC_PRIV); |
|
assert(sock_target_class(TOPO_ADDR_NAT, CFG_SERVER_TYPE_NAT, &open, 1, now + ADDRESS_PROFILE_TTL_US + 1) == SOCK_TC_PROBE); |
|
assert(sock_target_class(TOPO_ADDR_NAT, CFG_SERVER_TYPE_NAT, &open, 1, now - 1) == SOCK_TC_PROBE); |
|
|
|
struct sock_view outgoing = {.has_inet = 1, .has_priv = 1, .now_us = now, .public_ip4 = public_ip}; |
|
struct sock_view local = {.has_priv = 1, .now_us = now}; |
|
assert(sock_match(&outgoing, TOPO_ADDR_NAT, CFG_SERVER_TYPE_NAT, &open, public_ip)); |
|
assert(sock_match(&outgoing, TOPO_ADDR_NAT, CFG_SERVER_TYPE_NAT, &contact, public_ip)); |
|
/* Совпадение публичного IP разрешает проверку hairpin. */ |
|
outgoing.address_profile = open; |
|
assert(sock_match(&outgoing, TOPO_ADDR_NAT, CFG_SERVER_TYPE_NAT, &open, public_ip)); |
|
assert(!sock_match(&local, TOPO_ADDR_NAT, CFG_SERVER_TYPE_NAT, &open, public_ip)); |
|
assert(sock_match(&local, TOPO_ADDR_INTERFACE, CFG_SERVER_TYPE_NAT, &dependent, private_ip)); |
|
assert(!sock_match(&outgoing, TOPO_ADDR_NAT, CFG_SERVER_TYPE_NAT, &dependent, public_ip)); |
|
dependent.source = ADDRESS_SOURCE_STUN; |
|
assert(sock_match(&outgoing, TOPO_ADDR_NAT, CFG_SERVER_TYPE_NAT, &dependent, public_ip)); |
|
assert(address_profile_valid(&dependent)); |
|
dependent.source = ADDRESS_SOURCE_NONE; |
|
assert(!address_profile_valid(&dependent)); |
|
outgoing.now_us = now + ADDRESS_PROFILE_TTL_US + 1; |
|
assert(sock_match(&outgoing, TOPO_ADDR_NAT, CFG_SERVER_TYPE_NAT, &open, public_ip)); |
|
/* Смена времени/давности снижает уверенность, сохраняя возможность реального handshake. */ |
|
return 0; |
|
}
|
|
|