mirror of
https://github.com/meshtastic/firmware.git
synced 2025-09-15 15:05:48 +00:00
Add FloodingRouter::roleAllowsCancelingDupe and condition for CLIENT_BASE
This commit is contained in:
parent
ab5332950c
commit
b305acf7e5
@ -43,11 +43,30 @@ bool FloodingRouter::shouldFilterReceived(const meshtastic_MeshPacket *p)
|
|||||||
return Router::shouldFilterReceived(p);
|
return Router::shouldFilterReceived(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FloodingRouter::roleAllowsCancelingDupe(const meshtastic_MeshPacket *p)
|
||||||
|
{
|
||||||
|
if (config.device.role == meshtastic_Config_DeviceConfig_Role_ROUTER ||
|
||||||
|
config.device.role == meshtastic_Config_DeviceConfig_Role_REPEATER ||
|
||||||
|
config.device.role == meshtastic_Config_DeviceConfig_Role_ROUTER_LATE) {
|
||||||
|
// ROUTER, REPEATER, ROUTER_LATE should never cancel relaying a packet (i.e. we should always rebroadcast),
|
||||||
|
// even if we've heard another station rebroadcast it already.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.device.role == meshtastic_Config_DeviceConfig_Role_CLIENT_BASE) {
|
||||||
|
// CLIENT_BASE: if the packet is from or to a favorited node,
|
||||||
|
// we should act like a ROUTER and should never cancel a rebroadcast (i.e. we should always rebroadcast),
|
||||||
|
// even if we've heard another station rebroadcast it already.
|
||||||
|
return !nodeDB->isFromOrToFavoritedNode(*p);
|
||||||
|
}
|
||||||
|
|
||||||
|
// All other roles (such as CLIENT) should cancel a rebroadcast if they hear another station's rebroadcast.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void FloodingRouter::perhapsCancelDupe(const meshtastic_MeshPacket *p)
|
void FloodingRouter::perhapsCancelDupe(const meshtastic_MeshPacket *p)
|
||||||
{
|
{
|
||||||
if (config.device.role != meshtastic_Config_DeviceConfig_Role_ROUTER &&
|
if (roleAllowsCancelingDupe(p) &&
|
||||||
config.device.role != meshtastic_Config_DeviceConfig_Role_REPEATER &&
|
|
||||||
config.device.role != meshtastic_Config_DeviceConfig_Role_ROUTER_LATE &&
|
|
||||||
p->transport_mechanism == meshtastic_MeshPacket_TransportMechanism_TRANSPORT_LORA) {
|
p->transport_mechanism == meshtastic_MeshPacket_TransportMechanism_TRANSPORT_LORA) {
|
||||||
// cancel rebroadcast of this message *if* there was already one, unless we're a router/repeater!
|
// cancel rebroadcast of this message *if* there was already one, unless we're a router/repeater!
|
||||||
// But only LoRa packets should be able to trigger this.
|
// But only LoRa packets should be able to trigger this.
|
||||||
|
@ -59,6 +59,9 @@ class FloodingRouter : public Router
|
|||||||
*/
|
*/
|
||||||
virtual void sniffReceived(const meshtastic_MeshPacket *p, const meshtastic_Routing *c) override;
|
virtual void sniffReceived(const meshtastic_MeshPacket *p, const meshtastic_Routing *c) override;
|
||||||
|
|
||||||
|
// Return false for roles like ROUTER or REPEATER which should always rebroadcast even when we've heard another rebroadcast of the same packet
|
||||||
|
bool roleAllowsCancelingDupe(const meshtastic_MeshPacket *p);
|
||||||
|
|
||||||
/* Call when receiving a duplicate packet to check whether we should cancel a packet in the Tx queue */
|
/* Call when receiving a duplicate packet to check whether we should cancel a packet in the Tx queue */
|
||||||
void perhapsCancelDupe(const meshtastic_MeshPacket *p);
|
void perhapsCancelDupe(const meshtastic_MeshPacket *p);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user