mirror of
https://github.com/meshtastic/firmware.git
synced 2026-09-28 17:29:06 -04:00
perhapsCancelDupe was gated on TRANSPORT_LORA, so a node that overheard a neighbour relaying a packet over BLE advertised its own copy anyway. The gate is now per medium: a LoRa dupe cancels the LoRa queue as before, a BLE dupe cancels the BLE ring and nothing else. Cancelling across media would be wrong in the other direction - hearing a neighbour on BLE is no evidence at all about who heard us on LoRa, and standing the LoRa rebroadcast down on that would thin the flood wherever the two meshes overlap. MeshTransportBase gains cancelTransportsOn(), carrying the medium so each transport can ignore a cancel that is not for its own radio. AdvSlot carries from/id, and runOnce remembers the identity of the burst it started, so a cancel reaches a payload already repeating on air as well as the ones still queued. Separately, buildAdvPayload has always refused packets that do not fit one unfragmented advertisement, and the existing test only proved that at 256 bytes. The real ceiling is 219 bytes of ciphertext against the 239 a LoRa frame carries, and 198 for a relay, because the packet is encoded as it stands and so puts the rx_rssi, rx_snr and rx_time it was received with on the air - rx_rssi being a negative int32 at ten bytes, and the relayer's own link quality. Both numbers are now binary-searched and pinned, so a field added to MeshPacket shows up as a failing test rather than as quietly shorter reach, and the refusals are counted rather than only logged.