diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index 1c76121d4334..f4482edccf77 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -561,6 +561,19 @@ enum hdd_dot11_mode { * * This ini is used to enable or disable DFS channel * scan + */ +#define CFG_ENABLE_DFS_CHNL_SCAN_NAME "gEnableDFSChnlScan" +#define CFG_ENABLE_DFS_CHNL_SCAN_MIN (0) +#define CFG_ENABLE_DFS_CHNL_SCAN_MAX (1) +#define CFG_ENABLE_DFS_CHNL_SCAN_DEFAULT (1) + +/* + * + * pmkidModes - Enable PMKID modes + * This INI is used to enable PMKID feature options + * @Min: 0 + * @Max: 3 + * @Default: 3 * * Related: None * @@ -570,10 +583,12 @@ enum hdd_dot11_mode { * * */ -#define CFG_ENABLE_DFS_CHNL_SCAN_NAME "gEnableDFSChnlScan" -#define CFG_ENABLE_DFS_CHNL_SCAN_MIN (0) -#define CFG_ENABLE_DFS_CHNL_SCAN_MAX (1) -#define CFG_ENABLE_DFS_CHNL_SCAN_DEFAULT (1) +#define CFG_PMKID_MODES_NAME "pmkidModes" +#define CFG_PMKID_MODES_MIN (0x0) +#define CFG_PMKID_MODES_MAX (0x3) +#define CFG_PMKID_MODES_DEFAULT (0x3) +#define CFG_PMKID_MODES_OKC (0x1) +#define CFG_PMKID_MODES_PMKSA_CACHING (0x2) /* * @@ -10460,7 +10475,7 @@ struct hdd_config { bool isFastTransitionEnabled; uint8_t RoamRssiDiff; bool isWESModeEnabled; - bool isOkcIniFeatureEnabled; + uint32_t pmkid_modes; bool isRoamOffloadScanEnabled; bool bImplicitQosEnabled; @@ -11171,6 +11186,8 @@ QDF_STATUS hdd_execute_global_config_command(hdd_context_t *pHddCtx, bool hdd_is_okc_mode_enabled(hdd_context_t *pHddCtx); QDF_STATUS hdd_set_idle_ps_config(hdd_context_t *pHddCtx, uint32_t val); +void hdd_get_pmkid_modes(hdd_context_t *pHddCtx, + struct pmkid_mode_bits *pmkid_modes); void hdd_update_tgt_cfg(void *context, void *param); diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index d640eff5a3b7..36fc46c57dfa 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -1028,13 +1028,14 @@ struct reg_table_entry g_registry_table[] = { CFG_ENABLE_WES_MODE_NAME_MIN, CFG_ENABLE_WES_MODE_NAME_MAX, cb_notify_set_wes_mode, 0), - REG_VARIABLE(CFG_OKC_FEATURE_ENABLED_NAME, WLAN_PARAM_Integer, - struct hdd_config, isOkcIniFeatureEnabled, + REG_VARIABLE(CFG_PMKID_MODES_NAME, WLAN_PARAM_Integer, + struct hdd_config, pmkid_modes, VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, - CFG_OKC_FEATURE_ENABLED_DEFAULT, - CFG_OKC_FEATURE_ENABLED_MIN, - CFG_OKC_FEATURE_ENABLED_MAX), + CFG_PMKID_MODES_DEFAULT, + CFG_PMKID_MODES_MIN, + CFG_PMKID_MODES_MAX), + REG_DYNAMIC_VARIABLE(CFG_ROAM_SCAN_OFFLOAD_ENABLED, WLAN_PARAM_Integer, struct hdd_config, isRoamOffloadScanEnabled, VAR_FLAGS_OPTIONAL | @@ -5354,8 +5355,8 @@ void hdd_cfg_print(hdd_context_t *pHddCtx) pHddCtx->config->RoamRssiDiff); hdd_info("Name = [isWESModeEnabled] Value = [%u] ", pHddCtx->config->isWESModeEnabled); - hdd_info("Name = [OkcEnabled] Value = [%u] ", - pHddCtx->config->isOkcIniFeatureEnabled); + hdd_info("Name = [pmkidModes] Value = [0x%x] ", + pHddCtx->config->pmkid_modes); #ifdef FEATURE_WLAN_SCAN_PNO hdd_info("Name = [configPNOScanSupport] Value = [%u] ", pHddCtx->config->configPNOScanSupport); @@ -7602,18 +7603,18 @@ QDF_STATUS hdd_cfg_get_global_config(hdd_context_t *pHddCtx, char *pBuf, } /** - * hdd_is_okc_mode_enabled() - returns whether OKC mode is enabled or not + * hdd_get_pmkid_modes() - returns PMKID mode bits * @pHddCtx: the pointer to hdd context * - * Return: true if OKC is enabled, otherwise false + * Return: value of pmkid_modes */ -bool hdd_is_okc_mode_enabled(hdd_context_t *pHddCtx) +void hdd_get_pmkid_modes(hdd_context_t *pHddCtx, + struct pmkid_mode_bits *pmkid_modes) { - if (NULL == pHddCtx) { - hdd_alert("pHddCtx is NULL"); - return -EINVAL; - } - return pHddCtx->config->isOkcIniFeatureEnabled; + pmkid_modes->fw_okc = (pHddCtx->config->pmkid_modes & + CFG_PMKID_MODES_OKC) ? 1 : 0; + pmkid_modes->fw_pmksa_cache = (pHddCtx->config->pmkid_modes & + CFG_PMKID_MODES_PMKSA_CACHING) ? 1 : 0; } /** diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 4ccc55ac0558..0c55b0e3c997 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -4285,6 +4285,7 @@ static int __wlan_hdd_cfg80211_keymgmt_set_key(struct wiphy *wiphy, hdd_adapter_t *hdd_adapter_ptr = WLAN_HDD_GET_PRIV_PTR(dev); hdd_context_t *hdd_ctx_ptr; int status; + struct pmkid_mode_bits pmkid_modes; ENTER_DEV(dev); @@ -4308,10 +4309,13 @@ static int __wlan_hdd_cfg80211_keymgmt_set_key(struct wiphy *wiphy, status = wlan_hdd_validate_context(hdd_ctx_ptr); if (status) return status; + + hdd_get_pmkid_modes(hdd_ctx_ptr, &pmkid_modes); + sme_update_roam_key_mgmt_offload_enabled(hdd_ctx_ptr->hHal, hdd_adapter_ptr->sessionId, true, - hdd_is_okc_mode_enabled(hdd_ctx_ptr)); + &pmkid_modes); qdf_mem_zero(&local_pmk, SIR_ROAM_SCAN_PSK_SIZE); qdf_mem_copy(local_pmk, data, data_len); sme_roam_set_psk_pmk(WLAN_HDD_GET_HAL_CTX(hdd_adapter_ptr), @@ -13450,6 +13454,9 @@ int wlan_hdd_cfg80211_update_bss(struct wiphy *wiphy, * @preauth: Preauth flag * * This function is used to notify the supplicant of a new PMKSA candidate. + * PMK value is notified to supplicant whether PMK caching or OKC is enabled + * in firmware or not. Supplicant needs this value becaue it uses PMK caching + * by default. * * Return: 0 for success, non-zero for failure */ @@ -13458,7 +13465,6 @@ int wlan_hdd_cfg80211_pmksa_candidate_notify(hdd_adapter_t *pAdapter, int index, bool preauth) { struct net_device *dev = pAdapter->dev; - hdd_context_t *pHddCtx = (hdd_context_t *) pAdapter->pHddCtx; ENTER(); hdd_debug("is going to notify supplicant of:"); @@ -13468,13 +13474,11 @@ int wlan_hdd_cfg80211_pmksa_candidate_notify(hdd_adapter_t *pAdapter, return -EINVAL; } - if (true == hdd_is_okc_mode_enabled(pHddCtx)) { - hdd_notice(MAC_ADDRESS_STR, - MAC_ADDR_ARRAY(pRoamInfo->bssid.bytes)); - cfg80211_pmksa_candidate_notify(dev, index, - pRoamInfo->bssid.bytes, - preauth, GFP_KERNEL); - } + hdd_notice(MAC_ADDRESS_STR, + MAC_ADDR_ARRAY(pRoamInfo->bssid.bytes)); + cfg80211_pmksa_candidate_notify(dev, index, + pRoamInfo->bssid.bytes, + preauth, GFP_KERNEL); return 0; } diff --git a/core/hdd/src/wlan_hdd_ioctl.c b/core/hdd/src/wlan_hdd_ioctl.c index ba76227ad1f3..ad0595bc6371 100644 --- a/core/hdd/src/wlan_hdd_ioctl.c +++ b/core/hdd/src/wlan_hdd_ioctl.c @@ -3404,15 +3404,17 @@ static int drv_cmd_get_ccx_mode(hdd_adapter_t *adapter, bool eseMode = sme_get_is_ese_feature_enabled(hdd_ctx->hHal); char extra[32]; uint8_t len = 0; + struct pmkid_mode_bits pmkid_modes; + hdd_get_pmkid_modes(hdd_ctx, &pmkid_modes); /* - * Check if the features OKC/ESE/11R are supported simultaneously, + * Check if the features PMKID/ESE/11R are supported simultaneously, * then this operation is not permitted (return FAILURE) */ if (eseMode && - hdd_is_okc_mode_enabled(hdd_ctx) && + (pmkid_modes.fw_okc || pmkid_modes.fw_pmksa_cache) && sme_get_is_ft_feature_enabled(hdd_ctx->hHal)) { - hdd_warn("OKC/ESE/11R are supported simultaneously hence this operation is not permitted!"); + hdd_warn("PMKID/ESE/11R are supported simultaneously hence this operation is not permitted!"); ret = -EPERM; goto exit; } @@ -3437,24 +3439,25 @@ static int drv_cmd_get_okc_mode(hdd_adapter_t *adapter, hdd_priv_data_t *priv_data) { int ret = 0; - bool okcMode = hdd_is_okc_mode_enabled(hdd_ctx); + struct pmkid_mode_bits pmkid_modes; char extra[32]; uint8_t len = 0; + hdd_get_pmkid_modes(hdd_ctx, &pmkid_modes); /* * Check if the features OKC/ESE/11R are supported simultaneously, * then this operation is not permitted (return FAILURE) */ - if (okcMode && + if (pmkid_modes.fw_okc && sme_get_is_ese_feature_enabled(hdd_ctx->hHal) && sme_get_is_ft_feature_enabled(hdd_ctx->hHal)) { - hdd_warn("OKC/ESE/11R are supported simultaneously hence this operation is not permitted!"); + hdd_warn("PMKID/ESE/11R are supported simultaneously hence this operation is not permitted!"); ret = -EPERM; goto exit; } len = scnprintf(extra, sizeof(extra), "%s %d", - "GETOKCMODE", okcMode); + "GETOKCMODE", pmkid_modes.fw_okc); len = QDF_MIN(priv_data->total_len, len + 1); if (copy_to_user(priv_data->buf, &extra, len)) { @@ -4393,16 +4396,19 @@ static int drv_cmd_set_okc_mode(hdd_adapter_t *adapter, { int ret = 0; uint8_t *value = command; - uint8_t okcMode = CFG_OKC_FEATURE_ENABLED_DEFAULT; + uint32_t okc_mode; + struct pmkid_mode_bits pmkid_modes; + + hdd_get_pmkid_modes(hdd_ctx, &pmkid_modes); /* - * Check if the features OKC/ESE/11R are supported simultaneously, + * Check if the features PMKID/ESE/11R are supported simultaneously, * then this operation is not permitted (return FAILURE) */ if (sme_get_is_ese_feature_enabled(hdd_ctx->hHal) && - hdd_is_okc_mode_enabled(hdd_ctx) && + pmkid_modes.fw_okc && sme_get_is_ft_feature_enabled(hdd_ctx->hHal)) { - hdd_warn("OKC/ESE/11R are supported simultaneously hence this operation is not permitted!"); + hdd_warn("PMKID/ESE/11R are supported simultaneously hence this operation is not permitted!"); ret = -EPERM; goto exit; } @@ -4410,33 +4416,35 @@ static int drv_cmd_set_okc_mode(hdd_adapter_t *adapter, /* Move pointer to ahead of SETOKCMODE */ value = value + command_len + 1; + /* get the current configured value */ + okc_mode = hdd_ctx->config->pmkid_modes & CFG_PMKID_MODES_OKC; + /* Convert the value from ascii to integer */ - ret = kstrtou8(value, 10, &okcMode); + ret = kstrtou32(value, 10, &okc_mode); if (ret < 0) { /* * If the input value is greater than max value of datatype, * then also kstrtou8 fails */ - hdd_err("kstrtou8 failed range [%d - %d]", - CFG_OKC_FEATURE_ENABLED_MIN, - CFG_OKC_FEATURE_ENABLED_MAX); + hdd_err("value out of range [0 - 1]"); ret = -EINVAL; goto exit; } - if ((okcMode < CFG_OKC_FEATURE_ENABLED_MIN) || - (okcMode > CFG_OKC_FEATURE_ENABLED_MAX)) { - hdd_err("Okc mode value %d is out of range (Min: %d Max: %d)", - okcMode, - CFG_OKC_FEATURE_ENABLED_MIN, - CFG_OKC_FEATURE_ENABLED_MAX); + if ((okc_mode < 0) || + (okc_mode > 1)) { + hdd_err("Okc mode value %d is out of range (Min: 0 Max: 1)", + okc_mode); ret = -EINVAL; goto exit; } hdd_debug("Received Command to change okc mode = %d", - okcMode); + okc_mode); - hdd_ctx->config->isOkcIniFeatureEnabled = okcMode; + if (okc_mode) + hdd_ctx->config->pmkid_modes |= CFG_PMKID_MODES_OKC; + else + hdd_ctx->config->pmkid_modes &= ~CFG_PMKID_MODES_OKC; exit: return ret; @@ -5491,13 +5499,15 @@ static int drv_cmd_set_ccx_mode(hdd_adapter_t *adapter, int ret = 0; uint8_t *value = command; uint8_t eseMode = CFG_ESE_FEATURE_ENABLED_DEFAULT; + struct pmkid_mode_bits pmkid_modes; + hdd_get_pmkid_modes(hdd_ctx, &pmkid_modes); /* * Check if the features OKC/ESE/11R are supported simultaneously, * then this operation is not permitted (return FAILURE) */ if (sme_get_is_ese_feature_enabled(hdd_ctx->hHal) && - hdd_is_okc_mode_enabled(hdd_ctx) && + pmkid_modes.fw_okc && sme_get_is_ft_feature_enabled(hdd_ctx->hHal)) { hdd_warn("OKC/ESE/11R are supported simultaneously hence this operation is not permitted!"); ret = -EPERM; diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 8e34aa36148b..c7f58808591a 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -2963,6 +2963,18 @@ struct roam_ext_params { int traffic_threshold; }; +/** + * struct pmkid_mode_bits - Bit flags for PMKID usage in RSN IE + * @fw_okc: Opportunistic key caching enable in firmware + * @fw_pmksa_cache: PMKSA caching enable in firmware, remember previously + * visited BSSID/PMK pairs + */ +struct pmkid_mode_bits { + uint32_t fw_okc:1; + uint32_t fw_pmksa_cache:1; + uint32_t unused:30; +}; + typedef struct sSirRoamOffloadScanReq { uint16_t message_type; uint16_t length; @@ -3007,7 +3019,7 @@ typedef struct sSirRoamOffloadScanReq { uint8_t R0KH_ID[SIR_ROAM_R0KH_ID_MAX_LEN]; uint32_t R0KH_ID_Length; uint8_t RoamKeyMgmtOffloadEnabled; - bool okc_enabled; + struct pmkid_mode_bits pmkid_modes; #endif struct roam_ext_params roam_params; uint8_t middle_of_roaming; diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h index ded4457243e3..4665b2489f11 100644 --- a/core/sme/inc/csr_internal.h +++ b/core/sme/inc/csr_internal.h @@ -955,7 +955,7 @@ typedef struct tagCsrRoamSession { size_t pmk_len; uint8_t RoamKeyMgmtOffloadEnabled; roam_offload_synch_ind *roam_synch_data; - bool okc_enabled; + struct pmkid_mode_bits pmkid_modes; #endif tftSMEContext ftSmeContext; /* This count represents the number of bssid's we try to join. */ diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index 98b940ed7839..f0d69fc3a1b9 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -908,7 +908,7 @@ QDF_STATUS sme_update_roam_offload_enabled(tHalHandle hHal, QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(tHalHandle hal_ctx, uint8_t session_id, bool key_mgmt_offload_enabled, - bool okc_enabled); + struct pmkid_mode_bits *pmkid_modes); #endif #ifdef WLAN_FEATURE_NAN QDF_STATUS sme_nan_event(tHalHandle hHal, void *pMsg); diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index d7b74bb0048f..60dcbed2ec30 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -13342,15 +13342,15 @@ QDF_STATUS sme_update_roam_offload_enabled(tHalHandle hHal, * @hal_ctx: The handle returned by mac_open. * @session_id: Session Identifier * @key_mgmt_offload_enabled: key mgmt enable/disable flag - * @okc_enabled: Opportunistic key caching enable/disable flag + * @pmkid_modes: PMKID modes of PMKSA caching and OKC * Return: QDF_STATUS_SUCCESS - SME updated config successfully. * Other status means SME is failed to update. */ QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(tHalHandle hal_ctx, - uint8_t session_id, - bool key_mgmt_offload_enabled, - bool okc_enabled) + uint8_t session_id, + bool key_mgmt_offload_enabled, + struct pmkid_mode_bits *pmkid_modes) { tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal_ctx); QDF_STATUS status = QDF_STATUS_SUCCESS; @@ -13364,7 +13364,7 @@ QDF_STATUS sme_update_roam_key_mgmt_offload_enabled(tHalHandle hal_ctx, status = csr_roam_set_key_mgmt_offload(mac_ctx, session_id, key_mgmt_offload_enabled, - okc_enabled); + pmkid_modes); } else { status = QDF_STATUS_E_INVAL; } diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index d7338d60ed38..50d660956d68 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -16920,7 +16920,7 @@ QDF_STATUS csr_get_statistics(tpAniSirGlobal pMac, * @mac_ctx: mac context. * @session_id: Session Identifier * @roam_key_mgmt_offload_enabled: key mgmt enable/disable flag - * @okc_enabled: Opportunistic key caching enable/disable flag + * @pmkid_modes: PMKID modes of PMKSA caching and OKC * * Return: QDF_STATUS_SUCCESS - CSR updated config successfully. * Other status means CSR is failed to update. @@ -16929,7 +16929,7 @@ QDF_STATUS csr_get_statistics(tpAniSirGlobal pMac, QDF_STATUS csr_roam_set_key_mgmt_offload(tpAniSirGlobal mac_ctx, uint32_t session_id, bool roam_key_mgmt_offload_enabled, - bool okc_enabled) + struct pmkid_mode_bits *pmkid_modes) { tCsrRoamSession *session = CSR_GET_SESSION(mac_ctx, session_id); @@ -16938,7 +16938,8 @@ QDF_STATUS csr_roam_set_key_mgmt_offload(tpAniSirGlobal mac_ctx, return QDF_STATUS_E_FAILURE; } session->RoamKeyMgmtOffloadEnabled = roam_key_mgmt_offload_enabled; - session->okc_enabled = okc_enabled; + session->pmkid_modes.fw_okc = pmkid_modes->fw_okc; + session->pmkid_modes.fw_pmksa_cache = pmkid_modes->fw_pmksa_cache; return QDF_STATUS_SUCCESS; } @@ -17517,7 +17518,7 @@ csr_create_roam_scan_offload_request(tpAniSirGlobal mac_ctx, #ifdef WLAN_FEATURE_ROAM_OFFLOAD req_buf->RoamOffloadEnabled = csr_roamIsRoamOffloadEnabled(mac_ctx); req_buf->RoamKeyMgmtOffloadEnabled = session->RoamKeyMgmtOffloadEnabled; - req_buf->okc_enabled = session->okc_enabled; + req_buf->pmkid_modes = session->pmkid_modes; /* Roam Offload piggybacks upon the Roam Scan offload command. */ if (req_buf->RoamOffloadEnabled) csr_update_roam_scan_offload_request(mac_ctx, req_buf, session); diff --git a/core/sme/src/csr/csr_inside_api.h b/core/sme/src/csr/csr_inside_api.h index e2c23282c836..17ae441881a4 100644 --- a/core/sme/src/csr/csr_inside_api.h +++ b/core/sme/src/csr/csr_inside_api.h @@ -777,7 +777,7 @@ QDF_STATUS csr_roam_set_psk_pmk(tpAniSirGlobal pMac, uint32_t sessionId, QDF_STATUS csr_roam_set_key_mgmt_offload(tpAniSirGlobal mac_ctx, uint32_t session_id, bool roam_key_mgmt_offload_enabled, - bool okc_enabled); + struct pmkid_mode_bits *pmkid_modes); #endif /* --------------------------------------------------------------------------- \fn csr_roam_get_wpa_rsn_req_ie diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 9016a23ee3d0..3236274ee648 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -809,7 +809,8 @@ QDF_STATUS wma_roam_scan_offload_mode(tp_wma_handle wma_handle, roam_req->RoamKeyMgmtOffloadEnabled; wma_roam_scan_fill_self_caps(wma_handle, ¶ms->roam_offload_params, roam_req); - params->okc_enabled = roam_req->okc_enabled; + params->fw_okc = roam_req->pmkid_modes.fw_okc; + params->fw_pmksa_cache = roam_req->pmkid_modes.fw_pmksa_cache; #endif params->is_ese_assoc = roam_req->IsESEAssoc; params->mdid.mdie_present = roam_req->MDID.mdiePresent;