diff --git a/doc/proxy_protocol.md b/doc/proxy_protocol.md index d5466f0e..197d735e 100644 --- a/doc/proxy_protocol.md +++ b/doc/proxy_protocol.md @@ -185,16 +185,16 @@ trace — трафик и секундная диагностика exit TCP-о | test_tcp_proxy_client | Create/destroy с тестовым TUN, без утечек | | test_tcp_proxy_server | TCP echo через tcp_conn; сам по себе не проверяет протокол exit | | test_socks_http_proxy | Реальные SOCKS IPv4/domain, HTTP и HTTPS CONNECT, byte-exact загрузки; штатный TLS shutdown либо UTUN_TEST_TLS_ABRUPT=1 | -| test_udp_proxy / test_icmp_proxy | Два instance через ETCP; ICMP выбирает явный test_loopback при недоступном raw socket | +| test_udp_proxy / test_icmp_proxy | Два instance через ETCP; ICMP: явный test_loopback, UTUN_TEST_ICMP_RAW=1 требует настоящий raw socket | | test_tcp_io | 19 сценариев, включая HUP high/low-water на epoll/poll, ручную паузу и независимую запись | | test_tcp_io_flush | Callback после последнего синхронного send | -Проверка 2026-10-24: профильные тесты проходят на Linux. ICMP без прав на raw проверен -через явный test_loopback. Штатный TLS shutdown проходит без EPIPE/ENOTCONN; +Проверка 2026-10-24: профильные тесты проходят на Linux. ICMP проверен и через явный +test_loopback, и настоящим raw echo до 127.0.0.1 с правами root. Штатный TLS shutdown проходит без EPIPE/ENOTCONN; аварийный сохраняет реальные ошибки записи, все 16 загрузок остаются byte-exact. Тестовые конфиги используют поддержанный connect_timeout. Итоги полного прогона и sanitizer-проверок — в [proxy_fix_plan.txt](proxy_fix_plan.txt). -Windows/FreeBSD runtime и настоящий raw ICMP в этом окружении не проверены. +Windows/FreeBSD runtime в этом окружении не проверены. Создание proxy из конфигурации в utun_instance.c исключено под _WIN32. IPv4-фрагменты на входе proxy TUN отклоняются; сборки фрагментов нет. Описания модулей: `src/proxy/*_doc.md`; все семь заголовков `src/proxy/*.h` сверены с реализацией. diff --git a/tests/test_icmp_proxy.c b/tests/test_icmp_proxy.c index 80ea19d2..538cb8a5 100644 --- a/tests/test_icmp_proxy.c +++ b/tests/test_icmp_proxy.c @@ -145,6 +145,7 @@ static void test_timeout(void* arg) { int main(void) { printf("=== test_icmp_proxy ===\n"); debug_config_init(); debug_set_level(DEBUG_LEVEL_ERROR); debug_set_categories(DEBUG_CATEGORY_ALL); + debug_set_category_level(DEBUG_CATEGORY_GENERAL, DEBUG_LEVEL_INFO); utun_instance_set_tun_init_enabled(0); srand((unsigned)time(NULL)); @@ -162,7 +163,16 @@ int main(void) { exit_node_id = exit_node->node_id; client_node_id = cli->node_id; - icmp_proxy_set_test_loopback(exit_node, 1); + if (getenv("UTUN_TEST_ICMP_RAW")) { + if (!exit_node->icmp_proxy || exit_node->icmp_proxy->raw_sock == SOCKET_INVALID) { + DEBUG_ERROR(DEBUG_CATEGORY_PROXY, "ICMP raw test requires a working exit raw socket"); + goto done; + } + DEBUG_INFO(DEBUG_CATEGORY_GENERAL, "ICMP test: real raw socket fd=%d", (int)exit_node->icmp_proxy->raw_sock); + } else { + icmp_proxy_set_test_loopback(exit_node, 1); + DEBUG_INFO(DEBUG_CATEGORY_GENERAL, "ICMP test: explicit test_loopback"); + } g_to_id = uasync_set_timeout(ua, 100, NULL, monitor, "mon"); void* to_id = uasync_set_timeout(ua, TEST_TIMEOUT_MS * 10, NULL, test_timeout, "to");