mirror of
https://github.com/meshtastic/firmware.git
synced 2025-08-10 07:35:00 +00:00

Some checks are pending
CI / setup (check) (push) Waiting to run
CI / setup (esp32) (push) Waiting to run
CI / setup (esp32c3) (push) Waiting to run
CI / setup (esp32c6) (push) Waiting to run
CI / setup (esp32s3) (push) Waiting to run
CI / setup (nrf52840) (push) Waiting to run
CI / setup (rp2040) (push) Waiting to run
CI / setup (stm32) (push) Waiting to run
CI / check (push) Blocked by required conditions
CI / build-esp32 (push) Blocked by required conditions
CI / build-esp32-s3 (push) Blocked by required conditions
CI / build-esp32-c3 (push) Blocked by required conditions
CI / build-esp32-c6 (push) Blocked by required conditions
CI / build-nrf52 (push) Blocked by required conditions
CI / build-rpi2040 (push) Blocked by required conditions
CI / build-stm32 (push) Blocked by required conditions
CI / package-raspbian (push) Waiting to run
CI / package-raspbian-armv7l (push) Waiting to run
CI / package-native (push) Waiting to run
CI / after-checks (push) Blocked by required conditions
CI / gather-artifacts (esp32) (push) Blocked by required conditions
CI / gather-artifacts (esp32c3) (push) Blocked by required conditions
CI / gather-artifacts (esp32c6) (push) Blocked by required conditions
CI / gather-artifacts (esp32s3) (push) Blocked by required conditions
CI / gather-artifacts (nrf52840) (push) Blocked by required conditions
CI / gather-artifacts (rp2040) (push) Blocked by required conditions
CI / gather-artifacts (stm32) (push) Blocked by required conditions
CI / release-artifacts (push) Blocked by required conditions
CI / release-firmware (esp32) (push) Blocked by required conditions
CI / release-firmware (esp32c3) (push) Blocked by required conditions
CI / release-firmware (esp32c6) (push) Blocked by required conditions
CI / release-firmware (esp32s3) (push) Blocked by required conditions
CI / release-firmware (nrf52840) (push) Blocked by required conditions
CI / release-firmware (rp2040) (push) Blocked by required conditions
CI / release-firmware (stm32) (push) Blocked by required conditions
Flawfinder Scan / Flawfinder (push) Waiting to run
* Revert "Fix sending duplicate packets to PhoneAPI/MQTT (#5315)"
This reverts commit 40bc04b521
.
* Handle repeated packet after potentially canceling previous Tx
84 lines
3.5 KiB
C++
84 lines
3.5 KiB
C++
#include "RoutingModule.h"
|
|
#include "Default.h"
|
|
#include "MeshService.h"
|
|
#include "NodeDB.h"
|
|
#include "Router.h"
|
|
#include "configuration.h"
|
|
#include "main.h"
|
|
|
|
RoutingModule *routingModule;
|
|
|
|
bool RoutingModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Routing *r)
|
|
{
|
|
bool maybePKI = mp.which_payload_variant == meshtastic_MeshPacket_encrypted_tag && mp.channel == 0 && !isBroadcast(mp.to);
|
|
// Beginning of logic whether to drop the packet based on Rebroadcast mode
|
|
if (mp.which_payload_variant == meshtastic_MeshPacket_encrypted_tag &&
|
|
(config.device.rebroadcast_mode == meshtastic_Config_DeviceConfig_RebroadcastMode_LOCAL_ONLY ||
|
|
config.device.rebroadcast_mode == meshtastic_Config_DeviceConfig_RebroadcastMode_KNOWN_ONLY)) {
|
|
if (!maybePKI)
|
|
return false;
|
|
if ((nodeDB->getMeshNode(mp.from) == NULL || !nodeDB->getMeshNode(mp.from)->has_user) &&
|
|
(nodeDB->getMeshNode(mp.to) == NULL || !nodeDB->getMeshNode(mp.to)->has_user))
|
|
return false;
|
|
}
|
|
|
|
printPacket("Routing sniffing", &mp);
|
|
router->sniffReceived(&mp, r);
|
|
|
|
// FIXME - move this to a non promsicious PhoneAPI module?
|
|
// Note: we are careful not to send back packets that started with the phone back to the phone
|
|
if ((isBroadcast(mp.to) || isToUs(&mp)) && (mp.from != 0)) {
|
|
printPacket("Delivering rx packet", &mp);
|
|
service->handleFromRadio(&mp);
|
|
}
|
|
|
|
return false; // Let others look at this message also if they want
|
|
}
|
|
|
|
meshtastic_MeshPacket *RoutingModule::allocReply()
|
|
{
|
|
if (config.device.role == meshtastic_Config_DeviceConfig_Role_REPEATER)
|
|
return NULL;
|
|
assert(currentRequest);
|
|
|
|
// We only consider making replies if the request was a legit routing packet (not just something we were sniffing)
|
|
if (currentRequest->decoded.portnum == meshtastic_PortNum_ROUTING_APP) {
|
|
assert(0); // 1.2 refactoring fixme, Not sure if anything needs this yet?
|
|
// return allocDataProtobuf(u);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void RoutingModule::sendAckNak(meshtastic_Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex, uint8_t hopLimit)
|
|
{
|
|
auto p = allocAckNak(err, to, idFrom, chIndex, hopLimit);
|
|
|
|
router->sendLocal(p); // we sometimes send directly to the local node
|
|
}
|
|
|
|
uint8_t RoutingModule::getHopLimitForResponse(uint8_t hopStart, uint8_t hopLimit)
|
|
{
|
|
if (hopStart != 0) {
|
|
// Hops used by the request. If somebody in between running modified firmware modified it, ignore it
|
|
uint8_t hopsUsed = hopStart < hopLimit ? config.lora.hop_limit : hopStart - hopLimit;
|
|
if (hopsUsed > config.lora.hop_limit) {
|
|
// In event mode, we never want to send packets with more than our default 3 hops.
|
|
#if !(EVENTMODE) // This falls through to the default.
|
|
return hopsUsed; // If the request used more hops than the limit, use the same amount of hops
|
|
#endif
|
|
} else if ((uint8_t)(hopsUsed + 2) < config.lora.hop_limit) {
|
|
return hopsUsed + 2; // Use only the amount of hops needed with some margin as the way back may be different
|
|
}
|
|
}
|
|
return Default::getConfiguredOrDefaultHopLimit(config.lora.hop_limit); // Use the default hop limit
|
|
}
|
|
|
|
RoutingModule::RoutingModule() : ProtobufModule("routing", meshtastic_PortNum_ROUTING_APP, &meshtastic_Routing_msg)
|
|
{
|
|
isPromiscuous = true;
|
|
|
|
// moved the RebroadcastMode logic into handleReceivedProtobuf
|
|
// LocalOnly requires either the from or to to be a known node
|
|
// knownOnly specifically requires the from to be a known node.
|
|
encryptedOk = true;
|
|
} |