Commit Graph
1410 Commits
Author SHA1 Message Date
evgeny 5a42741d06 android: restore live member/connection updates lost in Kotlin source restore
- ChatRepository: MemberWire, parseMemberWire, cleanSocketName, parseMemberDetail, LinkStatus.linkId, LocalSocketState.linksUp/linksDown
- ChatViewModel: handlers 24/25/22, fix 16 (selectedMember update), 17 (in-place sync + status!=1 refresh), moder param
- MemberListScreen: compact header, no-dot addresses, TextAlign.Start connections, cleanSocketName, fonts 13sp, spacing 4dp, self *[up/down]
- SettingsScreen: linksCount -> *[linksUp/linksDown]
- NativeLib: moder in setMemberFlags JNI
2026-08-11 14:06:17 +03:00
evgeny 3f5dd43109 android: restore Kotlin sources + fix build
- Restore chat Kotlin sources deleted in d773f17 (refactor STCP)
  from d773f17~1: ChatApplication, MainActivity, data/, headless/,
  viewmodel/, ui/screens/, ui/components/
- Add InviteLinkDialog.kt (new file, never committed)
- Add missing libcrypto.a for arm64-v8a and x86_64
  (cross-compiled OpenSSL 3.5.5 via NDK 29)
- Build and install successful
2026-08-11 13:50:45 +03:00
evgeny f667e7bd74 fix: prevent use-after-free in etcp_ack_recv when link closed with pending inflight
When etcp_link_close() frees a link while INFLIGHT_PACKET entries
still reference it via last_link, a later ACK causes SIGSEGV in
bbr_main(link->bbr=NULL).

Fix:
- etcp_inflight_nullify_link(): nullifies last_link in both
  input_wait_ack and input_send_q for entries pointing to dead_link
- Called from etcp_link_close() before u_free(link)
- Guard etcp_ack_recv: check acked_pkt->last_link->bbr before
  accessing BBR/inflight stats
- Also fix bbr leak in etcp_link_close !link->conn path

Verified: 30/30 runs of test_etcp_link_stress pass (was ~50% crash)
Full suite: 71/71 pass
2026-08-11 13:37:42 +03:00
evgeny 63b1f1bc16 fix: init client_type and keepalive_interval in utun_instance_init()
utun_instance_init() did not call instance_init_common(), leaving
instance->client_type and instance->keepalive_interval as 0.
This broke the INIT handshake in V4 protocol: server wrote
keepalive=0 into INIT_RESPONSE, causing negotiate_keepalive
to see 0 and client to receive empty keepalive.

Also added guard: keepalive < 100ms clamped to 100ms with ERROR log.
2026-08-11 13:31:18 +03:00
evgeny bd6cd17bdf tests: fix close/restart detection after loopback_conn change
bb0866b changed close/restart notifications from NULL to loopback_conn().
Remove !conn check — use entry->len==9 alone to distinguish (9 bytes = svc_id+node_id, data always longer).
2026-08-11 12:21:10 +03:00
evgeny 0f1bd3d120 keepalive handshake: device_type + keepalive negotiation in UDP/TCP INIT
- Добавлен device_type (1 байт, CLIENT_TYPE_*) в INIT_REQUEST и INIT_RESPONSE
- Добавлен keepalive_interval (2 байта) в INIT_RESPONSE
- STCP handshake расширен с 43 до 46 байт (device_type+keepalive)
- negotiate_keepalive(): оба desktop/server → min, иначе (есть mobile) → max
- keepalive_interval вынесен в UTUN_INSTANCE для использования в handshake
- stcp_client_connect() принимает device_type и keepalive_interval
- peer_device_type/peer_keepalive_interval передаются через stcp_link в ETCP_LINK
2026-08-11 11:16:27 +03:00
Evgeny 43aca4a41b tcp_proxy_server: fix reentrant UAF in read_queue_drain_cb via loopback 2026-08-10 22:25:16 +03:00
Evgeny e7623e38b2 config_parser: add missing tcp_proxy_server options (fib, so_mark, netif, bind_ip); tcp_proxy_server: move diag log to TRACE 2026-08-10 22:07:12 +03:00
Evgeny bb0866b4c3 tcp_proxy: split svc_id into SERVER(0x04) and CLIENT(0x08), fix loopback conn=NULL 2026-08-10 22:00:39 +03:00
Evgeny 5a404fbc97 tcp_proxy_server: add fib/so_mark/netif/bind_ip socket options 2026-08-10 20:12:07 +03:00
evgeny 544c77efff unify TCP_SOCKET into ETCP_SOCKET with is_tcp flag; add local+remote addr to member detail links with arrow display 2026-08-10 12:06:32 +03:00
evgeny 477b4dfc98 move is_server indicator from per-connection to per-link in member detail and links JSON 2026-08-10 10:58:14 +03:00
evgeny 496f0f7d2b add server/client (S/C) indicator based on ETCP_LINK.is_server in connection monitor, member detail, and Android JSON 2026-08-10 10:47:52 +03:00
evgeny cf956cf2f0 add proxy server/client indicator (S/C) in connection monitor 2026-08-10 10:30:07 +03:00
evgeny f1941e61a2 fix: MemberLinkSnap/MemberSockSnap port int→uint16_t avoids stack garbage 2026-08-10 10:03:43 +03:00
evgeny 312876a0b2 fix: add strbuf.c/h to lib/Makefile.am 2026-08-10 00:20:02 +03:00
evgeny f2228202e3 fix: FORTIFY vsnprintf crash on Android + foreground service type
Root cause: etcp_on_up/etcp_on_down/etcp_conn_process_send_queue
used fixed buffers (links_str[256], l_status[256]) with snprintf
chains in loops over links. With 15+ links (IPv6 addresses),
sizeof(buf)-offset turned negative → vsnprintf size=(size_t)(-17)
→ FORTIFY abort on Bionic.

Fixes:
- lib/strbuf.h/c: safe growable printf buffer (auto-realloc)
- etcp.c: 3 snprintf chains → strbuf
- debug_config.c: BUF_ADVANCE macro prevents offset overflow
- android_jni_bridge.c: bridge_log va_list fix, set_member_flags guard
- chat_core.c: TAGS_ADVANCE macro in tags_commit
- AndroidManifest.xml: dataSync→specialUse (time limit exhausted)
- stcp: ed25519 pubkey exchange, tcp link addr/status in JNI bridge
- etcp_router: encrypted flag + ECDH per peer-pair
- node_conn_direct: TCP link support
- topo_node: group nodes cleanup
- media_delivery: buffer overflow fix
- test_stcp: ed25519 key exchange test
- tests: invite_group_create + Makefile update
2026-08-10 00:11:30 +03:00
evgeny ae80dae8ee tests: add Stage 7 merkle stress test — 13 instances, 5s spam, hash convergence
10 spammers (1-30ms random) + 2 observers (1-10ms), star topology via hub.
5s of concurrent modifications, then verify all 13 merkle root hashes
are identical and tree is internally consistent (recompute vs stored).
2026-08-09 19:39:41 +03:00
evgeny d8921f0e3d merkle_sync: fix infinite WAL growth from bg_check
- _recompute_bucket: skip INSERT OR REPLACE when hash unchanged,
  also skip DELETE when row doesn't exist (was always writing)
- bg_check interval: 100ms → 5000ms (was writing 10x/sec × 4KB/page
  into WAL = ~1.4GB over hours)
- bg_timer: round-robin across channels instead of only first
- bg_timer: periodic WAL checkpoint (every ~60s) to prevent
  unbounded WAL growth from any source
- test: sync ms_session struct copy with real definition

- stcp_link: handle race where conn already CLOSED before close
- stcp_client: remove double-free c->free_on_close = cli
- etcp_connections: stcp_link_close on TCP link down
- u_async: round sub-ms timeouts to 1ms to avoid busy-loop
2026-08-09 19:25:36 +03:00
Evgeny a646b35b9a etcp_router: router_deliver INFO→TRACE (спам на каждый пакет) 2026-08-09 18:15:25 +03:00
Evgeny e71f68736b socket_monitor: fix RT_ROUNDUP + пропавшая скобка функции (FreeBSD) 2026-08-09 17:56:39 +03:00
Evgeny f9417f06b4 BSD route sockaddr парсинг: addr/plen/gw/dev в INFO; убрал спам v6_send/v6_recv 2026-08-09 17:51:33 +03:00
Evgeny d8bae76ac7 socket monitor: BSD ifindex + UP/DOWN + фильтр спама; fallback idx%u → ? 2026-08-09 17:39:31 +03:00
Evgeny 15e3eeae65 socket monitor: осмысленные INFO-логи с именем интерфейса (UP/DOWN/NEW/DEL/route) 2026-08-09 17:32:50 +03:00
Evgeny 2cba839de4 Убрал DEBUG_CATEGORY_DEBUG: сообщения разбросаны по модульным категориям (+CHAT=25, MEDIA=23) 2026-08-09 17:24:15 +03:00
Evgeny 869f7c60d5 debug: add PROXY category, move all proxy logs to it 2026-08-09 16:31:21 +03:00
Evgeny 0de44e3117 remove spam TRACE messages: topo_group_find_conn_for_node, raw_recv, CRYPTO_DECRYPT_OK 2026-08-09 15:55:15 +03:00
Evgeny 6b6657c6b8 fix NTP ping-pong + normalizer counters
- ntp_node_time.c: respond to TIME_SYNC only when peer is unsynced (not always)
  Prevents infinite 10-byte ping-pong that ate bandwidth when both sides synced.

- pkt_normalizer.c: add in_total_pkts/in_total_bytes increments in
  etcp_input_ready_cb (real send path), matching pn_packer_send (test path).

- conn_mgr_core.c/conn_mgr_priv.h: full INVITE_INFO_RESP with channel info
2026-08-09 15:38:56 +03:00
evgeny 229a508022 etcpmon: add Makefile to git (was ignored by *.gitignore Makefile pattern) 2026-08-09 14:20:46 +03:00
evgeny c61c0639b9 remove utun.sh 2026-08-09 14:08:48 +03:00
evgeny 9066ae6a1f tests: add test_utils.h to git (was ignored by tests/test_* rule) 2026-08-09 14:06:34 +03:00
evgeny 6337d0f608 tests: add -I$(srcdir) to AM_CPPFLAGS for test_utils.h in VPATH builds 2026-08-09 14:01:31 +03:00
evgeny 4bb9f9e9c2 crypto: EVP_PKEY_generate → EVP_PKEY_keygen + OPENSSL_API_COMPAT для BSD/LibreSSL 2026-08-09 13:59:38 +03:00
evgeny d8337b9c3b whisper: опциональный configure --with-whisper; chatgui: парсер [debug]; stdint.h в AC_CHECK_HEADERS 2026-08-09 13:54:22 +03:00
evgeny 7f901c01e1 etcp: переупорядочить close + защита state==2 во всех API-точках; topo: правильная очистка group nodes и registry; chat/member: новый модуль member_sync; chatgui: обновления транспорта и UI 2026-08-09 12:39:53 +03:00
evgeny b2e4aadbf0 e2e: AES-128-CCM encryption via BGP router (ROUTER_FLAG_ENCRYPTED), ECDH key per peer-pair from NODEINFO pubkeys, cache 8 entries
- etcp_router.h/c: new flag ROUTER_FLAG_ENCRYPTED (0x04), etcp_route_send_encrypted(), inflight/retrans/send_q support
- utun_instance.h: e2e_ctx_cache[8] — per-peer sc_context_t cache with derived session key
- topo_node.c: topo_node_sign_self() — single point for Ed25519 self-signing of NODEINFO
- topo_node.c: fix stale x25519_self_sig after address update (topo_node_sign_self call)
- nat_detection.c: fix stale x25519_self_sig after in-place socket meta modification
- test_etcp_router_unit: 5 E2E tests (basic round-trip, no NODEINFO drop, tampered, cache reuse, ENCRYPTED+SIGNED combined)
- builds clean, 70/70 tests pass
2026-08-09 08:19:20 +03:00
evgeny ca176e1f24 encrypt overhead fix (33→36, noencrypt_len), mtu default 1280, connmonitor window, total_decrypted for TCP, check.sh 2026-08-08 16:56:32 +03:00
evgeny 9846599086 stcp: fix memory leaks and cleanup architecture
- stcp_conn_do_close: always deferred free for allocated conns (was else-if)
- stcp_link_on_stcp_close: don't null link->conn (close_impl needs it for rx_queue)
- stcp_link_close_impl: free rx_queue/tx_queue before close, null conn after cleanup
- stcp_client_connect: return NULL on derive_session failure (was returning dead cli)
- stcp_frame_decrypt/stcp_recv_try: dedup CRC check into stcp_check_crc helper
- test_stcp: add test8_srv_recv_close (error-recv close chain)
2026-08-08 11:42:16 +03:00
evgeny 5c8355ee63 stcp: unified recv FSM, handshake timeout, RX backpressure, opaque pointer fix
- stcp_recv_try / stcp_recv_set: unified chunk reader with raw+stream modes
  replacing duplicated stcp_conn_process_recv in server+client (~250 LOC removed)
- stcp_conn_read / stcp_conn_do_close / stcp_tx_queue_cb: unified shared functions
- continuous stream XOR: stcp_frame_encrypt now XORs len+data+CRC
- handshake timeout via uasync_set_timeout (5s server, 10s client)
- RX backpressure: stcp_rx_push / stcp_rx_resume_if_needed with hysteresis
- stcp_server_list_remove: new API fixes opaque pointer violation in auto_socket
  and 4 double-free bugs on shutdown
- removed hs_expected_len/hs_key_processed fields (replaced by callback chain)
- removed recv_buf<4096 debug workaround
- stcp_try_send const fix (takes ownership of malloc'd data)
2026-08-08 10:48:12 +03:00
evgeny d453e73ddb etcp: TCP links skip remote keepalive gating; chatgui: show interface names in member detail, fix destructor callbacks 2026-08-08 07:31:38 +03:00
evgeny 80e77f12c2 fix: auto_socket TCP duplicate sockets + NAT v4 address resolution
auto_socket.c: create_iface_tcp_socket returns stcp_server* instead of int,
ifa->v4_tcp/ifa->v6_tcp now properly track the created server, preventing
duplicate bind/listen on every reconcile_iface call.

etcp_connections.c: tcp_socket_add now resolves interface_addr via
get_interface_ip_by_index/get_interface_ipv6_addr_nl for any type (not just
PUBLIC), preventing NAT TCP v4 sockets from being destroyed due to INADDR_ANY.
2026-08-07 20:06:30 +03:00
evgeny de61a2dacc fix: auto_socket TCP hang + missing debug config apply in utun_instance_create_from_config
auto_socket.c: remove tsrv from inst->stcp_servers before stcp_link_server_destroy
when TCP socket has null addr — freed pointer stayed in linked list corrupting it
on next stcp_server_listen->stcp_server_list_add, causing hang

utun_instance.c: apply debug_level + per-category debug from config in
utun_instance_create_from_config (was only in utun_instance_create)

chat_core.c: verbose error log on invalid args
2026-08-07 18:31:30 +03:00
evgeny ec9edb6a7c Add test_etcp_link_stress: dynamic socket/link add/remove during traffic
- 2 instances, 1 initial UDP connection, 2000ms stress test
- Sends 1 packet every 1ms during stress
- Every 100ms: adds new UDP/TCP socket+link, removes oldest with stats
- Liveness check per cycle detects hangs
- Per-link report: type, state, decrypted/encrypted/acked bytes, retrans, RTT
- Removal stats: lifetime, encrypted, decrypted, acked, retrans, RTT, inflight
2026-08-07 17:32:28 +03:00
evgeny d6c78d96c4 stcp: dedup encrypt/decrypt/send to stcp.c, add pending queue for buffering, add server pubkey verification, add 4MB bulk test 2026-08-07 13:31:24 +03:00
evgeny 087ac9b0e4 stcp: close old TCP links on reconnect, check stcp_link_is_ready before send, notify ETCP on STCP close
1a: tcp_server_on_link — close existing TCP links before creating new ETCP_LINK
1b: etcp_tcp_send — skip send if stcp_link not ready
3a+3b+3c: stcp_conn_set_on_close → stcp_link_on_stcp_close → marks link DOWN → triggers reconnect
2026-08-07 12:46:46 +03:00
evgeny fd00e5dd15 cp 2026-08-07 12:21:41 +03: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 a3783b5f55 fix: re-index conn_queue_entry after setting peer_node_id
tcp_server_on_link sets conn->peer_node_id after etcp_connection_create
which adds the entry with peer_node_id=0. instance_find_conn couldnt
find TCP connections until the queue entry was re-indexed.
2026-08-06 23:14:57 +03:00
evgeny adac854c94 fix: TCP data flow — tx_state, keepalive, last_recv_local_time
- etcp_link_enter_ready_tcp: set tx_state=DATA_WAIT (was 0, blocking sends)
- etcp_conn_input: update last_recv_local_time on every packet (keepalive liveness)
- link_rx_cb: handle ETCP_KEEPALIVE before etcp_conn_input (conflicts with MEAS_RESP=0x08)
- KEEPALIVE handler: set recv_keepalive, remote_keepalive, link_status, keepalive_recv_count
- test_stcp_traffic: etcp_send instead of raw stcp_link_send
- test_etcp_stcp: rewrite for utun_instance + etcp_connect
2026-08-06 23:09:01 +03:00
evgeny 928fa7731c refactor: STCP connections as ETCP links (is_tcp) 2026-08-06 22:14:44 +03:00