Hi together! I'm currently working with Reticulum and would like to set up a local LoRa network with standalone transport nodes running microReticulum. I've noticed that, unfortunately, many peer-to-peer connections are unidirectional – Node A can hear Node B, but not the other way around.
The announce system in Reticulum works fine in one way but lets imagine the following situation:
Node A <--> Node B <-- Node C
^ ^
| |
∨ ∨
Node D <--> Node E <--> Node F
Node C sends an announce. The announce makes its way through the mesh using two parallel paths. Node B receives the repeated announce from Node C and from Node E. Node B only saves the direct path to Node C because it is the shortest path to Node C AND NOT the path via Node E. Finally, the announce arrives Node A.
Now, Node A wants to send a packet or establish a link to Node C. The first packet is sent to Node B. Node B acts as a transport node and repeats the packet that is now "addressed" to Node C. Since the connection between Node B and Node C is unidirectional, Node B is unable to send any packets to Node C. The link establishment fails or the packet is dropped.
Node A maybe tries to make a path request but this would just lead to establishing the very same (broken) path again. I think the path_states table might allow for a longer path temporarily, but I think this is originally meant for another purpose. Since the shorter path is still valid (in the receiving direction), the "broken"/unidirectional path would be restored in the long run.
Do you have any thought about that and do you have ideas for solving this issue? I already thought about two mechanisms:
- score different paths: increase the score for transported proof packets, decrease the score for proof timeouts (maybe also link timeouts)
- keeping track of reachable neighbors by listening to recently sent announces with hops=1 and preferring routes with next_hop in reachable_neighbors
Cheers!
