// remote_proxy.h — Удаленный TCP прокси (exit node) // Создаёт OS сокеты к адресатам по запросам от других нод через etcp_router #ifndef REMOTE_PROXY_H #define REMOTE_PROXY_H #include #include "../lib/socket_compat.h" struct UTUN_INSTANCE; struct UASYNC; struct ll_entry; struct ETCP_CONN; struct remote_proxy_ctx; // Sub-commands for ETCP_ID_TCP_PROXY protocol #define TCP_PROXY_SUBCMD_CONNECT 0x01 #define TCP_PROXY_SUBCMD_CONNECTED 0x02 #define TCP_PROXY_SUBCMD_DATA 0x03 #define TCP_PROXY_SUBCMD_CLOSE 0x04 #define TCP_PROXY_CONNECTED_OK 0 #define TCP_PROXY_CONNECTED_REFUSED 1 #define TCP_PROXY_HDR_SIZE 10 #define TCP_PROXY_CONNECT_HDR_SIZE 16 #define TCP_PROXY_CONNECTED_HDR_SIZE 13 struct remote_proxy_conn { struct remote_proxy_conn* next; struct remote_proxy_ctx* ctx; uint64_t stream_id; uint64_t peer_node_id; socket_t sock; void* read_id; struct UASYNC* ua; int connected; int connect_called; uint8_t dest_ip[4]; uint16_t dest_port; }; struct remote_proxy_ctx { int enabled; struct remote_proxy_conn* conns; struct UTUN_INSTANCE* inst; }; int remote_proxy_init(struct UTUN_INSTANCE* inst); void remote_proxy_destroy(struct UTUN_INSTANCE* inst); struct remote_proxy_conn* remote_proxy_find_conn(struct remote_proxy_ctx* ctx, uint64_t stream_id); int remote_proxy_handle_connect(struct UTUN_INSTANCE* inst, struct ll_entry* entry, uint64_t stream_id, uint64_t src_node_id); int remote_proxy_handle_data(struct UTUN_INSTANCE* inst, struct ll_entry* entry, uint64_t stream_id); void remote_proxy_handle_close(struct UTUN_INSTANCE* inst, uint64_t stream_id); #endif