summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAhmed ElArabawy <arabawy@google.com>2020-06-05 03:38:51 +0000
committerAndroid Partner Code Review <android-gerrit-partner@google.com>2020-06-05 03:38:51 +0000
commit9b2990fe21ccf1e31c34a927d6a860b86f0f0259 (patch)
tree2eb0ac92b094f0630ba61eadb2005bfeaba89db4
parent8dba7140a9b55e2d4e7df8e5be25ccdefefcda99 (diff)
parentebe4b1f15fc06cf41339590a419c05e893ad111a (diff)
downloadbcm43752-9b2990fe21ccf1e31c34a927d6a860b86f0f0259.tar.gz
Merge "wifi: update: WPA3-SAE/external authenticator" into android-gs-pixel-4.19
-rw-r--r--bcmevent.c3
-rw-r--r--dhd_common.c2
-rw-r--r--dhd_linux.c3
-rw-r--r--include/bcmevent.h1
-rw-r--r--include/wlioctl.h1
-rw-r--r--wl_cfg80211.c92
6 files changed, 61 insertions, 41 deletions
diff --git a/bcmevent.c b/bcmevent.c
index dc42aff..6435175 100644
--- a/bcmevent.c
+++ b/bcmevent.c
@@ -208,9 +208,6 @@ static const bcmevent_name_str_t bcmevent_names[] = {
BCMEVENT_NAME(WLC_E_SC_CHAN_QUAL),
BCMEVENT_NAME(WLC_E_DYNSAR),
BCMEVENT_NAME(WLC_E_ROAM_CACHE_UPDATE),
-#ifdef WL_CLIENT_SAE
- BCMEVENT_NAME(WLC_E_START_AUTH)
-#endif /* WL_CLIENT_SAE */
};
const char *bcmevent_get_name(uint event_type)
diff --git a/dhd_common.c b/dhd_common.c
index 138354f..9b4faf1 100644
--- a/dhd_common.c
+++ b/dhd_common.c
@@ -3427,7 +3427,7 @@ wl_show_host_event(dhd_pub_t *dhd_pub, wl_event_msg_t *event, void *event_data,
DHD_EVENT(("MACEVENT: %s, MAC %s, reason %d\n", event_name, eabuf, (int)reason));
break;
- case WLC_E_START_AUTH:
+ case WLC_E_JOIN_START:
DHD_EVENT(("MACEVENT: %s, MAC %s, reason %d\n", event_name, eabuf, (int)reason));
break;
case WLC_E_AUTH:
diff --git a/dhd_linux.c b/dhd_linux.c
index ad46e5a..b91b902 100644
--- a/dhd_linux.c
+++ b/dhd_linux.c
@@ -12225,9 +12225,6 @@ dhd_legacy_preinit_ioctls(dhd_pub_t *dhd)
setbit(mask, WLC_E_ADDTS_IND);
setbit(mask, WLC_E_DELTS_IND);
#endif /* WL_BCNRECV */
-#ifdef WL_CLIENT_SAE
- setbit(eventmask_msg->mask, WLC_E_START_AUTH);
-#endif /* WL_CLIENT_SAE */
/* Write updated Event mask */
eventmask_msg->ver = EVENTMSGS_VER;
diff --git a/include/bcmevent.h b/include/bcmevent.h
index e3137c2..0743481 100644
--- a/include/bcmevent.h
+++ b/include/bcmevent.h
@@ -252,7 +252,6 @@ typedef union bcm_event_msg_u {
#define WLC_E_RRM 141 /* RRM Event */
#define WLC_E_PFN_SSID_EXT 142 /* SSID EXT event */
#define WLC_E_ROAM_EXP_EVENT 143 /* Expanded roam event */
-#define WLC_E_START_AUTH 145
#define WLC_E_ULP 146 /* ULP entered indication */
#define WLC_E_MACDBG 147 /* Ucode debugging event */
#define WLC_E_RESERVED 148 /* reserved */
diff --git a/include/wlioctl.h b/include/wlioctl.h
index 4410e95..19aafe9 100644
--- a/include/wlioctl.h
+++ b/include/wlioctl.h
@@ -17928,6 +17928,7 @@ enum wl_sae_auth_xtlv_id {
#define WL_ASSOC_MGR_CMD_PAUSE_ON_EVT 0 /* have assoc pause on certain events */
#define WL_ASSOC_MGR_CMD_ABORT_ASSOC 1
#define WL_ASSOC_MGR_CMD_SET_SAE_FRAME 2
+#define WL_ASSOC_MGR_CMD_SEND_AUTH 3
#define WL_ASSOC_MGR_PARAMS_EVENT_NONE 0 /* use this to resume as well as clear */
#define WL_ASSOC_MGR_PARAMS_PAUSE_EVENT_AUTH_RESP 1
diff --git a/wl_cfg80211.c b/wl_cfg80211.c
index a08374d..4e0f70f 100644
--- a/wl_cfg80211.c
+++ b/wl_cfg80211.c
@@ -9728,20 +9728,37 @@ wl_cfg80211_mgmt_tx(struct wiphy *wiphy, bcm_struct_cfgdev *cfgdev,
#ifdef WL_CLIENT_SAE
else if (ieee80211_is_auth(mgmt->frame_control)) {
int err = 0;
+ wl_assoc_mgr_cmd_t *cmd;
+ char *ambuf = NULL;
+ int param_len;
ack = true;
if ((dev == bcmcfg_to_prmry_ndev(cfg)) && cfg->p2p) {
bssidx = wl_to_p2p_bss_bssidx(cfg, P2PAPI_BSSCFG_DEVICE);
}
- WL_DBG(("call scb_auth IOVA, buf=%p, len=%lu\n", buf, len));
- err = wldev_iovar_setbuf(dev, "scb_auth", buf, len,
- cfg->ioctl_buf, WLC_IOCTL_MEDLEN, NULL);
- if (err < 0) {
- WL_ERR(("seting scb_auth failed code=%d\n", err));
+ param_len = sizeof(wl_assoc_mgr_cmd_t) + len;
+ ambuf = MALLOCZ(cfg->osh, param_len);
+ if (ambuf == NULL)
+ {
+ WL_ERR(("unable to allocate frame\n"));
+ return -ENOMEM;
+ }
+
+ cmd = (wl_assoc_mgr_cmd_t*)ambuf;
+ cmd->version = WL_ASSOC_MGR_CURRENT_VERSION;
+ cmd->length = len;
+ cmd->cmd = WL_ASSOC_MGR_CMD_SEND_AUTH;
+ memcpy(&cmd->params, buf, len);
+ err = wldev_iovar_setbuf(dev, "assoc_mgr_cmd", ambuf, param_len,
+ cfg->ioctl_buf, WLC_IOCTL_SMLEN, &cfg->ioctl_buf_sync);
+ if (unlikely(err)) {
+ WL_ERR(("%s: Failed to send auth(%d)\n", __func__, err));
ack = false;
}
+ MFREE(cfg->osh, ambuf, param_len);
+
cfg80211_mgmt_tx_status(cfgdev, *cookie, buf, len, ack, GFP_KERNEL);
goto exit;
}
@@ -13537,6 +13554,9 @@ wl_notify_start_auth(struct bcm_cfg80211 *cfg,
struct net_device *ndev = cfgdev_to_wlc_ndev(cfgdev, cfg);
u32 datalen = be32_to_cpu(e->datalen);
wl_ext_auth_evt_t *evt_data = (wl_ext_auth_evt_t *)data;
+ wl_assoc_mgr_cmd_t cmd;
+ struct wireless_dev *wdev = ndev->ieee80211_ptr;
+ int err, retry = 3;
WL_DBG(("Enter \n"));
@@ -13552,10 +13572,32 @@ wl_notify_start_auth(struct bcm_cfg80211 *cfg,
ext_auth_param.action = NL80211_EXTERNAL_AUTH_START;
ext_auth_param.key_mgmt_suite = ntoh32(WLAN_AKM_SUITE_SAE_SHA256);
- WL_DBG(("call cfg80211_external_auth_request, BSSID:"MACDBG"\n",
+ WL_INFORM_MEM(("call cfg80211_external_auth_request, BSSID:"MACDBG"\n",
MAC2STRDBG(&evt_data->bssid)));
- cfg80211_external_auth_request(ndev, &ext_auth_param, GFP_KERNEL);
+ /* Wait for conn_owner_nlportid been assigned in nl80211_connect */
+ for (retry = 3; retry > 0; retry--) {
+ if (wdev->conn_owner_nlportid)
+ break;
+
+ wl_delay(10);
+ }
+
+ err = cfg80211_external_auth_request(ndev, &ext_auth_param, GFP_KERNEL);
+ if (err) {
+ WL_ERR(("Send external auth request failed, ret %d\n", err));
+ return BCME_ERROR;
+ }
+
+ cmd.version = WL_ASSOC_MGR_CURRENT_VERSION;
+ cmd.length = sizeof(cmd);
+ cmd.cmd = WL_ASSOC_MGR_CMD_PAUSE_ON_EVT;
+ cmd.params = WL_ASSOC_MGR_PARAMS_PAUSE_EVENT_AUTH_RESP;
+ err = wldev_iovar_setbuf(ndev, "assoc_mgr_cmd", (void *)&cmd, sizeof(cmd), cfg->ioctl_buf,
+ WLC_IOCTL_SMLEN, &cfg->ioctl_buf_sync);
+ if (unlikely(err)) {
+ WL_ERR(("%s: Failed to pause assoc(%d)\n", __func__, err));
+ }
return BCME_OK;
}
@@ -17389,7 +17431,7 @@ static void wl_init_event_handler(struct bcm_cfg80211 *cfg)
cfg->evt_handler[WLC_E_BSS_LOAD] = wl_cfg80211_bssload_report_event_handler;
#endif /* WL_CHAN_UTIL */
#ifdef WL_CLIENT_SAE
- cfg->evt_handler[WLC_E_START_AUTH] = wl_notify_start_auth;
+ cfg->evt_handler[WLC_E_JOIN_START] = wl_notify_start_auth;
#endif /* WL_CLIENT_SAE */
}
@@ -17401,8 +17443,7 @@ wl_cfg80211_external_auth(struct wiphy *wiphy,
{
int err = 0;
struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
- gfp_t kflags;
- wl_ext_auth_evt_t *evt_data;
+ wl_assoc_mgr_cmd_t cmd;
WL_DBG(("Enter\n "));
@@ -17412,31 +17453,16 @@ wl_cfg80211_external_auth(struct wiphy *wiphy,
return -EINVAL;
}
- kflags = in_atomic() ? GFP_ATOMIC : GFP_KERNEL;
- evt_data = (wl_ext_auth_evt_t *)kzalloc(sizeof(wl_ext_auth_evt_t),
- kflags);
- if (!evt_data) {
- WL_ERR(("Failed to allocate external auth evt_data\n"));
- return -ENOMEM;
+ cmd.version = WL_ASSOC_MGR_CURRENT_VERSION;
+ cmd.length = sizeof(cmd);
+ cmd.cmd = WL_ASSOC_MGR_CMD_PAUSE_ON_EVT;
+ cmd.params = WL_ASSOC_MGR_PARAMS_EVENT_NONE;
+ err = wldev_iovar_setbuf(ndev, "assoc_mgr_cmd", (void *)&cmd, sizeof(cmd),
+ cfg->ioctl_buf, WLC_IOCTL_SMLEN, &cfg->ioctl_buf_sync);
+ if (unlikely(err)) {
+ WL_ERR(("%s: Failed to pause assoc(%d)\n", __func__, err));
}
- memcpy(&evt_data->ssid.SSID, &ext_auth_param->ssid.ssid,
- ext_auth_param->ssid.ssid_len);
- evt_data->ssid.SSID_len = ext_auth_param->ssid.ssid_len;
-
- memcpy(&evt_data->bssid, &ext_auth_param->bssid, ETHER_ADDR_LEN);
- evt_data->status = ext_auth_param->action;
-
- WL_DBG(("call scb_assoc, BSSID:" MACDBG "\n", MAC2STRDBG(&evt_data->bssid)));
-
- err = wldev_iovar_setbuf(ndev, "scb_assoc", evt_data, sizeof(wl_ext_auth_evt_t),
- cfg->ioctl_buf, WLC_IOCTL_MEDLEN, NULL);
- if (err < 0)
- WL_ERR(("seting scb_assoc failed code=%d\n", err));
-
- if (evt_data)
- kfree(evt_data);
-
return err;
}
#endif /* WL_CLIENT_SAE */