From 88d9c380314c21a467898a04afea59b635f428b9 Mon Sep 17 00:00:00 2001 From: medentem Date: Sun, 29 Dec 2024 18:45:22 -0600 Subject: [PATCH] map coverage filter --- src/mesh/FloodingRouter.cpp | 23 +++++++++-------------- src/mesh/RadioInterface.cpp | 14 ++++++-------- src/mesh/RadioInterface.h | 2 +- src/mesh/RadioLibInterface.cpp | 3 +-- 4 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/mesh/FloodingRouter.cpp b/src/mesh/FloodingRouter.cpp index 0bd35c687..e8db29450 100644 --- a/src/mesh/FloodingRouter.cpp +++ b/src/mesh/FloodingRouter.cpp @@ -14,22 +14,17 @@ ErrorCode FloodingRouter::send(meshtastic_MeshPacket *p) { // Add any messages _we_ send to the seen message list (so we will ignore all retransmissions we see) wasSeenRecently(p); // FIXME, move this to a sniffSent method + + CoverageFilter coverage; + // Is there anything upstream of this? + // I think not, but if so, we need to merge coverage. + // loadCoverageFilterFromPacket(p, coverage); - // -- START coverage filter population -- - // If this is a floodable packet (for example, has non-zero hop_limit and ID), - // we can add our coverage. - if (p->id != 0 && p->hop_limit > 0) { - CoverageFilter coverage; - // Is there anything upstream of this? I think not, but if so, we need to merge coverage. - // loadCoverageFilterFromPacket(p, coverage); + // Add our coverage (neighbors, etc.) so they are in the filter from the get-go + mergeMyCoverage(coverage); - // Add our coverage (neighbors, etc.) so they are in the filter from the get-go - mergeMyCoverage(coverage); - - // Save the coverage bits into the packet: - storeCoverageFilterInPacket(coverage, p); - } - // -- END coverage filter population -- + // Save the coverage bits into the packet: + storeCoverageFilterInPacket(coverage, p); return Router::send(p); } diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp index 0e92b34ae..44db29a75 100644 --- a/src/mesh/RadioInterface.cpp +++ b/src/mesh/RadioInterface.cpp @@ -317,8 +317,6 @@ void printPacket(const char *prefix, const meshtastic_MeshPacket *p) // --- Coverage filter logging --- if (p->coverage_filter.size > 0) { - // If the coverage_filter.size is 0, you might skip printing or - // choose to indicate it differently. Usually it will be 16 though. std::string coverageHex; // Reserve enough space for 2 hex characters per byte. coverageHex.reserve(p->coverage_filter.size * 2); @@ -634,13 +632,13 @@ size_t RadioInterface::beginSending(meshtastic_MeshPacket *p) p->hop_limit | (p->want_ack ? PACKET_FLAGS_WANT_ACK_MASK : 0) | (p->via_mqtt ? PACKET_FLAGS_VIA_MQTT_MASK : 0); radioBuffer.header.flags |= (p->hop_start << PACKET_FLAGS_HOP_START_SHIFT) & PACKET_FLAGS_HOP_START_MASK; - // Coverage filter is 16 bytes, but p->coverage_filter.size might be 0..16. - // Usually, you set p->coverage_filter.size = 16 if you want to transmit. - radioBuffer.header.coverage_filter.fill(0); // Clear first, in case size < 16 + // Clear out coverage_filter + memset(radioBuffer.header.coverage_filter, 0, BLOOM_FILTER_SIZE_BYTES); + + // Copy if size > 0: if (p->coverage_filter.size > 0) { - memcpy(radioBuffer.header.coverage_filter.data(), - p->coverage_filter.bytes, - std::min((size_t)p->coverage_filter.size, (size_t)BLOOM_FILTER_SIZE_BYTES)); + memcpy(radioBuffer.header.coverage_filter, p->coverage_filter.bytes, + std::min(p->coverage_filter.size, BLOOM_FILTER_SIZE_BYTES)); } // if the sender nodenum is zero, that means uninitialized diff --git a/src/mesh/RadioInterface.h b/src/mesh/RadioInterface.h index 48fa50a21..3be73d369 100644 --- a/src/mesh/RadioInterface.h +++ b/src/mesh/RadioInterface.h @@ -45,7 +45,7 @@ typedef struct { uint8_t relay_node; // A 16-byte Bloom filter that tracks coverage of the current node. - std::array coverage_filter; + uint8_t coverage_filter[BLOOM_FILTER_SIZE_BYTES] __attribute__((__aligned)); } PacketHeader; /** diff --git a/src/mesh/RadioLibInterface.cpp b/src/mesh/RadioLibInterface.cpp index 55f31a122..8acdfd70c 100644 --- a/src/mesh/RadioLibInterface.cpp +++ b/src/mesh/RadioLibInterface.cpp @@ -411,8 +411,7 @@ void RadioLibInterface::handleReceiveInterrupt() // ----------------- Copy coverage_filter in the packet object ------------------ mp->coverage_filter.size = BLOOM_FILTER_SIZE_BYTES; - memcpy(mp->coverage_filter.bytes, - radioBuffer.header.coverage_filter.data(), BLOOM_FILTER_SIZE_BYTES); + memcpy(mp->coverage_filter.bytes, radioBuffer.header.coverage_filter, BLOOM_FILTER_SIZE_BYTES); // ----------------------------------------------------------------------------- addReceiveMetadata(mp);