OpenWiFi roam matrix — 424-taps-delay0

72 trials · roam mode · 2026-09-15 15:26 · 14 min

What this measured

A single client was driven between every pair of BSSIDs in the testbed and each transition timed from the ROAM command to the CTRL-EVENT-CONNECTED event. Trials were interleaved across pairs rather than run in blocks, so anything drifting over the run spreads across all groups instead of loading onto one.

The comparison that matters is a cross-radio roam within one AP against the same 2.4↔ 5 GHz transition between two APs. The client does identical work either way; the only difference is whether the two radios share one ath11k_base.

ipq5018

Cross-radio roams on the same AP are not materially worse than the same transition between two APs (median 0.92s vs 1.05s, completion 100% vs 100%). On this chipset the shared peer table is not costing anything measurable.

ipq6018

Cross-radio roams on the same AP are not materially worse than the same transition between two APs (median 0.96s vs 0.99s, completion 100% vs 100%). On this chipset the shared peer table is not costing anything measurable.

Dataplane after the roam

Every completed roam is followed by a real DHCP exchange from the client. This is a forwarding test, not a DHCP test: sdan drops a downstream frame whose destination MAC is absent from the MAC table for that VLAN, so a station that is associated and authorized but missing from the table receives nothing — the server answers every message and the client keeps asking. That failure is only visible from the client.

37 of 72 completed roams could not get a lease

These stations finished the 802.11 transition and then had no working dataplane. That is the reported symptom, reproduced.

Chipset / classRoamsGot a leaseNo leasemedian DHCPmax DHCP
ipq5018 / inter-ap-cross-band2424 (100%)00.30s4.51s
ipq6018 / inter-ap-cross-band240 (0%)24——
ipq6018 / intra-ap-cross-radio80 (0%)8——
ipq6018 / static-control50 (0%)5——
ipq5018 / intra-ap-cross-radio88 (100%)00.30s0.30s
ipq5018 / static-control33 (100%)00.30s0.30s

Roams that completed but had no dataplane

#ClassFromToRoamReason
2inter-ap-cross-band186h-94/2.4188n-96/51.06sno-lease(rc=1)
5inter-ap-cross-band186h-95/5188n-99/2.40.74sno-lease(rc=1)
6inter-ap-cross-band188n-99/2.4188n-96/51.12sno-lease(rc=1)
7inter-ap-cross-band188n-99/5188n-96/2.40.66sno-lease(rc=1)
8intra-ap-cross-radio188n-99/5188n-99/2.40.96sno-lease(rc=1)
8static-control(none)188n-99/2.4—no-lease(rc=1)
10inter-ap-cross-band186h-94/2.4188n-99/51.74sno-lease(rc=1)
11intra-ap-cross-radio188n-96/2.4188n-96/51.16sno-lease(rc=1)
14intra-ap-cross-radio188n-96/5188n-96/2.40.67sno-lease(rc=1)
16intra-ap-cross-radio188n-99/2.4188n-99/50.77sno-lease(rc=1)
16static-control(none)188n-99/5—no-lease(rc=1)
17inter-ap-cross-band186h-94/5188n-96/2.40.87sno-lease(rc=1)
18inter-ap-cross-band186h-95/5188n-96/2.40.70sno-lease(rc=1)
20inter-ap-cross-band188n-96/5188n-99/2.40.98sno-lease(rc=1)
21inter-ap-cross-band186h-94/5188n-99/2.40.76sno-lease(rc=1)
28inter-ap-cross-band186h-95/2.4188n-99/50.96sno-lease(rc=1)
29inter-ap-cross-band186h-95/2.4188n-96/52.09sno-lease(rc=1)
32inter-ap-cross-band188n-96/2.4188n-99/50.74sno-lease(rc=1)
32static-control(none)188n-99/5—no-lease(rc=1)
34inter-ap-cross-band188n-96/2.4188n-99/50.72sno-lease(rc=1)
36intra-ap-cross-radio188n-96/2.4188n-96/51.19sno-lease(rc=1)
38inter-ap-cross-band188n-99/5188n-96/2.40.56sno-lease(rc=1)
41inter-ap-cross-band186h-95/2.4188n-99/52.05sno-lease(rc=1)
43intra-ap-cross-radio188n-99/5188n-99/2.40.74sno-lease(rc=1)
44inter-ap-cross-band186h-95/2.4188n-96/51.10sno-lease(rc=1)
49inter-ap-cross-band186h-95/5188n-96/2.41.79sno-lease(rc=1)
50inter-ap-cross-band186h-95/5188n-99/2.41.80sno-lease(rc=1)
54inter-ap-cross-band186h-94/2.4188n-99/51.87sno-lease(rc=1)
56intra-ap-cross-radio188n-96/5188n-96/2.41.00sno-lease(rc=1)
56static-control(none)188n-96/2.4—no-lease(rc=1)
58inter-ap-cross-band186h-94/5188n-96/2.40.66sno-lease(rc=1)
59inter-ap-cross-band188n-96/5188n-99/2.40.99sno-lease(rc=1)
61inter-ap-cross-band186h-94/2.4188n-96/52.02sno-lease(rc=1)
62inter-ap-cross-band186h-94/5188n-99/2.40.87sno-lease(rc=1)
63intra-ap-cross-radio188n-99/2.4188n-99/50.93sno-lease(rc=1)
64inter-ap-cross-band188n-99/2.4188n-96/51.13sno-lease(rc=1)
64static-control(none)188n-96/5—no-lease(rc=1)

By roam class

GroupTrialsCompleted≤2s≤5smedianp90max
inter-ap-cross-band
The same 2.4↔ 5 GHz transition, but between two APs — separate ath11k instances, so no shared peer table. The control that matters.
4848 (100%)44 (92%)48 (100%)0.99s1.87s2.09s
intra-ap-cross-radio
Both radios of one AP. On a shared-peer-table SoC this is the only path where a cross-radio peer delete can be attributed to the wrong radio.
1616 (100%)16 (100%)16 (100%)0.93s1.16s1.19s
static-control80 (0%)0 (0%)0 (0%)———

Chipset × class

GroupTrialsCompleted≤2s≤5smedianp90max
ipq5018 / inter-ap-cross-band2424 (100%)23 (96%)24 (100%)1.05s1.79s2.02s
ipq5018 / intra-ap-cross-radio88 (100%)8 (100%)8 (100%)0.92s1.10s1.10s
ipq5018 / static-control30 (0%)0 (0%)0 (0%)———
ipq6018 / inter-ap-cross-band2424 (100%)21 (88%)24 (100%)0.99s2.02s2.09s
ipq6018 / intra-ap-cross-radio88 (100%)8 (100%)8 (100%)0.96s1.19s1.19s
ipq6018 / static-control50 (0%)0 (0%)0 (0%)———

By BSSID pair

GroupTrialsCompleted≤2s≤5smedianp90max
(none) → 186h-95/2.420 (0%)0 (0%)0 (0%)———
(none) → 186h-95/510 (0%)0 (0%)0 (0%)———
(none) → 188n-96/2.410 (0%)0 (0%)0 (0%)———
(none) → 188n-96/510 (0%)0 (0%)0 (0%)———
(none) → 188n-99/2.410 (0%)0 (0%)0 (0%)———
(none) → 188n-99/520 (0%)0 (0%)0 (0%)———
186h-94/2.4 → 186h-94/522 (100%)2 (100%)2 (100%)1.10s1.10s1.10s
186h-94/2.4 → 186h-95/522 (100%)2 (100%)2 (100%)1.18s1.18s1.18s
186h-94/2.4 → 188n-96/522 (100%)1 (50%)2 (100%)2.02s2.02s2.02s
186h-94/2.4 → 188n-99/522 (100%)2 (100%)2 (100%)1.87s1.87s1.87s
186h-94/5 → 186h-94/2.422 (100%)2 (100%)2 (100%)0.85s0.85s0.85s
186h-94/5 → 186h-95/2.422 (100%)2 (100%)2 (100%)1.79s1.79s1.79s
186h-94/5 → 188n-96/2.422 (100%)2 (100%)2 (100%)0.87s0.87s0.87s
186h-94/5 → 188n-99/2.422 (100%)2 (100%)2 (100%)0.87s0.87s0.87s
186h-95/2.4 → 186h-94/522 (100%)2 (100%)2 (100%)1.07s1.07s1.07s
186h-95/2.4 → 186h-95/522 (100%)2 (100%)2 (100%)0.96s0.96s0.96s
186h-95/2.4 → 188n-96/522 (100%)1 (50%)2 (100%)2.09s2.09s2.09s
186h-95/2.4 → 188n-99/522 (100%)1 (50%)2 (100%)2.05s2.05s2.05s
186h-95/5 → 186h-94/2.422 (100%)2 (100%)2 (100%)1.77s1.77s1.77s
186h-95/5 → 186h-95/2.422 (100%)2 (100%)2 (100%)0.98s0.98s0.98s
186h-95/5 → 188n-96/2.422 (100%)2 (100%)2 (100%)1.79s1.79s1.79s
186h-95/5 → 188n-99/2.422 (100%)2 (100%)2 (100%)1.80s1.80s1.80s
188n-96/2.4 → 186h-94/522 (100%)2 (100%)2 (100%)1.13s1.13s1.13s
188n-96/2.4 → 186h-95/522 (100%)2 (100%)2 (100%)1.12s1.12s1.12s
188n-96/2.4 → 188n-96/522 (100%)2 (100%)2 (100%)1.19s1.19s1.19s
188n-96/2.4 → 188n-99/522 (100%)2 (100%)2 (100%)0.74s0.74s0.74s
188n-96/5 → 186h-94/2.422 (100%)2 (100%)2 (100%)0.92s0.92s0.92s
188n-96/5 → 186h-95/2.422 (100%)2 (100%)2 (100%)0.95s0.95s0.95s
188n-96/5 → 188n-96/2.422 (100%)2 (100%)2 (100%)1.00s1.00s1.00s
188n-96/5 → 188n-99/2.422 (100%)2 (100%)2 (100%)0.99s0.99s0.99s
188n-99/2.4 → 186h-94/522 (100%)1 (50%)2 (100%)2.02s2.02s2.02s
188n-99/2.4 → 186h-95/522 (100%)2 (100%)2 (100%)1.12s1.12s1.12s
188n-99/2.4 → 188n-96/522 (100%)2 (100%)2 (100%)1.13s1.13s1.13s
188n-99/2.4 → 188n-99/522 (100%)2 (100%)2 (100%)0.93s0.93s0.93s
188n-99/5 → 186h-94/2.422 (100%)2 (100%)2 (100%)1.80s1.80s1.80s
188n-99/5 → 186h-95/2.422 (100%)2 (100%)2 (100%)0.94s0.94s0.94s
188n-99/5 → 188n-96/2.422 (100%)2 (100%)2 (100%)0.66s0.66s0.66s
188n-99/5 → 188n-99/2.422 (100%)2 (100%)2 (100%)0.96s0.96s0.96s

Failures

Every trial completed.

Testbed

BSSIDAPChipsetBandFreq
d4:ba:ba:ab:ba:ab188n-99ipq60182.4 GHz2437 MHz
d4:ba:ba:ab:ba:aa188n-99ipq60185 GHz5785 MHz
d4:ba:ba:ab:ce:6d188n-96ipq60182.4 GHz2437 MHz
d4:ba:ba:ab:ce:6c188n-96ipq60185 GHz5180 MHz
d4:ba:ba:a4:05:ca186h-94ipq50182.4 GHz2462 MHz
d4:ba:ba:a4:05:cb186h-94ipq50185 GHz5785 MHz
d4:ba:ba:a3:db:fa186h-95ipq50182.4 GHz2412 MHz
d4:ba:ba:a3:db:fb186h-95ipq50185 GHz5220 MHz
SSID
OW mPSK WPA2
Client MAC
02:03:7f:12:97:21
Client iface
sta0
Trials per pair
2
Shuffle seed
1
Roam cap (s)
25.0

Chipset topology is read from sysfs, not inferred from the model name: on IPQ6018 both phy0 and phy1 resolve to soc/c000000.wifi, while on IPQ5018 phy1 resolves to soc:wifi1@c000000 — a separate device with its own peer table.

Method

All trials

Expand 72 trials
#RoundClassFromToLatencyOutcome
11inter-ap-cross-band186h-95/2.4186h-94/51.07scompleted
21inter-ap-cross-band186h-94/2.4188n-96/51.06scompleted
31inter-ap-cross-band188n-96/2.4186h-95/51.12scompleted
41inter-ap-cross-band188n-96/2.4186h-94/51.09scompleted
51inter-ap-cross-band186h-95/5188n-99/2.40.74scompleted
61inter-ap-cross-band188n-99/2.4188n-96/51.12scompleted
71inter-ap-cross-band188n-99/5188n-96/2.40.66scompleted
81intra-ap-cross-radio188n-99/5188n-99/2.40.96scompleted
91static-control(none)188n-99/2.4—completed
101inter-ap-cross-band188n-99/5186h-95/2.40.93scompleted
111inter-ap-cross-band186h-94/2.4188n-99/51.74scompleted
121intra-ap-cross-radio188n-96/2.4188n-96/51.16scompleted
131inter-ap-cross-band186h-94/2.4186h-95/51.09scompleted
141inter-ap-cross-band186h-95/5186h-94/2.41.77scompleted
151intra-ap-cross-radio188n-96/5188n-96/2.40.67scompleted
161intra-ap-cross-radio186h-94/5186h-94/2.40.85scompleted
171intra-ap-cross-radio188n-99/2.4188n-99/50.77scompleted
181static-control(none)188n-99/5—completed
191inter-ap-cross-band186h-94/5188n-96/2.40.87scompleted
201inter-ap-cross-band186h-95/5188n-96/2.40.70scompleted
211inter-ap-cross-band188n-99/5186h-94/2.40.89scompleted
221inter-ap-cross-band188n-96/5188n-99/2.40.98scompleted
231inter-ap-cross-band186h-94/5188n-99/2.40.76scompleted
241inter-ap-cross-band186h-94/5186h-95/2.40.86scompleted
251inter-ap-cross-band188n-96/5186h-94/2.40.79scompleted
261inter-ap-cross-band188n-96/5186h-95/2.40.95scompleted
271static-control(none)186h-95/2.4—completed
281inter-ap-cross-band188n-99/2.4186h-95/51.05scompleted
291intra-ap-cross-radio186h-95/5186h-95/2.40.74scompleted
301inter-ap-cross-band188n-99/2.4186h-94/50.94scompleted
311inter-ap-cross-band186h-95/2.4188n-99/50.96scompleted
321inter-ap-cross-band186h-95/2.4188n-96/52.09scompleted
331intra-ap-cross-radio186h-95/2.4186h-95/50.96scompleted
341intra-ap-cross-radio186h-94/2.4186h-94/51.10scompleted
351inter-ap-cross-band188n-96/2.4188n-99/50.74scompleted
361static-control(none)188n-99/5—completed
372inter-ap-cross-band186h-95/2.4186h-94/50.69scompleted
382inter-ap-cross-band188n-96/2.4188n-99/50.72scompleted
392inter-ap-cross-band186h-94/5186h-95/2.41.79scompleted
402intra-ap-cross-radio188n-96/2.4188n-96/51.19scompleted
412inter-ap-cross-band188n-99/2.4186h-94/52.02scompleted
422inter-ap-cross-band188n-99/5188n-96/2.40.56scompleted
432intra-ap-cross-radio186h-94/2.4186h-94/50.73scompleted
442intra-ap-cross-radio186h-95/5186h-95/2.40.98scompleted
452static-control(none)186h-95/2.4—completed
462inter-ap-cross-band186h-95/2.4188n-99/52.05scompleted
472intra-ap-cross-radio186h-94/5186h-94/2.40.61scompleted
482intra-ap-cross-radio188n-99/5188n-99/2.40.74scompleted
492inter-ap-cross-band186h-95/2.4188n-96/51.10scompleted
502inter-ap-cross-band186h-94/2.4186h-95/51.18scompleted
512inter-ap-cross-band188n-96/2.4186h-94/51.13scompleted
522inter-ap-cross-band188n-99/2.4186h-95/51.12scompleted
532inter-ap-cross-band188n-96/2.4186h-95/50.90scompleted
542static-control(none)186h-95/5—completed
552inter-ap-cross-band186h-95/5188n-96/2.41.79scompleted
562inter-ap-cross-band186h-95/5188n-99/2.41.80scompleted
572inter-ap-cross-band188n-96/5186h-95/2.40.58scompleted
582inter-ap-cross-band188n-96/5186h-94/2.40.92scompleted
592inter-ap-cross-band188n-99/5186h-95/2.40.94scompleted
602inter-ap-cross-band186h-94/2.4188n-99/51.87scompleted
612intra-ap-cross-radio186h-95/2.4186h-95/50.92scompleted
622intra-ap-cross-radio188n-96/5188n-96/2.41.00scompleted
632static-control(none)188n-96/2.4—completed
642inter-ap-cross-band188n-99/5186h-94/2.41.80scompleted
652inter-ap-cross-band186h-94/5188n-96/2.40.66scompleted
662inter-ap-cross-band188n-96/5188n-99/2.40.99scompleted
672inter-ap-cross-band186h-95/5186h-94/2.40.72scompleted
682inter-ap-cross-band186h-94/2.4188n-96/52.02scompleted
692inter-ap-cross-band186h-94/5188n-99/2.40.87scompleted
702intra-ap-cross-radio188n-99/2.4188n-99/50.93scompleted
712inter-ap-cross-band188n-99/2.4188n-96/51.13scompleted
722static-control(none)188n-96/5—completed