reality: реклама reality-параметров сокетов через BGP и применение к исходящим TCP-линкам

This commit is contained in:
evgeny committed 2026-09-10 11:24:17 +03:00
1 parent edb3bb36e1
commit 898a0a4a66
13 files changed
+615 -22

No files matched your search

+30
View File
@@ -33,6 +33,7 @@ extern "C" {
struct TOPO_GROUP;
struct TOPO_GROUPS;
struct ETCP_SOCKET;
struct ETCP_LINK;
struct NODE_CONN_DIRECT;
struct ETCP_CONN;
struct UTUN_INSTANCE;
@@ -112,12 +113,24 @@ struct TOPOMSG_ADDR6 { uint8_t addr[16]; uint16_t port; uint8_t type, socket
struct TOPOMSG_SUBNET4 { uint8_t addr[4]; uint8_t prefix_length; } __attribute__((packed));
struct TOPOMSG_SUBNET6 { uint8_t addr[16]; uint8_t prefix_length; } __attribute__((packed));
/* Reality-камуфляж сокета: что нужно клиенту для подключения к reality TCP-сокету.
* short_id(8) + server_pubkey(32) + version(3) + server_name(фиксированный 64). */
#define TOPO_REALITY_SNAME_MAX 64
struct TOPOMSG_REALITY_SOCK {
uint8_t socket_id;
uint8_t short_id[8];
uint8_t server_pubkey[32];
uint8_t version[3];
uint8_t server_name[TOPO_REALITY_SNAME_MAX];
} __attribute__((packed));
struct TOPOMSG_NODE {
uint8_t flags; uint64_t group_id, node_id; uint8_t ver;
uint8_t public_key[SC_PUBKEY_SIZE], ed25519_public_key[SC_PUBKEY_SIZE];
uint8_t x25519_self_sig[64];
uint8_t node_name_len, local_v4_sockets, local_v4_addrs, local_v6_sockets, local_v6_addrs;
uint8_t local_v4_subnets, local_v6_subnets, hop_count;
uint8_t local_reality_socks; // кол-во reality-сокетов
uint8_t client_type; // CLIENT_TYPE_SERVER/DESKTOP/MOBILE
uint8_t client_activity; // CLIENT_ACTIVITY_STANDBY/ACTIVE
uint16_t cumulative_rtt;
@@ -132,6 +145,16 @@ struct TOPO_ADDR6 { struct TOPO_ADDR6* next; uint8_t addr[16]; uint16_t port
struct TOPO_SUBNET4 { struct TOPO_SUBNET4* next; uint8_t addr[4]; uint8_t prefix_length; };
struct TOPO_SUBNET6 { struct TOPO_SUBNET6* next; uint8_t addr[16]; uint8_t prefix_length; };
/* Reality-камуфляж сокета (in-memory): per-socket список, значения на узел одинаковы. */
struct TOPO_REALITY_SOCK {
struct TOPO_REALITY_SOCK* next;
uint8_t socket_id;
uint8_t short_id[8];
uint8_t server_pubkey[32];
uint8_t version[3];
char server_name[TOPO_REALITY_SNAME_MAX];
};
struct _topo_head { struct _topo_head* next; };
static inline int topo_list_count(struct _topo_head* head) { int n = 0; while (head) { n++; head = head->next; } return n; }
@@ -149,6 +172,7 @@ struct TOPO_NODE {
struct TOPO_ADDR4* v4_addrs;
struct TOPO_SOCKMETA6* v6_sock_meta;
struct TOPO_ADDR6* v6_addrs;
struct TOPO_REALITY_SOCK* reality_socks; // reality-камуфляж сокетов (per-socket, значения на узел)
};
struct TOPO_NODESUBNETS {
@@ -222,6 +246,12 @@ static inline const struct TOPO_ADDR6* topo_v6_addrs(const struct TOPO_NODE*
static inline const struct TOPO_SUBNET4* topo_v4_subnets(const struct TOPO_NODESUBNETS* r) { return r ? r->v4_subnets : NULL; }
static inline const struct TOPO_SUBNET6* topo_v6_subnets(const struct TOPO_NODESUBNETS* r) { return r ? r->v6_subnets : NULL; }
/* Найти reality-инфо сокета по socket_id (NULL, если сокет без reality). */
const struct TOPO_REALITY_SOCK* topo_node_find_reality_sock(const struct TOPO_NODE* ni, uint8_t socket_id);
/* Заполнить link->reality из reality-инфо пира (rs из BGP). link->reality_set = 1. */
void topo_node_apply_reality(struct ETCP_LINK* link, const struct TOPO_REALITY_SOCK* rs);
#ifdef __cplusplus
}
#endif