Thinking about the routing problem a little more… if I wanted to do a purely “native” routing scheme not involving Net/ROM routing update broadcasts, one has to wonder what such a system would look like.
Net/ROM L3 is really just intended to “bootstrap” things… there’s the prospect of using Net/ROM L4 for tunnelling TCP traffic, but really it’s the L3 part that interests me as a way of hopping between fragments of the mesh that may be linkable via a non-6LoWHAM capable digipeater.
Net/ROM’s periodic broadcasts are inefficient, divulging a node’s entire routing table is not an ideal situation. So what’s the alternative? IPv6 nodes already send a “neighbour discovery” packet when they don’t know the MAC address of a neighbour, this is a trigger for a “neighbour advertisement” response.
I’m thinking 6LoWHAM will send NAs periodically anyway. ACMA rules require identifying every 10 minutes. Since the NA will include the call-sign of the station (in bit-shifted ASCII), doing that every 10 minutes takes care of the ACMA requirement. An IPv6 NA message is not a big payload.
Given this will be sent to the
ff02::1 multicast group, all nodes able to hear the beaconing station will receive it. Unlike a IEEE 802.11 or 802.3 network though, not all nodes on the mesh will hear it.
The same is true of ND messages. If the neighbour is in ear-shot and able to respond, it likely will, but that isn’t a guarantee. Something in the link-local scope will likely be the answer, probably a daemon listening on a UDP port and sending to the
When a station wishes to make contact with a station that’s not an immediate neighbour, I’m thinking of a broadcast similar to how APRS does things. APRS uses special call-signs
WIDEn-m, where the hop-limit is encoded in those messages.
A UDP message would be constructed asking “Who can reach X within N hops?” and sent to
ff02::1 to some “well-known” port.
The first second is reserved for responses from nodes that know a route, either through Net/ROM, or maybe they’ve been in contact with that station before. They respond something along the lines of “X via A,B,C, quality Q”, where A, B, C are digipeaters and Q is some link quality value.
Not sure how I’ll derive Q just yet. Possibly based on packet loss… we’ll think of something.
If no responses are heard, the routers that heard the message re-broadcast it and listen for replies. In the re-broadcast, each router appends its 48-bit 6LoWHAM address and a link quality to the message payload. The hop limit would also get decremented. That way, it can break cycles, and it gives a direct unicast path for the distant node to respond.
The same algorithm applies: wait a second for immediate responses, then any routers downstream append their addresses/link quality values, decrement the hop limit, and re-broadcast.
Again, any node that overhears the message (including the target node), may respond. It does so via a direct unicast, sent using conventional AX.25 digipeating. Any router en route that relays the message may also cache the result. The “mesh” gets to learn of where everyone is as-required rather than by default with Net/ROM.
If the hop limit reaches zero, no further re-broadcasts are made, the message stops there.
When the source node hears the replies, each reply resets a 100msec timer. 100msec after the last reply, it chooses three “best” routes, and sends a ICMPv6 ND message via each one to the target station. The station replies to all three back via those routes with an ICMPv6 NA. If a message is lost via one of those routes, that route is demoted in quality.
Once replies have arrived back at the source, it picks the best route based on the updated quality information, and begins communications via that route.
This, is more tricky. I think the link-local should mean what it means on Thread… that is
ff02::/16 just gets processed by immediate neighbours that are in direct RF range.
ff03::/16 should be used for stuff that’s mesh-wide. Those messages may be repeated by routers provided those routers have at least one subscriber for the given multicast group/port listening.
Multicast Listener Discovery looks to be the tool for that, although it could do with some 6LoWPAN-style optimisation.
I’m thinking the first time a router hears a datagram destined for a particular group, it should send a query out asking “who is listening” to the said group.
Following that first message, it should be up to the downstream node to inform the local routers that it intends to receive messages from a given group. This should be periodic, maybe hourly, so that routers are not re-broadcasting messages for a node that has gone off-air.
Routers that have no listeners for a group, do not rebroadcast that group’s traffic. Similarly, if the hop limit has been exhausted, the messages do not get rebroadcast.