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.
136 lines
4.2 KiB
136 lines
4.2 KiB
// tun_if.h - Cross-platform TUN interface management for utun |
|
#ifndef TUN_IF_H |
|
#define TUN_IF_H |
|
|
|
#include <stdint.h> |
|
#include <stddef.h> |
|
#include <sys/types.h> |
|
|
|
#ifdef _WIN32 |
|
#include <windows.h> // для HANDLE и CRITICAL_SECTION |
|
#endif |
|
|
|
// Forward declarations |
|
struct UASYNC; |
|
struct utun_config; |
|
struct ll_queue; |
|
struct ll_entry; |
|
struct memory_pool; |
|
//struct ETCP_FRAGMENT; // используется внутри, определён в etcp.h |
|
|
|
// Структура для передачи данных из TUN потока в main thread |
|
struct tun_packet_data { |
|
struct tun_if* tun; |
|
struct ll_entry* entry; |
|
}; |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
#define TUN_MTU_DEFAULT 1500 |
|
#define TUN_MAX_PACKET_SIZE 1500 |
|
|
|
// =================================================================== |
|
// TUN interface handle |
|
// =================================================================== |
|
struct tun_if { |
|
char ifname[16]; // "utun", "tun0", "tun_test" и т.д. |
|
|
|
int fd; // Linux: fd /dev/net/tun, Windows: -1 |
|
void* platform_handle; // Windows: WINTUN_SESSION_HANDLE |
|
void* adapter_handle; // Windows: WINTUN_ADAPTER_HANDLE |
|
|
|
struct UASYNC* ua; |
|
void* socket_id; // uasync socket_id (NULL на Windows) |
|
|
|
struct memory_pool* pool; // пул для ll_entry |
|
struct ll_queue* output_queue; // TUN → routing (пакеты из интерфейса) |
|
struct ll_queue* input_queue; // routing → TUN (пакеты в интерфейс) |
|
|
|
int test_mode; // 1 = тестовый режим (без реального TUN) |
|
|
|
// Статистика |
|
uint64_t bytes_read; |
|
uint64_t bytes_written; |
|
uint32_t packets_read; |
|
uint32_t packets_written; |
|
uint32_t read_errors; |
|
uint32_t write_errors; |
|
|
|
uint32_t ifindex; // интерфейсный индекс |
|
|
|
#ifdef _WIN32 |
|
HANDLE read_thread; |
|
HANDLE stop_event; |
|
volatile int running; // 1 = поток работает |
|
#endif |
|
}; |
|
|
|
/** |
|
* @brief Инициализация TUN интерфейса |
|
* @param ua экземпляр uasync |
|
* @param config конфигурация (IP, MTU, test_mode и т.д.) |
|
* @return указатель на tun_if или NULL при ошибке |
|
*/ |
|
struct tun_if* tun_init(struct UASYNC* ua, struct utun_config* config); |
|
|
|
/** |
|
* @brief Закрытие и освобождение всех ресурсов |
|
*/ |
|
void tun_close(struct tun_if* tun); |
|
|
|
/** |
|
* @brief Записать пакет в TUN (из routing) |
|
*/ |
|
ssize_t tun_write(struct tun_if* tun, const uint8_t* buf, size_t len); |
|
|
|
/** |
|
* @brief Получить очередь input (routing → TUN) |
|
*/ |
|
struct ll_queue* tun_get_input_queue(struct tun_if* tun); |
|
|
|
/** |
|
* @brief Получить очередь output (TUN → routing) |
|
*/ |
|
struct ll_queue* tun_get_output_queue(struct tun_if* tun); |
|
|
|
/** |
|
* @brief Проверка режима |
|
*/ |
|
int tun_is_test_mode(struct tun_if* tun); |
|
|
|
/** |
|
* @brief Инъекция пакета в output_queue (для тестов и Windows-уведомлений) |
|
*/ |
|
int tun_inject_packet(struct tun_if* tun, const uint8_t* buf, size_t len); |
|
|
|
/** |
|
* @brief Прочитать пакет из input_queue (тестовый helper) |
|
*/ |
|
ssize_t tun_read_packet(struct tun_if* tun, uint8_t* buf, size_t len); |
|
|
|
/** |
|
* @brief Callback для обработки пакетов из TUN в main thread (через uasync_post) |
|
*/ |
|
void tun_packet_handler(void* arg); |
|
|
|
// =================================================================== |
|
// Platform-specific internal functions |
|
// (реализованы в tun_linux.c / tun_windows.c) |
|
// =================================================================== |
|
int tun_platform_init(struct tun_if* tun, const char* ifname, const char* ip_str, int mtu); |
|
void tun_platform_cleanup(struct tun_if* tun); |
|
ssize_t tun_platform_read(struct tun_if* tun, uint8_t* buf, size_t len); |
|
ssize_t tun_platform_write(struct tun_if* tun, const uint8_t* buf, size_t len); |
|
int tun_platform_get_poll_fd(struct tun_if* tun); |
|
|
|
#ifdef _WIN32 |
|
DWORD WINAPI tun_read_thread_proc(LPVOID arg); |
|
#endif |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
#endif /* TUN_IF_H */
|
|
|