Commit Graph
1504 Commits
Author SHA1 Message Date
evgeny c8bd5975ae chatgui-android: invite-ссылки с выбором узла входа в GUI + desktop dialog layout 2026-09-07 22:36:27 +03:00
evgeny ba557e2b9d chat: фикс 0:00 у длинных голосовых — b64_decode терял последний байт без padding + formatTime в мс 2026-09-07 22:36:23 +03:00
evgeny 1345f44e10 chat: invite-ссылки с выбором достижимого узла + tcp_io фикс half-close FIN
- Общий модуль invite_build: сборка utun://-ссылок, авто-выбор лучшего
  достижимого узла, список кандидатов (вынесено из android jni_bridge)
- chatgui: диалог invite с выбором узла (комбобокс), события INVITE_CANDIDATES /
  INVITE_LINK_READY через gui_bridge
- headless/chatcli: invite <ch_id> [node_id], команда invite_nodes
- tcp_io: error_cb отличает грациозный EPOLLHUP (SO_ERROR==0) от реальной ошибки —
  при приостановленном чтении FIN не роняет недослейные данные (фикс flaky half-close)
- run_test.sh: half-close echo на выделенном порту 19190 + отдельный DNAT (был недостижим)
2026-09-07 13:59:15 +03:00
evgeny a17a85a383 chat: deleted-аккаунты — колонка deleted, скрытие/зачёркивание, не подключаемся 2026-09-07 01:40:53 +03:00
evgeny 631a176944 chat: права админа + member tags (verified/deleted) + ncd revive
- chat_admin: передача канальных privkey другому узлу (encrypted+signed,
  ETCP_RT_ID_ADMIN_KEY), событие ADMIN_KEY_RECEIVED
- member_sync/bridge: tags verified/deleted, is_channel_owner, transfer_admin
  (android JNI + chatgui memberpropsdialog)
- node_conn_direct: оживление timed_out entry — обновление линков в существующем
  conn (убрать старые, добавить новые) + немедленная очистка не поднявшегося
  conn без fin_wait — фикс invite/reconnect
2026-09-07 00:53:41 +03:00
evgeny 6163f34ce1 etcp_router: эпоха reset_id на wire + master/slave — фикс потери пакетов при рестарте пира 2026-09-06 22:20:08 +03:00
evgeny 61c572cae4 etcp: reset_id эпоха ресета — фикс потери NODEINFO при флапе
Добавлен 64-битный reset_id (эпоха ресета) в INIT-фреймы и STCP-handshake:
- генерится один раз при создании conn, меняется только при фатальном ресете
  (normalizer desync / bad fragment size);
- при приёме чужого id slave принимает эпоху пира и ресетится, master держит свою;
- первый id принимается без ресета (свежие при init);
- «tcp peer clean» реинит гейтится по смене id — нет повторного сброса seq.

Это устраняет коллизию seq=1 (RX dup) из-за двойного реинита нескольких TCP-линков,
из-за которой NODEINFO пира терялся и member не возвращался online.

Также: chat member online теперь из topo_group (без БД/merkle), тест test_etcp_seq_collision.
2026-09-06 21:50:06 +03:00
evgeny f7c08f8f5e nat_detection: применять NAT-тип через topo_node_update_my_addresses с переподписью 2026-09-06 01:29:07 +03:00
evgeny 53bce51201 etcp_router: корректный handshake/restart без таймаут-петли
- START на первом пакете сеанса (seq=0), гейт отправки до первого ACK
- дедуп рестарта по payload init-пакета (ретрансмит START не триггерит рестарт)
- RST переинициализирует только отправку (без CLOSE_ALL), дедуп повторных RST
2026-09-06 00:33:45 +03:00
evgeny 232ad2de6b etcp_router: разделить служебные функции и API в хедере + чистка мёртвого кода
- etcp_router.h: 4 секции (протокол / внутренние структуры / API / служебные)
- переименование router_set_max_inflight -> etcp_router_set_max_inflight
- удалены неиспользуемые: input_q_count, waiter_register/cancel, conn_close_async
  (+ поля close_callback/close_callback_arg)
- docs: актуализировать backpressure (on_send_ready на send_q) вместо удалённого waiter API
2026-09-05 22:34:00 +03:00
evgeny 4b9b0009d8 chat: гейт авто-синхронизации db_sync до member_sync/pubkeys + member tags (verified/deleted) в chatgui 2026-09-05 20:38:22 +03:00
evgeny 01ea6913ae etcp_router: sess_id как локальный счётчик переустановок (не в протоколе) 2026-09-05 20:38:17 +03:00
evgeny 2d04bf941b etcp_router: вынести подпись/шифрование в route_crypto, одна функция отправки с флагами
- route_crypto_encode/decode: автономный пред/пост-обработчик пакета
  (encrypt-then-sign, стандартный Ed25519 вместо sc_stream_sign)
- одна функция отправки etcp_route_send/etcp_router_conn_send с bitmask mode
- формат доставки: [svc_id][src][dst][rx_flags][payload] (статус подписи/шифрования)
- ROUTER_INFLIGHT хранит финальный wire-пакет (чинит потерю подписи при ретрансмите)
- дедуп инициализации: router_conn_reset/free_queues
- учёт inflight через inflight_q count (seq присваивается на enqueue)
2026-09-05 17:40:43 +03:00
evgeny 7c95ddb09b chatgui: значок владельца канала (🔑) в шапке блока мемберов при наличии private key 2026-09-05 15:23:45 +03:00
evgeny 7817bb96aa etcp_router: START/RST handshake для переживания рестарта пира
Раньше START ставился один раз при первой отправке и терялся в ретрансмите,
а принимающая сторона молча авто-синкала rx_seq на любой первый пакет —
после рестарта пира/среднего узла seq рассинхронизировались (тихий data loss
или no-ACK close). Теперь:

- Клиент: флаг start_sent «новый» до первого ACK; пока он стоит, первый
  seq (0) шлётся со START, включая ретрансмит. Первый принятый ACK
  (tx_acked>0) сбрасывает флаг. При рестарте conn флаг снова «новый».
- Сервер: после рестарта peer_sync_done=0 («ждёт START»). Не-START пакет →
  отправка RST (через recv_conn). START → синк rx_seq + ACK → обычный режим.
- RST на принимающей стороне теперь сбрасывает локальное состояние
  (etcp_router_conn_restart), а не закрывает conn.

Тесты unit обновлены: первый data-пакет сессии инжектится со START.
2026-09-05 15:03:44 +03:00
evgeny 84015176b3 etcp_router: досылать потерянный ACK при дубле (рестарт среднего узла)
При рестарте транзитного узла ACK приёмника терялся и не пересылался:
router_schedule_ack выходит рано при rx_seq==last_sent_ack_seq, поэтому
пир ретранслил 17 циклов (~5с), роутер-conn закрывался и цикл повторялся
бесконечно — лечилось только рестартом клиента. Теперь при дубле
(ретрансмите пира) ACK досылается с троттлингом ROUTER_ACK_INTERVAL_TB.
2026-09-05 01:17:37 +03:00
evgeny 32725657dc chatgui-android: обработка скачивания голосовых (download state) + config: секция [chat] алиас для chatserver 2026-09-04 22:46:07 +03:00
evgeny 23fbdf4584 chat: запуск BGP-обмена при подключении узла к группе (invite + auto-connect) 2026-09-04 21:04:18 +03:00
evgeny 5b8c725c01 etcp_router: round-robin send + контроль заполненности send_q через waiter на send_input_q 2026-09-04 19:30:08 +03:00
evgeny 1a88ea88a8 topo_group: узлы меняются только по BGP (NODEINFO/WITHDRAW), удаление по link down через BGP-коллбэк 2026-09-04 17:57:37 +03:00
evgeny b0f149092f BGP: log node add/remove per group at info level 2026-09-04 16:45:33 +03:00
evgeny c049788c08 etcp_router: при no route выводить список узлов группы (<10) 2026-09-04 16:39:23 +03:00
evgeny ed2df9fe88 etcp_router: добавить кол-во узлов группы в лог no route 2026-09-04 16:25:21 +03:00
evgeny d092f649ac chatgui: пути db и лога относительные в конфиге, резолв к бинарнику в рантайме 2026-09-04 14:34:39 +03:00
evgeny 654202b0cb chatgui: debug-категории в секции [debug] построчно (как в utun) 2026-09-04 13:42:59 +03:00
evgeny 20eef8ad16 chatgui: лог по умолчанию в файл chatgui.log (debug_file) 2026-09-04 13:25:06 +03:00
evgeny 656da48e35 topo_group: асимметричный старт BGP (JOIN_GROUP) + вынос group_id/flags из TOPO_NODE
- UTUN: BGP инициирует только сторона-клиент ([client]) и явные etcp_connect;
  сервер добавляет пира по JOIN_GROUP (фикс обратного маршрута: сервер не
  создавал узел клиента из-за дедупа senders_list)
- topo_group_new_conn: conn_add_path до дедупа; handle_request_table без add_to_senders
- TOPO_NODE: убраны group_id/flags (shared-реестр), передаются в topo_node_serialize
- routing/control_server: явный TOPO_GROUP_UTUN
- CHAT: гейт по peers_* (get_member_channels) + пассивное add/remove в member_sync
- tests: тесты адаптированы (route_ping ждёт registry+v4_addrs)
- chatgui-android: voice_recorder_init в utun_bridge_voice_start (idempotent)
2026-09-04 13:21:24 +03:00
evgeny 7b73d99b5b chat: передавать group_id в бинарном виде в протоколе синхронизации
db_sync/merkle_sync/chat_sync шлют group_id (uint64 BE) вместо текстового
channel_id/namespace. Приёмная сторона находит группу/таблицу через
topo_groups_find(group_id) и требует существующую CHAT-группу. db_sync:
instance key заменён с SHA256(ch_id) на strtoull(ch_id)=group_id.
2026-09-04 09:02:46 +03:00
evgeny 326dfd7e2c media_delivery: маршрутизация всегда через CHAT-группу
media_download/медиа-ответы и суперузловая репликация теперь берут группу
из контекста (dl->group_id, group_id из пакета, peer->group_id) вместо
хардкода TOPO_GROUP_UTUN. node_props_changed получает channel_id.
SUPER_HELLO несёт group_id.
2026-09-03 23:24:50 +03:00
evgeny 55da8fd146 media_delivery: логирование отправки QUERY_RESP и провалов md_send 2026-09-03 21:59:57 +03:00
evgeny 01b61a457a etcp_router: fix ACK no-route — слать ACK через recv_conn
При асимметричной топологии topo_group_find_conn_for_node возвращает NULL,
ACK не уходит → ретрансмит-шторм → no-ACK close → inflight сбрасывается в 0.
Теперь ACK уходит через тот же коннект, с которого пришли данные (recv_conn),
с фолбэком на топологию. Довершает фикс из e08956e (deliver), который
аналогично не трогал router_send_ack.

Заодно удалён неиспользуемый ETCP_ID_ROUTE_ENTRY.
2026-09-03 20:05:59 +03:00
evgeny fbea9c3869 socks_proxy: fix client stall + non-blocking DNS via async_dns
- fix HTTP_STATE_RELAY == SOCKS_STATE_CONNECTING enum collision (relay data dropped)
- fix wrong waiter cancel (etcp_router_waiter_cancel -> etcp_router_cancel_send_ready)
- add backpressure retry timer, restore lost queue_resume_callback, defer FIN on pending tx_buf
- async_dns: /etc/hosts fast-path + hosts loading (avoid 4s DNS timeout for localhost)
2026-09-03 18:13:00 +03:00
evgeny f47ad7d87f tcp_proxy: fix throughput (tx_queue backpressure) + connect timeout + integration test
- Router: unified service delivery format [svc_id][src][dst][payload] (end-to-end src/dst from SVC_ROUTE header)
- tcp_proxy_client: replace single tx_buf drop-on-backpressure with bounded tx_queue + send_q waiter + retry timer (no data loss, bulk window reopen — removes 62.5ms delayed-ACK stall)
- tcp_io: configurable connect timeout (tcp_conn_set_connect_timeout)
- tcp_proxy_server: connect_timeout config option (ms, default 2000, 0=off)
- check.sh: run tcp_proxy_full integration test with sudo (skip if passwordless sudo unavailable)
- test_tcp_io: connect timeout unit test; docs (lwip_nuances.md)
2026-09-03 13:49:09 +03:00
evgeny acfaae2801 dns: заменить K&R-объявления указателей на функции на типизированные
gcc 15 (C23) трактует () как 'без аргументов', из-за чего lib/dns.c не собирался
(65 ошибок). struct dns_rr_i.sort и таблица dns_rrtypes[] переведены на явные
прототипы с typedef'ами и кастами указателей.
2026-09-02 23:59:46 +03:00
evgeny e08956e5dc etcp_router: fix NULL conn в deliver при отсутствии пути к узлу
router_handle_data_packet выбрасывал физический conn, а router_incoming_q_cb
восстанавливал его через topo_group_find_conn_for_node, который возвращает NULL,
когда у узла-источника нет пути в топологии. В итоге callback сервиса (routing,
conn_mgr) получал conn=0x0. Теперь физический conn сохраняется в rconn->recv_conn
и прокидывается в deliver.
2026-09-02 23:59:41 +03:00
evgeny 1db4fe1f01 build_linux_full.sh: автоустановка зависимостей и корректная обработка ошибок 2026-09-02 21:29:48 +03:00
evgeny 5d39083a6d auto_socket: пропускать интерфейсы без default-маршрута (опция auto_socket_skip_no_default_route, default=on) 2026-08-17 23:43:15 +03:00
evgeny f841a964aa chat: debug-логи на джойнер-стороне (channel_put, JOIN sent, WELCOME self-add) 2026-08-17 22:53:03 +03:00
jeka 10306f5613 chat: fix CHANNEL_INVITE invalid ch_sig — передавать владельца канала из БД, а не node_id отправителя 2026-08-17 21:16:44 +03:00
evgeny 7dee49ce63 android: мониторинг смены сети — NetworkChangeMonitor, перезапуск ядра при смене интерфейса 2026-08-17 21:03:05 +03:00
evgeny f3b33bcf74 android: кнопки start/stop сервиса с сохранением состояния, ядро не воскресает при остановленном сервисе
- ConfigProvider: флаг service_enabled (DataStore), flow/getter/setter
- MainActivity: автозапуск сервиса только при service_enabled; edge-to-edge со светлыми иконками статус-бара
- SettingsScreen: секция Service (start/stop), stop/exit сохраняет состояние; NativeLib.restart гейтится по isReady чтобы ядро не запускалось без сервиса
2026-08-17 14:37:54 +03:00
evgeny 3d59e5f322 chat: headless invite_to command + invite-flow integration test
- chat_headless_control.c: новая команда invite_to (inviter-side invite по адресам)
- chat_client.py / chatcli: клиентский метод и CLI-команда invite_to
- tools/chat_invite_test.py: headless-тест инвайтера-side (CHANNEL_INVITE → autojoin → member_sync)
- topo: guard node_id=0 в cm_open/process_nodeinfo + детализация send_nodeinfo warn
- cleanup: удалить устаревшие doc/*.txt, *.md заметки
2026-08-17 11:22:40 +03:00
evgeny 5316ee958a android: ограничить карточку members половиной экрана, CONFIGURE_DEPENDS для GLOB 2026-08-16 23:50:14 +03:00
evgeny 383a45ed47 chatgui: setup_firewall.bat — разрешить входящие в Windows Firewall для vibechat.exe
Отдельный self-elevating скрипт: добавляет program-правило (dir=in action=allow
profile=any) для vibechat.exe, копируется в build-каталог рядом с exe.
2026-08-16 23:23:52 +03:00
evgeny 4ca8348a75 chatgui: хранить last_channel_id в БД (ui_state) вместо QSettings
Восстановление канала только если он существует; запись из utun-потока
через trampoline, чтобы не трогать sqlite из GUI-потока.
2026-08-16 22:34:14 +03:00
evgeny eb24736e27 topo: держать актуальные self-адреса в node_addresses, обновлять/рассылать только при изменении
topo_node_update_my_addresses теперь собирает адреса во временные списки,
сравнивает со старыми и при отсутствии изменений выходит без бампа ver,
записи в БД и broadcast. Гейт member_exists убран: self-адреса пишутся
в node_addresses при любом запуске/изменении (с гарантией строки nodes для FK).
addrs_put логирует ошибки INSERT.
2026-08-16 22:34:10 +03:00
evgeny 54352c17ba chatgui: opus из исходников в CMake + build_nix.sh под Linux/BSD 2026-08-16 14:35:59 +03:00
Evgeny b4722f54f0 dns: убрать weak-атрибут у dns_random — на MinGW слабые data-символы не инициализируются → NULL-вызов → SIGSEGV 2026-08-16 12:58:40 +03:00
Evgeny 0c3398eb8c dns: исправить сборку под Windows (MinGW)
- dns.c: #define uint32_t → #include <stdint.h> (на UCRT64 stdint.h уже тянется через winsock2.h, макро даёт 'duplicate unsigned')
- async_dns.c: p->IpAddress → p->IpAddress.String (IP_ADDR_STRING.IpAddress — IP_ADDRESS_STRING, не char*)
2026-08-16 12:18:07 +03:00
Evgeny 1f307046f9 dns: async_dns модуль (libdns) + неблокирующий NTP sync
- Вендор libdns (MIT) как lib/dns.{c,h}; правка dns_quietinit для GCC 5+
- Новый lib/async_dns.{c,h}: неблокирующий A-резолвер поверх uasync
- src/ntp_time.c: убраны блокирующие getaddrinfo+select; async DNS + неблокирующая машина состояний UDP-запроса
- test_async_dns.c (юнит) + test_ntp.c сценарий hostname→DNS
- сборка: -DDNS_RANDOM=RAND_bytes, -lcrypto в COMMON_LIBS
2026-08-16 12:10:33 +03:00