TEST-SSID does accept this client -- intermittently, with the stock frame
scope: device:google-taimen · severity: finding · confidence: proven · subsystem: radio
The question — the phone is answered status=18
(ASSOC_DENIED_UNSUPP_RATE) by the UniFi AP while a laptop on the
same BSSID is accepted. Three sessions read that as “something in our
association request is wrong” and went looking for the element responsible.
SUPERSEDED 2026-08-31 by the-reserved-vht-width-pair-is-why-the-ap-refused. The central conclusion here – that our association request is clean and the refusal is the AP’s – is wrong. ath10k was advertising a VHT Supported Channel Width Set / Extended NSS BW pair that 802.11 marks reserved; clamping it in the driver gives 8/8 cold associations and a real DHCP lease. VHT looked exonerated only because the wpa_supplicant knob used to test it does nothing (vht-capa-overrides-cannot-touch-channel-width). Keep this note for its method – the BSSID pin, the beacon decode, the counterbalancing – not for its verdict.
The answer — there is nothing to find in the frame. The AP accepts this client, with the completely unmodified stock request, some of the time.
[ 3644.852896] wlan0: RX AssocResp from <ap-ch36> (capab=0x1511 status=0 aid=2)[ 3644.949384] wlan0: associated[ 3648.899179] wlan0: deauthenticated (Reason: 15=4WAY_HANDSHAKE_TIMEOUT)That is the kernel, not a supplicant guess. The handshake timed out because the probe deliberately used a dummy PSK – the association verdict lands before the 4-way, which is the whole point of testing with a fake key. Three runs in one sweep got in; two of them carried modified frames and the third carried the stock one, which is the point: the variant did not decide it.
What this rules out
Section: What this rules outstatus=18is not a rate defect and not deterministic. The same bytes are refused, then accepted, minutes apart. No frame-content theory survives a control that succeeds unmodified.- The VHT capability encoding is not it. Our VHT Capabilities Info is
0x738139fa: Supported Channel Width Set = 2 with Extended NSS BW Support = 1, which 802.11 Table 9-250 marks reserved –iw phy0 infoprintsSupported Channel Width: (reserved)– while the accepted laptop sends the valid (1, 0). It looked like the answer. It is not: overriding those bits from wpa_supplicant (vht_capa=0x4 vht_capa_mask=0xc000000c, verified parsed and applied) gavestatus=18on all 12 counterbalanced attempts. - The locally-administered MAC bit is not it. taimen has no factory WLAN
MAC (taimen-has-no-factory-wlan-mac), so every address it has ever used
is a random LAA while the laptop’s is OUI-registered – the one difference
nobody had varied, because the earlier “MAC randomisation ruled out” only
swapped one LAA for another. Nine attempts across LAA, a Google OUI and a
third registered OUI:
status=18every time. - PMF is not it. NetworkManager defaults
ieee80211wto optional and so sets MFPC in the RSN IE, while a minimal supplicant config leaves it clear – and this AP’s own beacon advertises RSN capabilities0x0000, i.e. no PMF at all.nopmf/ieee80211w=1/ a full NM-shaped block (proto=RSN,pairwise=CCMP,group=CCMP,proactive_key_caching=1) rotated in one window: 0 accepted out of 10 each,status=18throughout. - The gap between attempts is not it. All three acceptances happened to
follow an attempt that put no association request on the air, which looked
like a rate limiter releasing. Tested directly, paired in one window: a COLD
attempt with 90 s of enforced radio silence before it (interface down, not
merely idle) against a HOT one 5 s later. 0/8 and 0/8, all
status=18. The correlation was coincidence. - No HT or VHT capability or MCS knob is it.
disable_ht,disable_vht,disable_ht40,disable_sgi,disable_ldpc,disable_max_amsdu,ampdu_density,ht_mcs(1 stream),vht_rx/tx_mcs_nss_2– swept counterbalanced. None separates from the control, and the control itself both fails and succeeds.
Two real frame defects found along the way, neither causal
Section: Two real frame defects found along the way, neither causalBoth are upstream ath10k, both worth fixing on their own merits:
ath10k_create_vht_cap()doesvht_cap.cap = ar->vht_cap_infoand never validates it, so the WCN3990 firmware’s reserved Supported Channel Width Set / Extended NSS BW pair goes straight onto the air.ath10k_get_ht_cap()setsIEEE80211_HT_CAP_DSSSCCK40unconditionally, advertising DSSS/CCK in 40 MHz on a 5 GHz association where it is meaningless. The accepted laptop does not set it.
How it was established
Section: How it was establishedSix sweeps, 67 direct wpa_supplicant runs plus ~14 NetworkManager
activations, BSSID pinned to <ap-ch36> throughout – an unpinned
run tests nothing (ap-refuses-us-our-assocreq-is-clean). Variant
order was rotated every repetition after the first sweep, because the first
one put the control first in every rep and could not have told a variant
effect from a position effect.
The successes clustered, and nothing since has reproduced them. All three
landed inside one sweep of 14 runs. Everything before, and roughly 156
consecutive pinned attempts after – 60 NetworkManager activations, 30 PMF
variants, 16 paired cold/hot attempts – returned status=18. So the honest
model is not “each attempt has a ~5% chance” but “the AP admitted clients
during one window and has refused continuously outside it”. What opens a
window is not visible from the client, and the two mechanisms that would have
been visible (attempt spacing, per-MAC exclusion) were both tested and are
both refuted above.
What would overturn this: a run of several hundred pinned attempts with
the stock frame that never once returns status=0. One acceptance is enough
to kill a deterministic-refusal theory; only a long clean null could bring it
back.
