Unable to Connect to Open Network (Part 2)
Cy Schubert
Cy.Schubert at cschubert.com
Fri Jun 24 07:36:02 PDT 2022
Hi,
Last week I posted an email discussing a regression from 2.9 a FreeBSD user
discovered. I was able to reproduce the problem locally using a Netgear
WNDR3700v3 (I have two of these, results the same on both).
The problem occurs when the primary VAP is configured with WPA and the
secondary VAP (guest network on Netgear) is open and unprotected. What I'm
seeing is an IE that causes wpa_supplicant to assume WPA even though
key_mgmt=NONE.
The hackish patch below works around the problem:
diff --git a/contrib/wpa/src/drivers/driver_bsd.c b/contrib/wpa/src/drivers/
driver_bsd.c
index c455bc931036..b39198b7249b 100644
--- a/contrib/wpa/src/drivers/driver_bsd.c
+++ b/contrib/wpa/src/drivers/driver_bsd.c
@@ -1209,6 +1209,10 @@ wpa_driver_bsd_associate(void *priv, struct
wpa_driver_associate_params *params)
int privacy;
int ret = 0;
+ /* XXX woraround for PR/264238 until a better solution can be found */
+ const u8 *wpa_ie_save;
+ size_t wpa_ie_len_save;
+
wpa_printf(MSG_DEBUG,
"%s: ssid '%.*s' wpa ie len %u pairwise %u group %u key mgmt %u"
, __func__
@@ -1256,9 +1260,26 @@ wpa_driver_bsd_associate(void *priv, struct
wpa_driver_associate_params *params)
ret = -1;
if (wpa_driver_bsd_set_auth_alg(drv, params->auth_alg) < 0)
ret = -1;
+
+ /* XXX woraround for PR/264238 until a better solution can be found */
+ if (params->pairwise_suite == WPA_CIPHER_NONE &&
+ params->group_suite == WPA_CIPHER_NONE &&
+ params->key_mgmt_suite == WPA_KEY_MGMT_NONE &&
+ params->wpa_ie_len != 0) {
+ wpa_ie_save = params->wpa_ie;
+ wpa_ie_len_save = params->wpa_ie_len;
+ params->wpa_ie = NULL;
+ params->wpa_ie_len = 0;
+ } else {
+ wpa_ie_save = NULL;
+ wpa_ie_len_save = 0;
+ }
+
/* XXX error handling is wrong but unclear what to do... */
- if (wpa_driver_bsd_set_wpa_ie(drv, params->wpa_ie, params->wpa_ie_len) <
0)
- return -1;
+ if (wpa_driver_bsd_set_wpa_ie(drv, params->wpa_ie, params->wpa_ie_len) <
0) {
+ ret = -1;
+ goto bsd_assoc_exit;
+ }
privacy = !(params->pairwise_suite == WPA_CIPHER_NONE &&
params->group_suite == WPA_CIPHER_NONE &&
@@ -1266,20 +1287,26 @@ wpa_driver_bsd_associate(void *priv, struct
wpa_driver_associate_params *params)
params->wpa_ie_len == 0);
wpa_printf(MSG_DEBUG, "%s: set PRIVACY %u", __func__, privacy);
- if (set80211param(drv, IEEE80211_IOC_PRIVACY, privacy) < 0)
- return -1;
+ if (set80211param(drv, IEEE80211_IOC_PRIVACY, privacy) < 0) {
+ ret = -1;
+ goto bsd_assoc_exit;
+ }
if (params->wpa_ie_len &&
set80211param(drv, IEEE80211_IOC_WPA,
- params->wpa_ie[0] == WLAN_EID_RSN ? 2 : 1) < 0)
- return -1;
+ params->wpa_ie[0] == WLAN_EID_RSN ? 2 : 1) < 0) {
+ ret = -1;
+ goto bsd_assoc_exit;
+ }
/*
* NB: interface must be marked UP for association
* or scanning (ap_scan=2)
*/
- if (bsd_get_iface_flags(drv) < 0)
- return -1;
+ if (bsd_get_iface_flags(drv) < 0) {
+ ret = -1;
+ goto bsd_assoc_exit;
+ }
os_memset(&mlme, 0, sizeof(mlme));
mlme.im_op = IEEE80211_MLME_ASSOC;
@@ -1289,7 +1316,10 @@ wpa_driver_bsd_associate(void *priv, struct
wpa_driver_associate_params *params)
if (params->bssid != NULL)
os_memcpy(mlme.im_macaddr, params->bssid, IEEE80211_ADDR_LEN);
if (set80211var(drv, IEEE80211_IOC_MLME, &mlme, sizeof(mlme)) < 0)
- return -1;
+ ret = -1;
+bsd_assoc_exit:
+ params->wpa_ie = wpa_ie_save;
+ params->wpa_ie_len = wpa_ie_len_save;
return ret;
}
However, the code this patch touches has been in driver_bsd.c since 2008
so, obviously the code this patch addresses is not the cause of the
regression from 2.9 to 2.10. The problem lies elsewhere and the above patch
treats the symptom and not the cause. The problem is I don't have nearly
enough experience with hostap internals to identify the hostap commit that
likely caused the regression.
Where might I look to discover in hostap where the IE is received from the
AP, and if this jogs someone's recollection of the patch I'd be grateful.
In summary, based on my testing this only occurs on a secondary open
unencrypted VAP when the primary VAP is configured for WPA.
P.S. The setting of params->wpa_ie back to its original value at the end of
the patch is in the one case I can find where this memory is obtained
through os_malloc(), avoiding a memory leak.
This is a hackish workaround but I'd prefer finding a better solution.
Any help would be muchly appreciated.
--
Cheers,
Cy Schubert <Cy.Schubert at cschubert.com>
FreeBSD UNIX: <cy at FreeBSD.org> Web: http://www.FreeBSD.org
NTP: <cy at nwtime.org> Web: https://nwtime.org
e**(i*pi)+1=0
More information about the Hostap
mailing list