From 3b9b33a5ee10936d13302a260f169ad53f34c33b Mon Sep 17 00:00:00 2001 From: GUVWAF Date: Fri, 16 Dec 2022 19:31:20 +0100 Subject: [PATCH 1/4] Use hopLimit setting for ACKs as well --- src/mesh/FloodingRouter.cpp | 3 ++- src/mesh/MeshModule.cpp | 2 +- src/mesh/PacketHistory.cpp | 10 ++++++++-- src/mesh/PacketHistory.h | 1 + src/mesh/RadioInterface.cpp | 2 +- src/mesh/ReliableRouter.cpp | 30 ++++++++++++++++-------------- src/modules/NodeInfoModule.cpp | 2 +- src/modules/PositionModule.cpp | 2 +- 8 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/mesh/FloodingRouter.cpp b/src/mesh/FloodingRouter.cpp index 925735903..92df575b1 100644 --- a/src/mesh/FloodingRouter.cpp +++ b/src/mesh/FloodingRouter.cpp @@ -34,7 +34,8 @@ void FloodingRouter::sniffReceived(const MeshPacket *p, const Routing *c) // do not flood direct message that is ACKed DEBUG_MSG("Receiving an ACK not for me, but don't need to rebroadcast this direct message anymore.\n"); Router::cancelSending(p->to, p->decoded.request_id); // cancel rebroadcast for this DM - } else if ((p->to != getNodeNum()) && (p->hop_limit > 0) && (getFrom(p) != getNodeNum())) { + } + if ((p->to != getNodeNum()) && (p->hop_limit > 0) && (getFrom(p) != getNodeNum())) { if (p->id != 0) { if (config.device.role != Config_DeviceConfig_Role_CLIENT_MUTE) { MeshPacket *tosend = packetPool.allocCopy(*p); // keep a copy because we will be sending it diff --git a/src/mesh/MeshModule.cpp b/src/mesh/MeshModule.cpp index 923b4f471..02289f863 100644 --- a/src/mesh/MeshModule.cpp +++ b/src/mesh/MeshModule.cpp @@ -48,7 +48,7 @@ MeshPacket *MeshModule::allocAckNak(Routing_Error err, NodeNum to, PacketId idFr p->priority = MeshPacket_Priority_ACK; - p->hop_limit = 0; // Assume just immediate neighbors for now + p->hop_limit = config.lora.hop_limit; // Assume just immediate neighbors for now p->to = to; p->decoded.request_id = idFrom; p->channel = chIndex; diff --git a/src/mesh/PacketHistory.cpp b/src/mesh/PacketHistory.cpp index c8008689d..9d2c7a8ed 100644 --- a/src/mesh/PacketHistory.cpp +++ b/src/mesh/PacketHistory.cpp @@ -11,7 +11,7 @@ PacketHistory::PacketHistory() /** * Update recentBroadcasts and return true if we have already seen this packet */ -bool PacketHistory::wasSeenRecently(const MeshPacket *p, bool withUpdate) +bool PacketHistory::wasSeenRecently(const MeshPacket *p, bool withUpdate) //, bool checkAck { if (p->id == 0) { DEBUG_MSG("Ignoring message with zero id\n"); @@ -24,6 +24,12 @@ bool PacketHistory::wasSeenRecently(const MeshPacket *p, bool withUpdate) r.id = p->id; r.sender = getFrom(p); r.rxTimeMsec = now; + // if (checkAck) + // if (p->which_payload_variant == MeshPacket_decoded_tag && p->decoded.portnum == PortNum_ROUTING_APP) { + // perhapsDecode(p); + // bool seenAck = (p-> == ) + // } + // r.seenAck = p-> auto found = recentPackets.find(r); bool seenRecently = (found != recentPackets.end()); // found not equal to .end() means packet was seen recently @@ -52,7 +58,7 @@ bool PacketHistory::wasSeenRecently(const MeshPacket *p, bool withUpdate) clearExpiredRecentPackets(); } - return seenRecently; + return seenRecently; //checkAck ? seenAck : } /** diff --git a/src/mesh/PacketHistory.h b/src/mesh/PacketHistory.h index d44a3d369..abdc78c4f 100644 --- a/src/mesh/PacketHistory.h +++ b/src/mesh/PacketHistory.h @@ -13,6 +13,7 @@ struct PacketRecord { NodeNum sender; PacketId id; uint32_t rxTimeMsec; // Unix time in msecs - the time we received it + //bool seenAck; bool operator==(const PacketRecord &p) const { return sender == p.sender && id == p.id; } }; diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp index 222e5d14b..9ee66da0d 100644 --- a/src/mesh/RadioInterface.cpp +++ b/src/mesh/RadioInterface.cpp @@ -182,7 +182,7 @@ uint32_t RadioInterface::getRetransmissionMsec(const MeshPacket *p) float channelUtil = airTime->channelUtilizationPercent(); uint8_t CWsize = map(channelUtil, 0, 100, CWmin, CWmax); // Assuming we pick max. of CWsize and there will be a receiver with SNR at half the range - return 2*packetAirtime + (pow(2, CWsize) + pow(2, int((CWmax+CWmin)/2))) * slotTimeMsec + PROCESSING_TIME_MSEC; + return 1000*packetAirtime + (pow(2, CWsize) + pow(2, int((CWmax+CWmin)/2))) * slotTimeMsec + PROCESSING_TIME_MSEC; } /** The delay to use when we want to send something */ diff --git a/src/mesh/ReliableRouter.cpp b/src/mesh/ReliableRouter.cpp index 7933a7920..a60c37ebc 100644 --- a/src/mesh/ReliableRouter.cpp +++ b/src/mesh/ReliableRouter.cpp @@ -21,7 +21,7 @@ ErrorCode ReliableRouter::send(MeshPacket *p) } auto copy = packetPool.allocCopy(*p); - startRetransmission(copy); + startRetransmission(copy); // TODO: also on not want_ack? } return FloodingRouter::send(p); @@ -37,27 +37,29 @@ bool ReliableRouter::shouldFilterReceived(MeshPacket *p) // If this is the first time we saw this, cancel any retransmissions we have queued up and generate an internal ack for // the original sending process. - // FIXME - we might want to turn off this "optimization", it does save lots of airtime but it assumes that once we've - // heard one one adjacent node hear our packet that a) probably other adjacent nodes heard it and b) we can trust those - // nodes to reach our destination. Both of which might be incorrect. + // This "optimization", does save lots of airtime, but can be turned off for direct messages to get + // a confirmation from the specific node it was sent to. auto key = GlobalPacketId(getFrom(p), p->id); auto old = findPendingPacket(key); if (old) { - DEBUG_MSG("generating implicit ack\n"); - // NOTE: we do NOT check p->wantAck here because p is the INCOMING rebroadcast and that packet is not expected to be - // marked as wantAck - sendAckNak(Routing_Error_NONE, getFrom(p), p->id, old->packet->channel); - + // Only if want_ack was not set, we mark the packet as ACKed already on an implicit ACK + if (!p->want_ack) { + DEBUG_MSG("generating implicit ack\n"); + sendAckNak(Routing_Error_NONE, getFrom(p), p->id, old->packet->channel); + } + // At this point we assume it will arrive. + // We don't now how long we have to wait for the real ACK so stop retransmissions. + DEBUG_MSG("Stopping retransmissions\n"); stopRetransmission(key); - } else { - DEBUG_MSG("didn't find pending packet\n"); } } + + //bool isAck = ((c && c->error_reason == Routing_Error_NONE)); // consider only ROUTING_APP message without error as ACK /* send acks for repeated packets that want acks and are destined for us - * this way if an ACK is dropped and a packet is resent we'll ACK the resent packet - * make sure wasSeenRecently _doesn't_ update - * finding the channel requires decoding the packet. */ + * this way if an ACK is dropped and a packet is resent we'll ACK the resent packet + * make sure wasSeenRecently _doesn't_ update + * finding the channel requires decoding the packet. */ if (p->want_ack && (p->to == getNodeNum()) && wasSeenRecently(p, false) && !MeshModule::currentReply) { if (perhapsDecode(p)) { sendAckNak(Routing_Error_NONE, getFrom(p), p->id, p->channel); diff --git a/src/modules/NodeInfoModule.cpp b/src/modules/NodeInfoModule.cpp index 1ce1acf33..b5d6c30da 100644 --- a/src/modules/NodeInfoModule.cpp +++ b/src/modules/NodeInfoModule.cpp @@ -54,7 +54,7 @@ NodeInfoModule::NodeInfoModule() : ProtobufModule("nodeinfo", PortNum_NODEINFO_APP, &User_msg), concurrency::OSThread("NodeInfoModule") { isPromiscuous = true; // We always want to update our nodedb, even if we are sniffing on others - setIntervalFromNow(30 * 1000); // Send our initial owner announcement 30 seconds after we start (to give network time to setup) + //setIntervalFromNow(30 * 1000); // Send our initial owner announcement 30 seconds after we start (to give network time to setup) } int32_t NodeInfoModule::runOnce() diff --git a/src/modules/PositionModule.cpp b/src/modules/PositionModule.cpp index 013f2ee44..df9ee6816 100644 --- a/src/modules/PositionModule.cpp +++ b/src/modules/PositionModule.cpp @@ -13,7 +13,7 @@ PositionModule::PositionModule() : ProtobufModule("position", PortNum_POSITION_APP, &Position_msg), concurrency::OSThread("PositionModule") { isPromiscuous = true; // We always want to update our nodedb, even if we are sniffing on others - setIntervalFromNow(60 * 1000); // Send our initial position 60 seconds after we start (to give GPS time to setup) + //setIntervalFromNow(60 * 1000); // Send our initial position 60 seconds after we start (to give GPS time to setup) } bool PositionModule::handleReceivedProtobuf(const MeshPacket &mp, Position *pptr) From b4735f4224d46b84ec9602703699499332006d35 Mon Sep 17 00:00:00 2001 From: GUVWAF Date: Tue, 27 Dec 2022 14:32:07 +0100 Subject: [PATCH 2/4] Don't resend ACK every time you receive the packet --- src/mesh/FloodingRouter.cpp | 2 +- src/mesh/FloodingRouter.h | 2 +- src/mesh/MeshModule.cpp | 2 +- src/mesh/ReliableRouter.cpp | 18 +++++------------- src/mesh/ReliableRouter.h | 2 +- src/mesh/Router.h | 2 +- 6 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/mesh/FloodingRouter.cpp b/src/mesh/FloodingRouter.cpp index 92df575b1..e21820305 100644 --- a/src/mesh/FloodingRouter.cpp +++ b/src/mesh/FloodingRouter.cpp @@ -17,7 +17,7 @@ ErrorCode FloodingRouter::send(MeshPacket *p) return Router::send(p); } -bool FloodingRouter::shouldFilterReceived(MeshPacket *p) +bool FloodingRouter::shouldFilterReceived(const MeshPacket *p) { if (wasSeenRecently(p)) { // Note: this will also add a recent packet record printPacket("Ignoring incoming msg, because we've already seen it", p); diff --git a/src/mesh/FloodingRouter.h b/src/mesh/FloodingRouter.h index 7e6271fc0..01b51c9a2 100644 --- a/src/mesh/FloodingRouter.h +++ b/src/mesh/FloodingRouter.h @@ -51,7 +51,7 @@ class FloodingRouter : public Router, protected PacketHistory * Called immedately on receiption, before any further processing. * @return true to abandon the packet */ - virtual bool shouldFilterReceived(MeshPacket *p) override; + virtual bool shouldFilterReceived(const MeshPacket *p) override; /** * Look for broadcasts we need to rebroadcast diff --git a/src/mesh/MeshModule.cpp b/src/mesh/MeshModule.cpp index 02289f863..8019cda1e 100644 --- a/src/mesh/MeshModule.cpp +++ b/src/mesh/MeshModule.cpp @@ -48,7 +48,7 @@ MeshPacket *MeshModule::allocAckNak(Routing_Error err, NodeNum to, PacketId idFr p->priority = MeshPacket_Priority_ACK; - p->hop_limit = config.lora.hop_limit; // Assume just immediate neighbors for now + p->hop_limit = config.lora.hop_limit; // Flood ACK back to original sender p->to = to; p->decoded.request_id = idFrom; p->channel = chIndex; diff --git a/src/mesh/ReliableRouter.cpp b/src/mesh/ReliableRouter.cpp index a60c37ebc..ba886ed71 100644 --- a/src/mesh/ReliableRouter.cpp +++ b/src/mesh/ReliableRouter.cpp @@ -27,7 +27,7 @@ ErrorCode ReliableRouter::send(MeshPacket *p) return FloodingRouter::send(p); } -bool ReliableRouter::shouldFilterReceived(MeshPacket *p) +bool ReliableRouter::shouldFilterReceived(const MeshPacket *p) { // Note: do not use getFrom() here, because we want to ignore messages sent from phone if (p->from == getNodeNum()) { @@ -54,18 +54,10 @@ bool ReliableRouter::shouldFilterReceived(MeshPacket *p) } } - - //bool isAck = ((c && c->error_reason == Routing_Error_NONE)); // consider only ROUTING_APP message without error as ACK - /* send acks for repeated packets that want acks and are destined for us - * this way if an ACK is dropped and a packet is resent we'll ACK the resent packet - * make sure wasSeenRecently _doesn't_ update - * finding the channel requires decoding the packet. */ - if (p->want_ack && (p->to == getNodeNum()) && wasSeenRecently(p, false) && !MeshModule::currentReply) { - if (perhapsDecode(p)) { - sendAckNak(Routing_Error_NONE, getFrom(p), p->id, p->channel); - DEBUG_MSG("acking a repeated want_ack packet\n"); - } - } else if (wasSeenRecently(p, false) && p->hop_limit == HOP_RELIABLE && !MeshModule::currentReply && p->to != nodeDB.getNodeNum()) { + /* Resend implicit ACKs for repeated packets (assuming original packet was sent with HOP_RELIABLE) + * this way if an implicit ACK is dropped and a packet is resent we'll rebroadcast again + * Not used for real ACKs, as you might receive a packet multiple times due to flooding. */ + if (wasSeenRecently(p, false) && p->hop_limit == HOP_RELIABLE && !MeshModule::currentReply && p->to != nodeDB.getNodeNum()) { // retransmission on broadcast has hop_limit still equal to HOP_RELIABLE DEBUG_MSG("Resending implicit ack for a repeated floodmsg\n"); MeshPacket *tosend = packetPool.allocCopy(*p); diff --git a/src/mesh/ReliableRouter.h b/src/mesh/ReliableRouter.h index ff304cdd7..65f486e5b 100644 --- a/src/mesh/ReliableRouter.h +++ b/src/mesh/ReliableRouter.h @@ -96,7 +96,7 @@ class ReliableRouter : public FloodingRouter /** * We hook this method so we can see packets before FloodingRouter says they should be discarded */ - virtual bool shouldFilterReceived(MeshPacket *p) override; + virtual bool shouldFilterReceived(const MeshPacket *p) override; /** * Add p to the list of packets to retransmit occasionally. We will free it once we stop retransmitting. diff --git a/src/mesh/Router.h b/src/mesh/Router.h index 3f079d92c..f7748bb2b 100644 --- a/src/mesh/Router.h +++ b/src/mesh/Router.h @@ -90,7 +90,7 @@ class Router : protected concurrency::OSThread * Called immedately on receiption, before any further processing. * @return true to abandon the packet */ - virtual bool shouldFilterReceived(MeshPacket *p) { return false; } + virtual bool shouldFilterReceived(const MeshPacket *p) { return false; } /** * Every (non duplicate) packet this node receives will be passed through this method. This allows subclasses to From 6c5602e88d8f5038c0e10c9dd11d62462f0aa9fa Mon Sep 17 00:00:00 2001 From: GUVWAF Date: Wed, 28 Dec 2022 14:04:26 +0100 Subject: [PATCH 3/4] Cleanup --- src/mesh/PacketHistory.cpp | 12 +++--------- src/mesh/PacketHistory.h | 1 - src/mesh/RadioInterface.cpp | 2 +- src/mesh/ReliableRouter.cpp | 28 ++++++++++++++-------------- src/modules/NodeInfoModule.cpp | 4 ++-- src/modules/PositionModule.cpp | 2 +- 6 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/mesh/PacketHistory.cpp b/src/mesh/PacketHistory.cpp index 9d2c7a8ed..a1e0f6bd5 100644 --- a/src/mesh/PacketHistory.cpp +++ b/src/mesh/PacketHistory.cpp @@ -11,7 +11,7 @@ PacketHistory::PacketHistory() /** * Update recentBroadcasts and return true if we have already seen this packet */ -bool PacketHistory::wasSeenRecently(const MeshPacket *p, bool withUpdate) //, bool checkAck +bool PacketHistory::wasSeenRecently(const MeshPacket *p, bool withUpdate) { if (p->id == 0) { DEBUG_MSG("Ignoring message with zero id\n"); @@ -24,12 +24,6 @@ bool PacketHistory::wasSeenRecently(const MeshPacket *p, bool withUpdate) //, b r.id = p->id; r.sender = getFrom(p); r.rxTimeMsec = now; - // if (checkAck) - // if (p->which_payload_variant == MeshPacket_decoded_tag && p->decoded.portnum == PortNum_ROUTING_APP) { - // perhapsDecode(p); - // bool seenAck = (p-> == ) - // } - // r.seenAck = p-> auto found = recentPackets.find(r); bool seenRecently = (found != recentPackets.end()); // found not equal to .end() means packet was seen recently @@ -58,7 +52,7 @@ bool PacketHistory::wasSeenRecently(const MeshPacket *p, bool withUpdate) //, b clearExpiredRecentPackets(); } - return seenRecently; //checkAck ? seenAck : + return seenRecently; } /** @@ -78,4 +72,4 @@ void PacketHistory::clearExpiredRecentPackets() { } DEBUG_MSG("recentPackets size=%ld (after clearing expired packets)\n", recentPackets.size()); -} \ No newline at end of file +} diff --git a/src/mesh/PacketHistory.h b/src/mesh/PacketHistory.h index abdc78c4f..d44a3d369 100644 --- a/src/mesh/PacketHistory.h +++ b/src/mesh/PacketHistory.h @@ -13,7 +13,6 @@ struct PacketRecord { NodeNum sender; PacketId id; uint32_t rxTimeMsec; // Unix time in msecs - the time we received it - //bool seenAck; bool operator==(const PacketRecord &p) const { return sender == p.sender && id == p.id; } }; diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp index 9ee66da0d..222e5d14b 100644 --- a/src/mesh/RadioInterface.cpp +++ b/src/mesh/RadioInterface.cpp @@ -182,7 +182,7 @@ uint32_t RadioInterface::getRetransmissionMsec(const MeshPacket *p) float channelUtil = airTime->channelUtilizationPercent(); uint8_t CWsize = map(channelUtil, 0, 100, CWmin, CWmax); // Assuming we pick max. of CWsize and there will be a receiver with SNR at half the range - return 1000*packetAirtime + (pow(2, CWsize) + pow(2, int((CWmax+CWmin)/2))) * slotTimeMsec + PROCESSING_TIME_MSEC; + return 2*packetAirtime + (pow(2, CWsize) + pow(2, int((CWmax+CWmin)/2))) * slotTimeMsec + PROCESSING_TIME_MSEC; } /** The delay to use when we want to send something */ diff --git a/src/mesh/ReliableRouter.cpp b/src/mesh/ReliableRouter.cpp index ba886ed71..22f3692b9 100644 --- a/src/mesh/ReliableRouter.cpp +++ b/src/mesh/ReliableRouter.cpp @@ -21,7 +21,7 @@ ErrorCode ReliableRouter::send(MeshPacket *p) } auto copy = packetPool.allocCopy(*p); - startRetransmission(copy); // TODO: also on not want_ack? + startRetransmission(copy); } return FloodingRouter::send(p); @@ -37,26 +37,26 @@ bool ReliableRouter::shouldFilterReceived(const MeshPacket *p) // If this is the first time we saw this, cancel any retransmissions we have queued up and generate an internal ack for // the original sending process. - // This "optimization", does save lots of airtime, but can be turned off for direct messages to get - // a confirmation from the specific node it was sent to. + // This "optimization", does save lots of airtime. For DMs, you also get a real ACK back + // from the intended recipient. auto key = GlobalPacketId(getFrom(p), p->id); auto old = findPendingPacket(key); if (old) { - // Only if want_ack was not set, we mark the packet as ACKed already on an implicit ACK - if (!p->want_ack) { - DEBUG_MSG("generating implicit ack\n"); - sendAckNak(Routing_Error_NONE, getFrom(p), p->id, old->packet->channel); - } - // At this point we assume it will arrive. - // We don't now how long we have to wait for the real ACK so stop retransmissions. - DEBUG_MSG("Stopping retransmissions\n"); + DEBUG_MSG("generating implicit ack\n"); + // NOTE: we do NOT check p->wantAck here because p is the INCOMING rebroadcast and that packet is not expected to be + // marked as wantAck + sendAckNak(Routing_Error_NONE, getFrom(p), p->id, old->packet->channel); + stopRetransmission(key); + } else { + DEBUG_MSG("didn't find pending packet\n"); } } - /* Resend implicit ACKs for repeated packets (assuming original packet was sent with HOP_RELIABLE) - * this way if an implicit ACK is dropped and a packet is resent we'll rebroadcast again - * Not used for real ACKs, as you might receive a packet multiple times due to flooding. */ + /* Resend implicit ACKs for repeated packets (assuming the original packet was sent with HOP_RELIABLE) + * this way if an implicit ACK is dropped and a packet is resent we'll rebroadcast again. + * Resending real ACKs is omitted, as you might receive a packet multiple times due to flooding and + * flooding this ACK back to the original sender already adds redundancy. */ if (wasSeenRecently(p, false) && p->hop_limit == HOP_RELIABLE && !MeshModule::currentReply && p->to != nodeDB.getNodeNum()) { // retransmission on broadcast has hop_limit still equal to HOP_RELIABLE DEBUG_MSG("Resending implicit ack for a repeated floodmsg\n"); diff --git a/src/modules/NodeInfoModule.cpp b/src/modules/NodeInfoModule.cpp index b5d6c30da..fc1d143ee 100644 --- a/src/modules/NodeInfoModule.cpp +++ b/src/modules/NodeInfoModule.cpp @@ -54,7 +54,7 @@ NodeInfoModule::NodeInfoModule() : ProtobufModule("nodeinfo", PortNum_NODEINFO_APP, &User_msg), concurrency::OSThread("NodeInfoModule") { isPromiscuous = true; // We always want to update our nodedb, even if we are sniffing on others - //setIntervalFromNow(30 * 1000); // Send our initial owner announcement 30 seconds after we start (to give network time to setup) + setIntervalFromNow(30 * 1000); // Send our initial owner announcement 30 seconds after we start (to give network time to setup) } int32_t NodeInfoModule::runOnce() @@ -69,4 +69,4 @@ int32_t NodeInfoModule::runOnce() sendOurNodeInfo(NODENUM_BROADCAST, requestReplies); // Send our info (don't request replies) return default_broadcast_interval_secs * 1000; -} \ No newline at end of file +} diff --git a/src/modules/PositionModule.cpp b/src/modules/PositionModule.cpp index df9ee6816..013f2ee44 100644 --- a/src/modules/PositionModule.cpp +++ b/src/modules/PositionModule.cpp @@ -13,7 +13,7 @@ PositionModule::PositionModule() : ProtobufModule("position", PortNum_POSITION_APP, &Position_msg), concurrency::OSThread("PositionModule") { isPromiscuous = true; // We always want to update our nodedb, even if we are sniffing on others - //setIntervalFromNow(60 * 1000); // Send our initial position 60 seconds after we start (to give GPS time to setup) + setIntervalFromNow(60 * 1000); // Send our initial position 60 seconds after we start (to give GPS time to setup) } bool PositionModule::handleReceivedProtobuf(const MeshPacket &mp, Position *pptr) From 5c859da4e40bc9cd5a2792f2ca737ad1a9d0b746 Mon Sep 17 00:00:00 2001 From: GUVWAF Date: Wed, 28 Dec 2022 14:40:10 +0100 Subject: [PATCH 4/4] Remove unnecessary changes --- src/mesh/PacketHistory.cpp | 2 +- src/modules/NodeInfoModule.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mesh/PacketHistory.cpp b/src/mesh/PacketHistory.cpp index a1e0f6bd5..c8008689d 100644 --- a/src/mesh/PacketHistory.cpp +++ b/src/mesh/PacketHistory.cpp @@ -72,4 +72,4 @@ void PacketHistory::clearExpiredRecentPackets() { } DEBUG_MSG("recentPackets size=%ld (after clearing expired packets)\n", recentPackets.size()); -} +} \ No newline at end of file diff --git a/src/modules/NodeInfoModule.cpp b/src/modules/NodeInfoModule.cpp index fc1d143ee..1ce1acf33 100644 --- a/src/modules/NodeInfoModule.cpp +++ b/src/modules/NodeInfoModule.cpp @@ -69,4 +69,4 @@ int32_t NodeInfoModule::runOnce() sendOurNodeInfo(NODENUM_BROADCAST, requestReplies); // Send our info (don't request replies) return default_broadcast_interval_secs * 1000; -} +} \ No newline at end of file