diff options
author | Ahmed ElArabawy <arabawy@google.com> | 2020-06-05 03:38:51 +0000 |
---|---|---|
committer | Android Partner Code Review <android-gerrit-partner@google.com> | 2020-06-05 03:38:51 +0000 |
commit | 9b2990fe21ccf1e31c34a927d6a860b86f0f0259 (patch) | |
tree | 2eb0ac92b094f0630ba61eadb2005bfeaba89db4 | |
parent | 8dba7140a9b55e2d4e7df8e5be25ccdefefcda99 (diff) | |
parent | ebe4b1f15fc06cf41339590a419c05e893ad111a (diff) | |
download | bcm43752-9b2990fe21ccf1e31c34a927d6a860b86f0f0259.tar.gz |
Merge "wifi: update: WPA3-SAE/external authenticator" into android-gs-pixel-4.19
-rw-r--r-- | bcmevent.c | 3 | ||||
-rw-r--r-- | dhd_common.c | 2 | ||||
-rw-r--r-- | dhd_linux.c | 3 | ||||
-rw-r--r-- | include/bcmevent.h | 1 | ||||
-rw-r--r-- | include/wlioctl.h | 1 | ||||
-rw-r--r-- | wl_cfg80211.c | 92 |
6 files changed, 61 insertions, 41 deletions
@@ -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 */ |