Skip to content

Commit 69a514f

Browse files
committed
Integration of upstrem PR meshcore-dev#1338
2 parents 49721ff + f9f1775 commit 69a514f

4 files changed

Lines changed: 39 additions & 2 deletions

File tree

examples/simple_repeater/MyMesh.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,14 @@ bool MyMesh::allowPacketForward(const mesh::Packet *packet) {
390390
MESH_DEBUG_PRINTLN("allowPacketForward: unknown transport code, or wildcard not allowed for FLOOD packet");
391391
return false;
392392
}
393+
// Limit flood advert paket forwarding using a probabilistic reduction defined by P(h) = 0.308^(hops-1)
394+
// https://github.com/meshcore-dev/MeshCore/issues/1223
395+
double_t roll_dice = (double)rand() / RAND_MAX;
396+
double_t forw_prob = pow(_prefs.flood_advert_base, packet->path_len - 1);
397+
if (packet->getPayloadType() == PAYLOAD_TYPE_ADVERT && packet->isRouteFlood() && roll_dice > forw_prob)
398+
return false;
399+
400+
// all other packets
393401
return true;
394402
}
395403

@@ -783,6 +791,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
783791
_prefs.tx_power_dbm = LORA_TX_POWER;
784792
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
785793
_prefs.flood_advert_interval = 12; // 12 hours
794+
_prefs.flood_advert_base = 0.308f;
786795
_prefs.flood_max = 64;
787796
_prefs.interference_threshold = 0; // disabled
788797

examples/simple_room_server/MyMesh.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,15 @@ uint32_t MyMesh::getDirectRetransmitDelay(const mesh::Packet *packet) {
275275
bool MyMesh::allowPacketForward(const mesh::Packet *packet) {
276276
if (_prefs.disable_fwd) return false;
277277
if (packet->isRouteFlood() && packet->path_len >= _prefs.flood_max) return false;
278+
279+
// Limit flood advert paket forwarding using a probabilistic reduction defined by P(h) = 0.308^(hops-1)
280+
// https://github.com/meshcore-dev/MeshCore/issues/1223
281+
double_t roll_dice = (double)rand() / RAND_MAX;
282+
double_t forw_prob = pow(_prefs.flood_advert_base, packet->path_len - 1);
283+
if (packet->getPayloadType() == PAYLOAD_TYPE_ADVERT && packet->isRouteFlood() && roll_dice > forw_prob)
284+
return false;
285+
286+
// all other packets
278287
return true;
279288
}
280289

@@ -613,6 +622,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
613622
_prefs.disable_fwd = 1;
614623
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
615624
_prefs.flood_advert_interval = 12; // 12 hours
625+
_prefs.flood_advert_base = 0.308f;
616626
_prefs.flood_max = 64;
617627
_prefs.interference_threshold = 0; // disabled
618628
#ifdef ROOM_PASSWORD

src/helpers/CommonCLI.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
8181
file.read((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
8282
file.read((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
8383
file.read((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
84-
// 290
84+
file.read((uint8_t *)&_prefs->flood_advert_base, sizeof(_prefs->flood_advert_base)); // 290
85+
86+
// 294
8587

8688
// sanitise bad pref values
8789
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
@@ -108,6 +110,8 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
108110
_prefs->gps_enabled = constrain(_prefs->gps_enabled, 0, 1);
109111
_prefs->advert_loc_policy = constrain(_prefs->advert_loc_policy, 0, 2);
110112

113+
_prefs->flood_advert_base = constrain(_prefs->flood_advert_base, 0, 1);
114+
111115
file.close();
112116
}
113117
}
@@ -165,7 +169,9 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
165169
file.write((uint8_t *)&_prefs->discovery_mod_timestamp, sizeof(_prefs->discovery_mod_timestamp)); // 162
166170
file.write((uint8_t *)&_prefs->adc_multiplier, sizeof(_prefs->adc_multiplier)); // 166
167171
file.write((uint8_t *)_prefs->owner_info, sizeof(_prefs->owner_info)); // 170
168-
// 290
172+
file.write((uint8_t *)&_prefs->flood_advert_base, sizeof(_prefs->flood_advert_base)); // 290
173+
174+
// 294
169175

170176
file.close();
171177
}
@@ -369,6 +375,8 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
369375
} else {
370376
sprintf(reply, "> %.3f", adc_mult);
371377
}
378+
} else if (memcmp(config, "flood.advert.base", 17) == 0) {
379+
sprintf(reply, "> %s", StrHelper::ftoa(_prefs->flood_advert_base));
372380
// Power management commands
373381
} else if (memcmp(config, "pwrmgt.support", 14) == 0) {
374382
#ifdef NRF52_POWER_MANAGEMENT
@@ -616,6 +624,15 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
616624
_prefs->adc_multiplier = 0.0f;
617625
strcpy(reply, "Error: unsupported by this board");
618626
};
627+
} else if (memcmp(config, "flood.advert.base ", 18) == 0) {
628+
float f = atof(&config[18]);
629+
if((f > 0) || (f<1)) {
630+
_prefs->flood_advert_base = f;
631+
savePrefs();
632+
strcpy(reply, "OK");
633+
} else {
634+
strcpy(reply, "Error: base must be between 0 and 1");
635+
}
619636
} else {
620637
sprintf(reply, "unknown config: %s", config);
621638
}

src/helpers/CommonCLI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ struct NodePrefs { // persisted to file
3636
uint8_t flood_max;
3737
uint8_t interference_threshold;
3838
uint8_t agc_reset_interval; // secs / 4
39+
float flood_advert_base;
3940
// Bridge settings
4041
uint8_t bridge_enabled; // boolean
4142
uint16_t bridge_delay; // milliseconds (default 500 ms)

0 commit comments

Comments
 (0)