Refresh both AGENTS guides and clarify module purpose, usage, ownership, threading, return values and wire formats in headers. Remove the unused timeout_heap freed_count field and unimplemented getter.
78 lines
3.1 KiB
C
78 lines
3.1 KiB
C
/* Exit TCP-прокси: принимает CONNECT/DATA через UTUN-router и открывает обычный TCP к назначению.
|
|
* Поток определяется парой peer_node_id/stream_id; proxy_flow согласует окна и half-close.
|
|
* init учитывает tcp_proxy_server_enabled в конфиге; destroy закрывает потоки и общий UDP/ICMP-прокси.
|
|
* Состояние принадлежит UTUN_INSTANCE, операции и callbacks выполняются в его uasync-потоке. */
|
|
#ifndef TCP_PROXY_SERVER_H
|
|
#define TCP_PROXY_SERVER_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
#include <stdint.h>
|
|
#include "../lib/socket_compat.h"
|
|
#include "../lib/ll_queue.h"
|
|
#include "../lib/tcp_io.h"
|
|
#include "../routing_layer/etcp_router.h"
|
|
|
|
struct UTUN_INSTANCE;
|
|
struct UASYNC;
|
|
struct ll_entry;
|
|
struct ETCP_CONN;
|
|
|
|
#include "proxy_protocol.h"
|
|
|
|
struct tcp_proxy_server_conn {
|
|
struct tcp_proxy_server_conn* next;
|
|
struct tcp_proxy_server* ctx;
|
|
struct tcp_conn* tc;
|
|
struct proxy_flow flow;
|
|
uint32_t stream_id;
|
|
uint64_t peer_node_id;
|
|
uint8_t dest_ip[4];
|
|
uint16_t dest_port;
|
|
|
|
uint8_t close_queued;
|
|
uint8_t cli_closed; // client sent CLOSE
|
|
|
|
void* diag_timer; // 1-секундный таймер диагностики
|
|
uint8_t freed; // 1 = уже освобождён, защита от double-free
|
|
|
|
struct queue_waiter_handle pause_waiter;
|
|
void* retry_timer; // fallback timer (500ms) for force=1 retry on stall
|
|
uint32_t bytes_sent; // байт записано в destination (реальный TCP)
|
|
uint32_t bytes_relayed; // байт отправлено клиенту через ETCP
|
|
uint32_t drain_count; // счётчик вызовов read_queue_drain_cb
|
|
uint32_t data_count; // счётчик входящих DATA от клиента
|
|
struct UASYNC* ua;
|
|
};
|
|
|
|
struct tcp_proxy_server {
|
|
int enabled;
|
|
int conn_count;
|
|
struct tcp_proxy_server_conn* conns;
|
|
struct UTUN_INSTANCE* inst;
|
|
};
|
|
|
|
int tcp_proxy_server_init(struct UTUN_INSTANCE* inst);
|
|
void tcp_proxy_server_destroy(struct UTUN_INSTANCE* inst);
|
|
|
|
struct tcp_proxy_server_conn* tcp_proxy_server_find_conn(struct tcp_proxy_server* ctx, uint64_t peer, uint32_t stream_id);
|
|
void tcp_proxy_server_conn_free(struct tcp_proxy_server_conn* rc);
|
|
|
|
void tcp_proxy_server_recv_cb(struct ETCP_CONN* conn, struct ll_entry* entry);
|
|
|
|
int tcp_proxy_server_handle_connect(struct UTUN_INSTANCE* inst, struct ll_entry* entry,
|
|
uint32_t stream_id, uint64_t src_node_id);
|
|
int tcp_proxy_server_handle_data(struct UTUN_INSTANCE* inst, struct ETCP_CONN* conn, struct ll_entry* entry, uint32_t stream_id);
|
|
void tcp_proxy_server_handle_close(struct UTUN_INSTANCE* inst, uint64_t peer, uint32_t stream_id);
|
|
void tcp_proxy_server_handle_error(struct UTUN_INSTANCE* inst, uint64_t peer, uint32_t stream_id);
|
|
void tcp_proxy_server_handle_fin(struct UTUN_INSTANCE* inst, uint64_t peer, uint32_t stream_id);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif
|