Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Next Hop-based routing with fallback to flooding #2856

Draft
wants to merge 14 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/mesh/NextHopRouter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ ErrorCode NextHopRouter::send(meshtastic_MeshPacket *p)
bool NextHopRouter::shouldFilterReceived(const meshtastic_MeshPacket *p)
{
if (wasSeenRecently(p)) { // Note: this will also add a recent packet record
if (p->next_hop == (uint8_t)(getNodeNum() & 0xFF)) {
if (p->next_hop == nodeDB.getLastByteOfNodeNum(getNodeNum())) {
LOG_DEBUG("Ignoring incoming msg, because we've already seen it.\n");
} else {
LOG_DEBUG("Ignoring incoming msg, because we've already seen it and cancel any outgoing packets.\n");
Expand Down Expand Up @@ -51,7 +51,7 @@ void NextHopRouter::sniffReceived(const meshtastic_MeshPacket *p, const meshtast

if (config.device.role != meshtastic_Config_DeviceConfig_Role_CLIENT_MUTE) {
if ((p->to != getNodeNum()) && (getFrom(p) != getNodeNum())) {
if (p->next_hop == (uint8_t)(getNodeNum() & 0xFF)) {
if (p->next_hop == nodeDB.getLastByteOfNodeNum(getNodeNum())) {
meshtastic_MeshPacket *tosend = packetPool.allocCopy(*p); // keep a copy because we will be sending it
LOG_INFO("Relaying received next-hop message coming from %x\n", p->relay_node);

Expand Down
4 changes: 2 additions & 2 deletions src/mesh/NodeDB.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -824,10 +824,10 @@ void NodeDB::updateFrom(const meshtastic_MeshPacket &mp)

// If this packet didn't travel any hops, then it was sent directly to us, so we know what to use as next hop to this node
if (mp.original_hop_limit == mp.hop_limit) {
info->next_hop = (uint8_t)(mp.from & 0xFF);
info->next_hop = getLastByteOfNodeNum(mp.from);
} else if (mp.relay_node && (mp.original_hop_limit - mp.hop_limit == 1)) {
// This packet traveled one hop, so we can use the relay_node as next_hop
info->next_hop = (uint8_t)(mp.relay_node & 0xFF);
info->next_hop = getLastByteOfNodeNum(mp.relay_node);
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions src/mesh/NodeDB.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ class NodeDB
/// @return our node number
NodeNum getNodeNum() { return myNodeInfo.my_node_num; }

// @return last byte of a NodeNum, 0xFF if it ended at 0x00
uint8_t getLastByteOfNodeNum(NodeNum num) { return (uint8_t)((num & 0xFF) ? (num & 0xFF) : 0xFF); }

/// if returns false, that means our node should send a DenyNodeNum response. If true, we think the number is okay for use
// bool handleWantNodeNum(NodeNum n);

Expand Down
4 changes: 2 additions & 2 deletions src/mesh/Router.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,10 +241,10 @@ ErrorCode Router::send(meshtastic_MeshPacket *p)
p->from = getFrom(p);

// If we are the original transmitter, set the original hop limit
if (p->from == nodeDB.getNodeNum())
if (p->from == getNodeNum())
GUVWAF marked this conversation as resolved.
Show resolved Hide resolved
p->original_hop_limit = config.lora.hop_limit ? config.lora.hop_limit : HOP_RELIABLE;

p->relay_node = (uint8_t)(getNodeNum() & 0xFF); // set the current relayer to us
p->relay_node = nodeDB.getLastByteOfNodeNum(getNodeNum()); // set the relayer to us

// If the packet hasn't yet been encrypted, do so now (it might already be encrypted if we are just forwarding it)

Expand Down
8 changes: 4 additions & 4 deletions src/modules/NeighborInfoModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ size_t NeighborInfoModule::cleanUpNeighbors()
// Clear all next hops of nodes that had this neighbor as next hop
for (unsigned int j = 0; j < nodeDB.getNumMeshNodes(); j++) {
meshtastic_NodeInfoLite *node = nodeDB.getMeshNodeByIndex(j);
if (node->next_hop == (uint8_t)(neighbors[index].node_id & 0xFF)) {
if (node->next_hop == nodeDB.getLastByteOfNodeNum(neighbors[index].node_id)) {
node->next_hop = 0;
}
}
Expand Down Expand Up @@ -251,15 +251,15 @@ void NeighborInfoModule::updateNextHops(meshtastic_NeighborInfo *np)
meshtastic_NodeInfoLite *currentNode = nodeDB.getMeshNode(np->node_id);
// Check if the sender of this neighborInfo packet is a neighbor of ourselves
if (currentNode && isANeighbor(np->node_id)) {
currentNode->next_hop = (uint8_t)(np->node_id & 0xFF); // Set the next hop to the sender of this packet
currentNode->next_hop = nodeDB.getLastByteOfNodeNum(np->node_id); // Set the next hop to the sender of this packet
for (uint8_t i = 0; i < np->neighbors_count; i++) {
if (isANeighbor(np->neighbors[i].node_id))
continue; // This node is a neighbor of ourselves

meshtastic_NodeInfoLite *neighborOfCurrentNode = nodeDB.getMeshNode(np->neighbors[i].node_id);
// Update next hop of this node to the sender of this packet, because it is the most recent neighbor
if (neighborOfCurrentNode)
neighborOfCurrentNode->next_hop = (uint8_t)(currentNode->num & 0xFF);
neighborOfCurrentNode->next_hop = nodeDB.getLastByteOfNodeNum(currentNode->num);
}
} else if (currentNode) { // Sender is not a neighbor
// Find common neighbors and use the most recent as next hop to this node
Expand All @@ -270,7 +270,7 @@ void NeighborInfoModule::updateNextHops(meshtastic_NeighborInfo *np)
if (neighborOfCurrentNode && isANeighbor(neighborOfCurrentNode->num)) {
// This neighbor was heard more recently than the current next hop
if (neighborOfCurrentNode->last_heard > maxLastHeard) {
currentNode->next_hop = (uint8_t)(neighborOfCurrentNode->num & 0xFF);
currentNode->next_hop = nodeDB.getLastByteOfNodeNum(neighborOfCurrentNode->num);
maxLastHeard = neighborOfCurrentNode->last_heard;
LOG_DEBUG("More recent node found, so update next_hop of %x to %x\n", currentNode->num,
neighborOfCurrentNode->num);
Expand Down