Multiple hop mesh performance with multi-band dual-radio routers

The test network consists of four such routers using their factory omnidirectional antennas (click on the image to enlarge and see a photo of each node).

They are located at aproximately 50m distance from each other in a zigzag line. In this semi-rural setting all wifi 2.4Ghz noise comes from our community network and the 5Ghz band is completely clean. A typical scan in this particular area only shows two of our nodes with a signal strength of -78/-80.

Vegetation purposely serves as a partial barrier between the nodes. The originators table from each router shows that they are seeing each other the way we expected; that is: every router chooses it’s nearest neighbors as next hop in each direction and they are linked on 2.4Ghz and 5Ghz simultaneously. The multicast rate is set to 54000 and tx power is set to 9 on every node. In this particular setup, those values gave the cleanest results while maintaining good overall performance.

So now to the console dump and then some conclusions. Iperf output has been truncated to shorten the resulting text of so many tests. Each test was actually run a number of times and the outputs published are those we deemed more representative.

ping across the test network

The initial ping test is run from a computer with a wired connection to node_a.

$ sudo ping node_d -i 0.1 -c 100
--- node_d ping statistics ---
100 packets transmitted, 100 received, 0% packet loss, time 9966ms
rtt min/avg/max/mdev = 2.762/6.951/62.385/7.231 ms

There’s no packet loss in the path to node_d and delay is low.

originators table from each node

As explained in the introduction, the tables show that the test nodes are routing traffic as expected.
These tables are dynamic by nature. It’s interesting to note that when the network has no traffic nearly all nodes choose the 5Ghz links, but when traffic starts to move they’ll start shifting between 2.4 and 5.

root@node_a:~# batctl o
[B.A.T.M.A.N. adv 2012.4.0, MainIF/MAC: wlan0-2/66:70:02:ed:f9:81 (bat0)]
Originator      last-seen (#/255)           Nexthop [outgoingIF]:   Potential nexthops ...
node_d_2.4Ghz    0.340s   (198)       node_b_5Ghz [     wlan1]:       node_b_5Ghz (198)     node_b_2.4Ghz (182)
node_b_5Ghz    0.420s   (255)       node_b_5Ghz [     wlan1]:       node_b_5Ghz (255)
node_b_2.4Ghz    0.530s   (255)       node_b_5Ghz [     wlan1]:       node_b_5Ghz (255)     node_b_2.4Ghz (234)
node_c_5Ghz    0.440s   (225)       node_b_5Ghz [     wlan1]:       node_b_5Ghz (225)
node_c_2.4Ghz    1.820s   (222)       node_b_5Ghz [     wlan1]:       node_b_5Ghz (222)     node_b_2.4Ghz (209)
root@node_b:~# batctl o
[B.A.T.M.A.N. adv 2012.4.0, MainIF/MAC: wlan0-2/66:70:02:ee:02:e9 (bat0)]
Originator      last-seen (#/255)           Nexthop [outgoingIF]:   Potential nexthops ...
node_d_2.4Ghz    0.520s   (221)       node_c_5Ghz [     wlan1]:       node_c_5Ghz (221)     node_c_2.4Ghz (206)
node_a_2.4Ghz    0.800s   (251)       node_a_5Ghz [     wlan1]:       node_a_5Ghz (251)     node_a_2.4Ghz (235)
node_d_5Ghz    0.740s   (225)       node_c_5Ghz [     wlan1]:       node_c_5Ghz (225)
node_c_5Ghz    0.630s   (255)       node_c_5Ghz [     wlan1]:       node_c_5Ghz (255)
node_a_5Ghz    0.920s   (251)       node_a_5Ghz [     wlan1]:       node_a_5Ghz (251)
node_c_2.4Ghz    0.950s   (255)       node_c_5Ghz [     wlan1]:       node_c_5Ghz (255)     node_c_2.4Ghz (242)
root@node_c:~# batctl o
[B.A.T.M.A.N. adv 2012.4.0, MainIF/MAC: wlan0-2/66:70:02:ee:01:b7 (bat0)]
Originator      last-seen (#/255)           Nexthop [outgoingIF]:   Potential nexthops ...
node_d_2.4Ghz    0.790s   (255)     node_d_2.4Ghz [   wlan0-2]:       node_d_5Ghz (251)     node_d_2.4Ghz (255)
node_a_2.4Ghz    0.750s   (217)       node_b_5Ghz [     wlan1]:       node_b_5Ghz (217)     node_b_2.4Ghz (213)
node_b_5Ghz    0.600s   (251)       node_b_5Ghz [     wlan1]:       node_b_5Ghz (251)
node_d_5Ghz    0.900s   (255)       node_d_5Ghz [     wlan1]:       node_d_5Ghz (255)
node_b_2.4Ghz    0.630s   (251)       node_b_5Ghz [     wlan1]:       node_b_5Ghz (251)     node_b_2.4Ghz (242)
node_a_5Ghz    0.820s   (221)       node_b_5Ghz [     wlan1]:       node_b_5Ghz (221)
root@node_d:~# batctl o 
[B.A.T.M.A.N. adv 2012.4.0, MainIF/MAC: wlan0-2/66:70:02:ed:f8:dd (bat0)]
  Originator      last-seen (#/255)           Nexthop [outgoingIF]:   Potential nexthops ...
node_a_2.4Ghz    0.170s   (192)       node_c_5Ghz [     wlan1]:       node_c_5Ghz (192)     node_c_2.4Ghz (169)
node_b_5Ghz    0.060s   (221)       node_c_5Ghz [     wlan1]:       node_c_5Ghz (221)
node_b_2.4Ghz    0.160s   (221)       node_c_5Ghz [     wlan1]:      node_c_5Ghz (221)     node_c_2.4Ghz (192)
node_c_5Ghz    0.330s   (255)       node_c_5Ghz [     wlan1]:       node_c_5Ghz (255)
node_c_2.4Ghz    0.670s   (255)       node_c_5Ghz [     wlan1]:       node_c_5Ghz (255)     node_c_2.4Ghz (221)

iperf along the path from node_a to node_d

root@node_a:~# iperf -c node_b
[  3]  0.0-10.0 sec  75.5 MBytes  63.1 Mbits/sec
root@node_b:~# iperf -c node_c
[  3]  0.0-10.0 sec  69.5 MBytes  58.3 Mbits/sec
root@node_c:~# iperf -c node_d
[  3]  0.0-10.0 sec  77.0 MBytes  64.5 Mbits/sec

iperf from node_a to node_c and node_d

root@node_a:~# iperf -c node_c
[  3]  0.0-10.1 sec  46.5 MBytes  38.7 Mbits/sec
root@node_a:~# iperf -c node_d
[  3]  0.0-10.1 sec  39.0 MBytes  32.4 Mbits/sec

independent iperf on 2.4 and 5Ghz links between nodes

Every node in this network is linked to it’s neighbors through 2.4Ghz and 5Ghz, so in this test we intend to find out what’s the actual performance of each link along our tested path (from node_a to node_d).

wlan0-2 is 2.4Ghz and wlan1 is 5Ghz in every node. We force the traffic through each interface using local IPv6 addresses.

root@node_a:~# export node_b_24_v6=fe80::6470:2ff:feee:2e9
root@node_a:~# iperf -V -c $node_b_24_v6%wlan0-2
[  3]  0.0-10.0 sec  61.9 MBytes  51.8 Mbits/sec
root@node_a:~# export node_b_5_v6=fe80::6670:2ff:feee:2e8
root@node_a:~# iperf -V -c $node_b_5_v6%wlan1
[  3]  0.0-10.0 sec  70.8 MBytes  59.2 Mbits/sec
root@node_b:~# export node_c_24_v6=fe80::6470:2ff:feee:1b7
root@node_b:~# iperf -V -c $node_c_24_v6%wlan0-2
[  3]  0.0-10.0 sec  49.4 MBytes  41.3 Mbits/sec
root@node_b:~# export node_c_5_v6=fe80::6670:2ff:feee:1b6
root@node_b:~# iperf -V -c $node_c_5_v6%wlan1
[  3]  0.0-10.0 sec  61.8 MBytes  51.7 Mbits/sec
root@node_c:~# export node_d_24_v6=fe80::6470:2ff:feed:f8dd
root@node_c:~# iperf -V -c $node_d_24_v6%wlan0-2
[  3]  0.0-10.0 sec  56.1 MBytes  47.0 Mbits/sec
root@node_c:~# export node_d_5_v6=fe80::6670:2ff:feed:f8dc
root@node_c:~# iperf -V -c $node_d_5_v6%wlan1
[  3]  0.0-10.0 sec  72.3 MBytes  60.5 Mbits/sec


The slowest link in the path is the 2.4Ghz link between node_b and node_c at 41.3Mbit/s and the next slowest is the contiguous 2.4Ghz link from node_c to node_d at 47Mbit/s. So even if our routing protocol is alternating correctly between available paths, an iperf from end to end will always have a 47 or 41.3Mbit/s bottleneck. As a result, the path from node_a to node_c at a rate of 32.4Mbit/s is suffering roughly 25% throughput degradation. It’s also worth mentioning that comparing the results of running iperf from node_a to node_c with running it from node_a to node_d, thus adding only one hop in the path, there’s a 6Mbit/s drop in throughput, which is consistent with the degradation observed for the complete path.

In a single radio mesh, the theoretical degradation is of 50% per hop, so in our setup, the initial 59.2Mbit/s (node_a_5Ghz – node_b_5Ghz) would have been degraded to aproximately 15Mbit/s. At 2.4Ghz the initial 51.8Mbit/s would have been degraded to 13Mbit/s. Comparing this optimistic theoretical single-radio values to the real world multi-radio experiment conducted here, we can assure that multi-radio/multi-band mesh networking has an enormous potential, even on cheap off-the-shelf routers.

Future tests could try to establish optimal links in both 2.4Ghz and 5Ghz between neighboring nodes to test the real end to end performance limit of such a network. It would also be interesting to establish if the observed ~6Mbit/s per hop degradation observed in this experiment is an actual limit of such networks or not.

For now, this series of tests is enough to prove that multi-radio mesh networks do not suffer from the halved bandwidth per hop degradation of single-radio setups.

Coda: udp iperf from node_a to node_d

We know the weakest link is 41Mbit/s, so we send a 40Mbit/s iperf from node_a to node_d, and the result reported by the server side at node_d is 38.5Mbit/s.

root@node_a:/tmp# iperf -c node_d -b 40M -u
WARNING: option -b implies udp testing
Client connecting to node_d, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size:  160 KByte (default)
[  3] local port 57273 connected with port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  47.5 MBytes  39.9 Mbits/sec
[  3] Sent 33912 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec  46.0 MBytes  38.5 Mbits/sec   0.437 ms 1104/33913 (3.3%)