qcacld-3.0: Clear same pmk info while processing del/flush pmk
Clear sae_single_pmk info while processing del/flush pmk command from supplicant, if required. Change-Id: Idd974822ef0426461cd9971e54d8244d64b246b5 CRs-Fixed: 2616036
This commit is contained in:
@@ -2335,6 +2335,15 @@ wlan_mlme_update_sae_single_pmk(struct wlan_objmgr_vdev *vdev,
|
||||
void
|
||||
wlan_mlme_get_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_mlme_sae_single_pmk *pmksa);
|
||||
/**
|
||||
* wlan_mlme_clear_sae_single_pmk_info - API to clear mlme_pmkid_info ap caps
|
||||
* @vdev: vdev object
|
||||
* @pmk : pmk info to clear
|
||||
*
|
||||
* Return : None
|
||||
*/
|
||||
void wlan_mlme_clear_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
|
||||
struct mlme_pmk_info *pmk);
|
||||
#else
|
||||
static inline void
|
||||
wlan_mlme_set_sae_single_pmk_bss_cap(struct wlan_objmgr_psoc *psoc,
|
||||
@@ -2353,7 +2362,14 @@ wlan_mlme_get_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
|
||||
struct wlan_mlme_sae_single_pmk *pmksa)
|
||||
{
|
||||
}
|
||||
|
||||
static inline
|
||||
void wlan_mlme_clear_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
|
||||
struct mlme_pmk_info *pmk)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* mlme_get_roam_fail_reason_str() - Get fail string from enum
|
||||
* WMI_ROAM_FAIL_REASON_ID
|
||||
|
@@ -3666,6 +3666,37 @@ void wlan_mlme_get_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
|
||||
qdf_mem_zero(pmksa->pmk_info.pmk, sizeof(*pmksa->pmk_info.pmk));
|
||||
pmksa->pmk_info.pmk_len = 0;
|
||||
}
|
||||
|
||||
void wlan_mlme_clear_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
|
||||
struct mlme_pmk_info *pmk_recv)
|
||||
{
|
||||
struct mlme_legacy_priv *mlme_priv;
|
||||
struct wlan_mlme_sae_single_pmk sae_single_pmk;
|
||||
|
||||
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
|
||||
if (!mlme_priv) {
|
||||
mlme_legacy_err("vdev legacy private object is NULL");
|
||||
return;
|
||||
}
|
||||
|
||||
sae_single_pmk = mlme_priv->mlme_roam.sae_single_pmk;
|
||||
|
||||
if (!pmk_recv) {
|
||||
/* Process flush pmk cmd */
|
||||
mlme_legacy_debug("Flush sae_single_pmk info");
|
||||
qdf_mem_zero(&sae_single_pmk.pmk_info,
|
||||
sizeof(sae_single_pmk.pmk_info));
|
||||
} else if (pmk_recv->pmk_len != sae_single_pmk.pmk_info.pmk_len) {
|
||||
mlme_legacy_debug("Invalid pmk len");
|
||||
return;
|
||||
} else if (!qdf_mem_cmp(&sae_single_pmk.pmk_info.pmk, pmk_recv->pmk,
|
||||
pmk_recv->pmk_len)) {
|
||||
/* Process delete pmk cmd */
|
||||
mlme_legacy_debug("Clear sae_single_pmk info");
|
||||
qdf_mem_zero(&sae_single_pmk.pmk_info,
|
||||
sizeof(sae_single_pmk.pmk_info));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
char *mlme_get_roam_fail_reason_str(uint32_t result)
|
||||
|
@@ -21432,7 +21432,6 @@ static int __wlan_hdd_cfg80211_set_pmksa(struct wiphy *wiphy,
|
||||
{
|
||||
struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
|
||||
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
||||
mac_handle_t mac_handle;
|
||||
QDF_STATUS result = QDF_STATUS_SUCCESS;
|
||||
int status;
|
||||
tPmkidCacheInfo *pmk_cache;
|
||||
@@ -21470,8 +21469,6 @@ static int __wlan_hdd_cfg80211_set_pmksa(struct wiphy *wiphy,
|
||||
if (!pmk_cache)
|
||||
return -ENOMEM;
|
||||
|
||||
mac_handle = hdd_ctx->mac_handle;
|
||||
|
||||
hdd_fill_pmksa_info(adapter, pmk_cache, pmksa, false);
|
||||
|
||||
/*
|
||||
@@ -21487,7 +21484,7 @@ static int __wlan_hdd_cfg80211_set_pmksa(struct wiphy *wiphy,
|
||||
TRACE_CODE_HDD_CFG80211_SET_PMKSA,
|
||||
adapter->vdev_id, result);
|
||||
|
||||
sme_set_del_pmkid_cache(mac_handle, adapter->vdev_id,
|
||||
sme_set_del_pmkid_cache(hdd_ctx->psoc, adapter->vdev_id,
|
||||
pmk_cache, true);
|
||||
|
||||
qdf_mem_zero(pmk_cache, sizeof(pmk_cache));
|
||||
@@ -21538,7 +21535,6 @@ static int __wlan_hdd_cfg80211_del_pmksa(struct wiphy *wiphy,
|
||||
{
|
||||
struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
|
||||
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
||||
mac_handle_t mac_handle;
|
||||
int status = 0;
|
||||
tPmkidCacheInfo *pmk_cache;
|
||||
|
||||
@@ -21569,14 +21565,16 @@ static int __wlan_hdd_cfg80211_del_pmksa(struct wiphy *wiphy,
|
||||
if (!pmk_cache)
|
||||
return -ENOMEM;
|
||||
|
||||
mac_handle = hdd_ctx->mac_handle;
|
||||
|
||||
qdf_mtrace(QDF_MODULE_ID_HDD, QDF_MODULE_ID_HDD,
|
||||
TRACE_CODE_HDD_CFG80211_DEL_PMKSA,
|
||||
adapter->vdev_id, 0);
|
||||
|
||||
hdd_fill_pmksa_info(adapter, pmk_cache, pmksa, true);
|
||||
|
||||
/* clear single_pmk_info information */
|
||||
sme_clear_sae_single_pmk_info(hdd_ctx->psoc,adapter->vdev_id,
|
||||
pmk_cache);
|
||||
|
||||
/* Delete the PMKID CSR cache */
|
||||
if (QDF_STATUS_SUCCESS !=
|
||||
wlan_hdd_del_pmksa_cache(adapter, pmk_cache)) {
|
||||
@@ -21588,8 +21586,9 @@ static int __wlan_hdd_cfg80211_del_pmksa(struct wiphy *wiphy,
|
||||
status = -EINVAL;
|
||||
}
|
||||
|
||||
sme_set_del_pmkid_cache(mac_handle, adapter->vdev_id, pmk_cache,
|
||||
sme_set_del_pmkid_cache(hdd_ctx->psoc, adapter->vdev_id, pmk_cache,
|
||||
false);
|
||||
|
||||
qdf_mem_zero(pmk_cache, sizeof(*pmk_cache));
|
||||
qdf_mem_free(pmk_cache);
|
||||
|
||||
@@ -21637,7 +21636,6 @@ static int __wlan_hdd_cfg80211_flush_pmksa(struct wiphy *wiphy,
|
||||
{
|
||||
struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
|
||||
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
|
||||
mac_handle_t mac_handle;
|
||||
int errno;
|
||||
QDF_STATUS status;
|
||||
|
||||
@@ -21658,15 +21656,13 @@ static int __wlan_hdd_cfg80211_flush_pmksa(struct wiphy *wiphy,
|
||||
if (errno)
|
||||
return errno;
|
||||
|
||||
mac_handle = hdd_ctx->mac_handle;
|
||||
|
||||
status = wlan_hdd_flush_pmksa_cache(adapter);
|
||||
if (QDF_IS_STATUS_ERROR(status)) {
|
||||
hdd_err("Cannot flush PMKIDCache");
|
||||
errno = -EINVAL;
|
||||
}
|
||||
|
||||
sme_set_del_pmkid_cache(mac_handle, adapter->vdev_id, NULL, false);
|
||||
sme_set_del_pmkid_cache(hdd_ctx->psoc, adapter->vdev_id, NULL, false);
|
||||
hdd_exit();
|
||||
return errno;
|
||||
}
|
||||
|
@@ -2756,17 +2756,33 @@ QDF_STATUS sme_set_vc_mode_config(uint32_t vc_bitmap);
|
||||
|
||||
/**
|
||||
* sme_set_del_pmkid_cache() - API to update PMKID cache
|
||||
* @mac_handle: Opaque handle to the global MAC context
|
||||
* @psoc: psoc common object
|
||||
* @session_id: Session id
|
||||
* @pmk_cache_info: Pointer to PMK cache info
|
||||
* @is_add: boolean that implies whether to add or delete PMKID entry
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
QDF_STATUS sme_set_del_pmkid_cache(mac_handle_t mac_handle, uint8_t session_id,
|
||||
QDF_STATUS sme_set_del_pmkid_cache(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t session_id,
|
||||
tPmkidCacheInfo *pmk_cache_info,
|
||||
bool is_add);
|
||||
|
||||
/**
|
||||
* sme_clear_sae_single_pmk_info() - Clear sae_single_pmk onfo
|
||||
* @psoc: Psoc object
|
||||
* @session_id: session id
|
||||
* @pmk_cache_info: pmk cache info
|
||||
*
|
||||
* This function will clear sae_single_pmk info while processing delete pmk
|
||||
* command from userspace.
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void sme_clear_sae_single_pmk_info(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t session_id,
|
||||
tPmkidCacheInfo *pmk_cache_info);
|
||||
|
||||
/**
|
||||
* sme_send_hlp_ie_info() - API to send HLP IE info to fw
|
||||
* @mac_handle: Opaque handle to the global MAC context
|
||||
|
@@ -60,6 +60,7 @@
|
||||
#include "cfg_ucfg_api.h"
|
||||
#include "wlan_fwol_ucfg_api.h"
|
||||
#include <wlan_coex_ucfg_api.h>
|
||||
#include "wlan_crypto_global_api.h"
|
||||
|
||||
static QDF_STATUS init_sme_cmd_list(struct mac_context *mac);
|
||||
|
||||
@@ -14166,7 +14167,33 @@ QDF_STATUS sme_fast_reassoc(mac_handle_t mac_handle,
|
||||
|
||||
#endif
|
||||
|
||||
QDF_STATUS sme_set_del_pmkid_cache(mac_handle_t mac_handle, uint8_t session_id,
|
||||
void sme_clear_sae_single_pmk_info(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t session_id,
|
||||
tPmkidCacheInfo *pmk_cache_info)
|
||||
{
|
||||
struct wlan_crypto_pmksa *pmksa;
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
tPmkidCacheInfo pmk_to_del;
|
||||
|
||||
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, session_id,
|
||||
WLAN_LEGACY_SME_ID);
|
||||
if (!vdev) {
|
||||
sme_err("Invalid vdev");
|
||||
return;
|
||||
}
|
||||
pmksa = wlan_crypto_get_pmksa(vdev, &pmk_cache_info->BSSID);
|
||||
if (!pmksa) {
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
||||
return;
|
||||
}
|
||||
qdf_mem_copy(&pmk_to_del.pmk, pmksa->pmk, pmksa->pmk_len);
|
||||
pmk_to_del.pmk_len = pmksa->pmk_len;
|
||||
csr_clear_sae_single_pmk(psoc, session_id, &pmk_to_del);
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
||||
}
|
||||
|
||||
QDF_STATUS sme_set_del_pmkid_cache(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t session_id,
|
||||
tPmkidCacheInfo *pmk_cache_info,
|
||||
bool is_add)
|
||||
{
|
||||
@@ -14183,6 +14210,7 @@ QDF_STATUS sme_set_del_pmkid_cache(mac_handle_t mac_handle, uint8_t session_id,
|
||||
|
||||
if (!pmk_cache_info) {
|
||||
pmk_cache->is_flush_all = true;
|
||||
csr_clear_sae_single_pmk(psoc, session_id, NULL);
|
||||
goto send_flush_cmd;
|
||||
}
|
||||
|
||||
|
@@ -14605,6 +14605,37 @@ static void csr_mem_zero_psk_pmk(struct csr_roam_session *session)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
|
||||
void csr_clear_sae_single_pmk(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id, tPmkidCacheInfo *pmk_cache)
|
||||
{
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
uint32_t keymgmt;
|
||||
struct mlme_pmk_info pmk_info;
|
||||
|
||||
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
|
||||
WLAN_LEGACY_SME_ID);
|
||||
if (!vdev) {
|
||||
sme_err("vdev is NULL");
|
||||
return;
|
||||
}
|
||||
|
||||
keymgmt = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT);
|
||||
if (!(keymgmt & (1 << WLAN_CRYPTO_KEY_MGMT_SAE))) {
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
||||
return;
|
||||
}
|
||||
if (pmk_cache) {
|
||||
qdf_mem_copy(&pmk_info.pmk, pmk_cache->pmk, pmk_cache->pmk_len);
|
||||
pmk_info.pmk_len = pmk_cache->pmk_len;
|
||||
wlan_mlme_clear_sae_single_pmk_info(vdev, &pmk_info);
|
||||
} else {
|
||||
wlan_mlme_clear_sae_single_pmk_info(vdev, NULL);
|
||||
}
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
||||
}
|
||||
#endif
|
||||
|
||||
QDF_STATUS csr_roam_del_pmkid_from_cache(struct mac_context *mac,
|
||||
uint32_t sessionId,
|
||||
tPmkidCacheInfo *pmksa,
|
||||
@@ -14632,12 +14663,17 @@ QDF_STATUS csr_roam_del_pmkid_from_cache(struct mac_context *mac,
|
||||
/* Flush the entire cache */
|
||||
qdf_mem_zero(pSession->PmkidCacheInfo,
|
||||
sizeof(tPmkidCacheInfo) * CSR_MAX_PMKID_ALLOWED);
|
||||
/* flush single_pmk_info information */
|
||||
csr_clear_sae_single_pmk(mac->psoc, pSession->vdev_id, NULL);
|
||||
pSession->NumPmkidCache = 0;
|
||||
pSession->curr_cache_idx = 0;
|
||||
csr_mem_zero_psk_pmk(pSession);
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* clear single_pmk_info information */
|
||||
csr_clear_sae_single_pmk(mac->psoc, pSession->vdev_id, pmksa);
|
||||
|
||||
/* !flush_cache - so look up in the cache */
|
||||
for (Index = 0; Index < CSR_MAX_PMKID_ALLOWED; Index++) {
|
||||
cached_pmksa = &pSession->PmkidCacheInfo[Index];
|
||||
|
@@ -919,6 +919,26 @@ QDF_STATUS csr_roam_del_pmkid_from_cache(struct mac_context *mac,
|
||||
tPmkidCacheInfo *pmksa,
|
||||
bool flush_cache);
|
||||
|
||||
#if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
|
||||
/**
|
||||
* csr_clear_sae_single_pmk - API to clear single_pmk_info cache
|
||||
* @psoc: psoc common object
|
||||
* @vdev_id: session id
|
||||
* @pmksa: pmk info
|
||||
*
|
||||
* Return : None
|
||||
*/
|
||||
void csr_clear_sae_single_pmk(struct wlan_objmgr_psoc *psoc,
|
||||
uint8_t vdev_id, tPmkidCacheInfo *pmksa);
|
||||
|
||||
#else
|
||||
static inline void
|
||||
csr_clear_sae_single_pmk(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
|
||||
tPmkidCacheInfo *pmksa)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
QDF_STATUS csr_send_ext_change_channel(struct mac_context *mac_ctx,
|
||||
uint32_t channel, uint8_t session_id);
|
||||
|
||||
|
Reference in New Issue
Block a user