diff --git a/src/transport_layer/etcp_debug_doc.md b/src/transport_layer/etcp_debug_doc.md index eb216a16..f877baf6 100644 --- a/src/transport_layer/etcp_debug_doc.md +++ b/src/transport_layer/etcp_debug_doc.md @@ -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, ...)` diff --git a/src/transport_layer/etcp_dump_doc.md b/src/transport_layer/etcp_dump_doc.md index a8827f49..086a1fd6 100644 --- a/src/transport_layer/etcp_dump_doc.md +++ b/src/transport_layer/etcp_dump_doc.md @@ -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 diff --git a/src/transport_layer/stcp_client_doc.md b/src/transport_layer/stcp_client_doc.md index acaabd7f..e31c5135 100644 --- a/src/transport_layer/stcp_client_doc.md +++ b/src/transport_layer/stcp_client_doc.md @@ -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.