Correct ETCP diagnostic filters and state dump documentation
This commit is contained in:
1 parent
bed99abbe9
commit
964f6cb045
3 files changed
+41
-38
No files matched your search
@@ -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, ...)`
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
Reference in new issue
Block a user