From 37ecea438191f24b27c233ac38a40bdaa493fcc3 Mon Sep 17 00:00:00 2001 From: Jeff Johnson Date: Sun, 18 Mar 2018 17:54:40 -0700 Subject: [PATCH] qcacld-3.0: Update auth key mgmt semantics Currently HDD maintains an auth key management bitmap as field authKeyMgmt in struct hdd_wext_state utilizing bitmaps defined by wireless.h. This current implementation suffers from the following issues: - The implementation is independent of wireless extensions so it should not use wireless.h definitons or be stored in a wext-related data structure. - The name uses camelCase which is inconsistent with the Linux coding style. To address these issues define a new set of bitmps along with a properly named field located in struct hdd_station_ctx. Change-Id: I0d1c66236f88b7e6486b2d03c3383ef38f80c134 CRs-Fixed: 2207904 --- core/hdd/inc/wlan_hdd_main.h | 14 +++++++++ core/hdd/inc/wlan_hdd_wext.h | 3 -- core/hdd/src/wlan_hdd_assoc.c | 54 ++++++++++++++------------------ core/hdd/src/wlan_hdd_cfg80211.c | 54 +++++++++++++++----------------- core/hdd/src/wlan_hdd_wext.c | 5 +-- 5 files changed, 63 insertions(+), 67 deletions(-) diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index a6a52a3d0da5..47f809c34a20 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -385,6 +385,18 @@ extern struct mutex hdd_init_deinit_lock; #define NUM_TX_RX_HISTOGRAM 128 #define NUM_TX_RX_HISTOGRAM_MASK (NUM_TX_RX_HISTOGRAM - 1) +/** + * enum hdd_auth_key_mgmt - auth key mgmt protocols + * @HDD_AUTH_KEY_MGMT_802_1X: 802.1x + * @HDD_AUTH_KEY_MGMT_PSK: PSK + * @HDD_AUTH_KEY_MGMT_CCKM: CCKM + */ +enum hdd_auth_key_mgmt { + HDD_AUTH_KEY_MGMT_802_1X = BIT(0), + HDD_AUTH_KEY_MGMT_PSK = BIT(1), + HDD_AUTH_KEY_MGMT_CCKM = BIT(2) +}; + /** * struct hdd_tx_rx_histogram - structure to keep track of tx and rx packets * received over 100ms intervals @@ -683,6 +695,7 @@ struct hdd_mon_set_ch_info { * struct hdd_station_ctx -- STA-specific information * @wext_state: wireless extensions state * @wpa_versions: bitmap of supported WPA versions + * @auth_key_mgmt: bitmap of supported auth key mgmt protocols * @requested_bssid: Specific BSSID to which to connect * @conn_info: current connection information * @roam_info: current roaming information @@ -705,6 +718,7 @@ struct hdd_mon_set_ch_info { struct hdd_station_ctx { struct hdd_wext_state wext_state; enum nl80211_wpa_versions wpa_versions; + enum hdd_auth_key_mgmt auth_key_mgmt; struct qdf_mac_addr requested_bssid; struct hdd_connection_info conn_info; struct hdd_connection_info cache_conn_info; diff --git a/core/hdd/inc/wlan_hdd_wext.h b/core/hdd/inc/wlan_hdd_wext.h index eba2d8031ccb..c5e696e85a30 100644 --- a/core/hdd/inc/wlan_hdd_wext.h +++ b/core/hdd/inc/wlan_hdd_wext.h @@ -212,9 +212,6 @@ struct hdd_wext_state { /**Additional IE for assoc */ tSirAddie assocAddIE; - - /**auth key mgmt */ - int32_t authKeyMgmt; }; struct ccp_freq_chan_map { diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 710f15e575ea..3bf0e020eed7 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -5292,10 +5292,9 @@ int hdd_set_csr_auth_type(struct hdd_adapter *adapter, eCsrAuthType RSNAuthType) { struct csr_roam_profile *roam_profile; - struct hdd_wext_state *pWextState = - WLAN_HDD_GET_WEXT_STATE_PTR(adapter); struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); + enum hdd_auth_key_mgmt key_mgmt = sta_ctx->auth_key_mgmt; roam_profile = hdd_roam_profile(adapter); roam_profile->AuthType.numEntries = 1; @@ -5317,8 +5316,8 @@ int hdd_set_csr_auth_type(struct hdd_adapter *adapter, #ifdef FEATURE_WLAN_ESE if ((RSNAuthType == eCSR_AUTH_TYPE_CCKM_WPA) && - ((pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) - == IW_AUTH_KEY_MGMT_802_1X)) { + ((key_mgmt & HDD_AUTH_KEY_MGMT_802_1X) + == HDD_AUTH_KEY_MGMT_802_1X)) { hdd_debug("set authType to CCKM WPA. AKM also 802.1X."); roam_profile->AuthType.authType[0] = eCSR_AUTH_TYPE_CCKM_WPA; @@ -5328,14 +5327,13 @@ int hdd_set_csr_auth_type(struct hdd_adapter *adapter, eCSR_AUTH_TYPE_CCKM_WPA; } else #endif - if ((pWextState-> - authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) - == IW_AUTH_KEY_MGMT_802_1X) { + if ((key_mgmt & HDD_AUTH_KEY_MGMT_802_1X) + == HDD_AUTH_KEY_MGMT_802_1X) { roam_profile->AuthType.authType[0] = eCSR_AUTH_TYPE_WPA; } else - if ((pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_PSK) - == IW_AUTH_KEY_MGMT_PSK) { + if ((key_mgmt & HDD_AUTH_KEY_MGMT_PSK) + == HDD_AUTH_KEY_MGMT_PSK) { roam_profile->AuthType.authType[0] = eCSR_AUTH_TYPE_WPA_PSK; } else { @@ -5346,8 +5344,8 @@ int hdd_set_csr_auth_type(struct hdd_adapter *adapter, if (sta_ctx->wpa_versions & NL80211_WPA_VERSION_2) { #ifdef FEATURE_WLAN_ESE if ((RSNAuthType == eCSR_AUTH_TYPE_CCKM_RSN) && - ((pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) - == IW_AUTH_KEY_MGMT_802_1X)) { + ((key_mgmt & HDD_AUTH_KEY_MGMT_802_1X) + == HDD_AUTH_KEY_MGMT_802_1X)) { hdd_debug("set authType to CCKM RSN. AKM also 802.1X."); roam_profile->AuthType.authType[0] = eCSR_AUTH_TYPE_CCKM_RSN; @@ -5361,16 +5359,14 @@ int hdd_set_csr_auth_type(struct hdd_adapter *adapter, roam_profile->AuthType.authType[0] = eCSR_AUTH_TYPE_DPP_RSN; } else if ((RSNAuthType == eCSR_AUTH_TYPE_FT_RSN) && - ((pWextState-> - authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) - == IW_AUTH_KEY_MGMT_802_1X)) { + ((key_mgmt & HDD_AUTH_KEY_MGMT_802_1X) + == HDD_AUTH_KEY_MGMT_802_1X)) { roam_profile->AuthType.authType[0] = eCSR_AUTH_TYPE_FT_RSN; } else if ((RSNAuthType == eCSR_AUTH_TYPE_FT_RSN_PSK) && - ((pWextState-> - authKeyMgmt & IW_AUTH_KEY_MGMT_PSK) - == IW_AUTH_KEY_MGMT_PSK)) { + ((key_mgmt & HDD_AUTH_KEY_MGMT_PSK) + == HDD_AUTH_KEY_MGMT_PSK)) { roam_profile->AuthType.authType[0] = eCSR_AUTH_TYPE_FT_RSN_PSK; } else @@ -5393,36 +5389,32 @@ int hdd_set_csr_auth_type(struct hdd_adapter *adapter, RSNAuthType); } else if ((RSNAuthType == eCSR_AUTH_TYPE_OWE) && - ((pWextState-> - authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) - == IW_AUTH_KEY_MGMT_802_1X)) { + ((key_mgmt & HDD_AUTH_KEY_MGMT_802_1X) + == HDD_AUTH_KEY_MGMT_802_1X)) { /* OWE case */ roam_profile->AuthType.authType[0] = eCSR_AUTH_TYPE_OWE; } else if ((RSNAuthType == eCSR_AUTH_TYPE_SUITEB_EAP_SHA256) && - ((pWextState-> - authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) - == IW_AUTH_KEY_MGMT_802_1X)) { + ((key_mgmt & HDD_AUTH_KEY_MGMT_802_1X) + == HDD_AUTH_KEY_MGMT_802_1X)) { /* Suite B EAP SHA 256 */ roam_profile->AuthType.authType[0] = eCSR_AUTH_TYPE_SUITEB_EAP_SHA256; } else if ((RSNAuthType == eCSR_AUTH_TYPE_SUITEB_EAP_SHA384) && - ((pWextState-> - authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) - == IW_AUTH_KEY_MGMT_802_1X)) { + ((key_mgmt & HDD_AUTH_KEY_MGMT_802_1X) + == HDD_AUTH_KEY_MGMT_802_1X)) { /* Suite B EAP SHA 384 */ roam_profile->AuthType.authType[0] = eCSR_AUTH_TYPE_SUITEB_EAP_SHA384; - } else if ((pWextState-> - authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) - == IW_AUTH_KEY_MGMT_802_1X) { + } else if ((key_mgmt & HDD_AUTH_KEY_MGMT_802_1X) + == HDD_AUTH_KEY_MGMT_802_1X) { roam_profile->AuthType.authType[0] = eCSR_AUTH_TYPE_RSN; } else - if ((pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_PSK) - == IW_AUTH_KEY_MGMT_PSK) { + if ((key_mgmt & HDD_AUTH_KEY_MGMT_PSK) + == HDD_AUTH_KEY_MGMT_PSK) { roam_profile->AuthType.authType[0] = eCSR_AUTH_TYPE_RSN_PSK; } else { diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index a703c9b94354..96cd3bc0e55c 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -16607,8 +16607,6 @@ static int __wlan_hdd_cfg80211_add_key(struct wiphy *wiphy, } else if ((adapter->device_mode == QDF_STA_MODE) || (adapter->device_mode == QDF_P2P_CLIENT_MODE)) { - struct hdd_wext_state *pWextState = - WLAN_HDD_GET_WEXT_STATE_PTR(adapter); struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); struct csr_roam_profile *roam_profile; @@ -16662,8 +16660,8 @@ static int __wlan_hdd_cfg80211_add_key(struct wiphy *wiphy, * group key with correct value */ if ((eCSR_BSS_TYPE_START_IBSS == roam_profile->BSSType) && - !((IW_AUTH_KEY_MGMT_802_1X == - (pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X)) + !((HDD_AUTH_KEY_MGMT_802_1X == + (sta_ctx->auth_key_mgmt & HDD_AUTH_KEY_MGMT_802_1X)) && (eCSR_AUTH_TYPE_OPEN_SYSTEM == sta_ctx->conn_info.authType) ) @@ -18351,8 +18349,7 @@ static bool wlan_hdd_is_conn_type_fils(struct cfg80211_connect_params *req) */ static int wlan_hdd_set_akm_suite(struct hdd_adapter *adapter, u32 key_mgmt) { - struct hdd_wext_state *pWextState = - WLAN_HDD_GET_WEXT_STATE_PTR(adapter); + struct hdd_station_ctx *sta_ctx; struct csr_roam_profile *roam_profile; roam_profile = hdd_roam_profile(adapter); @@ -18366,6 +18363,9 @@ static int wlan_hdd_set_akm_suite(struct hdd_adapter *adapter, u32 key_mgmt) #ifndef WLAN_AKM_SUITE_PSK_SHA256 #define WLAN_AKM_SUITE_PSK_SHA256 0x000FAC06 #endif + + sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); + /*set key mgmt type */ switch (key_mgmt) { case WLAN_AKM_SUITE_PSK: @@ -18373,21 +18373,20 @@ static int wlan_hdd_set_akm_suite(struct hdd_adapter *adapter, u32 key_mgmt) case WLAN_AKM_SUITE_FT_PSK: case WLAN_AKM_SUITE_DPP_RSN: hdd_debug("setting key mgmt type to PSK"); - pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_PSK; + sta_ctx->auth_key_mgmt |= HDD_AUTH_KEY_MGMT_PSK; break; case WLAN_AKM_SUITE_8021X_SHA256: case WLAN_AKM_SUITE_8021X: case WLAN_AKM_SUITE_FT_8021X: hdd_debug("setting key mgmt type to 8021x"); - pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_802_1X; + sta_ctx->auth_key_mgmt |= HDD_AUTH_KEY_MGMT_802_1X; break; #ifdef FEATURE_WLAN_ESE #define WLAN_AKM_SUITE_CCKM 0x00409600 /* Should be in ieee802_11_defs.h */ -#define IW_AUTH_KEY_MGMT_CCKM 8 /* Should be in linux/wireless.h */ case WLAN_AKM_SUITE_CCKM: hdd_debug("setting key mgmt type to CCKM"); - pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_CCKM; + sta_ctx->auth_key_mgmt |= HDD_AUTH_KEY_MGMT_CCKM; break; #endif #ifndef WLAN_AKM_SUITE_OSEN @@ -18395,35 +18394,35 @@ static int wlan_hdd_set_akm_suite(struct hdd_adapter *adapter, u32 key_mgmt) #endif case WLAN_AKM_SUITE_OSEN: hdd_debug("setting key mgmt type to OSEN"); - pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_802_1X; + sta_ctx->auth_key_mgmt |= HDD_AUTH_KEY_MGMT_802_1X; break; #if defined(WLAN_FEATURE_FILS_SK) && \ (defined(CFG80211_FILS_SK_OFFLOAD_SUPPORT) || \ (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0))) case WLAN_AKM_SUITE_FILS_SHA256: hdd_debug("setting key mgmt type to FILS SHA256"); - pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_802_1X; + sta_ctx->auth_key_mgmt |= HDD_AUTH_KEY_MGMT_802_1X; roam_profile->fils_con_info->akm_type = eCSR_AUTH_TYPE_FILS_SHA256; break; case WLAN_AKM_SUITE_FILS_SHA384: hdd_debug("setting key mgmt type to FILS SHA384"); - pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_802_1X; + sta_ctx->auth_key_mgmt |= HDD_AUTH_KEY_MGMT_802_1X; roam_profile->fils_con_info->akm_type = eCSR_AUTH_TYPE_FILS_SHA384; break; case WLAN_AKM_SUITE_FT_FILS_SHA256: hdd_debug("setting key mgmt type to FILS FT SHA256"); - pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_802_1X; + sta_ctx->auth_key_mgmt |= HDD_AUTH_KEY_MGMT_802_1X; roam_profile->fils_con_info->akm_type = eCSR_AUTH_TYPE_FT_FILS_SHA256; break; case WLAN_AKM_SUITE_FT_FILS_SHA384: hdd_debug("setting key mgmt type to FILS FT SHA384"); - pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_802_1X; + sta_ctx->auth_key_mgmt |= HDD_AUTH_KEY_MGMT_802_1X; roam_profile->fils_con_info->akm_type = eCSR_AUTH_TYPE_FT_FILS_SHA384; break; @@ -18431,21 +18430,21 @@ static int wlan_hdd_set_akm_suite(struct hdd_adapter *adapter, u32 key_mgmt) case WLAN_AKM_SUITE_OWE: hdd_debug("setting key mgmt type to OWE"); - pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_802_1X; + sta_ctx->auth_key_mgmt |= HDD_AUTH_KEY_MGMT_802_1X; break; case WLAN_AKM_SUITE_EAP_SHA256: hdd_debug("setting key mgmt type to EAP_SHA256"); - pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_802_1X; + sta_ctx->auth_key_mgmt |= HDD_AUTH_KEY_MGMT_802_1X; break; case WLAN_AKM_SUITE_EAP_SHA384: hdd_debug("setting key mgmt type to EAP_SHA384"); - pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_802_1X; + sta_ctx->auth_key_mgmt |= HDD_AUTH_KEY_MGMT_802_1X; break; case WLAN_AKM_SUITE_SAE: hdd_debug("setting key mgmt type to SAE"); - pWextState->authKeyMgmt |= IW_AUTH_KEY_MGMT_802_1X; + sta_ctx->auth_key_mgmt |= HDD_AUTH_KEY_MGMT_802_1X; break; default: @@ -19028,8 +19027,6 @@ static int wlan_hdd_cfg80211_set_privacy(struct hdd_adapter *adapter, struct cfg80211_connect_params *req) { int status = 0; - struct hdd_wext_state *pWextState = - WLAN_HDD_GET_WEXT_STATE_PTR(adapter); struct hdd_station_ctx *sta_ctx; struct csr_roam_profile *roam_profile; @@ -19109,15 +19106,14 @@ static int wlan_hdd_cfg80211_set_privacy(struct hdd_adapter *adapter, if (req->key && req->key_len) { u8 key_len = req->key_len; u8 key_idx = req->key_idx; + u32 cipher = req->crypto.ciphers_pairwise[0]; - if ((WLAN_CIPHER_SUITE_WEP40 == req->crypto.ciphers_pairwise[0]) - || (WLAN_CIPHER_SUITE_WEP104 == - req->crypto.ciphers_pairwise[0]) - ) { - if (IW_AUTH_KEY_MGMT_802_1X - == - (pWextState-> - authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X)) { + if ((WLAN_CIPHER_SUITE_WEP40 == cipher) || + (WLAN_CIPHER_SUITE_WEP104 == cipher)) { + enum hdd_auth_key_mgmt key_mgmt = + sta_ctx->auth_key_mgmt; + + if (key_mgmt & HDD_AUTH_KEY_MGMT_802_1X) { hdd_err("Dynamic WEP not supported"); return -EOPNOTSUPP; } diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c index e63b18cc607a..fbdfbe597059 100644 --- a/core/hdd/src/wlan_hdd_wext.c +++ b/core/hdd/src/wlan_hdd_wext.c @@ -4086,8 +4086,6 @@ int wlan_hdd_get_peer_info(struct hdd_adapter *adapter, void hdd_clear_roam_profile_ie(struct hdd_adapter *adapter) { struct hdd_station_ctx *sta_ctx; - struct hdd_wext_state *pWextState = - WLAN_HDD_GET_WEXT_STATE_PTR(adapter); struct csr_roam_profile *roam_profile; hdd_enter(); @@ -4132,8 +4130,6 @@ void hdd_clear_roam_profile_ie(struct hdd_adapter *adapter) roam_profile->MFPCapable = 0; #endif - pWextState->authKeyMgmt = 0; - qdf_mem_zero(roam_profile->Keys.KeyLength, CSR_MAX_NUM_KEY); #ifdef FEATURE_WLAN_WAPI @@ -4142,6 +4138,7 @@ void hdd_clear_roam_profile_ie(struct hdd_adapter *adapter) #endif sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); + sta_ctx->auth_key_mgmt = 0; qdf_zero_macaddr(&sta_ctx->requested_bssid); hdd_exit(); }