Document atomic proxy client creation and instance shutdown order

This commit is contained in:
evgeny committed 2026-10-24 13:52:22 +02:00
1 parent 5914e26579
commit e2ee5f2397
2 files changed
+18 -7

No files matched your search

+10
View File
@@ -71,6 +71,16 @@ ConnectivityManager до запроса запуска и передаёт ко
| Группа | Сессии пиров, её маршруты и логические каналы, планировщик подключения и recovery |
| Сессия пира группы | NCD handle с момента CONNECTING, согласованные эпохи, состояние обмена таблицей, очередь отправки |
Proxy настраивается при создании ядра. Instance владеет общими UDP/ICMP-контекстами;
TCP client/server владеют только своими bindings, listeners и TCP-потоками.
Общие контексты нужны для exit либо клиентского TUN; SOCKS/HTTP без TUN их не требуют.
Ошибка обязательного listener, TUN mapping или регистрации откатывает создание instance.
Недоступность raw ICMP по правам или поддержке отключает только ICMP exit с WARN;
клиентские ICMP REPLY и TCP/UDP продолжают работать.
`utun_instance_destroy()` закрывает proxy и обрабатывает отложенные free до остановки
UTUN/CHAT-групп и транспорта. Waiters/таймеры снимаются до освобождения их владельцев.
Остановка отдельного TCP proxy-модуля не уничтожает общие UDP/ICMP-контексты.
SQLite открывается ядром один раз: `db_path/chats.db`, либо `:memory:`, если путь
не задан. Остановка чата сохраняет каналы и сообщения в этой БД. В варианте
`:memory:` данные сохраняются только до уничтожения ядра.
+8 -7
View File
@@ -8,8 +8,8 @@
## Создание и владение
`tcp_proxy_client_create` вызывается в uasync с живым `ua`. TUN/lwIP создаются только
при **обоих** непустых `tun_name` и `tun_ip`. В этом случае `tun_init_nat` создаёт
`tcp_proxy_client_create` вызывается в uasync с живым `ua`. Для TUN нужны **оба**
непустых `tun_name` и `tun_ip`; задание только одного — ошибка. `tun_init_nat` создаёт
отдельный proxy TUN (test_mode выбирает тестовый интерфейс); MTU<=0 заменяется на 1500,
MTU TUN передаётся в lwIP. Имя tun_init_nat не означает включение eim_nat на ingress.
Без TUN необходим хотя бы флаг SOCKS или HTTP; эти listeners могут работать без lwIP.
@@ -20,9 +20,10 @@ MTU TUN передаётся в lwIP. Имя tun_init_nat не означает
обмена через router нужен instance. Mappings содержат порты в host byte order,
адрес назначения — IPv4-строку.
Критическая ошибка TUN/lwIP/пула возвращает NULL. Ошибка отдельного listener или
router bind не отменяет создание всего клиента; проверять конкретные listener handles
и диагностику. UDP/ICMP инициализируются только для TUN после успешного TCP bind.
Все заданные SOCKS/HTTP listeners, TUN mappings, TUN/lwIP/пулы и TCP router binding
обязательны. Ошибка любого шага возвращает NULL и освобождает уже созданные ресурсы.
Повторное создание клиента или занятой binding отклоняются. UDP/ICMP создаёт владелец
instance после успешного создания TCP-модулей, если есть TUN либо включён exit.
Клиент привязывается к `ETCP_RT_ID_TCP_PROXY_CLIENT` (0x08), сервер — к
`ETCP_RT_ID_TCP_PROXY_SERVER` (0x04). Генератор stream_id общий для TUN/SOCKS/HTTP,
@@ -81,7 +82,7 @@ CLOSE/ERROR при неудаче отправки могут повторять
Пустое уведомление router (`ROUTER_SVC_HDR_SIZE=26`, без TCP command/sid) удаляет
все lwIP/SOCKS/HTTP потоки клиента к настроенному exit. Это не 9-байтовый wire CLOSE_ALL.
`destroy` снимает TCP binding, закрывает listeners/клиентов, освобождает lwIP/TUN/пул.
Общие UDP/ICMP уничтожаются только при выключенном сервере того же instance.
`destroy` снимает только собственный TCP binding, закрывает listeners/клиентов,
освобождает lwIP/TUN/пул. Общие UDP/ICMP принадлежат instance и сохраняются.
Владелец затем сам обнуляет `inst->tcp_proxy_client`. Все callbacks и очистка выполняются
в uasync; уничтожать клиента следует вне его активного callback.