summaryrefslogtreecommitdiff
path: root/net/hostapd-devel
diff options
context:
space:
mode:
authorJ.R. Oldroyd <fbsd@opal.com>2022-07-03 14:18:40 -0700
committerCy Schubert <cy@FreeBSD.org>2022-07-03 14:33:18 -0700
commitb3916c7a8d2599e99fabdc1735b095ff5a9f9381 (patch)
treee5fb895110487c24497f3d47ac68e443f2404c44 /net/hostapd-devel
parentcad6302bccdaef3b1fd9fd4ce8b1d26c24b32840 (diff)
downloadfreebsd-ports-b3916c7a8d2599e99fabdc1735b095ff5a9f9381.zip
wpa_supplicant* hostapd*: Resolve secondary VAP association issue
Association will fail on a secondary open unprotected VAP when the primary VAP is configured for WPA. Examples of secondary VAPs are, hotels, universities, and commodity routers' guest networks. A broadly similar bug was discussed on Red Hat's bugzilla affecting association to a D-Link DIR-842. This suggests that as IEs were added to the 802.11 protocol the old code was increasingly inadaquate to handle the additional IEs, not only a secondary VAP. This duplcates src commit 775611ea11db here in ports. PR: 264238 Reported by: Jaskie <jiangjun12321@gmail.com> "J.R. Oldroyd" <fbsd@opal.com> Submitted by: "J.R. Oldroyd" <fbsd@opal.com> MFH: 2022Q3
Diffstat (limited to 'net/hostapd-devel')
-rw-r--r--net/hostapd-devel/Makefile1
-rw-r--r--net/hostapd-devel/files/patch-src_drivers_driver__bsd.c109
2 files changed, 98 insertions, 12 deletions
diff --git a/net/hostapd-devel/Makefile b/net/hostapd-devel/Makefile
index 6cc447a6a92b..59298e7651ee 100644
--- a/net/hostapd-devel/Makefile
+++ b/net/hostapd-devel/Makefile
@@ -2,6 +2,7 @@
PORTNAME= hostapd
PORTVERSION= ${COMMIT_DATE}
+PORTREVISION= 1
CATEGORIES= net
PKGNAMESUFFIX= -devel
diff --git a/net/hostapd-devel/files/patch-src_drivers_driver__bsd.c b/net/hostapd-devel/files/patch-src_drivers_driver__bsd.c
index dda055f26664..db2f4291d682 100644
--- a/net/hostapd-devel/files/patch-src_drivers_driver__bsd.c
+++ b/net/hostapd-devel/files/patch-src_drivers_driver__bsd.c
@@ -1,6 +1,14 @@
---- src/drivers/driver_bsd.c.orig 2022-05-24 13:30:39.000000000 -0700
-+++ src/drivers/driver_bsd.c 2022-06-20 07:18:14.191871000 -0700
-@@ -853,14 +853,18 @@
+--- src/drivers/driver_bsd.c.orig 2022-06-20 04:39:26.000000000 -0700
++++ src/drivers/driver_bsd.c 2022-07-03 14:14:25.865828000 -0700
+@@ -14,6 +14,7 @@
+ #include "driver.h"
+ #include "eloop.h"
+ #include "common/ieee802_11_defs.h"
++#include "common/ieee802_11_common.h"
+ #include "common/wpa_common.h"
+
+ #include <ifaddrs.h>
+@@ -853,14 +854,18 @@
drv = bsd_get_drvindex(global, ifm->ifm_index);
if (drv == NULL)
return;
@@ -22,7 +30,50 @@
wpa_printf(MSG_DEBUG, "RTM_IFINFO: Interface '%s' UP",
drv->ifname);
wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_ENABLED,
-@@ -1220,7 +1224,10 @@
+@@ -1197,13 +1202,41 @@
+ }
+
+ static int
++wpa_driver_bsd_set_rsn_wpa_ie(struct bsd_driver_data * drv,
++ struct wpa_driver_associate_params *params, const u8 *ie)
++{
++ int privacy;
++ size_t ie_len = ie[1] ? ie[1] + 2 : 0;
++
++ /* XXX error handling is wrong but unclear what to do... */
++ if (wpa_driver_bsd_set_wpa_ie(drv, ie, ie_len) < 0)
++ return -1;
++
++ privacy = !(params->pairwise_suite == WPA_CIPHER_NONE &&
++ params->group_suite == WPA_CIPHER_NONE &&
++ params->key_mgmt_suite == WPA_KEY_MGMT_NONE);
++ wpa_printf(MSG_DEBUG, "%s: set PRIVACY %u", __func__,
++ privacy);
++
++ if (set80211param(drv, IEEE80211_IOC_PRIVACY, privacy) < 0)
++ return -1;
++
++ if (ie_len &&
++ set80211param(drv, IEEE80211_IOC_WPA,
++ ie[0] == WLAN_EID_RSN ? 2 : 1) < 0)
++ return -1;
++
++ return 0;
++}
++
++static int
+ wpa_driver_bsd_associate(void *priv, struct wpa_driver_associate_params *params)
+ {
+ struct bsd_driver_data *drv = priv;
+ struct ieee80211req_mlme mlme;
+ u32 mode;
+- int privacy;
+ int ret = 0;
++ const u8 *wpa_ie, *rsn_ie;
+
+ wpa_printf(MSG_DEBUG,
+ "%s: ssid '%.*s' wpa ie len %u pairwise %u group %u key mgmt %u"
+@@ -1220,7 +1253,10 @@
mode = 0 /* STA */;
break;
case IEEE80211_MODE_IBSS:
@@ -33,21 +84,55 @@
break;
case IEEE80211_MODE_AP:
mode = IFM_IEEE80211_HOSTAP;
-@@ -1267,6 +1274,13 @@
- params->wpa_ie[0] == WLAN_EID_RSN ? 2 : 1) < 0)
- return -1;
+@@ -1249,24 +1285,33 @@
+ ret = -1;
+ if (wpa_driver_bsd_set_auth_alg(drv, params->auth_alg) < 0)
+ ret = -1;
+- /* 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;
+
+- privacy = !(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_printf(MSG_DEBUG, "%s: set PRIVACY %u", __func__, privacy);
++ if (params->wpa_ie_len) {
++ rsn_ie = get_ie(params->wpa_ie, params->wpa_ie_len,
++ WLAN_EID_RSN);
++ if (rsn_ie) {
++ if (wpa_driver_bsd_set_rsn_wpa_ie(drv, params,
++ rsn_ie) < 0)
++ return -1;
++ }
++ else {
++ wpa_ie = get_vendor_ie(params->wpa_ie,
++ params->wpa_ie_len, WPA_IE_VENDOR_TYPE);
++ if (wpa_ie) {
++ if (wpa_driver_bsd_set_rsn_wpa_ie(drv, params,
++ wpa_ie) < 0)
++ return -1;
++ }
++ }
++ }
+- if (set80211param(drv, IEEE80211_IOC_PRIVACY, privacy) < 0)
+ /*
+ * NB: interface must be marked UP for association
+ * or scanning (ap_scan=2)
+ */
+ if (bsd_get_iface_flags(drv) < 0)
-+ return -1;
-+
+ return -1;
+
+- if (params->wpa_ie_len &&
+- set80211param(drv, IEEE80211_IOC_WPA,
+- params->wpa_ie[0] == WLAN_EID_RSN ? 2 : 1) < 0)
+- return -1;
+-
os_memset(&mlme, 0, sizeof(mlme));
mlme.im_op = IEEE80211_MLME_ASSOC;
if (params->ssid != NULL)
-@@ -1485,6 +1499,17 @@
+@@ -1485,6 +1530,17 @@
if (devcaps.dc_drivercaps & IEEE80211_C_WPA2)
drv->capa.key_mgmt = WPA_DRIVER_CAPA_KEY_MGMT_WPA2 |
WPA_DRIVER_CAPA_KEY_MGMT_WPA2_PSK;
@@ -65,7 +150,7 @@
if (devcaps.dc_cryptocaps & IEEE80211_CRYPTO_WEP)
drv->capa.enc |= WPA_DRIVER_CAPA_ENC_WEP40 |
-@@ -1493,6 +1518,7 @@
+@@ -1493,6 +1549,7 @@
drv->capa.enc |= WPA_DRIVER_CAPA_ENC_TKIP;
if (devcaps.dc_cryptocaps & IEEE80211_CRYPTO_AES_CCM)
drv->capa.enc |= WPA_DRIVER_CAPA_ENC_CCMP;
@@ -73,7 +158,7 @@
if (devcaps.dc_drivercaps & IEEE80211_C_HOSTAP)
drv->capa.flags |= WPA_DRIVER_FLAGS_AP;
-@@ -1545,6 +1571,8 @@
+@@ -1545,6 +1602,8 @@
}
if (ifmr.ifm_current & IFM_IEEE80211_HOSTAP)
return IEEE80211_M_HOSTAP;