Files
utun2/src/chat/chat_local.h
T
evgeny f84622966e Add BLE ETCP links and GATT invitations for desktop and Android
Attach packet drivers to initially empty ETCP connections. Share BLE neighbor
tracking and group fallback between desktop and Android in cgathui_common.

Deliver join links through a dedicated Write/Indicate characteristic with
independent fragmentation queues, application acknowledgements, deduplication
and bounded retries. Merge LAN/BLE discovery and add a separate Bluetooth
invitation reception setting to both clients.

Validation: 230 core tests, BLE transport/BlueZ/UI tests, ASAN/UBSAN,
Linux GUI and Android builds, and Windows backend cross-compilation.
Physical Android/Linux invitation exchange passed with either GATT initiator.
The Android-initiated run also verified all 32 ETCP packets of 1500 bytes;
the desktop-initiated load run reached 7/32 within its 45-second time limit.
2026-10-29 16:41:04 +01:00

54 lines
4.2 KiB
C

/* Общая обработка LAN/Bluetooth discovery: готовые invite-ссылки и подписанные адреса известных узлов, без запуска JOIN.
* LAN-адреса подтверждаются nonce-ответом только при отсутствии прямого UP и BGP-путей во всех группах.
* Ключи берутся из registry/SQLite и не передаются в открытых объявлениях; NODEINFO не изменяется.
* Весь API и callbacks работают в uasync-потоке живого instance; stop — до освобождения ядра.
* LOCAL_INVITE передаёт проверенную ссылку обработчику chat_event; получение не запускает JOIN.
* LOCAL_DELIVERY подтверждает доставку ссылки устройству, а не вступление в канал. */
#ifndef CHAT_LOCAL_H
#define CHAT_LOCAL_H
#include "../local_transport/local_transport.h"
#ifdef __cplusplus
extern "C" {
#endif
struct UTUN_INSTANCE;
/* Дополнительный транспорт ближайших устройств; API заимствован до снятия через set_bluetooth(NULL).
* peers копирует до capacity записей. send копирует ссылку: 0 => один будущий delivery, -1 => callback не будет.
* Установка и callbacks — uasync; таблицей соседей и pending владеет драйвер, ядро их не дублирует. */
struct chat_local_provider {
void* ctx;
size_t (*peers)(void* ctx, struct local_peer* output, size_t capacity);
int (*send)(void* ctx, uint64_t peer, uint64_t request, const void* data, size_t len);
};
void chat_local_set_bluetooth(struct UTUN_INSTANCE* inst, const struct chat_local_provider* provider);
/* Проверить готовую join-ссылку; 1=валидна, 0=ошибка с логом. */
int chat_local_valid_link(const char* link, size_t len);
/* Проверить политику LAN/BT и передать приглашение UI; 0=доставлено, FORBIDDEN либо -1=отказ. JOIN не запускается. */
int chat_local_receive(struct UTUN_INSTANCE* inst, const struct local_peer* peer, const uint8_t* link, size_t len, int bluetooth);
/* Конечный статус доставки, использует тот же UI event для LAN и BT; содержимое ссылки не логируется. */
void chat_local_delivered(void* inst, uint64_t request, uint64_t peer, int status);
/* Создать транспорт для desktop/mobile, подписать активность. Повтор и server — 0; ошибка — -1. */
int chat_local_start(struct UTUN_INSTANCE* inst);
/* Снять подписку и уничтожить транспорт чат-сервиса; NULL/repeat допустимы. */
void chat_local_stop(struct UTUN_INSTANCE* inst);
/* Применить local_invites_enabled/local_broadcasts_enabled из chat_setting без рестарта.
* Receive проверяется при каждой доставке, broadcasts применяется к транспорту.
* При отсутствии транспорта ничего не делает. Возвращает 0/-1; сохранённые настройки не откатывает. */
int chat_local_apply_settings(struct UTUN_INSTANCE* inst);
/* Трамплины uasync. peers получает заимствованный inst; send освобождает u_malloc request. */
void chat_local_peers_trampoline(void* inst);
struct chat_local_send_request {
struct UTUN_INSTANCE* inst; // заимствованный instance, которому передаётся команда
uint64_t peer_id; // устройство из CHAT_EVT_LOCAL_DEVICES
uint64_t request_id; // ненулевой ID UI, возвращается LOCAL_DELIVERY
char link[LOCAL_TRANSPORT_DATA_MAX + 1]; // готовая зарегистрированная ссылка, завершается NUL
};
void chat_local_send_trampoline(void* request);
#ifdef __cplusplus
}
#endif
#endif