Skip to content

Commit

Permalink
Rate limit position replies to three minutes (#5932)
Browse files Browse the repository at this point in the history
  • Loading branch information
GUVWAF authored Jan 25, 2025
1 parent fd56995 commit a14346b
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 4 deletions.
20 changes: 16 additions & 4 deletions src/modules/PositionModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,8 @@ bool PositionModule::hasGPS()
#endif
}

meshtastic_MeshPacket *PositionModule::allocReply()
// Allocate a packet with our position data if we have one
meshtastic_MeshPacket *PositionModule::allocPositionPacket()
{
if (precision == 0) {
LOG_DEBUG("Skip location send because precision is set to 0!");
Expand Down Expand Up @@ -262,7 +263,8 @@ meshtastic_MeshPacket *PositionModule::allocReply()
p.has_ground_speed = true;
}

LOG_INFO("Position reply: time=%i lat=%i lon=%i", p.time, p.latitude_i, p.longitude_i);
LOG_INFO("Position packet: time=%i lat=%i lon=%i", p.time, p.latitude_i, p.longitude_i);
lastSentToMesh = millis();

// TAK Tracker devices should send their position in a TAK packet over the ATAK port
if (config.device.role == meshtastic_Config_DeviceConfig_Role_TAK_TRACKER)
Expand All @@ -271,6 +273,16 @@ meshtastic_MeshPacket *PositionModule::allocReply()
return allocDataProtobuf(p);
}

meshtastic_MeshPacket *PositionModule::allocReply()
{
if (lastSentToMesh && Throttle::isWithinTimespanMs(lastSentToMesh, 3 * 60 * 1000)) {
LOG_DEBUG("Skip Position reply since we sent it <3min ago");
ignoreRequest = true; // Mark it as ignored for MeshModule
return nullptr;
}
return allocPositionPacket();
}

meshtastic_MeshPacket *PositionModule::allocAtakPli()
{
LOG_INFO("Send TAK PLI packet");
Expand Down Expand Up @@ -333,9 +345,9 @@ void PositionModule::sendOurPosition(NodeNum dest, bool wantReplies, uint8_t cha
precision = 0;
}

meshtastic_MeshPacket *p = allocReply();
meshtastic_MeshPacket *p = allocPositionPacket();
if (p == nullptr) {
LOG_DEBUG("allocReply returned a nullptr");
LOG_DEBUG("allocPositionPacket returned a nullptr");
return;
}

Expand Down
2 changes: 2 additions & 0 deletions src/modules/PositionModule.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,15 @@ class PositionModule : public ProtobufModule<meshtastic_Position>, private concu
virtual int32_t runOnce() override;

private:
meshtastic_MeshPacket *allocPositionPacket();
struct SmartPosition getDistanceTraveledSinceLastSend(meshtastic_PositionLite currentPosition);
meshtastic_MeshPacket *allocAtakPli();
void trySetRtc(meshtastic_Position p, bool isLocal, bool forceUpdate = false);
uint32_t precision;
void sendLostAndFoundText();
bool hasQualityTimesource();
bool hasGPS();
uint32_t lastSentToMesh = 0; // Last time we sent our position to the mesh

const uint32_t minimumTimeThreshold =
Default::getConfiguredOrDefaultMs(config.position.broadcast_smart_minimum_interval_secs, 30);
Expand Down

0 comments on commit a14346b

Please sign in to comment.