OpenWiFi roam matrix — 4ap-126

126 trials · roam mode · 2026-09-15 19:16 · 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.03s, 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.96s, completion 100% vs 96%). 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.

All 125 completed roams got a lease

No forwarding failure observed after any successful roam in this run.

Chipset / classRoamsGot a leaseNo leasemedian DHCPmax DHCP
ipq5018 / inter-ap-same-band-diff-channel2020 (100%)00.30s4.51s
ipq6018 / inter-ap-same-band-diff-channel2020 (100%)00.30s0.40s
ipq6018 / static-control88 (100%)00.30s0.30s
ipq5018 / inter-ap-same-channel44 (100%)00.40s0.50s
ipq6018 / inter-ap-same-channel44 (100%)00.30s0.40s
ipq6018 / inter-ap-cross-band2323 (100%)00.30s0.40s
ipq5018 / inter-ap-cross-band2424 (100%)00.30s0.40s
ipq5018 / static-control66 (100%)00.30s0.30s
ipq5018 / intra-ap-cross-radio88 (100%)00.30s0.40s
ipq6018 / intra-ap-cross-radio88 (100%)00.30s0.40s

By roam class

GroupTrialsCompleted≤2s≤5smedianp90max
inter-ap-same-band-diff-channel
Two APs, same band, different channel. A re-tune without a band change.
4040 (100%)35 (88%)40 (100%)0.96s2.02s2.06s
static-control1414 (100%)no transition to time
inter-ap-same-channel
Two APs on one channel. No re-tune at all, so it answers “does roaming between these APs work” without isolating anything.
88 (100%)8 (100%)8 (100%)1.76s1.84s1.84s
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.
4847 (98%)44 (94%)47 (100%)0.96s1.82s2.12s
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.92s1.21s1.81s

Chipset × class

GroupTrialsCompleted≤2s≤5smedianp90max
ipq5018 / inter-ap-same-band-diff-channel2020 (100%)16 (80%)20 (100%)0.96s2.05s2.06s
ipq5018 / static-control66 (100%)no transition to time
ipq5018 / inter-ap-same-channel44 (100%)4 (100%)4 (100%)1.78s1.84s1.84s
ipq5018 / inter-ap-cross-band2424 (100%)21 (88%)24 (100%)1.03s2.09s2.12s
ipq5018 / intra-ap-cross-radio88 (100%)8 (100%)8 (100%)0.92s1.09s1.09s
ipq6018 / inter-ap-same-band-diff-channel2020 (100%)19 (95%)20 (100%)1.03s2.00s2.01s
ipq6018 / static-control88 (100%)no transition to time
ipq6018 / inter-ap-same-channel44 (100%)4 (100%)4 (100%)1.76s1.79s1.79s
ipq6018 / inter-ap-cross-band2423 (96%)23 (100%)23 (100%)0.96s1.78s1.85s
ipq6018 / intra-ap-cross-radio88 (100%)8 (100%)8 (100%)0.96s1.81s1.81s

By BSSID pair

GroupTrialsCompleted≤2s≤5smedianp90max
(none) → 186h-94/2.411 (100%)no transition to time
(none) → 186h-94/511 (100%)no transition to time
(none) → 186h-95/2.433 (100%)no transition to time
(none) → 186h-95/511 (100%)no transition to time
(none) → 188n-96/2.422 (100%)no transition to time
(none) → 188n-96/522 (100%)no transition to time
(none) → 188n-99/2.411 (100%)no transition to time
(none) → 188n-99/533 (100%)no transition to time
186h-94/2.4 → 186h-94/522 (100%)2 (100%)2 (100%)0.96s0.96s0.96s
186h-94/2.4 → 186h-95/2.422 (100%)2 (100%)2 (100%)0.95s0.95s0.95s
186h-94/2.4 → 186h-95/522 (100%)1 (50%)2 (100%)2.09s2.09s2.09s
186h-94/2.4 → 188n-96/2.422 (100%)2 (100%)2 (100%)0.90s0.90s0.90s
186h-94/2.4 → 188n-96/522 (100%)2 (100%)2 (100%)1.78s1.78s1.78s
186h-94/2.4 → 188n-99/2.422 (100%)2 (100%)2 (100%)0.67s0.67s0.67s
186h-94/2.4 → 188n-99/522 (100%)2 (100%)2 (100%)1.78s1.78s1.78s
186h-94/5 → 186h-94/2.422 (100%)2 (100%)2 (100%)0.97s0.97s0.97s
186h-94/5 → 186h-95/2.422 (100%)2 (100%)2 (100%)1.75s1.75s1.75s
186h-94/5 → 186h-95/522 (100%)2 (100%)2 (100%)1.16s1.16s1.16s
186h-94/5 → 188n-96/2.422 (100%)2 (100%)2 (100%)0.73s0.73s0.73s
186h-94/5 → 188n-96/522 (100%)2 (100%)2 (100%)1.27s1.27s1.27s
186h-94/5 → 188n-99/2.422 (100%)2 (100%)2 (100%)1.81s1.81s1.81s
186h-94/5 → 188n-99/522 (100%)2 (100%)2 (100%)1.76s1.76s1.76s
186h-95/2.4 → 186h-94/2.422 (100%)2 (100%)2 (100%)1.78s1.78s1.78s
186h-95/2.4 → 186h-94/522 (100%)1 (50%)2 (100%)2.12s2.12s2.12s
186h-95/2.4 → 186h-95/522 (100%)2 (100%)2 (100%)1.09s1.09s1.09s
186h-95/2.4 → 188n-96/2.422 (100%)2 (100%)2 (100%)1.79s1.79s1.79s
186h-95/2.4 → 188n-96/522 (100%)2 (100%)2 (100%)1.27s1.27s1.27s
186h-95/2.4 → 188n-99/2.422 (100%)2 (100%)2 (100%)1.85s1.85s1.85s
186h-95/2.4 → 188n-99/522 (100%)2 (100%)2 (100%)1.12s1.12s1.12s
186h-95/5 → 186h-94/2.422 (100%)2 (100%)2 (100%)0.59s0.59s0.59s
186h-95/5 → 186h-94/522 (100%)0 (0%)2 (100%)2.05s2.05s2.05s
186h-95/5 → 186h-95/2.422 (100%)2 (100%)2 (100%)0.73s0.73s0.73s
186h-95/5 → 188n-96/2.422 (100%)2 (100%)2 (100%)0.60s0.60s0.60s
186h-95/5 → 188n-96/522 (100%)2 (100%)2 (100%)2.00s2.00s2.00s
186h-95/5 → 188n-99/2.422 (100%)2 (100%)2 (100%)0.72s0.72s0.72s
186h-95/5 → 188n-99/522 (100%)2 (100%)2 (100%)1.06s1.06s1.06s
188n-96/2.4 → 186h-94/2.422 (100%)2 (100%)2 (100%)0.77s0.77s0.77s
188n-96/2.4 → 186h-94/522 (100%)2 (100%)2 (100%)1.78s1.78s1.78s
188n-96/2.4 → 186h-95/2.422 (100%)2 (100%)2 (100%)1.78s1.78s1.78s
188n-96/2.4 → 186h-95/522 (100%)2 (100%)2 (100%)1.03s1.03s1.03s
188n-96/2.4 → 188n-96/522 (100%)2 (100%)2 (100%)1.21s1.21s1.21s
188n-96/2.4 → 188n-99/2.422 (100%)2 (100%)2 (100%)0.87s0.87s0.87s
188n-96/2.4 → 188n-99/522 (100%)2 (100%)2 (100%)1.85s1.85s1.85s
188n-96/5 → 186h-94/2.422 (100%)2 (100%)2 (100%)1.82s1.82s1.82s
188n-96/5 → 186h-94/522 (100%)2 (100%)2 (100%)1.10s1.10s1.10s
188n-96/5 → 186h-95/2.422 (100%)2 (100%)2 (100%)0.87s0.87s0.87s
188n-96/5 → 186h-95/522 (100%)2 (100%)2 (100%)0.96s0.96s0.96s
188n-96/5 → 188n-96/2.422 (100%)2 (100%)2 (100%)0.96s0.96s0.96s
188n-96/5 → 188n-99/2.422 (100%)2 (100%)2 (100%)0.96s0.96s0.96s
188n-96/5 → 188n-99/522 (100%)2 (100%)2 (100%)2.00s2.00s2.00s
188n-99/2.4 → 186h-94/2.422 (100%)2 (100%)2 (100%)0.89s0.89s0.89s
188n-99/2.4 → 186h-94/522 (100%)2 (100%)2 (100%)1.12s1.12s1.12s
188n-99/2.4 → 186h-95/2.422 (100%)2 (100%)2 (100%)0.92s0.92s0.92s
188n-99/2.4 → 186h-95/522 (100%)1 (50%)2 (100%)2.09s2.09s2.09s
188n-99/2.4 → 188n-96/2.422 (100%)2 (100%)2 (100%)0.73s0.73s0.73s
188n-99/2.4 → 188n-96/522 (100%)2 (100%)2 (100%)1.05s1.05s1.05s
188n-99/2.4 → 188n-99/522 (100%)2 (100%)2 (100%)1.81s1.81s1.81s
188n-99/5 → 186h-94/2.422 (100%)2 (100%)2 (100%)0.87s0.87s0.87s
188n-99/5 → 186h-94/522 (100%)2 (100%)2 (100%)1.84s1.84s1.84s
188n-99/5 → 186h-95/2.422 (100%)2 (100%)2 (100%)1.81s1.81s1.81s
188n-99/5 → 186h-95/522 (100%)0 (0%)2 (100%)2.06s2.06s2.06s
188n-99/5 → 188n-96/2.421 (50%)1 (100%)1 (100%)0.90s0.90s0.90s
188n-99/5 → 188n-96/522 (100%)1 (50%)2 (100%)2.01s2.01s2.01s
188n-99/5 → 188n-99/2.422 (100%)2 (100%)2 (100%)0.70s0.70s0.70s

Failures

ModeCountShare of all trials
landed_on_other(d4:ba:ba:a4:05:cb)10.8%

stayed_on_source the client never left the old BSS. landed_on_other it moved somewhere unasked. ended_disconnected it fell off entirely. roam_rejected wpa_supplicant refused the command, usually a target missing from the scan cache.

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 GHz2412 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 126 trials
#RoundClassFromToLatencyOutcome
11inter-ap-same-band-diff-channel188n-96/5186h-94/51.04scompleted
21inter-ap-same-band-diff-channel188n-96/5188n-99/51.03scompleted
31inter-ap-same-band-diff-channel188n-99/5188n-96/52.01scompleted
41inter-ap-same-band-diff-channel188n-99/2.4186h-95/2.40.92scompleted
51inter-ap-same-band-diff-channel186h-94/5188n-96/51.09scompleted
61inter-ap-same-band-diff-channel186h-95/5186h-94/52.02scompleted
71inter-ap-same-band-diff-channel188n-99/2.4186h-94/2.40.88scompleted
81inter-ap-same-band-diff-channel186h-95/5188n-99/51.06scompleted
91static-control(none)188n-99/5—completed
101inter-ap-same-band-diff-channel186h-94/2.4186h-95/2.40.95scompleted
111inter-ap-same-band-diff-channel186h-95/2.4186h-94/2.41.78scompleted
121inter-ap-same-band-diff-channel186h-95/2.4188n-99/2.40.58scompleted
131inter-ap-same-band-diff-channel188n-96/2.4188n-99/2.40.87scompleted
141inter-ap-same-band-diff-channel188n-96/2.4186h-94/2.40.73scompleted
151inter-ap-same-band-diff-channel188n-96/5186h-95/50.93scompleted
161inter-ap-same-band-diff-channel188n-99/2.4188n-96/2.40.73scompleted
171inter-ap-same-band-diff-channel186h-95/5188n-96/50.90scompleted
181static-control(none)188n-96/5—completed
191inter-ap-same-band-diff-channel188n-99/5186h-95/52.03scompleted
201inter-ap-same-band-diff-channel186h-94/5186h-95/51.16scompleted
211inter-ap-same-band-diff-channel186h-94/2.4188n-96/2.40.74scompleted
221inter-ap-same-band-diff-channel186h-94/2.4188n-99/2.40.67scompleted
231inter-ap-same-channel188n-99/5186h-94/50.69scompleted
241inter-ap-same-channel188n-96/2.4186h-95/2.40.54scompleted
251inter-ap-same-channel186h-95/2.4188n-96/2.41.79scompleted
261inter-ap-same-channel186h-94/5188n-99/51.76scompleted
271static-control(none)188n-99/5—completed
281inter-ap-cross-band188n-99/2.4188n-96/51.05scompleted
291inter-ap-cross-band186h-95/2.4188n-96/50.70scompleted
301inter-ap-cross-band186h-95/5186h-94/2.40.59scompleted
311inter-ap-cross-band188n-96/2.4186h-94/50.93scompleted
321inter-ap-cross-band188n-99/5186h-94/2.40.70scompleted
331inter-ap-cross-band188n-96/2.4188n-99/51.85scompleted
341inter-ap-cross-band186h-94/2.4186h-95/52.09scompleted
351inter-ap-cross-band186h-95/5188n-99/2.40.57scompleted
361static-control(none)188n-99/2.4—completed
371inter-ap-cross-band188n-96/5186h-95/2.40.58scompleted
381inter-ap-cross-band186h-95/2.4188n-99/51.12scompleted
391inter-ap-cross-band188n-96/5188n-99/2.40.95scompleted
401inter-ap-cross-band188n-99/5186h-95/2.41.81scompleted
411inter-ap-cross-band186h-94/2.4188n-99/51.76scompleted
421inter-ap-cross-band186h-94/5188n-99/2.40.77scompleted
431inter-ap-cross-band186h-94/5188n-96/2.40.69scompleted
441inter-ap-cross-band186h-94/5186h-95/2.40.75scompleted
451static-control(none)186h-95/2.4—completed
461inter-ap-cross-band188n-96/2.4186h-95/50.94scompleted
471inter-ap-cross-band186h-95/2.4186h-94/52.12scompleted
481inter-ap-cross-band188n-99/2.4186h-95/51.06scompleted
491inter-ap-cross-band188n-96/5186h-94/2.40.57scompleted
501inter-ap-cross-band186h-94/2.4188n-96/51.78scompleted
511inter-ap-cross-band188n-99/2.4186h-94/51.12scompleted
521inter-ap-cross-band186h-95/5188n-96/2.40.58scompleted
531inter-ap-cross-band188n-99/5188n-96/2.40.90scompleted
541static-control(none)188n-96/2.4—completed
551intra-ap-cross-radio186h-95/5186h-95/2.40.61scompleted
561intra-ap-cross-radio188n-96/5188n-96/2.40.96scompleted
571intra-ap-cross-radio186h-94/5186h-94/2.40.97scompleted
581intra-ap-cross-radio186h-94/2.4186h-94/50.59scompleted
591intra-ap-cross-radio188n-99/2.4188n-99/51.81scompleted
601intra-ap-cross-radio188n-99/5188n-99/2.40.69scompleted
611intra-ap-cross-radio188n-96/2.4188n-96/51.21scompleted
621intra-ap-cross-radio186h-95/2.4186h-95/51.09scompleted
631static-control(none)186h-95/5—completed
642inter-ap-same-band-diff-channel188n-96/2.4186h-94/2.40.77scompleted
652inter-ap-same-band-diff-channel186h-94/5186h-95/51.11scompleted
662inter-ap-same-band-diff-channel186h-95/5186h-94/52.05scompleted
672inter-ap-same-band-diff-channel186h-94/5188n-96/51.27scompleted
682inter-ap-same-band-diff-channel188n-96/2.4188n-99/2.40.74scompleted
692inter-ap-same-band-diff-channel188n-99/5186h-95/52.06scompleted
702inter-ap-same-band-diff-channel188n-96/5188n-99/52.00scompleted
712inter-ap-same-band-diff-channel188n-99/2.4186h-94/2.40.89scompleted
722static-control(none)186h-94/2.4—completed
732inter-ap-same-band-diff-channel186h-95/5188n-96/52.00scompleted
742inter-ap-same-band-diff-channel188n-99/5188n-96/51.07scompleted
752inter-ap-same-band-diff-channel188n-99/2.4188n-96/2.40.60scompleted
762inter-ap-same-band-diff-channel186h-95/5188n-99/51.03scompleted
772inter-ap-same-band-diff-channel186h-94/2.4186h-95/2.40.62scompleted
782inter-ap-same-band-diff-channel186h-94/2.4188n-99/2.40.62scompleted
792inter-ap-same-band-diff-channel188n-99/2.4186h-95/2.40.89scompleted
802inter-ap-same-band-diff-channel186h-94/2.4188n-96/2.40.90scompleted
812static-control(none)188n-96/2.4—completed
822inter-ap-same-band-diff-channel188n-96/5186h-94/51.10scompleted
832inter-ap-same-band-diff-channel186h-95/2.4188n-99/2.41.85scompleted
842inter-ap-same-band-diff-channel188n-96/5186h-95/50.96scompleted
852inter-ap-same-band-diff-channel186h-95/2.4186h-94/2.40.59scompleted
862inter-ap-same-channel186h-95/2.4188n-96/2.40.96scompleted
872inter-ap-same-channel186h-94/5188n-99/50.64scompleted
882inter-ap-same-channel188n-99/5186h-94/51.84scompleted
892inter-ap-same-channel188n-96/2.4186h-95/2.41.78scompleted
902static-control(none)186h-95/2.4—completed
912inter-ap-cross-band188n-96/2.4186h-95/51.03scompleted
922inter-ap-cross-band188n-96/5188n-99/2.40.96scompleted
932inter-ap-cross-band188n-99/2.4186h-94/51.10scompleted
942inter-ap-cross-band188n-99/5186h-94/2.40.87scompleted
952inter-ap-cross-band188n-99/5188n-96/2.4—landed_on_other(d4:ba:ba:a4:05:cb)
962inter-ap-cross-band186h-94/2.4188n-99/51.78scompleted
972inter-ap-cross-band186h-95/2.4186h-94/50.88scompleted
982inter-ap-cross-band186h-94/5186h-95/2.41.75scompleted
992static-control(none)186h-95/2.4—completed
1002inter-ap-cross-band186h-94/2.4186h-95/51.07scompleted
1012inter-ap-cross-band186h-95/5188n-99/2.40.72scompleted
1022inter-ap-cross-band188n-96/5186h-94/2.41.82scompleted
1032inter-ap-cross-band188n-99/2.4186h-95/52.09scompleted
1042inter-ap-cross-band186h-94/5188n-99/2.41.81scompleted
1052inter-ap-cross-band188n-96/5186h-95/2.40.87scompleted
1062inter-ap-cross-band186h-95/2.4188n-99/51.09scompleted
1072inter-ap-cross-band188n-96/2.4188n-99/50.68scompleted
1082static-control(none)188n-99/5—completed
1092inter-ap-cross-band188n-99/2.4188n-96/51.01scompleted
1102inter-ap-cross-band186h-95/5188n-96/2.40.60scompleted
1112inter-ap-cross-band186h-94/2.4188n-96/51.09scompleted
1122inter-ap-cross-band186h-94/5188n-96/2.40.73scompleted
1132inter-ap-cross-band188n-96/2.4186h-94/51.78scompleted
1142inter-ap-cross-band188n-99/5186h-95/2.40.61scompleted
1152inter-ap-cross-band186h-95/5186h-94/2.40.56scompleted
1162inter-ap-cross-band186h-95/2.4188n-96/51.27scompleted
1172static-control(none)188n-96/5—completed
1182intra-ap-cross-radio186h-95/2.4186h-95/50.92scompleted
1192intra-ap-cross-radio188n-99/5188n-99/2.40.70scompleted
1202intra-ap-cross-radio188n-99/2.4188n-99/50.65scompleted
1212intra-ap-cross-radio186h-94/5186h-94/2.40.89scompleted
1222intra-ap-cross-radio188n-96/2.4188n-96/51.21scompleted
1232intra-ap-cross-radio188n-96/5188n-96/2.40.62scompleted
1242intra-ap-cross-radio186h-95/5186h-95/2.40.73scompleted
1252intra-ap-cross-radio186h-94/2.4186h-94/50.96scompleted
1262static-control(none)186h-94/5—completed