Commit Graph
39 Commits
Author SHA1 Message Date
evgeny ff69552a61 Measure owned endpoint mapping and inbound reachability separately 2026-10-12 00:01:40 +02:00
evgeny 4afd5df55f tests: use bound ephemeral ports for ETCP and IPv6 peers 2026-10-10 15:27:47 +02:00
evgeny 38c9f229bc stcp: ed25519 pubkey exchange in handshake, fix instance destroy segfault, fix chat_tcp_test
- u_async.c: process immediate_queue BEFORE epoll_wait in uasync_poll
- stcp_link.c: defensive NULL etcp_conn/etcp_link in stcp_link_close
- utun_instance.c: move stcp_server_list_destroy_all to Phase J (before ETCP),
  add deferred drain in both Phase J and L
- stcp.h/c: STCP_HS_ENC_CLIENT 6→38, STCP_HS_ENC_SERVER 7→39,
  exchange ed25519_pubkey in both handshake directions
- etcp_connections.c: copy peer_ed25519 from STCP to ETCP_CONN in
  etcp_link_enter_ready_tcp; guard link->etcp in tcp_link_close_cb
- chat_sync.c: fix lk->conn NULL dereference for TCP links
- test_stcp.c: update stcp_server_create/stcp_client_connect callsites
- tools/chat_tcp_test: change transport udp→tcp
2026-08-07 00:48:27 +03:00
evgeny d773f1724a refactor: STCP connections as ETCP links (is_tcp)
- Add is_tcp, tcp_link, tcp_reconnect_* fields to ETCP_LINK
- Remove transport_link from ETCP_CONN, add tcp_link_count
- stcp_link: replace embedded etcp_conn with pointer; add etcp_link backpointer
- stcp_link: link_rx_cb routes ETCP data to etcp_conn_input
- stcp_link: call on_close_cb in close
- New TCP functions: etcp_link_enter_ready_tcp, etcp_tcp_link_start_connect,
  etcp_tcp_link_start_reconnect, tcp_link_close_cb, etcp_tcp_send
- etcp_link_new: handle NULL conn for TCP links; skip enter_init for TCP
- etcp_link_close: close stcp_link for TCP
- etcp_encrypt_send: redirect TCP to etcp_tcp_send (skips AES-CCM)
- tcp_server_on_link: create ETCP_LINK(is_tcp=1) + enter_ready_tcp
- etcp_connect: TCP addrs -> etcp_tcp_link_start_connect
- Remove ctx->tcp_link/tcp_ready
- test_stcp_traffic: find stcp_link via links->is_tcp instead of transport_link
- 66/68 tests pass; 2 STCP tests expected to fail (integration not complete)
2026-08-06 22:14:32 +03:00
Evgeny fcf3fb7f51 refactor: move transport (etcp/stcp/normalizer) to transport_layer/, routing (bgp/pings/topo*) to routing_layer/ 2026-07-21 20:25:41 +03:00
Evgeny a7ecee01f5 etcp: replace connections linked-list with indexed ll_queue, add state/ref_count lifecycle
- Remove ETCP_CONN.next linked-list, UTUN_INSTANCE.connections list/count
- Unified connections in single ll_queue indexed by peer_node_id (0=pending)
- struct conn_queue_entry { peer_node_id, conn* } for uniform queue data
- Connection lifecycle via etcp.c: create→pending, conn_ready→indexed, close→detach+deferred free
- Close split: phase1 detach from external world, phase2 deferred via uasync_call_soon
- etcp_conn_set_peer_node_id: reindex on ID change (WARN)
- etcp_conn_ref_take/free: blocking close until refcount returns to 0
- Remove chat_connections — use unified connections queue directly
- Update all iteration/search patterns across 40 files (src + tests + chatgui)
2026-07-15 19:56:47 +03:00
Evgeny 73f707ef9b crypto: migrate ECDH(secp256r1) to X25519, drop TinyCrypt
- SC_PUBKEY_SIZE: 64 -> 32 bytes, SC_PUBKEY_ENC_SIZE: 72 -> 40
- sc_set_peer_public_key uses EVP_PKEY_derive with X25519
- sc_generate_keypair via EVP_PKEY_keygen(EVP_PKEY_X25519)
- sc_compute_public_key_from_private via EVP_PKEY_new_raw_private_key
- sc_validate_key: check non-zero (X25519 has no invalid keys)
- sc_obfuscate_pubkey: XOR now 32 bytes
- Remove all TinyCrypt code (~860 lines), always use OpenSSL
- Remove TinyCrypt from build system, drop test_crypto/test_ecc_encrypt
- Update all test keys (128 hex -> 64 hex)
- Fix bbr_integration.c split-line pubkeys
2026-06-17 21:28:07 +03:00
Evgeny d0d4199273 etcp: unified send hook via etcp_udp_send, remove loss_rate, add dummynet_filter inline mode, rewrite BGP test
- Add etcp_udp_send_fn_t hook typedef, send_hook/send_hook_ctx fields to ETCP_LINK
- Implement etcp_udp_send() wrapper — all UDP sends go through one point
- Remove loss_rate from ETCP_SOCKET, CFG_SERVER, config parser, send path
- Add dummynet_filter: inline send-hook with loss/delay, no proxy socket needed
- Rewrite test_bgp_route_exchange: 3-node chain A(2 links)↔B↔C, 7 phases
  with dummynet_filter-based link failure/recovery simulation
- Clean up tests: remove skeleton test_routing_mesh, 6 debug/stale test files
- Refactor test_etcp_simple_traffic and test_pkt_normalizer_etcp (remove debug spam)
- Fix test_etcp_two_instances: remove private field access, fix false PASS on timeout
2026-04-27 12:43:52 +03:00
Evgeny e39979bfac Config: Added [allowed_keys] section for client public key authorization on server
- Added CFG_ALLOWED_KEY struct with binary key storage (64 bytes) for fast memcmp comparison
- Implemented parsing of [allowed_keys] section with allow_all flag and per-key entries
- Added key validation in etcp_connections.c server handler (errorcode=8 for rejected keys)
- Default behavior: deny all if [allowed_keys] section is missing or allow_all=0 with no keys
- Added proper memory cleanup and debug logging for allowed_keys configuration
- Updated all test configs to include [allowed_keys] allow_all=1 for backward compatibility
2026-04-24 00:16:30 +03:00
Evgeny 0984ea749a Исправлен byte order для IP адресов в NAT detection flow
- etcp_connections.c: парсинг NAT IP через memcpy (сохраняет NBO)
- route_bgp.c: убраны ntohl() для IP в NAT detection и route_bgp_send_nat_info
- route_ping.c: убран htonl() для IP в ping request
- тесты: обновлены ожидания NBO для nat_ip
2026-04-22 18:23:32 +03:00
Evgeny d74ab1c1c6 Add name parameter to uasync_set_timeout for timer identification in dumps 2026-04-21 19:06:45 +03:00
Evgeny 9f13cf5459 route redesign + tests 2026-03-30 18:26:56 +03:00
Evgeny 46b62e2e77 1 2026-03-25 23:33:11 +03:00
Evgeny 98f886b8a8 test fix, log update 2026-03-25 22:49:57 +03:00
Evgeny 7261e596eb fix: improve test_routing_mesh and fix duplicate init_connections in test_etcp_two_instances
- Refactored test_routing_mesh to use proper ETCP + normalizer flow
- Removed duplicate init_connections() calls that caused 'Address already in use'
- Improved error reporting in etcp_link_new()
- Test now respects single mainloop architecture
2026-03-23 01:56:17 +03:00
jeka 167b3b36da routing + bgp big update 2026-03-11 15:30:45 +03:00
jeka 066a9aa89e +memory check module
fix double free @routing
2026-03-06 15:55:16 +03:00
jeka de053a00c0 cleanup tests (winsock) 2026-03-04 17:27:33 +03:00
jeka fcdd07ba94 фиксы тестов (winsock) 2026-03-04 15:30:32 +03:00
Evgeny 27f2edca40 Fix remaining Windows test build issues
- Remove sys/socket.h include from test_etcp_two_instances.c (Linux-only)
- Fix test_mkdtemp buffer overflow - use memcpy instead of strncpy
- Fix test_mkdtemp return value check (replace == NULL with != 0)
- Add Windows socket libraries (-lws2_32 -liphlpapi) to test builds
- All tests build successfully on Linux
2026-02-15 04:24:46 +03:00
Evgeny 4d486c7017 Fix test files for Windows cross-platform compatibility
- Create test_utils.h with cross-platform utility functions:
  * test_mkdtemp() - Windows uses GetTempPath + _mkdir, Linux uses mkdtemp
  * test_unlink() - Windows _unlink, Linux unlink
  * test_rmdir() - Windows _rmdir, Linux rmdir

- Update all test files to use test_utils.h
- Replace arpa/inet.h and netinet/in.h with platform_compat.h
- Replace unistd.h with conditional includes
- Replace mkdtemp(), unlink(), rmdir() with test_* versions

- Tests now build on both Linux and Windows
- Note: Some integration tests may fail on Linux due to test environment
2026-02-15 04:09:24 +03:00
Evgeny 4fcdfc15f9 Add exact IP:port match validation to NAT test
Test now verifies that NAT IP:port exactly matches client's local bind:
- Gets expected port from client socket using getsockname()
- Compares nat_port with expected_client_port for exact match
- Validates nat_ip equals 127.0.0.1 (localhost test)
- Fails test if values don't match exactly

This ensures the server correctly returns the client's actual address
in the INIT_RESPONSE handshake without any modification.

Test output:
  [TEST] Client socket bound to port 9012 (expected NAT port)
  [CLIENT] PASS: NAT address is set: 127.0.0.1:9012
  [CLIENT] PASS: nat_changes_count=0, nat_hits_count=0
  [CLIENT] PASS: NAT IP and port match exactly (127.0.0.1:9012)
2026-02-14 11:19:47 +03:00
Evgeny 507f2da831 Improve NAT IP:port test validation to check specific values
Test now verifies that NAT fields contain CORRECT data, not just non-zero:
- Verifies nat_ip equals 127.0.0.1 (0x7F000001) - expected for localhost test
- Verifies nat_port is in valid ephemeral port range (> 1024 and <= 65535)
- Fails test if values are incorrect (not just warning)

This ensures the server correctly returns the client's external address
in the INIT_RESPONSE handshake packet.

Test output:
  [CLIENT] PASS: NAT address is set: 127.0.0.1:9012
  [CLIENT] PASS: nat_changes_count=0, nat_hits_count=0
  [CLIENT] PASS: NAT IP and port contain valid values (127.0.0.1:9012)
2026-02-14 11:14:52 +03:00
Evgeny a843b998ed Add NAT IP:port validation to test_etcp_two_instances
- Added check that NAT fields are populated after connection establishment
- Verifies nat_ip is non-zero and contains correct IP (127.0.0.1)
- Verifies nat_port is non-zero and contains correct port
- Checks nat_changes_count=0 (first initialization)
- Checks nat_hits_count=0 (no repeated matches yet)

Test output shows:
  [CLIENT] PASS: NAT address is set: 127.0.0.1:9012
  [CLIENT] PASS: nat_changes_count=0, nat_hits_count=0
2026-02-14 11:11:45 +03:00
Evgeny 8334b97521 Backup before adding NAT IP:port tracking to ETCP handshake 2026-02-14 11:02:20 +03:00
Evgeny 5a7107b855 Simplify tun_if: unified init, write, close API with queue-based reads
- New struct tun_if with internal queue for incoming packets
- Single tun_init() does everything: create TUN, set MTU=1500, up, register in uasync
- tun_write() for outgoing packets
- tun_close() cleans up everything including queue
- Removed: tun_create, tun_set_ip, tun_set_up, tun_set_mtu, tun_read, tun_get_config
- Removed: utun_instance_register/unregister_sockets (now internal)
- Updated utun_instance to use new tun_if* pointer
- Updated test_etcp_two_instances for new API
2026-02-07 02:28:58 +03:00
Evgeny 1bb59bad98 Fix: Isolate test configs and add key validation retry 2026-02-06 22:21:21 +03:00
Evgeny d5e43b4745 Fix: Optimize test_etcp_two_instances and test_etcp_simple_traffic
- Changed to use single shared uasync instead of two separate instances
- Removed usleep from event loops for faster execution
- Added missing init_connections() calls when TUN is disabled
- Fixed monitor timeout to work correctly with poll intervals
- Fixed references to server_instance->ua to use shared ua

Tests now complete in ~18ms instead of waiting seconds for init.
2026-02-05 21:23:14 +03:00
Evgeny beafb9b198 Fix: Remove usleep from event loops and fix segfault in tests
- Removed usleep(5000) from all test event loops
- Changed to use single shared uasync for server and client instances
- Removed uasync_destroy from utun_instance_destroy to prevent double-free
- Added explicit uasync_destroy calls in all tests and main program
- Fixed segfault in test_pkt_normalizer_etcp and test_etcp_100_packets
- Added DEBUG_TRACE to all functions in etcp.c and etcp_connections.c

Tests now run without artificial delays and complete successfully.
2026-02-05 20:51:07 +03:00
Evgeny a90b3038ac Replace printf with DEBUG_ macros in test_etcp_two_instances.c 2026-01-26 18:17:38 +03:00
Evgeny e1556eb8c4 Replace printf with DEBUG_ macros in 4 test files and partial in test_etcp_two_instances.c 2026-01-26 18:14:04 +03:00
Evgeny 3ddfb79338 Backup before replacing all printf with DEBUG_ macros in tests 2026-01-26 17:52:50 +03:00
Evgeny 1bafe6a681 Backup before fixing etcp_connections list addition 2026-01-26 17:40:51 +03:00
Evgeny 7e957de0e5 TUN: Добавил явное отключение TUN в тест test_etcp_two_instances
- Добавлен вызов utun_instance_set_tun_init_enabled(0) в начале теста
- Теперь тест явно отключает TUN перед созданием экземпляров
- Это гарантирует, что тест работает корректно в среде без прав root
2026-01-23 23:27:06 +03:00
Evgeny d6a26e392d TUN: Сделал инициализацию TUN опциональной и отключенной по умолчанию
- Добавлена глобальная переменная g_tun_init_enabled = 0 (отключена по умолчанию)
- Добавлена функция utun_instance_set_tun_init_enabled() для управления
- TUN инициализируется только если g_tun_init_enabled = 1
- При отключенном TUN структура инициализируется с fd = -1
- Тест test_etcp_two_instances адаптирован для работы без TUN
- Все основные тесты проходят с отключенным TUN
- Сохранена обратная совместимость с существующим кодом
2026-01-23 23:26:00 +03:00
Evgeny 3ca0254518 Performance optimization: reduce test execution time by 20x
- Reduced test timeout from 10s to 3s
- Decreased monitoring interval from 1000ms to 200ms
- Shortened server initialization wait from 2s to 0.5s
- Added immediate exit on successful connection
- Test now completes in ~0.5s vs ~10s previously
- All tests pass without crashes or memory leaks

The test_etcp_two_instances now runs 20x faster and exits immediately
upon successful connection establishment.
2026-01-22 01:03:54 +03:00
Evgeny f1a76c9d30 Fix memory leaks and crashes in ETCP tests
✅ Fixed critical segmentation fault (SIGABRT) in test_etcp_two_instances
✅ Added comprehensive timer debug logging with DEBUG_CATEGORY_TIMERS
✅ Created uasync_print_resources() function for resource diagnostics
✅ Created utun_instance_diagnose_leaks() function for leak analysis
✅ Fixed cleanup order - cancel timers before destroying uasync instances
✅ Fixed timer cancellation to properly update counters
✅ Fixed socket cleanup to unregister from uasync before destruction
✅ Added detailed diagnostic output for memory leak tracking
✅ All tests now pass without crashes

Key fixes:
- Fixed use-after-free in test cleanup sequence
- Added proper timer leak detection and cleanup
- Enhanced debug capabilities for future debugging
- Fixed ETCP socket cleanup to prevent resource leaks

The test_etcp_two_instances now runs successfully without segmentation faults.
2026-01-22 00:57:45 +03:00
Evgeny 56dfd2f0df Ревизия: добавлены DEBUG сообщения для ошибок и предупреждений
Добавлены комплексные DEBUG сообщения в критические точки проекта:

- **ETCP протокол** (etcp.c): ошибки инициализации криптоконтекста, выделения памяти для очередей, коротких пакетов, сбоев шифрования
- **ETCP соединения** (etcp_connections.c): ошибки установки публичных ключей, расшифровки пакетов, шифрования при отправке
- **TUN интерфейс** (tun_if.c): ошибки создания устройства, настройки IP/MTU, чтения/записи
- **Конфигурация** (config_parser.c): ошибки выделения памяти для структур конфигурации, парсинга IP-адресов
- **Маршрутизация** (routing.c): ошибки выделения памяти для таблиц, отсутствие маршрутов

Все DEBUG сообщения используют существующую систему категорий (CRYPTO, MEMORY, CONFIG, ROUTING, TUN, CONNECTION, ETCP) и предоставляют детальную информацию для диагностики проблем.
2026-01-21 18:18:32 +03:00
Evgeny e666c6ac1a Add two-instance test with handshake monitoring and debug output
- test_etcp_two_instances_fixed.c: two UTUN instances in single process
- Creates server and client configs in /tmp
- Uses uasync polling for both instances
- Periodic monitoring via settimeout
- Exits after handshake success/failure
- Debug output in SEND/RECV functions
2026-01-20 22:02:39 +03:00