Document BLE readiness fixes and remaining HCI queue delay

This commit is contained in:
evgeny committed 2026-10-29 21:37:40 +01:00
1 parent 55bb052406
commit 635e1726e6
2 files changed
+57 -4

No files matched your search

+51 -1
View File
@@ -1,5 +1,13 @@
BLE GATT → ETCP (chatgui desktop + Android)
Текущее состояние диагностики задержек (29.10.2026):
Write Without Response/Notify, HIGH и PHY2M включены. Исправлены готовность
BlueZ по ServicesResolved, использование старого ManufacturerData, входящий
HIGH Android и потолок DATA RTO=1s. Версия объявления повышена до 2, чтобы
не подключаться к старому DATA Write/Indicate сервису. Полная нагрузка обеих
аппаратных ролей пока не подтверждена: остаётся очередь между локальным
completion и HCI TX. Успех короткой пробы не означает устранения этой очереди.
Общий код: tools/cgathui_common/ble_etcp.c/h.
Платформенные backend остаются в lib/ble и android_ble.c; Qt не участвует в протоколе.
UTUN binary этот модуль не собирает. При активном UTUN-сервисе общего instance
@@ -292,7 +300,8 @@ HCI можно снимать через sudo btmon -w FILE; обычному п
- ETCP усиливает перегрузку: INIT вначале повторяется примерно каждые 50ms
с padding; DATA RTO ограничен 1s даже при уже измеренном KA RTT=5..6s.
В результате повтор может попасть в очередь раньше физической отправки оригинала.
Алгоритмы INIT/RTO в этом исправлении не менялись.
На этапе исправления incoming HIGH алгоритмы INIT/RTO ещё не менялись;
последующее исправление RTO описано ниже.
Отдельно найден мешающий discovery: D-Bus sender :1.70, PID3047 kdeconnectd,
каждые 60s устанавливает Transport=bredr. BlueZ объединяет его с нашим Transport=le,
@@ -310,6 +319,11 @@ HCI можно снимать через sudo btmon -w FILE; обычному п
с доступным кешем и ServicesResolved=false падал до исправления, теперь проходит;
после сигнала resolve используется актуальный MTU517 вместо прежнего MTU23.
В аппаратной пробе видны оба snapshot: connected=1/resolved=0, затем resolved=1.
- GetManagedObjects используется только как metadata snapshot: закешированное
ManufacturerData больше не обновляет discovery/last_seen. Иначе старый RPA
телефона мог выдаваться за актуальный endpoint. Новые объявления поступают
только из live InterfacesAdded/PropertiesChanged. Регрессионный тест со старым
ManufacturerData в snapshot падал до исправления и проходит после него.
- Android после первой входящей CCC открывает BluetoothGatt handle к тому же ACL
исключительно для requestConnectionPriority(HIGH). У BluetoothGattServer нет
соответствующего публичного метода. Новый handle не выполняет discovery/DATA,
@@ -354,3 +368,39 @@ UTUN_TEST_DEBUG=1 включает отпечатки кадров также в
теста проходят. Пробы восстанавливают GUI, Android-политику и временное состояние
KDE Connect. Сборку APK и запуск instrumentation нужно выполнять последовательно:
одна проба во время установки завершилась Process crashed и не учитывается.
Изоляция старого протокола и RTO при RTT больше секунды
------------------------------------------------------
Сосед 1588291579282de3 публиковал DATA RX=Write/TX=Indicate. Android пытался
подключиться к нему примерно каждые 6s и обнаруживал несовместимые свойства.
Новый wire-profile требует объявления VC/version=2; версия 1 отклоняется
на discovery, до connectGatt. JNI передаёт scan prefix из общего C codec,
Kotlin не хранит отдельную версию. Нужны новые сборки на обоих пирах.
В /tmp/ble-ready-priority-v2-* нет этих подключений: 128/128 echo за10.623s,
суммарно36149B/s, TX queue до0.554s. Длинные повторения остались нестабильны:
/tmp/ble-ready-desktop-load-v2-* 49/512, /tmp/ble-ready-android-central-v2-* 439/512.
В desktop-load-v2 при KA_RTT_us=2025400 повтор DATA назначался через1000000us;
далее наблюдался RTT2..6s с тем же потолком. Попытки удалялись раньше ACK,
повторы увеличивали очередь и мешали получить действующие DATA/BBR samples.
etcp_tx_rto_us теперь сохраняет ceil(1.2*max(DATA_RTT,KA_RTT)+1.5*jitter+3000us),
минимум10ms и начальное1s без RTT; ограничение сверху — представимость uint32.
Переполнение формулы считается в uint64 и логируется WARN при насыщении.
test_etcp_windows проходит все63 сценария, включая RTT2s/ACK1.5s без повтора,
таймер7.8672s и предельные значения. Формат DATA/ACK и модель BBR не менялись.
Аппаратная проба после исправления: /tmp/ble-ready-rto-desktop-v2-*.
MTU517, HIGH принят, PHY2M. За71.328s подтверждено183/512 echo, complete=0,
суммарно7697B/s; это НЕ успешный нагрузочный проход. Сопоставлены534 TX кадра:
local completion→HCI до4.583s; у503 RX кадров HCI→callback0.7..2.5ms.
До первого INIT_RESPONSE отправлены24 INIT (вначале каждые~50ms), после готовности
линия продолжает передавать кадры. Исправление RTO не ограничивает очередь ОС.
Начальный RTO без RTT всё ещё1s, и в этой пробе он сработал до первого измерения.
Нужен отдельный выбор ограничения стартовых INIT/нижней TX-очереди; изменение
одного таймера не считается подтверждённым устранением всех задержек BLE.
При полном check обнаружена некорректная фикстура test_etcp_server_lifecycle:
синтетический линк MTU=0 не мог отправлять keepalive, но тест ожидал роста счётчика.
После аудита ошибок счётчик увеличивается только при принятии пакета транспортом.
Фикстура теперь явно задаёт результат отправки через codec без сетевого I/O;
добавлена проверка, что busy/error сохраняют счётчик, а успешная отправка увеличивает.
+6 -3
View File
@@ -5,7 +5,7 @@ BLE транспорт VibeChat (lib/ble)
Независимая от Qt библиотека предоставляет manufacturer-броадкасты и адресные
двусторонние GATT-сессии. Один локальный GATT-сервис обслуживает до 16 соединений.
Броадкаст — повторяемое ОС объявление, а не гарантированно доставляемая датаграмма.
Общий codec ble_identity.h: VC (2 байта), версия 1 (1), node_id BE64 (8),
Общий codec ble_identity.h: VC (2 байта), версия 2 (1), node_id BE64 (8),
имя UTF-8 (0..13). Имя сокращается по границе символа. Всего 11..24 байта.
Приглашения и автоматический выбор соседей реализованы в tools/cgathui_common (doc/ble_etcp.txt); транспорт не запускает JOIN/ETCP.
Node ID передаётся в HELLO для сопоставления сессий; подлинность он не доказывает.
@@ -70,8 +70,11 @@ UUID RX: f61a9021-4abc-45ac-98e1-761df4c13811 (Write Without Response)
UUID TX: f61a9022-4abc-45ac-98e1-761df4c13811 (Notify)
UUID INVITE: f61a9023-4abc-45ac-98e1-761df4c13811 (Write + Indicate)
RX/TX названы относительно сервера; API одинаков для обеих ролей.
UUID определяют эту версию. Это отдельный протокол от Android BLE test v2;
автоматическую совместимость с tools/ble-test-android он не заявляет.
Версия объявления 2 означает DATA Write Without Response/Notify; объявления
версии 1 отклоняются до GATT-подключения. Desktop и Android должны использовать
новую версию вместе. Scan prefix Android приходит из C codec через JNI start,
номер версии в Kotlin не дублируется. Это отдельный протокол от BLE_EXAMPLE
и tools/ble-test-android; автоматическая совместимость с ними не заявляется.
Все многобайтные целые big-endian, без выравнивания C-структур.
HELLO: [type=1:1][source_node:8][target_node:8], Central -> Peripheral.