OpenWiFi roam matrix — 188n-assoc-flush

67 trials · roam mode · 2026-09-15 18:27 · 7 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.

ipq6018

Cross-radio roams on the same AP are not materially worse than the same transition between two APs (median 0.96s vs 0.97s, 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.

All 66 completed roams got a lease

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

Chipset / classRoamsGot a leaseNo leasemedian DHCPmax DHCP
ipq6018 / inter-ap-same-band-diff-channel1919 (100%)00.30s0.40s
ipq6018 / inter-ap-cross-band2020 (100%)00.30s0.40s
ipq6018 / static-control77 (100%)00.30s0.30s
ipq6018 / intra-ap-cross-radio2020 (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.
2019 (95%)19 (95%)19 (95%)0.96s1.98s2.00s
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.
2020 (100%)20 (100%)20 (100%)0.97s1.82s1.87s
static-control70 (0%)0 (0%)0 (0%)———
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.
2020 (100%)20 (100%)20 (100%)0.96s1.06s1.07s

By BSSID pair

GroupTrialsCompleted≤2s≤5smedianp90max
(none) → 188n-96/530 (0%)0 (0%)0 (0%)———
(none) → 188n-99/2.420 (0%)0 (0%)0 (0%)———
(none) → 188n-99/520 (0%)0 (0%)0 (0%)———
188n-96/2.4 → 188n-96/555 (100%)5 (100%)5 (100%)1.01s1.07s1.07s
188n-96/2.4 → 188n-99/2.455 (100%)5 (100%)5 (100%)0.62s1.79s1.79s
188n-96/2.4 → 188n-99/555 (100%)5 (100%)5 (100%)0.93s1.77s1.77s
188n-96/5 → 188n-96/2.455 (100%)5 (100%)5 (100%)0.75s1.06s1.06s
188n-96/5 → 188n-99/2.455 (100%)5 (100%)5 (100%)1.78s1.82s1.82s
188n-96/5 → 188n-99/554 (80%)4 (80%)4 (80%)1.06s1.98s1.98s
188n-99/2.4 → 188n-96/2.455 (100%)5 (100%)5 (100%)0.61s1.80s1.80s
188n-99/2.4 → 188n-96/555 (100%)5 (100%)5 (100%)0.93s1.78s1.78s
188n-99/2.4 → 188n-99/555 (100%)5 (100%)5 (100%)0.96s1.06s1.06s
188n-99/5 → 188n-96/2.455 (100%)5 (100%)5 (100%)1.76s1.87s1.87s
188n-99/5 → 188n-96/555 (100%)5 (100%)5 (100%)1.11s2.00s2.00s
188n-99/5 → 188n-99/2.455 (100%)5 (100%)5 (100%)0.75s0.97s0.97s

Failures

ModeCountShare of all trials
stayed_on_source11.5%

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
SSID
OW mPSK WPA2
Client MAC
02:03:7f:12:97:21
Client iface
sta0
Trials per pair
5
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 67 trials
#RoundClassFromToLatencyOutcome
11inter-ap-same-band-diff-channel188n-99/5188n-96/51.03scompleted
21inter-ap-same-band-diff-channel188n-96/2.4188n-99/2.40.96scompleted
31inter-ap-same-band-diff-channel188n-96/5188n-99/50.94scompleted
41inter-ap-same-band-diff-channel188n-99/2.4188n-96/2.40.92scompleted
51inter-ap-cross-band188n-96/2.4188n-99/50.97scompleted
61inter-ap-cross-band188n-99/5188n-96/2.41.80scompleted
71inter-ap-cross-band188n-96/5188n-99/2.40.67scompleted
81inter-ap-cross-band188n-99/2.4188n-96/51.78scompleted
91static-control(none)188n-96/5—completed
101intra-ap-cross-radio188n-96/5188n-96/2.41.06scompleted
111intra-ap-cross-radio188n-99/2.4188n-99/51.06scompleted
121intra-ap-cross-radio188n-96/2.4188n-96/51.02scompleted
131intra-ap-cross-radio188n-99/5188n-99/2.40.68scompleted
142inter-ap-same-band-diff-channel188n-99/2.4188n-96/2.40.56scompleted
152inter-ap-same-band-diff-channel188n-99/5188n-96/51.11scompleted
162inter-ap-same-band-diff-channel188n-96/5188n-99/51.98scompleted
172inter-ap-same-band-diff-channel188n-96/2.4188n-99/2.40.59scompleted
182static-control(none)188n-99/2.4—completed
192inter-ap-cross-band188n-99/5188n-96/2.41.87scompleted
202inter-ap-cross-band188n-99/2.4188n-96/50.93scompleted
212inter-ap-cross-band188n-96/5188n-99/2.41.80scompleted
222inter-ap-cross-band188n-96/2.4188n-99/50.93scompleted
232intra-ap-cross-radio188n-96/2.4188n-96/51.01scompleted
242intra-ap-cross-radio188n-96/5188n-96/2.40.67scompleted
252intra-ap-cross-radio188n-99/5188n-99/2.40.94scompleted
262intra-ap-cross-radio188n-99/2.4188n-99/50.71scompleted
272static-control(none)188n-99/5—completed
283inter-ap-same-band-diff-channel188n-96/2.4188n-99/2.40.61scompleted
293inter-ap-same-band-diff-channel188n-99/2.4188n-96/2.41.80scompleted
303inter-ap-same-band-diff-channel188n-96/5188n-99/5—stayed_on_source
313inter-ap-same-band-diff-channel188n-99/5188n-96/51.05scompleted
323inter-ap-cross-band188n-99/5188n-96/2.40.68scompleted
333inter-ap-cross-band188n-96/2.4188n-99/51.77scompleted
343inter-ap-cross-band188n-99/2.4188n-96/51.17scompleted
353inter-ap-cross-band188n-96/5188n-99/2.41.78scompleted
363static-control(none)188n-99/2.4—completed
373intra-ap-cross-radio188n-96/5188n-96/2.40.75scompleted
383intra-ap-cross-radio188n-99/5188n-99/2.40.97scompleted
393intra-ap-cross-radio188n-96/2.4188n-96/51.00scompleted
403intra-ap-cross-radio188n-99/2.4188n-99/50.99scompleted
414inter-ap-same-band-diff-channel188n-96/2.4188n-99/2.40.62scompleted
424inter-ap-same-band-diff-channel188n-99/5188n-96/51.18scompleted
434inter-ap-same-band-diff-channel188n-99/2.4188n-96/2.40.61scompleted
444inter-ap-same-band-diff-channel188n-96/5188n-99/51.06scompleted
454static-control(none)188n-99/5—completed
464inter-ap-cross-band188n-99/5188n-96/2.40.96scompleted
474inter-ap-cross-band188n-99/2.4188n-96/50.92scompleted
484inter-ap-cross-band188n-96/5188n-99/2.41.82scompleted
494inter-ap-cross-band188n-96/2.4188n-99/50.92scompleted
504intra-ap-cross-radio188n-99/2.4188n-99/50.96scompleted
514intra-ap-cross-radio188n-96/5188n-96/2.40.70scompleted
524intra-ap-cross-radio188n-99/5188n-99/2.40.72scompleted
534intra-ap-cross-radio188n-96/2.4188n-96/51.00scompleted
544static-control(none)188n-96/5—completed
555inter-ap-same-band-diff-channel188n-96/5188n-99/50.87scompleted
565inter-ap-same-band-diff-channel188n-99/5188n-96/52.00scompleted
575inter-ap-same-band-diff-channel188n-99/2.4188n-96/2.40.60scompleted
585inter-ap-same-band-diff-channel188n-96/2.4188n-99/2.41.79scompleted
595inter-ap-cross-band188n-96/5188n-99/2.40.71scompleted
605inter-ap-cross-band188n-96/2.4188n-99/50.92scompleted
615inter-ap-cross-band188n-99/5188n-96/2.41.76scompleted
625inter-ap-cross-band188n-99/2.4188n-96/50.89scompleted
635static-control(none)188n-96/5—completed
645intra-ap-cross-radio188n-96/5188n-96/2.40.94scompleted
655intra-ap-cross-radio188n-99/5188n-99/2.40.75scompleted
665intra-ap-cross-radio188n-99/2.4188n-99/50.68scompleted
675intra-ap-cross-radio188n-96/2.4188n-96/51.07scompleted