# ETCP Monitor - Implementation Summary ## Overview ETCP Monitor is a Windows GUI utility for real-time monitoring of ETCP connections in uTun. ## Architecture ### Protocol (Binary) - **Format**: `[2 bytes: size] [1 byte: type] [payload...]` - **Period**: 100ms updates - **Transport**: TCP socket ### Message Types **Client → Server:** - `0x01` - Request connection list - `0x02` - Select connection by peer_node_id - `0x03` - Request metrics - `0x04` - Disconnect **Server → Client:** - `0x81` - Connection list response - `0x82` - Metrics response (ETCP + TUN + Links) - `0xFF` - Error response ## Files Created ### Protocol (Shared) - `tools/etcpmon/etcpmon_protocol.h` - Protocol definitions and structures ### Server (uTun) - `src/control_server.h` - Control server interface - `src/control_server.c` - TCP server implementation - Modified `src/utun_instance.c` - Integration with uTun lifecycle - Modified `src/Makefile.am` - Added control_server.c to build - Modified `lib/debug_config.h` - Added DEBUG_CATEGORY_CONTROL ### Client (Windows GUI) - `tools/etcpmon/etcpmon_client.h/c` - Network layer (Winsock) - `tools/etcpmon/etcpmon_gui.h/c` - WinAPI GUI implementation - `tools/etcpmon/etcpmon_main.c` - Entry point - `tools/etcpmon/Makefile.mingw` - MinGW build - `tools/etcpmon/build.bat` - Windows build script - `tools/etcpmon/build.sh` - Unix build script - `tools/etcpmon/clean.bat` - Clean script - `tools/etcpmon/README.md` - Documentation ### Test - `tests/test_control_server.c` - Integration test for control server protocol ### Library Fix - `lib/u_async.c` - Modified to use select() on Windows instead of WSAPoll ## Build Instructions ### Windows (Recommended) ```cmd cd tools\etcpmon build.bat ``` ### Unix/MinGW ```bash cd tools/etcpmon bash build.sh ``` ## Usage ### 1. Configure uTun Add to `utun.conf`: ```ini control_ip=127.0.0.1 control_port=9090 ``` ### 2. Start uTun ```bash ./utun ``` ### 3. Start ETCP Monitor ```cmd etcpmon.exe ``` ### 4. Connect - Enter server IP:port (default: 127.0.0.1:9090) - Click "Connect" - Select connection from list - View real-time metrics ## Metrics Displayed ### ETCP Connection - RTT (last, avg 10, avg 100) - Jitter - Bytes sent total - Retransmission count - ACK count - Unacked bytes - Links count ### TUN Interface - Bytes read/written - Packets read/written - Read/write errors ### Links (per link) - Status (UP/DOWN) - Encrypt/decrypt errors - Send/receive errors - Total encrypted/decrypted bytes - Bandwidth (Kbps) - NAT changes count ## Technical Details ### Windows select() Implementation On Windows, the uasync library now uses `select()` instead of `WSAPoll()` for socket monitoring. This resolves issues with accepted TCP sockets that caused WSAPoll to fail with error 10022 (WSAEINVAL). **Changes in `lib/u_async.c`:** - Added Windows-specific code path using `select()` - Maintains compatibility with Linux (uses `poll()`) - Properly handles both regular FDs and socket_t types ### Binary Protocol The protocol uses fixed-size binary structures for efficient communication: - Header: 3 bytes (2 size + 1 type) - Connection list item: 40 bytes (8 peer_id + 32 name) - ETCP metrics: 40 bytes - Link metrics: 32 bytes per link - TUN metrics: 24 bytes ## Testing ### Unit Test ```bash cd tests ./test_control_server ``` Expected output: ``` ================================ Control Server Protocol Test ================================ [TEST] Setting up mock data... [TEST] Mock data ready (1 conn, 2 links) [TEST] Starting control server on port 19090... [TEST] Control server started ✓ [TEST] Starting client thread... [TEST] Running event loop... [CLIENT] Connecting to 127.0.0.1:19090... [CLIENT] Connected [CLIENT] Sending CMD_LIST_CONN... [CLIENT] Waiting for response... [CLIENT] Received connection list: 1 connection(s) [CLIENT] Connection verified: peer_id=0x1234567890ABCDEF ✓ [CLIENT] All tests passed ✓ [TEST] Cleaning up... ================================ [PASS] All tests passed! ================================ ``` ## License See main project LICENSE file.