mirror of
https://github.com/meshtastic/firmware.git
synced 2025-08-23 13:38:01 +00:00
Better checking for fallback to flooding
This commit is contained in:
parent
bb64b1480b
commit
24ff7c0bfb
@ -18,7 +18,7 @@ ErrorCode NextHopRouter::send(meshtastic_MeshPacket *p)
|
|||||||
wasSeenRecently(p); // FIXME, move this to a sniffSent method
|
wasSeenRecently(p); // FIXME, move this to a sniffSent method
|
||||||
|
|
||||||
p->next_hop = getNextHop(p->to, p->relay_node); // set the next hop
|
p->next_hop = getNextHop(p->to, p->relay_node); // set the next hop
|
||||||
// LOG_DEBUG("Setting next hop for packet with dest %x to %x", p->to, p->next_hop);
|
LOG_DEBUG("Setting next hop for packet with dest %x to %x", p->to, p->next_hop);
|
||||||
|
|
||||||
// If it's from us, ReliableRouter already handles retransmissions. If a next hop is set and hop limit is not 0, start
|
// If it's from us, ReliableRouter already handles retransmissions. If a next hop is set and hop limit is not 0, start
|
||||||
// retransmissions
|
// retransmissions
|
||||||
@ -62,8 +62,8 @@ void NextHopRouter::sniffReceived(const meshtastic_MeshPacket *p, const meshtast
|
|||||||
if (wasRelayer(p->relay_node, p->decoded.request_id, p->to) ||
|
if (wasRelayer(p->relay_node, p->decoded.request_id, p->to) ||
|
||||||
(wasRelayer(ourRelayID, p->decoded.request_id, p->to) &&
|
(wasRelayer(ourRelayID, p->decoded.request_id, p->to) &&
|
||||||
p->relay_node == nodeDB->getLastByteOfNodeNum(p->from))) {
|
p->relay_node == nodeDB->getLastByteOfNodeNum(p->from))) {
|
||||||
if (origTx->next_hop != p->relay_node) {
|
if (origTx->next_hop != p->relay_node) { // Not already set
|
||||||
LOG_DEBUG("Update next hop of 0x%x to 0x%x based on ACK/reply", p->from, p->relay_node);
|
LOG_INFO("Update next hop of 0x%x to 0x%x based on ACK/reply", p->from, p->relay_node);
|
||||||
origTx->next_hop = p->relay_node;
|
origTx->next_hop = p->relay_node;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ bool PacketHistory::wasSeenRecently(const meshtastic_MeshPacket *p, bool withUpd
|
|||||||
r.rxTimeMsec = millis();
|
r.rxTimeMsec = millis();
|
||||||
r.next_hop = p->next_hop;
|
r.next_hop = p->next_hop;
|
||||||
r.relayed_by[0] = p->relay_node;
|
r.relayed_by[0] = p->relay_node;
|
||||||
|
LOG_INFO("Add relayed_by 0x%x for id=0x%x", p->relay_node, r.id);
|
||||||
|
|
||||||
auto found = recentPackets.find(r);
|
auto found = recentPackets.find(r);
|
||||||
bool seenRecently = (found != recentPackets.end()); // found not equal to .end() means packet was seen recently
|
bool seenRecently = (found != recentPackets.end()); // found not equal to .end() means packet was seen recently
|
||||||
@ -48,10 +49,15 @@ bool PacketHistory::wasSeenRecently(const meshtastic_MeshPacket *p, bool withUpd
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (seenRecently) {
|
if (seenRecently) {
|
||||||
// If it was seen with a next-hop not set to us, relayer is still the same and now it's NO_NEXT_HOP_PREFERENCE, it's a
|
// If it was seen with a next-hop not set to us and now it's NO_NEXT_HOP_PREFERENCE, relayer relayed already before, it's
|
||||||
// fallback to flooding, so we consider it unseen because we might need to handle it now
|
// a fallback to flooding. If we didn't already relay and the next-hop neither, consider it unseen because we might need
|
||||||
if (found->next_hop != NO_NEXT_HOP_PREFERENCE && found->next_hop != nodeDB->getLastByteOfNodeNum(nodeDB->getNodeNum()) &&
|
// to handle it now
|
||||||
found->relayed_by[0] == p->relay_node && p->next_hop == NO_NEXT_HOP_PREFERENCE) {
|
uint8_t ourRelayID = nodeDB->getLastByteOfNodeNum(nodeDB->getNodeNum());
|
||||||
|
if (found->sender != nodeDB->getNodeNum() && found->next_hop != NO_NEXT_HOP_PREFERENCE &&
|
||||||
|
p->next_hop == NO_NEXT_HOP_PREFERENCE && found->next_hop != nodeDB->getLastByteOfNodeNum(nodeDB->getNodeNum()) &&
|
||||||
|
p->relay_node != 0 && wasRelayer(p->relay_node, found) && !wasRelayer(ourRelayID, found) &&
|
||||||
|
!wasRelayer(found->next_hop, found)) {
|
||||||
|
LOG_WARN("Fallback to flooding, consider unseen relay_node=0x%x", p->relay_node);
|
||||||
seenRecently = false;
|
seenRecently = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -113,11 +119,19 @@ bool PacketHistory::wasRelayer(const uint8_t relayer, const uint32_t id, const N
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return wasRelayer(relayer, found);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if a certain node was a relayer of a packet in the history given iterator
|
||||||
|
* @return true if node was indeed a relayer, false if not */
|
||||||
|
bool PacketHistory::wasRelayer(const uint8_t relayer, std::unordered_set<PacketRecord, PacketRecordHashFunction>::iterator r)
|
||||||
|
{
|
||||||
for (uint8_t i = 0; i < NUM_RELAYERS; i++) {
|
for (uint8_t i = 0; i < NUM_RELAYERS; i++) {
|
||||||
if (found->relayed_by[i] == relayer) {
|
if (r->relayed_by[i] == relayer) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove a relayer from the list of relayers of a packet in the history given an ID and sender
|
// Remove a relayer from the list of relayers of a packet in the history given an ID and sender
|
||||||
|
@ -52,6 +52,10 @@ class PacketHistory
|
|||||||
* @return true if node was indeed a relayer, false if not */
|
* @return true if node was indeed a relayer, false if not */
|
||||||
bool wasRelayer(const uint8_t relayer, const uint32_t id, const NodeNum sender);
|
bool wasRelayer(const uint8_t relayer, const uint32_t id, const NodeNum sender);
|
||||||
|
|
||||||
|
/* Check if a certain node was a relayer of a packet in the history given iterator
|
||||||
|
* @return true if node was indeed a relayer, false if not */
|
||||||
|
bool wasRelayer(const uint8_t relayer, std::unordered_set<PacketRecord, PacketRecordHashFunction>::iterator r);
|
||||||
|
|
||||||
// Remove a relayer from the list of relayers of a packet in the history given an ID and sender
|
// Remove a relayer from the list of relayers of a packet in the history given an ID and sender
|
||||||
void removeRelayer(const uint8_t relayer, const uint32_t id, const NodeNum sender);
|
void removeRelayer(const uint8_t relayer, const uint32_t id, const NodeNum sender);
|
||||||
};
|
};
|
Loading…
Reference in New Issue
Block a user