8.8 KiB
utun_instance — Корневой инстанс (центральный оркестратор)
1. Назначение
UTUN_INSTANCE — центральная структура всего процесса uTun. Владеет всеми подсистемами: TUN, таблица маршрутов, BGP-группы, ETCP-сокеты/соединения, control-сервер, message transport, firewall, NAT, TCP-прокси, memory pools, NTP, синхронизация БД, менеджер соединений.
Это единственная точка входа для инициализации и завершения всех компонентов. Порядок инициализации и destroy строго определён — от низкоуровневых подсистем к высокоуровневым и обратно.
2. Как пользоваться
Создание
struct UASYNC* ua = uasync_create();
struct UTUN_INSTANCE* inst = utun_instance_create(ua, "utun.conf"); // из файла
// или
struct UTUN_INSTANCE* inst = utun_instance_create_from_config(ua, config); // из готовой структуры
// или
struct UTUN_INSTANCE* inst = utun_instance_create_from_str(ua, config_text); // из строки (тесты)
Инициализация (оркестрация)
utun_instance_init(inst); // запускает всю цепочку инициализации
utun_instance_init() не вызывает utun_instance_create() — create только аллоцирует память и загружает конфиг. init запускает все подсистемы в строгом порядке:
db_sync_init— распределённая БД с репликациейrouting_set_tun— привязка TUN к таблице маршрутовnat_transport_init— NAT (если включён в конфиге)init_connections— ETCP-сокеты, клиентские подключения, handshakecontrol_server_init— сервер мониторинга (etcpmon)ntp_time_init+ntp_node_time_init— синхронизация времени
Основной цикл
inst->running = 1;
while (inst->running) {
uasync_poll(inst->ua, 100);
}
Остановка и destroy
utun_instance_stop(inst); // running=0, wakeup
utun_instance_destroy(inst); // полный cleanup в обратном порядке
destroy гарантирует порядок: NTP→control→ETCP sockets→db_sync→connections→pings→TUN→tcp_proxy→routing→NAT→etcp_router→conn_mgr→BGP→fw→stcp→networks→config→pools. uasync не уничтожается — вызывающий код должен сам вызвать uasync_destroy().
Reload (SIGHUP)
inst = utun_instance_reload(inst, ua, "utun.conf");
Сравнивает старый и новый конфиг:
- Если изменились ключи/node_id/tun_ifname → полный перезапуск (destroy + create + init)
- Иначе — селективное обновление: только изменённые/добавленные/удалённые сокеты, клиенты, линки. Неизменённые не трогаются (без close, без сброса таймеров).
3. API
Структура UTUN_INSTANCE — ключевые поля
| Поле | Тип | Назначение |
|---|---|---|
name |
char[16] |
Имя инстанса из конфига |
config |
struct utun_config* |
Полный разобранный конфиг |
node_id |
uint64_t |
Идентификатор узла (из конфига или derived из privkey) |
my_keys |
struct SC_MYKEYS |
Пара ключей X25519 (pub/priv) |
my_ed25519_pubkey / _privkey |
uint8_t[32] |
Ed25519 ключи (для подписи) |
ua |
struct UASYNC* |
Главный event loop (один на поток) |
running |
int |
Флаг работы главного цикла |
tun |
struct tun_if* |
TUN-интерфейс |
route_subnets |
struct CFG_ROUTE_ENTRY* |
Маршруты для добавления/удаления системных роутов |
rt |
struct ROUTE_TABLE* |
Таблица маршрутов |
topo_groups |
struct TOPO_GROUPS* |
BGP-подобный обмен маршрутами |
connections |
struct ll_queue* |
Очередь всех ETCP-соединений (индекс по peer_node_id) |
etcp_sockets |
struct ETCP_SOCKET* |
Связный список UDP-сокетов |
stcp_server |
struct stcp_server* |
STCP TCP-сервер |
data_pool |
struct memory_pool* |
Пул для данных пакетов (payload) |
pkt_pool |
struct memory_pool* |
Пул для struct ETCP_DGRAM |
ack_pool |
struct memory_pool* |
Пул для struct ACK_PACKET |
control_srv |
struct control_server* |
Сервер мониторинга (etcpmon backend) |
fw |
struct firewall_ctx |
Контекст файрвола |
nat / nat_tr |
struct eim_nat_ctx / nat_transport_ctx |
EIM NAT + транспорт |
tcp_proxy_client |
struct tcp_proxy_client* |
TCP-прокси клиент (опционально) |
tcp_proxy_server |
struct tcp_proxy_server |
TCP-прокси сервер (exit node) |
router_bindings / router_conns |
Привязки и соединения ETCP-роутера | |
conn_mgr |
struct CONN_MGR* |
Менеджер соединений (может быть NULL) |
db_sync |
struct DB_SYNC* |
Распределённая синхронизация БД (может быть NULL) |
networks |
struct ll_queue* |
Очередь сетей (NETWORK_ENTRY, индекс по 56-bit id) |
pending_connects |
struct ETCP_CONNECT* |
Ожидающие фоновые подключения |
ntp / ntp_node |
struct NTP_TIME / NTP_NODE_TIME |
Синхронизация времени |
stats_dir |
char[512] |
Путь <config_dir>/stats/ для файлов метрик |
next_socket_id |
uint8_t |
Счётчик уникальных ID сокетов (0–255) |
socket_init_status |
int |
Статус инициализации сокетов: 0=OK, 1=частично, -1=ошибка |
routed_packets / dropped_packets |
uint64_t |
Счётчики маршрутизированных/отброшенных пакетов |
Основные функции
| Функция | Описание |
|---|---|
utun_instance_create(ua, config_file) |
Загрузка конфига, аллокация инстанса, вызов instance_init_common(). Возвращает готовый к init инстанс или NULL |
utun_instance_create_from_config(ua, config) |
Создание из уже разобранного конфига (владение передаётся инстансу) |
utun_instance_create_from_str(ua, config_text) |
Создание из строки конфига (временный файл → parse → delete). Для тестов |
utun_instance_init(instance) |
Основной оркестратор инициализации. Запускает все подсистемы в правильном порядке, устанавливает running=1 |
utun_instance_destroy(instance) |
Полный cleanup всех ресурсов в обратном порядке зависимостей |
utun_instance_stop(instance) |
Установка running=0 + uasync_wakeup() для выхода из mainloop |
utun_instance_reload(instance, ua, config_file) |
Перезагрузка конфига по SIGHUP: полная при изменении ключей/TUN, иначе селективная |
utun_instance_set_tun_init_enabled(enabled) |
Глобальный флаг: включать инициализацию TUN или нет (для тестов без TUN) |
utun_instance_diagnose_leaks(instance, phase) |
Диагностика: подсчёт ETCP-сокетов/соединений/линков, проверка утечек пулов и TUN |
Внутренние (static)
| Функция | Описание |
|---|---|
instance_init_common(instance, ua, config) |
Общая инициализация для всех create-функций: ключи, node_id, networks, memory pools, routing, TUN, сокеты, BGP, conn_mgr, firewall, etcp_router, routing_bind, tcp_proxy_server/client |
local_sockaddr_equal(a, b) |
Сравнение двух sockaddr_storage (IPv4/IPv6) — используется в reload |