net80211 association failures in station mode

From: obiwac <obiwac_at_gmail.com>
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