Correct ETCP diagnostic filters and state dump documentation

This commit is contained in:
evgeny committed 2026-10-24 00:30:33 +02:00
1 parent bed99abbe9
commit 964f6cb045
3 files changed
+41 -38

No files matched your search

+17 -7
View File
@@ -13,9 +13,11 @@ etcp_dump_pkt_sections(pkt, link, 1); // is_send=1 — отправка
etcp_dump_pkt_sections(pkt, link, 0); // is_send=0 — приём
```
Вывод идёт через `DEBUG_INFO(DEBUG_CATEGORY_DUMP, ...)`. Для включения:
```
debug = dump=info
Вывод идёт через `DEBUG_DEBUG(DEBUG_CATEGORY_DUMP, ...)`, сборка строки также
пропускается при выключенном фильтре. Настройка INI:
```ini
[debug]
dump=debug
```
### Вспомогательная функция
@@ -26,14 +28,22 @@ IP_STR ip = ip_to_string(0x0A000001);
## 3. API
**`IP_STR ip_to_string(uint32_t ip)`** — конвертирует IP (network byte order) в строку `a.b.c.d`. Возвращает структуру с буфером 16 байт.
**`IP_STR ip_to_string(uint32_t ip)`** — печатает байты uint32_t в порядке `[3],[2],[1],[0]`.
На используемых little-endian платформах это числовой IPv4 в host order:
`0x0A000001 → 10.0.0.1`. Значение `sin_addr.s_addr` сначала преобразуют через ntohl.
Результат — структура по значению с буфером 16 байт.
**`void etcp_dump_pkt_sections(struct ETCP_DGRAM* pkt, struct ETCP_LINK* link, int is_send)`** — парсит `pkt->data` побайтово и выводит сводку секций: `ETCP_SECTION_ACK` (last_delivered, count, rx_dup_count), `ETCP_SECTION_TIMESTAMP` (ret_ts/recv_ts), `ETCP_SECTION_PAYLOAD` (size, seq). Неизвестные секции прерывают парсинг. Формат вывода:
**`void etcp_dump_pkt_sections(struct ETCP_DGRAM* pkt, struct ETCP_LINK* link, int is_send)`** —
читает секции из pkt->data без внешней SESSION_DATA-обёртки и выводит ACK
(last_delivered, count, rx_dup_count, точку приёма bytes/time), TIMESTAMP,
ACK_REQUEST и PAYLOAD (размер, seq, attempt_no). Направление: is_send!=0 — SEND, иначе RECV.
Пакет не изменяется; это диагностика после снятия защиты, а не проверка подлинности.
Длинная строка безопасно усекается, неизвестная секция завершает разбор. Пример:
```
ETCP PKT: SEND ts=12345 ack=100/5 dup=0 ch_ts=200/150 payload=1200(seq=101)
ETCP PKT: SEND ts=12345 ack=100/0 dup=0 ch_ts=200/150 payload=100(seq=101,try=1)
```
### Зависимости
- `etcp_connections.h` — `struct ETCP_DGRAM`, `struct ETCP_LINK`
- `etcp.h` — константы `ETCP_SECTION_*`
- `lib/debug_config.h` — `DEBUG_INFO(DEBUG_CATEGORY_DUMP, ...)`
- `lib/debug_config.h` — `DEBUG_DEBUG(DEBUG_CATEGORY_DUMP, ...)`
+22 -30
View File
@@ -1,53 +1,45 @@
# ETCP Connection State Dump (etcp_dump)
## 1. Назначение
Диагностический дамп полного состояния ETCP-соединения в stdout. Охватывает: общие параметры, очереди, пулы памяти, normalizer, все линки с детализацией (BBR, shaper, burst, ошибки, таймеры, NAT). Используется для отладки проблем с соединениями — удобно вызывать из control-сервера или по сигналу.
Снимок состояния ETCP-соединений и сокетов: параметры, очереди, пулы, normalizer,
физические попытки, ACK/RTO и метрики линков. Пишется в настроенные выходы системы
отладки на уровне DEBUG категории `etcp_dump`. Все функции вызываются в uasync-потоке instance.
## 2. Как пользоваться
```c
#include "etcp_dump.h"
debug_set_category_level(DEBUG_CATEGORY_ETCP_DUMP, DEBUG_LEVEL_DEBUG);
// Дамп одного соединения:
etcp_dump_conn_state(conn);
// Дамп всех соединений инстанса:
etcp_dump_all_conns(instance);
// Сокеты либо весь снимок:
etcp_dump_sockets(instance);
etcp_dump_all(instance);
```
Вывод идёт в `stdout` через `fprintf`, формат структурированный с отступами. Пример фрагмента:
```
=== ETCP CONN STATE [myconn] ===
GENERAL: ... peer=0x... initialized=1 links_up=2 tx_state=0 ...
IDS: next_tx=1050 last_rx=1048 last_del=1040 rx_ack_till=1045
RTT: last=15 avg10=14 avg100=16 jitter=2
STATS: bytes_sent=123456 retrans=3 reinit=0 reset=0 ack_pkts=200
INFLIGHT: unacked=8192 optimal=65536
ACK_DEBUG: hit_inf=500 hit_sndq=10 miss=0 link_wait=0 rx_dup=0 tx_dup=0
TIMERS: retrans=ACTIVE ack_resp=free
--- QUEUES ---
input 5 pkts / 4096 bytes
input_send_q 2 pkts / 2048 bytes
...
--- NORMALIZER ---
frag=1400 data_ptr=0/0 flush=free pending=free ...
--- POOLS ---
inflight alloc=100 reuse=50
...
--- LINK 0 ---
BASIC: id=0/0 is_server=0 link_state=3 link_status=1 ...
BBR: bytes=4096 pkts=2 lim=65536 mode=2 cycle=2 pacing=12500000
RTT: last=12 jitter=3 min_rtt_us=5000 bw_lo=... bw_hi=... inflight_lo=... inflight_hi=...
...
--- LINK 1 ---
...
```
Для INI используется секция `[debug]` со строкой `etcp_dump=debug`.
Дамп не меняет состояние и не приобретает владение объектами.
## 3. API
**`void etcp_dump_conn_state(struct ETCP_CONN* conn)`** — полный дамп одного соединения. Выводит секции: GENERAL, IDS, RTT, STATS, INFLIGHT, ACK_DEBUG, DEBUG, TIMERS, QUEUES (6 очередей), NORMALIZER (pkt_normalizer + его очереди), POOLS (inflight_pool, io_pool, instance->data/ack/pkt_pool), LINKS (в цикле по связанному списку link->next, для каждого: BASIC, ADDR, KA, TIMERS, BBR, RTT, TT/RT, MTU, ERRORS, NAT, LAST_RECV, HANDSHAKE, BURST, SHAPER).
**`void etcp_dump_conn_state(struct ETCP_CONN* conn)`** — параметры одного conn,
логические очереди и normalizer, статистика пулов и список линков. У каждого линка
выводятся его attempts/ACK, DATA RTT/jitter, RTO, окно/pacing, keepalive, ошибки,
наблюдаемый локальный endpoint и burst. Таймер повторов находится у каждого линка.
**`void etcp_dump_all_conns(struct UTUN_INSTANCE* instance)`** — итерация по `instance->connections` (через `ll_entry`), вызывает `etcp_dump_conn_state` для каждого активного соединения.
**`void etcp_dump_all_conns(struct UTUN_INSTANCE* instance)`** — обход реестра
instance->connections, включая pending-соединения; вызывает conn_state для каждой записи.
**`void etcp_dump_sockets(struct UTUN_INSTANCE* instance)`** — сокеты, профили
mapping/inbound, MTU, число UDP-линков и сводные счётчики TCP.
**`void etcp_dump_all(struct UTUN_INSTANCE* instance)`** — последовательно sockets и all_conns.
### Зависимости
- `etcp.h` — `struct ETCP_CONN`, поля состояния, очереди, normalizer
+2 -1
View File
@@ -81,4 +81,5 @@ if (!cli) return -1;
- **`client_hs_cb()`** — проверяет ожидаемый ключ сервера, расшифровывает тело ответа и проверяет CRC/размер padding.
- **`client_hs_padding_cb()`** — продвигает приёмный CTR через padding, завершает таймер handshake и сообщает DATA либо результат PING.
- **`stcp_recv_try()` / `stcp_recv_set()`** — общий поэтапный приём handshake и DATA.
- **`stcp_frame_encrypt()` / `stcp_frame_decrypt()`** — общие CRC и CTR для тела кадра; длину DATA шифрует общий TX-код отдельно тем же потоком.
- **`stcp_frame_encrypt()`** — формирует и шифрует целиком `len(2 LE) + data + CRC32(4 LE)`.
- **`stcp_frame_decrypt()`** — дешифрует тело с CRC без поля длины; используется для handshake.