Forwarding rules in the Grassroots BLE mesh

Six forwarding rules for the BLE mesh

Each rule delivers the same message on the same topology, between the same sender and recipient. We compare what each spends on the air, and what each must learn before it can forward at all.

Live mesh · traffic runs continuously —
Our message · hops
—
Our message · transmissions
—
Our message · vs flood
—
Mesh · packets in custody
0

Press Send to deliver one message under the selected rule.

sender (click a node) recipient (click another) has seen our message carrying background traffic
Forwarding rule
Field
8 · 128 total
7 per node
200 m
50 m · 4×4
1500 ticks
140 ms
3
Score parameters — top-3 only
0.50
0.00
3

Setup. Hall sets the square's side. A cluster is one cell of it and the radio reaches one cell side, so Cell sets the cluster size, the range and how many clusters the hall divides into at once — which is also why every member can hear into a neighbouring cluster. The seed fixes the topology and the sender–recipient pair, so switching rules repeats the same delivery, paired per seed. Speed is wall-clock only — a shorter tick runs the same mesh faster, and the congested rules need it.

Scope. The mesh carries background traffic at all times, with custody capped at 60 packets, hop budget 7, and idle link rotation for top-3 — the only rule that runs with the policy on. A node drives all its links at once and its radio's rate is split across the ones transferring, on top of a coarse contention penalty. Our message is injected into that running mesh. The field shows mechanism; every rate we report comes from the measured runs below.

Suitability score

Every peer advertises a score for itself. A node ranks its links by the score the peer on the far side advertises — it never computes anything about that peer itself.

Sk= α⁢Ck +β⁢ (1− ρk)
Ck
Centrality: distinct neighbors that completed a transfer to k within the window W, over the link cap. Ck=min (1, fk(W) Dmax)
ρk
Buffer occupancy of k, as a fraction of its custody store. ρk= B−BfreeB

Gate and lanes

A link is a lane if its peer passes the gate. The node floods each message on its top F lanes only; messages addressed to a link's own peer bypass lanes entirely.

Lk= top-F { j∈N(k) :Sj≥θ }

On the wire

Both terms ride the peer's ANNOUNCE, quantized to one byte and refreshed once per announce epoch, so every decision runs on values as stale as that interval. Quantization is load-bearing: with raw doubles, jitter in ρ reshuffles near-tied rankings on every announce, and the resulting preemption storm aborts transfers mesh-wide.

q(x)= round(255x)255

Parameters in these runs

αweight on centrality0.5
βweight on free buffer0
θgate threshold, inclusive0
Flane fan-out3
Wcentrality window60 s
Dmaxconcurrent link cap7
—announce interval5 s

With β = 0 the score reduces to Sk = αCk: this arm ranks by centrality alone. θ = 0 under the inclusive gate admits every peer, including those that have fed nobody yet.

Measured · 2,750 runs · n = 50 per cellstationary hall
Delivery by node count, mean of fifty paired runs — five node placements, ten replicates each. The flood has no working regime here: 0.404 at its sparsest, falling from there. Cluster addressing holds above 0.96 throughout, at a twentieth of the airtime.
Rule160240320400480relays / delivered

Measures. Relays per delivered message is our airtime proxy, listed at 480 nodes. A shortest path costs its hop count, so the oracle stays at 8.2 → 10.0 across a threefold rise in node count while the flood goes 116 → 371: flooding costs O(n) per message, directed forwarding O(hops). Read the flood's median latency against its delivery — it falls with density only because the slow messages stop arriving at all.

Threats to validity. The simulator keeps an exact set of seen packet ids per peer; the implementation uses a Bloom filter of 96,000 bits over at most 10,000 items at ~1% false positives, rotating every 5 minutes. The modelled seen-set never errs, never fills and never forgets, so the sync exchange is cheaper here than on a device. The two errors do not cancel: a false positive skips a packet the node lacks, costing delivery where copies are fewest, while rotation forgets and old packets are reflooded, costing airtime where copies are most. We report relays per delivered as a lower bound, for every rule.