reality: реклама reality-параметров сокетов через BGP и применение к исходящим TCP-линкам
This commit is contained in:
1 parent
edb3bb36e1
commit
898a0a4a66
13 files changed
+615
-22
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user