From 8989a4503a9830bcac1f8f98d7df1a23ac3bf1d8 Mon Sep 17 00:00:00 2001 From: Matthias Wientapper Date: Wed, 7 Jan 2026 21:24:25 +0100 Subject: [PATCH 1/2] Limit flood advert packet forwarding, implements #1223 --- examples/simple_repeater/MyMesh.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/examples/simple_repeater/MyMesh.cpp b/examples/simple_repeater/MyMesh.cpp index 33e32a68..c935bd62 100644 --- a/examples/simple_repeater/MyMesh.cpp +++ b/examples/simple_repeater/MyMesh.cpp @@ -324,6 +324,14 @@ bool MyMesh::allowPacketForward(const mesh::Packet *packet) { MESH_DEBUG_PRINTLN("allowPacketForward: unknown transport code, or wildcard not allowed for FLOOD packet"); return false; } + // Limit flood advert paket forwarding using a probabilistic reduction defined by P(h) = 0.308^(hops-1) + // https://github.com/meshcore-dev/MeshCore/issues/1223 + double_t roll_dice = (double)rand() / RAND_MAX; + double_t forw_prob = pow(0.308, packet->path_len - 1); + if (packet->getPayloadType() == PAYLOAD_TYPE_ADVERT && packet->isRouteFlood() && roll_dice > forw_prob) + return false; + + // all other packets return true; } From 27b030c9a291938a46e85412f55a8e37e228356e Mon Sep 17 00:00:00 2001 From: Matthias Wientapper Date: Fri, 9 Jan 2026 20:47:09 +0100 Subject: [PATCH 2/2] Limit flood advert packet forwarding for roomservers as well --- examples/simple_room_server/MyMesh.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/examples/simple_room_server/MyMesh.cpp b/examples/simple_room_server/MyMesh.cpp index 60dd1840..0cfef8c3 100644 --- a/examples/simple_room_server/MyMesh.cpp +++ b/examples/simple_room_server/MyMesh.cpp @@ -275,6 +275,15 @@ uint32_t MyMesh::getDirectRetransmitDelay(const mesh::Packet *packet) { bool MyMesh::allowPacketForward(const mesh::Packet *packet) { if (_prefs.disable_fwd) return false; if (packet->isRouteFlood() && packet->path_len >= _prefs.flood_max) return false; + + // Limit flood advert paket forwarding using a probabilistic reduction defined by P(h) = 0.308^(hops-1) + // https://github.com/meshcore-dev/MeshCore/issues/1223 + double_t roll_dice = (double)rand() / RAND_MAX; + double_t forw_prob = pow(0.308, packet->path_len - 1); + if (packet->getPayloadType() == PAYLOAD_TYPE_ADVERT && packet->isRouteFlood() && roll_dice > forw_prob) + return false; + + // all other packets return true; }