From be0dff7b2c644dfd1541f01cc0dd4e66023a3f48 Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 29 Oct 2026 22:08:29 +0100 Subject: [PATCH] Define the BLE ACK wire channel and fixed flight budget --- lib/ble/ble_backend.h | 9 ++++++--- lib/ble/ble_transport.h | 8 +++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/ble/ble_backend.h b/lib/ble/ble_backend.h index 6065f0a8..cee2df4d 100644 --- a/lib/ble/ble_backend.h +++ b/lib/ble/ble_backend.h @@ -1,6 +1,6 @@ /* Внутренний платформенный контракт. Все вызовы/события в uasync, send/close не вызывают события синхронно. * ACCEPTED send копирует значение и даёт ровно один sent, либо closed отменяет все операции соединения. - * DATA sent означает локальное завершение без ATT ACK, INVITE сохраняет Request/Indication. + * DATA sent означает локальное завершение; INVITE/ACK используют Request/Indication. * close/destroy отменяют callbacks; transport создаёт идентификаторы, backend не хранит указатели core-link. * Реализации не создают неограниченных очередей: максимум одна операция send на link. */ #ifndef VIBECHAT_BLE_BACKEND_H @@ -13,14 +13,17 @@ extern "C" { #define BLE_RX_UUID "f61a9021-4abc-45ac-98e1-761df4c13811" #define BLE_TX_UUID "f61a9022-4abc-45ac-98e1-761df4c13811" #define BLE_INVITE_UUID "f61a9023-4abc-45ac-98e1-761df4c13811" +#define BLE_ACK_UUID "f61a9024-4abc-45ac-98e1-761df4c13811" #define BLE_VALUE_MAX 512 +/* Wire-каналы backend; ACK не является прикладным каналом ble_channel. */ +enum ble_wire_channel { BLE_WIRE_DATA, BLE_WIRE_INVITE, BLE_WIRE_ACK, BLE_WIRE_COUNT }; struct ble_backend; struct ble_backend* ble_backend_create(struct ble_transport* owner, struct UASYNC* ua, const struct ble_config* config); void ble_backend_destroy(struct ble_backend* backend); int ble_backend_advertise(struct ble_backend* backend, const uint8_t* data, size_t len); int ble_backend_connect(struct ble_backend* backend, ble_link_id id, const struct ble_endpoint* endpoint); void ble_backend_close(struct ble_backend* backend, ble_link_id id); -int ble_backend_send(struct ble_backend* backend, ble_link_id id, enum ble_channel channel, const uint8_t* data, size_t len); +int ble_backend_send(struct ble_backend* backend, ble_link_id id, enum ble_wire_channel channel, const uint8_t* data, size_t len); /* События backend. incoming вызывается до любых других событий нового входящего link; 0 = лимит/отказ. */ ble_link_id ble_backend_incoming(struct ble_transport* owner, const struct ble_endpoint* endpoint); void ble_backend_status(struct ble_transport* owner, int ready, const char* reason); @@ -28,7 +31,7 @@ void ble_backend_advertising(struct ble_transport* owner, enum ble_state state, void ble_backend_broadcast(struct ble_transport* owner, const struct ble_endpoint* endpoint, const uint8_t* data, size_t len, int rssi); void ble_backend_opened(struct ble_transport* owner, ble_link_id id, unsigned int mtu); -void ble_backend_received(struct ble_transport* owner, ble_link_id id, enum ble_channel channel, const uint8_t* data, size_t len); +void ble_backend_received(struct ble_transport* owner, ble_link_id id, enum ble_wire_channel channel, const uint8_t* data, size_t len); void ble_backend_sent(struct ble_transport* owner, ble_link_id id, int success); void ble_backend_closed(struct ble_transport* owner, ble_link_id id, const char* reason); #ifdef __cplusplus diff --git a/lib/ble/ble_transport.h b/lib/ble/ble_transport.h index bbe1e68b..6ffad399 100644 --- a/lib/ble/ble_transport.h +++ b/lib/ble/ble_transport.h @@ -3,7 +3,8 @@ * Объявление — повторяемые ОС байты, не надёжная датаграмма. node_id в HELLO не аутентифицирован. * Один сервис обслуживает независимые соединения; данные — непрозрачные кадры 1..1500 байт. * Целые кадры находятся в ll_queue. DATA: Write Without Response/Notification; INVITE: Request/Indication. - * Собственных ретрансляций нет; доставка DATA подтверждается потребителем (ETCP). + * DATA имеет накопительный ACK GATT-фрагментов: ограничивает очередь ОС, без собственных ретрансляций. + * Доставку целых DATA подтверждает потребитель (ETCP); ACK не является подтверждением приложения. * Диагностика: discovery (BLE-префикс). NULL validate разрешает запрос, как и начальная политика GUI. */ #ifndef VIBECHAT_BLE_TRANSPORT_H #define VIBECHAT_BLE_TRANSPORT_H @@ -18,6 +19,11 @@ extern "C" { #define BLE_ENDPOINT_MAX 256 #define BLE_LINKS_MAX 16 #define BLE_QUEUE_MAX 64 +/* Расчётная скорость фиксирована; окно включает DATA GATT-values с заголовками. */ +#define BLE_TX_RATE_BITS 2000000u +#define BLE_TX_WINDOW_MS 50u +#define BLE_TX_WINDOW_BYTES (BLE_TX_RATE_BITS / 8u * BLE_TX_WINDOW_MS / 1000u) +#define BLE_ACK_INTERVAL_US 15000u struct ble_transport; struct UASYNC; typedef uint64_t ble_link_id;