# etcpmon ## 1. Назначение Windows GUI монитор для ETCP соединений uTun в реальном времени (100ms refresh). Подключается по TCP к control_server внутри uTun и отображает метрики соединений, линков, TUN-интерфейса, роутера и дебаг-уровней. Позволяет менять debug levels на лету через GUI. ## 2. Как пользоваться ### Типовой сценарий 1. В конфиге uTun (`utun.conf`): `control_ip=127.0.0.1`, `control_port=9090` 2. Запустить uTun → он поднимает TCP control server на указанном порту 3. Запустить `etcpmon.exe` (Windows, MinGW/MSYS2 сборка) 4. Ввести IP:порт сервера (по умолчанию `192.168.40.1:9091`), нажать Connect 5. Выбрать соединение из списка Connections — начнут поступать метрики ### Что отображает **ETCP Connection:** - RTT (last / avg10 / avg100, в 0.1ms), jitter, bytes sent, retransmissions, ACKs, unacked bytes, optimal inflight, links count - RX/TX дубликаты, таймеры (retrans/ack_resp), WaitAck состояние (suspended/cb/timer) - ID Sequence: next_tx_id, last_rx_id, last_delivered_id, rx_ack_till - Счётчики ошибок: reinit, reset, pkt_format_errors **TUN / Routing:** - Bytes/packets read/written, ошибки чтения/записи - Routed/dropped пакеты, TUN очереди (InQ/OutQ packets/bytes) - Таблица маршрутов: total, local, learned, BGP senders, BGP nodes **Links:** - Статус (UP/DOWN), encrypt/decrypt/send/recv ошибки - Total encrypted/decrypted bytes, bandwidth (Kbps), NAT changes - RTT (last/avg10), transmit time, keepalive counters (sent/recv) - Inflight bytes/packets/limit, таймеры (init/keepalive/shaper) **BBR per link:** - mode (STARTUP/DRAIN/PROBE_BW/PROBE_RTT), cycle idx, full_bw/loss_in_round флаги - pacing_rate (bytes/sec), min_rtt (us), bw_hi/bw_lo (bytes/sec), inflight_hi/lo, pacing_gain **Router Congestion (агрегированные):** - total_conns, total_inflight, total_send_q, total_recv_q - pkts sent/recv, send err, ACK sent/recv, dup_dropped, oob_dropped, stale_ack, sign_fail - RTT max/avg, jitter max, minRTT min **Графики BBR (scrolling canvas, 860 сэмплов, 1px=1sample):** - Inflight Bytes, Cwnd (inflight_lim), minRTT, bwHi, Pacing Rate, bwLo, inflight Hi, BBR Mode - 8 каналов с индивидуальными галочками включения - Вертикальная линия курсора с показом значений в блоках под графиком **Очереди (Queues & Errors):** - InQ, InSend, WaitAck, AckQ, RecvQ, OutQ — bytes/packets - Нормализатор: input/output pkts/bytes, alloc/logic errors, frag_size, data_ptr/size, cumulative totals - ACK Debug: hit_inf, hit_sndq, miss, link_wait - Системные ресурсы: active_timeouts, busy_memory_blocks **Debug Levels (правая колонка):** - Глобальный уровень: NONE/ERROR/WARN/INFO/DEBUG/TRACE (радиокнопки) - Per-category уровни с метками категорий - Radio-кнопки отправляют CMD_SET_DEBUG_CONFIG на сервер при клике **Action:** - Текстовое поле + кнопка Send — отправка произвольной команды (CMD_ACTION) - Результат открывается в отдельном окне с моноширинным шрифтом Consolas ### Сборка ```cmd cd tools\etcpmon build.bat # через MSYS2 UCRT64 (рекомендуется) ``` ```bash bash build.sh # Unix/MinGW make # MinGW Makefile ``` Серверная часть (control_server) встроена в utun, собирается стандартным `./configure && make`. ### Горячие клавиши - Tab в поле Server/Port — переключение между полями - Enter в поле Server/Port — Connect/Disconnect - Enter в поле Action — отправка команды ## 3. API / Структура ### Компоненты | Файл | Назначение | |------|-----------| | `etcpmon_main.c` | WinMain: инициализация GUI, создание окна, message loop | | `etcpmon_client.h/c` | TCP клиент (Winsock2): connect, send/recv, парсинг протокола, history, pending requests с коллбэками | | `etcpmon_gui.h/c` | WinAPI GUI: окно 1000×1400, все контролы (~200 edit-полей, списки, кнопки, radio, graph), тултипы | | `etcpmon_graph.h/c` | Real-time график: 8 каналов, off-screen буфер, пересчёт min/max, курсор, обновление channel values | | `etcpmon_protocol.h` | Бинарный протокол, общие структуры, shared между клиентом и сервером | ### Протокол (бинарный, TCP) Формат: `[size:2][type:1][seq_id:1][payload...]` **Клиент → Сервер:** - `0x01` CMD_LIST_CONN — запрос списка соединений (без payload) - `0x02` CMD_SELECT_CONN — выбор соединения: `peer_node_id` (uint64_t) - `0x03` CMD_GET_METRICS — запрос метрик для выбранного соединения - `0x04` CMD_DISCONNECT — отключение - `0x05` CMD_LIST_SOCKETS — запрос списка локальных сокетов - `0x06` CMD_ACTION — текстовая команда (32 байта) - `0x07` CMD_GET_DEBUG_CONFIG — запрос текущих debug levels - `0x08` CMD_SET_DEBUG_CONFIG — установка debug levels: `[global_level:1][cat_count:1][levels:N]` - `0x09` CMD_SUBSCRIBE_NODES — подписка на изменения узлов (topo) **Сервер → Клиент:** - `0x81` RSP_CONN_LIST: `count(1) + N × {peer_node_id(8) + name(32)}` - `0x82` RSP_METRICS: `etcp_metrics + tun_metrics + router_metrics + N × link_metrics` - `0x83` RSP_SOCKET_LIST: `count(1) + N × socket_info` - `0x84` RSP_DEBUG_CONFIG: `global_level(1) + cat_count(1) + names_csv(NUL-term) + levels[N]` - `0x85` RSP_NODE_INFO — один узел (raw BGP_NODEINFO_PACKET) - `0x86` RSP_NODE_INFO_END — конец списка узлов - `0x88` RSP_NODE_REMOVED — узел удалён: `node_id(8)` - `0x89` RSP_ACTION_RESULT — результат команды: `code(1) + text(NUL-term)` - `0xFF` RSP_ERROR: `error_code(1) + message(NUL-term)`