net80211 association failures in station mode
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 24 Mar 2023 19:41:15 UTC
Hey, Recently I've been getting a lot of association failures with wpa_supplicant(8). I looked into things a little and found that the issue comes when iterating over the sta scan table with mlmelookup (sys/net80211/ieee80211_ioctl.c) in setmlme_assoc_sta, which first checks if the MAC addresses are equal between the query and a scan entry, and then checks if the SSID's are equal. (Minor issue but the "Match mac address and *any* ssid." comment above is wrong, right?) Thing is that query used when calling setmlme_assoc_sta (in ieee80211_ioctl_setmlme) is the vap's SSID (vap->iv_des_ssid[0]), whereas the one used when calling setmlme_assoc_adhoc for adhoc networks is the SSID contained in the MLME request structure (mlme.im_ssid): static int ieee80211_ioctl_setmlme(struct ieee80211vap *vap, struct ieee80211req *ireq) { struct ieee80211req_mlme mlme; ... int error = copyin(ireq->i_data, &mlme, sizeof(mlme)); ... if (vap->iv_opmode == IEEE80211_M_STA && mlme.im_op == IEEE80211_MLME_ASSOC) return setmlme_assoc_sta(vap, mlme.im_macaddr, vap->iv_des_ssid[0].len, vap->iv_des_ssid[0].ssid); else if ((vap->iv_opmode == IEEE80211_M_IBSS || vap->iv_opmode == IEEE80211_M_AHDEMO) && mlme.im_op == IEEE80211_MLME_ASSOC) return setmlme_assoc_adhoc(vap, mlme.im_macaddr, mlme.im_ssid_len, mlme.im_ssid); ... } I would have expected these SSID arguments be the other way around, because e.g. when wpa_supplicant(8) tries to associate in station mode, it sets the wanted SSID in the MLME request structure and then calls IEEE802_IOC_MLME - in fact, when reversing these arguments, I can associate no problem and things operate as I'd expect again... But since this code has last been touched over a decade ago, I feel like there's something I'm missing/doing wrong here :P If this is indeed wrong I'll make a diff :) Thanks in advance, Aymeric