From 49cbb7e14838e283fd171d419fffdb4039ca6823 Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 30 Oct 2026 12:45:56 +0100 Subject: [PATCH] Keep BLE counters tied to neighbor table entries --- doc/ble_etcp.txt | 4 ++-- tools/cgathui_common/ble_etcp.c | 7 +++---- tools/cgathui_common/tests/test_ble_etcp.c | 11 +++++++++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/doc/ble_etcp.txt b/doc/ble_etcp.txt index 9a9e2393..2e7bc55d 100644 --- a/doc/ble_etcp.txt +++ b/doc/ble_etcp.txt @@ -31,8 +31,8 @@ frontend передают instance. config.callbacks — наблюдатели; Таблица в управляющей структуре драйвера, не в instance и не в UI: 64 записи {node_id, UTF-8 name, endpoint, RSSI, seen_us, broadcast_received}; срок свежести 30 секунд. Каждое принятое валидное объявление увеличивает broadcast_received, включая одинаковые повторы. -Обновление имени, адреса и RSSI сохраняет счётчик. По истечении срока запись удаляется; -повторное появление начинает счёт с 1, даже если таймер ещё не очистил просроченный слот. +Обновление имени, адреса и RSSI сохраняет счётчик. Он сбрасывается вместе с записью +при удалении по таймауту или замене другим соседом; новая запись начинает счёт с 1. Desktop формирует видимый список из snapshot общего драйвера. Android получает тот же C API через android_ble_driver(). node_id/name в эфире не аутентифицированы. Android показывает счётчик под ником, desktop — в строке соседа как RX. diff --git a/tools/cgathui_common/ble_etcp.c b/tools/cgathui_common/ble_etcp.c index dadad607..0104f824 100644 --- a/tools/cgathui_common/ble_etcp.c +++ b/tools/cgathui_common/ble_etcp.c @@ -216,14 +216,13 @@ static void broadcast(void* arg, const struct ble_endpoint* endpoint, const uint } if (slot >= 0) { struct ble_neighbor* n = &d->neighbors[slot]; - int fresh = n->identity.node_id == peer.node_id && now - n->seen_us <= BLE_NEIGHBOR_TTL_US; - peer_received = fresh ? n->broadcast_received + 1 : 1; - if (!fresh) { + peer_received = n->identity.node_id == peer.node_id ? n->broadcast_received + 1 : 1; + if (n->identity.node_id != peer.node_id) { DEBUG_INFO(CAT, "BLE neighbor discovered peer=%016llx name=%s endpoint=%s rssi=%d", (unsigned long long)peer.node_id, peer.name, endpoint->id, rssi); d->retry[slot] = 0; d->check_groups = 1; } - if (!fresh || strcmp(n->identity.name, peer.name)) d->peers_changed = 1; + if (n->identity.node_id != peer.node_id || strcmp(n->identity.name, peer.name)) d->peers_changed = 1; *n = (struct ble_neighbor){.identity = peer, .endpoint = *endpoint, .rssi = rssi, .seen_us = now, .broadcast_received = peer_received}; schedule(d); reason = "accepted"; count = ++d->broadcast_accepted; diff --git a/tools/cgathui_common/tests/test_ble_etcp.c b/tools/cgathui_common/tests/test_ble_etcp.c index 383778be..d7839d0b 100644 --- a/tools/cgathui_common/tests/test_ble_etcp.c +++ b/tools/cgathui_common/tests/test_ble_etcp.c @@ -332,9 +332,20 @@ int main(void) { assert(ble_etcp_neighbors(endpoints[0].driver, neighbors, 2) == 1); assert(neighbors[0].identity.node_id == endpoints[1].inst.node_id && neighbors[0].rssi == -42); assert(!strcmp(neighbors[0].endpoint.id, "1")); + assert(neighbors[0].broadcast_received == 1); assert(!endpoints[0].inst.connections->head); /* Discovery не подключает посторонних. */ ble_backend_broadcast(backends[0]->owner, &ep, bytes, len, -30); assert(ble_etcp_neighbors(endpoints[0].driver, neighbors, 2) == 1 && neighbors[0].rssi == -30); + assert(neighbors[0].broadcast_received == 2); + ble_backend_broadcast(backends[0]->owner, &ep, bytes, len, -30); + bytes[2] = BLE_IDENTITY_VERSION - 1; + ble_backend_broadcast(backends[0]->owner, &ep, bytes, len, -30); bytes[2] = BLE_IDENTITY_VERSION; + assert(ble_etcp_neighbors(endpoints[0].driver, neighbors, 2) == 1 && neighbors[0].broadcast_received == 3); + /* Отдельный сосед имеет свой счётчик; его объявление не меняет счёт первого. */ + int other_len = ble_identity_encode(self, endpoints[0].inst.node_id ^ 1, "other"); + ble_backend_broadcast(backends[0]->owner, &ep, self, other_len, -55); + assert(ble_etcp_neighbors(endpoints[0].driver, neighbors, 2) == 2); + assert(neighbors[0].broadcast_received == 3 && neighbors[1].broadcast_received == 1); assert(!ble_etcp_connect(endpoints[0].driver, endpoints[1].inst.node_id)); wait_ready(); for (int i = 0; i < 2; i++) { struct etcp_link_snapshot snapshot;