Skip to content

Commit faaf7c2

Browse files
committed
Add exponential flood advert reduction based on hop count
Implements #1223 Adds cli config flood.advert.base 0 = forwarding flood adverts off 1 = forwarding flood adverts on (unrestricted) 0.308 (default) = prob. forwarding according to #1223
1 parent 5557457 commit faaf7c2

3 files changed

Lines changed: 26 additions & 0 deletions

File tree

examples/simple_repeater/MyMesh.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,15 @@ bool MyMesh::allowPacketForward(const mesh::Packet *packet) {
433433
MESH_DEBUG_PRINTLN("allowPacketForward: unknown transport code, or wildcard not allowed for FLOOD packet");
434434
return false;
435435
}
436+
// Limit flood advert paket forwarding using a probabilistic reduction defined by P(h) = 0.308^(hops-1)
437+
// https://github.com/meshcore-dev/MeshCore/issues/1223
438+
if (packet->getPayloadType() == PAYLOAD_TYPE_ADVERT && packet->isRouteFlood()) {
439+
double roll_dice = (double)rand() / RAND_MAX;
440+
double forw_prob = pow(_prefs.flood_advert_base, packet->path_len - 1);
441+
if (roll_dice > forw_prob)
442+
return false;
443+
}
444+
436445
if (packet->isRouteFlood() && _prefs.loop_detect != LOOP_DETECT_OFF) {
437446
const uint8_t* maximums;
438447
if (_prefs.loop_detect == LOOP_DETECT_MINIMAL) {
@@ -885,6 +894,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
885894
_prefs.tx_power_dbm = LORA_TX_POWER;
886895
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
887896
_prefs.flood_advert_interval = 12; // 12 hours
897+
_prefs.flood_advert_base = 0.308f;
888898
_prefs.flood_max = 64;
889899
_prefs.interference_threshold = 0; // disabled
890900

src/helpers/CommonCLI.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
8989
file.read((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
9090
file.read((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
9191
file.read((uint8_t *)&_prefs->rx_boosted_gain, sizeof(_prefs->rx_boosted_gain)); // 290
92+
file.read((uint8_t *)&_prefs->flood_advert_base, sizeof(_prefs->flood_advert_base)); // 290
93+
9294
// next: 291
9395

9496
// sanitise bad pref values
@@ -119,6 +121,7 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
119121

120122
// sanitise settings
121123
_prefs->rx_boosted_gain = constrain(_prefs->rx_boosted_gain, 0, 1); // boolean
124+
_prefs->flood_advert_base = constrain(_prefs->flood_advert_base, 0, 1);
122125

123126
file.close();
124127
}
@@ -181,6 +184,7 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
181184
file.write((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
182185
file.write((uint8_t *)&_prefs->rx_boosted_gain, sizeof(_prefs->rx_boosted_gain)); // 290
183186
// next: 291
187+
file.write((uint8_t *)&_prefs->flood_advert_base, sizeof(_prefs->flood_advert_base));
184188

185189
file.close();
186190
}
@@ -508,6 +512,15 @@ void CommonCLI::handleSetCmd(uint32_t sender_timestamp, char* command, char* rep
508512
savePrefs();
509513
strcpy(reply, "OK");
510514
}
515+
} else if (memcmp(config, "flood.advert.base ", 18) == 0) {
516+
float f = atof(&config[18]);
517+
if (f >= 0.0f && f <= 1.0f) {
518+
_prefs->flood_advert_base = f;
519+
savePrefs();
520+
strcpy(reply, "OK");
521+
} else {
522+
strcpy(reply, "Error: base must be between 0 and 1");
523+
}
511524
} else if (memcmp(config, "advert.interval ", 16) == 0) {
512525
int mins = _atoi(&config[16]);
513526
if ((mins > 0 && mins < MIN_LOCAL_ADVERT_INTERVAL) || (mins > 240)) {
@@ -752,6 +765,8 @@ void CommonCLI::handleGetCmd(uint32_t sender_timestamp, char* command, char* rep
752765
sprintf(reply, "> %s", _prefs->allow_read_only ? "on" : "off");
753766
} else if (memcmp(config, "flood.advert.interval", 21) == 0) {
754767
sprintf(reply, "> %d", ((uint32_t) _prefs->flood_advert_interval));
768+
} else if (memcmp(config, "flood.advert.base", 17) == 0) {
769+
sprintf(reply, "> %s", StrHelper::ftoa(_prefs->flood_advert_base));
755770
} else if (memcmp(config, "advert.interval", 15) == 0) {
756771
sprintf(reply, "> %d", ((uint32_t) _prefs->advert_interval) * 2);
757772
} else if (memcmp(config, "guest.password", 14) == 0) {

src/helpers/CommonCLI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ struct NodePrefs { // persisted to file
6161
uint8_t rx_boosted_gain; // power settings
6262
uint8_t path_hash_mode; // which path mode to use when sending
6363
uint8_t loop_detect;
64+
float flood_advert_base;
6465
};
6566

6667
class CommonCLICallbacks {

0 commit comments

Comments
 (0)