Release packets the interface declines to send (#11087)
This commit is contained in:
co-authored by
GitHub
parent
829ff80a09
commit
290967f739
+27
-15
@@ -159,6 +159,9 @@ bool NextHopRouter::perhapsRebroadcast(const meshtastic_MeshPacket *p)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (p->to == NODENUM_BROADCAST_NO_LORA)
|
||||
return false;
|
||||
|
||||
// Allow rebroadcast if hop_limit > 0 OR if we're exhausting hops (which sets hop_limit = 0 but still needs one relay)
|
||||
if (!isToUs(p) && !isFromUs(p) && (p->hop_limit > 0 || exhaustHops)) {
|
||||
if (p->id != 0) {
|
||||
@@ -192,11 +195,10 @@ bool NextHopRouter::perhapsRebroadcast(const meshtastic_MeshPacket *p)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (p->next_hop == NO_NEXT_HOP_PREFERENCE) {
|
||||
FloodingRouter::send(tosend);
|
||||
} else {
|
||||
NextHopRouter::send(tosend);
|
||||
}
|
||||
ErrorCode res =
|
||||
(p->next_hop == NO_NEXT_HOP_PREFERENCE) ? FloodingRouter::send(tosend) : NextHopRouter::send(tosend);
|
||||
if (res == ERRNO_SHOULD_RELEASE)
|
||||
packetPool.release(tosend);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -401,8 +403,10 @@ int32_t NextHopRouter::doRetransmissions()
|
||||
trafficManagementModule->clearNextHop(p.packet->to);
|
||||
}
|
||||
#endif
|
||||
if (auto *copy = packetPool.allocCopy(*p.packet))
|
||||
FloodingRouter::send(copy);
|
||||
if (auto *copy = packetPool.allocCopy(*p.packet)) {
|
||||
if (FloodingRouter::send(copy) == ERRNO_SHOULD_RELEASE)
|
||||
packetPool.release(copy);
|
||||
}
|
||||
} else {
|
||||
#if NEXTHOP_EARLY_FLOOD_ON_UNVERIFIED
|
||||
// M4 (gated): if the route isn't proven healthy, don't spend a second directed
|
||||
@@ -416,22 +420,30 @@ int32_t NextHopRouter::doRetransmissions()
|
||||
meshtastic_NodeInfoLite *sentTo = nodeDB->getMeshNode(p.packet->to);
|
||||
if (sentTo)
|
||||
sentTo->next_hop = NO_NEXT_HOP_PREFERENCE;
|
||||
if (auto *copy = packetPool.allocCopy(*p.packet))
|
||||
FloodingRouter::send(copy);
|
||||
if (auto *copy = packetPool.allocCopy(*p.packet)) {
|
||||
if (FloodingRouter::send(copy) == ERRNO_SHOULD_RELEASE)
|
||||
packetPool.release(copy);
|
||||
}
|
||||
} else {
|
||||
if (auto *copy = packetPool.allocCopy(*p.packet))
|
||||
NextHopRouter::send(copy);
|
||||
if (auto *copy = packetPool.allocCopy(*p.packet)) {
|
||||
if (NextHopRouter::send(copy) == ERRNO_SHOULD_RELEASE)
|
||||
packetPool.release(copy);
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (auto *copy = packetPool.allocCopy(*p.packet))
|
||||
NextHopRouter::send(copy);
|
||||
if (auto *copy = packetPool.allocCopy(*p.packet)) {
|
||||
if (NextHopRouter::send(copy) == ERRNO_SHOULD_RELEASE)
|
||||
packetPool.release(copy);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
// Note: we call the superclass version because we don't want to have our version of send() add a new
|
||||
// retransmission record
|
||||
if (auto *copy = packetPool.allocCopy(*p.packet))
|
||||
FloodingRouter::send(copy);
|
||||
if (auto *copy = packetPool.allocCopy(*p.packet)) {
|
||||
if (FloodingRouter::send(copy) == ERRNO_SHOULD_RELEASE)
|
||||
packetPool.release(copy);
|
||||
}
|
||||
}
|
||||
|
||||
// Queue again
|
||||
|
||||
@@ -205,7 +205,11 @@ class NextHopRouter : public FloodingRouter
|
||||
*/
|
||||
std::optional<uint8_t> getNextHop(NodeNum to, uint8_t relay_node);
|
||||
|
||||
#ifdef PIO_UNIT_TESTING
|
||||
public: // expose perhapsRebroadcast to the test shim
|
||||
#else
|
||||
private:
|
||||
#endif
|
||||
/** Check if we should be rebroadcasting this packet if so, do so.
|
||||
* @return true if we did rebroadcast */
|
||||
bool perhapsRebroadcast(const meshtastic_MeshPacket *p) override;
|
||||
|
||||
@@ -55,7 +55,8 @@ void RoutingModule::sendAckNak(meshtastic_Routing_Error err, NodeNum to, PacketI
|
||||
// Allow the caller to set want_ack on this ACK packet if it's important that the ACK be delivered reliably
|
||||
p->want_ack = ackWantsAck;
|
||||
|
||||
router->sendLocal(p); // we sometimes send directly to the local node
|
||||
if (router->sendLocal(p) == ERRNO_SHOULD_RELEASE) // we sometimes send directly to the local node
|
||||
packetPool.release(p);
|
||||
}
|
||||
|
||||
uint8_t RoutingModule::getHopLimitForResponse(const meshtastic_MeshPacket &mp)
|
||||
|
||||
+2
-1
@@ -122,7 +122,8 @@ inline void onReceiveProto(char *topic, byte *payload, size_t length)
|
||||
if (isFromUs(e.packet)) {
|
||||
auto pAck = routingModule->allocAckNak(meshtastic_Routing_Error_NONE, getFrom(e.packet), e.packet->id, ch.index);
|
||||
pAck->transport_mechanism = meshtastic_MeshPacket_TransportMechanism_TRANSPORT_MQTT;
|
||||
router->sendLocal(pAck);
|
||||
if (router->sendLocal(pAck) == ERRNO_SHOULD_RELEASE)
|
||||
packetPool.release(pAck);
|
||||
} else {
|
||||
LOG_INFO("Ignore downlink message we originally sent");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user