Skip to main content
Distributed receive needs ground stations to find each other and exchange fragments without a central router. The agent uses batman-adv, the Linux kernel mesh routing layer. It decides who can reach whom, picks paths across several hops, notices a silent neighbour, and elects which node carries the cloud uplink. It exposes a virtual bat0 interface that behaves like an ordinary Ethernet interface.

The second adapter

batman-adv runs on a second WFB-class adapter (RTL8812EU or RTL8812AU), separate from the one on the drone link. The two adapters sit on separate bands so they do not interfere. If you change either channel, plan around the other.

Carrier: 802.11s or IBSS

The mesh rides on either 802.11s, authenticated with SAE, or IBSS, authenticated with IBSS-RSN from the same shared key, for drivers without 802.11s support. Neither carrier allows an unauthenticated join; if the secure join cannot come up, the node stays off the mesh.
Both carriers use the stock wpasupplicant the installer adds. Every ground_station.mesh key is listed in Drone Agent configuration.

Mesh id and shared key

Two neighbouring meshes on the same channel must not see each other’s traffic, so every mesh has two pieces of identity:
  • Mesh id: ados- followed by a short hex string, shared by every node, stored in /etc/ados/mesh/id. It becomes the 802.11s mesh id (or IBSS name).
  • Shared key: 32 random bytes in /etc/ados/mesh/psk.key (mode 0600) that authenticate peers.
The receiver generates both the first time its mesh services start; the first mesh id is derived from the receiver’s device id. Relays receive both in the encrypted invite during mesh pairing. Revoking a relay replaces both with fresh random values and re-sends them to the relays that are still paired, which apply them and restart their mesh service.

What runs on the box

When a node changes to relay or receiver, two pieces start. ados-batman (the mesh manager) joins and supervises the mesh:
  1. Loads batman-adv.
  2. Brings the second adapter up in 802.11s or IBSS mode on the configured channel.
  3. Joins by mesh id, authenticated with the shared key.
  4. Attaches the adapter to bat0 and brings bat0 up.
  5. Sets the gateway mode from the node’s role and uplink.
  6. Re-joins and re-attaches if the interface, the join or the batman membership is lost, and re-evaluates the gateway mode as the uplink comes and goes.
ados-groundlink, started by the relay or receiver role unit, polls the neighbours, gateways and partition state, writes /run/ados/mesh-state.json, and publishes mesh events.

Cloud gateway election

Any mesh node with an internet uplink (Ethernet, Wi-Fi client or cellular) can advertise itself as a gateway, and the rest of the mesh routes cloud traffic through the best one. Each node decides from ground_station.cloud_uplink: The receiver runs as a gateway client and picks the gateway with the best batman-adv link quality (TQ). When the selected gateway drops, batman-adv evicts it and the next best takes over. Mission Control’s Mesh & RX tab shows the gateways, their link quality and which one is selected. TQ measures mesh link quality, not uplink speed, so a nearby node with a slow modem can outrank a distant one with a fast link. Pin the gateway you want:
Release the pin:
On a direct node this route returns 404 E_NOT_IN_MESH.

Diagnostics

GET /api/v1/ground-station/mesh reads /run/ados/mesh-state.json, not batctl directly, so it can trail a fresh batctl query by one poll.

Next steps

Build a mesh

Pair relays and change roles.

Mesh troubleshooting

When the mesh does not come up.
Last modified on October 11, 2026