Skip to content

Commit cac45d9

Browse files
authored
Align telemetry broadcast want_response behavior with traceroute (#9717)
* Align telemetry broadcast want_response behavior with traceroute * Fixes * Reduce side-effects by making the telemetry modules handle the ignorerequest * Remove unnecessary ignoreRequest flag * Try inheriting from MeshModule * Add exclusion for sensor/router roles and add base telem module
1 parent 9c439f8 commit cac45d9

13 files changed

Lines changed: 181 additions & 5 deletions

src/mesh/MeshModule.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,18 @@ class MeshModule
106106
/* We allow modules to ignore a request without sending an error if they have a specific reason for it. */
107107
bool ignoreRequest = false;
108108

109+
/**
110+
* Check if the current request is a multi-hop broadcast. Modules should call this in allocReply()
111+
* and return NULL to prevent reply storms from broadcast requests that have already been relayed.
112+
*/
113+
bool isMultiHopBroadcastRequest()
114+
{
115+
if (currentRequest && isBroadcast(currentRequest->to) && currentRequest->hop_limit < currentRequest->hop_start) {
116+
return true;
117+
}
118+
return false;
119+
}
120+
109121
/** If a bound channel name is set, we will only accept received packets that come in on that channel.
110122
* A special exception (FIXME, not sure if this is a good idea) - packets that arrive on the local interface
111123
* are allowed on any channel (this lets the local user do anything).

src/modules/Telemetry/AirQualityTelemetry.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,10 @@ bool AirQualityTelemetryModule::getAirQualityTelemetry(meshtastic_Telemetry *m)
321321
meshtastic_MeshPacket *AirQualityTelemetryModule::allocReply()
322322
{
323323
if (currentRequest) {
324+
if (isMultiHopBroadcastRequest() && !isSensorOrRouterRole()) {
325+
ignoreRequest = true;
326+
return NULL;
327+
}
324328
auto req = *currentRequest;
325329
const auto &p = req.decoded;
326330
meshtastic_Telemetry scratch;

src/modules/Telemetry/AirQualityTelemetry.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
#pragma once
66

7+
#include "BaseTelemetryModule.h"
8+
79
#ifndef AIR_QUALITY_TELEMETRY_MODULE_ENABLE
810
#define AIR_QUALITY_TELEMETRY_MODULE_ENABLE 0
911
#endif
@@ -17,6 +19,7 @@
1719

1820
class AirQualityTelemetryModule : private concurrency::OSThread,
1921
public ScanI2CConsumer,
22+
public BaseTelemetryModule,
2023
public ProtobufModule<meshtastic_Telemetry>
2124
{
2225
CallbackObserver<AirQualityTelemetryModule, const meshtastic::Status *> nodeStatusObserver =
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#pragma once
2+
3+
#include "NodeDB.h"
4+
#include "configuration.h"
5+
6+
class BaseTelemetryModule
7+
{
8+
protected:
9+
bool isSensorOrRouterRole() const
10+
{
11+
return config.device.role == meshtastic_Config_DeviceConfig_Role_SENSOR ||
12+
config.device.role == meshtastic_Config_DeviceConfig_Role_ROUTER;
13+
}
14+
};

src/modules/Telemetry/DeviceTelemetry.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@
1919
int32_t DeviceTelemetryModule::runOnce()
2020
{
2121
refreshUptime();
22-
bool isImpoliteRole =
23-
IS_ONE_OF(config.device.role, meshtastic_Config_DeviceConfig_Role_SENSOR, meshtastic_Config_DeviceConfig_Role_ROUTER);
22+
bool isImpoliteRole = isSensorOrRouterRole();
2423
if (((lastSentToMesh == 0) ||
2524
((uptimeLastMs - lastSentToMesh) >=
2625
Default::getConfiguredOrDefaultMsScaled(moduleConfig.telemetry.device_update_interval,
@@ -60,6 +59,10 @@ bool DeviceTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &
6059
meshtastic_MeshPacket *DeviceTelemetryModule::allocReply()
6160
{
6261
if (currentRequest) {
62+
if (isMultiHopBroadcastRequest() && !isSensorOrRouterRole()) {
63+
ignoreRequest = true;
64+
return NULL;
65+
}
6366
auto req = *currentRequest;
6467
const auto &p = req.decoded;
6568
meshtastic_Telemetry scratch;

src/modules/Telemetry/DeviceTelemetry.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
#pragma once
22
#include "../mesh/generated/meshtastic/telemetry.pb.h"
3+
#include "BaseTelemetryModule.h"
34
#include "NodeDB.h"
45
#include "ProtobufModule.h"
56
#include <OLEDDisplay.h>
67
#include <OLEDDisplayUi.h>
78

8-
class DeviceTelemetryModule : private concurrency::OSThread, public ProtobufModule<meshtastic_Telemetry>
9+
class DeviceTelemetryModule : private concurrency::OSThread,
10+
public BaseTelemetryModule,
11+
public ProtobufModule<meshtastic_Telemetry>
912
{
1013
CallbackObserver<DeviceTelemetryModule, const meshtastic::Status *> nodeStatusObserver =
1114
CallbackObserver<DeviceTelemetryModule, const meshtastic::Status *>(this, &DeviceTelemetryModule::handleStatusUpdate);

src/modules/Telemetry/EnvironmentTelemetry.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,10 @@ bool EnvironmentTelemetryModule::getEnvironmentTelemetry(meshtastic_Telemetry *m
577577
meshtastic_MeshPacket *EnvironmentTelemetryModule::allocReply()
578578
{
579579
if (currentRequest) {
580+
if (isMultiHopBroadcastRequest() && !isSensorOrRouterRole()) {
581+
ignoreRequest = true;
582+
return NULL;
583+
}
580584
auto req = *currentRequest;
581585
const auto &p = req.decoded;
582586
meshtastic_Telemetry scratch;

src/modules/Telemetry/EnvironmentTelemetry.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
#pragma once
66

7+
#include "BaseTelemetryModule.h"
8+
79
#ifndef ENVIRONMENTAL_TELEMETRY_MODULE_ENABLE
810
#define ENVIRONMENTAL_TELEMETRY_MODULE_ENABLE 0
911
#endif
@@ -17,6 +19,7 @@
1719

1820
class EnvironmentTelemetryModule : private concurrency::OSThread,
1921
public ScanI2CConsumer,
22+
public BaseTelemetryModule,
2023
public ProtobufModule<meshtastic_Telemetry>
2124
{
2225
CallbackObserver<EnvironmentTelemetryModule, const meshtastic::Status *> nodeStatusObserver =

src/modules/Telemetry/HealthTelemetry.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ bool HealthTelemetryModule::getHealthTelemetry(meshtastic_Telemetry *m)
192192
meshtastic_MeshPacket *HealthTelemetryModule::allocReply()
193193
{
194194
if (currentRequest) {
195+
if (isMultiHopBroadcastRequest() && !isSensorOrRouterRole()) {
196+
ignoreRequest = true;
197+
return NULL;
198+
}
195199
auto req = *currentRequest;
196200
const auto &p = req.decoded;
197201
meshtastic_Telemetry scratch;

src/modules/Telemetry/HealthTelemetry.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
44

55
#pragma once
66
#include "../mesh/generated/meshtastic/telemetry.pb.h"
7+
#include "BaseTelemetryModule.h"
78
#include "NodeDB.h"
89
#include "ProtobufModule.h"
910
#include <OLEDDisplay.h>
1011
#include <OLEDDisplayUi.h>
1112

12-
class HealthTelemetryModule : private concurrency::OSThread, public ProtobufModule<meshtastic_Telemetry>
13+
class HealthTelemetryModule : private concurrency::OSThread,
14+
public BaseTelemetryModule,
15+
public ProtobufModule<meshtastic_Telemetry>
1316
{
1417
CallbackObserver<HealthTelemetryModule, const meshtastic::Status *> nodeStatusObserver =
1518
CallbackObserver<HealthTelemetryModule, const meshtastic::Status *>(this, &HealthTelemetryModule::handleStatusUpdate);

0 commit comments

Comments
 (0)