OpenWiFi roam matrix — 188n-B-noassoc

67 trials · roam mode · 2026-09-15 18:44 · 13 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.93s vs 1.06s, completion 95% 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.

15 of 66 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
ipq6018 / inter-ap-same-band-diff-channel2015 (75%)50.30s0.40s
ipq6018 / inter-ap-cross-band2012 (60%)80.30s0.40s
ipq6018 / static-control75 (71%)20.30s0.30s
ipq6018 / intra-ap-cross-radio1919 (100%)00.30s0.40s

Roams that completed but had no dataplane

#ClassFromToRoamReason
6inter-ap-cross-band188n-99/5188n-96/2.41.78sno-lease(rc=1)
8inter-ap-cross-band188n-99/2.4188n-96/51.82sno-lease(rc=1)
8static-control(none)188n-96/5—no-lease(rc=1)
15inter-ap-same-band-diff-channel188n-96/5188n-99/52.07sno-lease(rc=1)
17inter-ap-cross-band188n-99/5188n-96/2.41.82sno-lease(rc=1)
19inter-ap-cross-band188n-96/5188n-99/2.41.77sno-lease(rc=1)
26inter-ap-same-band-diff-channel188n-99/2.4188n-96/2.41.80sno-lease(rc=1)
28inter-ap-same-band-diff-channel188n-99/5188n-96/51.99sno-lease(rc=1)
30inter-ap-cross-band188n-96/2.4188n-99/51.80sno-lease(rc=1)
32inter-ap-cross-band188n-96/5188n-99/2.41.82sno-lease(rc=1)
32static-control(none)188n-99/2.4—no-lease(rc=1)
43inter-ap-cross-band188n-96/5188n-99/2.41.75sno-lease(rc=1)
50inter-ap-same-band-diff-channel188n-99/5188n-96/52.09sno-lease(rc=1)
52inter-ap-same-band-diff-channel188n-96/2.4188n-99/2.41.79sno-lease(rc=1)
55inter-ap-cross-band188n-99/5188n-96/2.41.78sno-lease(rc=1)

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.
2020 (100%)18 (90%)20 (100%)1.02s2.07s2.09s
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%)1.06s1.82s1.82s
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.
2019 (95%)19 (95%)19 (95%)0.93s1.08s1.19s

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.05s1.08s1.08s
188n-96/2.4 → 188n-99/2.455 (100%)5 (100%)5 (100%)0.70s1.79s1.79s
188n-96/2.4 → 188n-99/555 (100%)5 (100%)5 (100%)0.98s1.80s1.80s
188n-96/5 → 188n-96/2.455 (100%)5 (100%)5 (100%)0.73s0.96s0.96s
188n-96/5 → 188n-99/2.455 (100%)5 (100%)5 (100%)1.75s1.82s1.82s
188n-96/5 → 188n-99/555 (100%)4 (80%)5 (100%)1.02s2.07s2.07s
188n-99/2.4 → 188n-96/2.455 (100%)5 (100%)5 (100%)0.64s1.80s1.80s
188n-99/2.4 → 188n-96/555 (100%)5 (100%)5 (100%)1.06s1.82s1.82s
188n-99/2.4 → 188n-99/555 (100%)5 (100%)5 (100%)0.94s1.19s1.19s
188n-99/5 → 188n-96/2.455 (100%)5 (100%)5 (100%)1.78s1.82s1.82s
188n-99/5 → 188n-96/555 (100%)4 (80%)5 (100%)1.13s2.09s2.09s
188n-99/5 → 188n-99/2.454 (80%)4 (80%)4 (80%)0.76s0.91s0.91s

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.05scompleted
21inter-ap-same-band-diff-channel188n-96/2.4188n-99/2.40.95scompleted
31inter-ap-same-band-diff-channel188n-96/5188n-99/50.87scompleted
41inter-ap-same-band-diff-channel188n-99/2.4188n-96/2.40.83scompleted
51inter-ap-cross-band188n-96/2.4188n-99/50.92scompleted
61inter-ap-cross-band188n-99/5188n-96/2.41.78scompleted
71inter-ap-cross-band188n-96/5188n-99/2.40.98scompleted
81inter-ap-cross-band188n-99/2.4188n-96/51.82scompleted
91static-control(none)188n-96/5—completed
101intra-ap-cross-radio188n-96/5188n-96/2.40.96scompleted
111intra-ap-cross-radio188n-99/2.4188n-99/51.19scompleted
121intra-ap-cross-radio188n-96/2.4188n-96/51.08scompleted
131intra-ap-cross-radio188n-99/5188n-99/2.40.73scompleted
142inter-ap-same-band-diff-channel188n-99/2.4188n-96/2.40.59scompleted
152inter-ap-same-band-diff-channel188n-99/5188n-96/51.07scompleted
162inter-ap-same-band-diff-channel188n-96/5188n-99/52.07scompleted
172inter-ap-same-band-diff-channel188n-96/2.4188n-99/2.40.70scompleted
182static-control(none)188n-99/2.4—completed
192inter-ap-cross-band188n-99/5188n-96/2.41.82scompleted
202inter-ap-cross-band188n-99/2.4188n-96/51.06scompleted
212inter-ap-cross-band188n-96/5188n-99/2.41.77scompleted
222inter-ap-cross-band188n-96/2.4188n-99/51.03scompleted
232intra-ap-cross-radio188n-96/2.4188n-96/50.98scompleted
242intra-ap-cross-radio188n-96/5188n-96/2.40.66scompleted
252intra-ap-cross-radio188n-99/5188n-99/2.4—stayed_on_source
262intra-ap-cross-radio188n-99/2.4188n-99/50.94scompleted
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/51.16scompleted
313inter-ap-same-band-diff-channel188n-99/5188n-96/51.99scompleted
323inter-ap-cross-band188n-99/5188n-96/2.40.70scompleted
333inter-ap-cross-band188n-96/2.4188n-99/51.80scompleted
343inter-ap-cross-band188n-99/2.4188n-96/51.20scompleted
353inter-ap-cross-band188n-96/5188n-99/2.41.82scompleted
363static-control(none)188n-99/2.4—completed
373intra-ap-cross-radio188n-96/5188n-96/2.40.72scompleted
383intra-ap-cross-radio188n-99/5188n-99/2.40.91scompleted
393intra-ap-cross-radio188n-96/2.4188n-96/50.98scompleted
403intra-ap-cross-radio188n-99/2.4188n-99/51.06scompleted
414inter-ap-same-band-diff-channel188n-96/2.4188n-99/2.40.67scompleted
424inter-ap-same-band-diff-channel188n-99/5188n-96/51.13scompleted
434inter-ap-same-band-diff-channel188n-99/2.4188n-96/2.40.64scompleted
444inter-ap-same-band-diff-channel188n-96/5188n-99/51.02scompleted
454static-control(none)188n-99/5—completed
464inter-ap-cross-band188n-99/5188n-96/2.40.92scompleted
474inter-ap-cross-band188n-99/2.4188n-96/50.88scompleted
484inter-ap-cross-band188n-96/5188n-99/2.41.75scompleted
494inter-ap-cross-band188n-96/2.4188n-99/50.98scompleted
504intra-ap-cross-radio188n-99/2.4188n-99/50.92scompleted
514intra-ap-cross-radio188n-96/5188n-96/2.40.73scompleted
524intra-ap-cross-radio188n-99/5188n-99/2.40.76scompleted
534intra-ap-cross-radio188n-96/2.4188n-96/51.07scompleted
544static-control(none)188n-96/5—completed
555inter-ap-same-band-diff-channel188n-96/5188n-99/50.89scompleted
565inter-ap-same-band-diff-channel188n-99/5188n-96/52.09scompleted
575inter-ap-same-band-diff-channel188n-99/2.4188n-96/2.40.58scompleted
585inter-ap-same-band-diff-channel188n-96/2.4188n-99/2.41.79scompleted
595inter-ap-cross-band188n-96/5188n-99/2.40.69scompleted
605inter-ap-cross-band188n-96/2.4188n-99/50.97scompleted
615inter-ap-cross-band188n-99/5188n-96/2.41.78scompleted
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.93scompleted
655intra-ap-cross-radio188n-99/5188n-99/2.40.71scompleted
665intra-ap-cross-radio188n-99/2.4188n-99/50.66scompleted
675intra-ap-cross-radio188n-96/2.4188n-96/51.05scompleted