Skip to content

Commit 1cec409

Browse files
committed
Integration of upstrem PR meshcore-dev#1338
2 parents 2a67d42 + f9f1775 commit 1cec409

File tree

4 files changed

+39
-2
lines changed

4 files changed

+39
-2
lines changed

examples/simple_repeater/MyMesh.cpp

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

@@ -828,6 +836,7 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
828836
_prefs.tx_power_dbm = LORA_TX_POWER;
829837
_prefs.advert_interval = 1; // default to 2 minutes for NEW installs
830838
_prefs.flood_advert_interval = 12; // 12 hours
839+
_prefs.flood_advert_base = 0.308f;
831840
_prefs.flood_max = 64;
832841
_prefs.interference_threshold = 0; // disabled
833842

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)