From 1229e319b0b6ae12106fe8fc898e8d397cb0da69 Mon Sep 17 00:00:00 2001 From: Pragaspathi Thilagaraj Date: Fri, 6 Mar 2020 15:13:38 +0530 Subject: [PATCH] qcacld-3.0: Delete pmk entry from crypto table on assoc reject Currently when association reject with reason code 53(invalid pmkid) is received from the AP, then we delete the pmksa entry for that AP from csr_session, but with converged crypto component, the entry needs to be deleted from the crypto pmk table. Else when associating to the same AP again, driver will use the stale pmk for the AP again. Delete the pmk entry from crypto pmk table when association reject is received from AP with reason code 53. Change-Id: I54f4a7ee7e02d35e0560bfad9fe2e3466aaa361d CRs-Fixed: 2636570 --- core/sme/inc/sme_api.h | 7 ++++--- core/sme/src/common/sme_api.c | 29 +++++++++++++++++------------ core/sme/src/csr/csr_api_roam.c | 12 ++++++------ 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index f6d1238fedfa..feb392fe5465 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -1183,9 +1183,10 @@ QDF_STATUS sme_del_periodic_tx_ptrn(mac_handle_t mac_handle, QDF_STATUS sme_send_rate_update_ind(mac_handle_t mac_handle, tSirRateUpdateInd *rateUpdateParams); QDF_STATUS sme_roam_del_pmkid_from_cache(mac_handle_t mac_handle, - uint8_t sessionId, - tPmkidCacheInfo *pmksa, - bool flush_cache); + uint8_t vdev_id, + struct wlan_crypto_pmksa *pmksa, + bool set_pmk); + void sme_get_command_q_status(mac_handle_t mac_handle); #ifdef FEATURE_WLAN_RMC diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 37fb9a391f12..0ad09f7613b7 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -3150,25 +3150,30 @@ void sme_roam_free_connect_profile(tCsrRoamConnectedProfile *profile) } QDF_STATUS sme_roam_del_pmkid_from_cache(mac_handle_t mac_handle, - uint8_t sessionId, - tPmkidCacheInfo *pmksa, - bool flush_cache) + uint8_t vdev_id, + struct wlan_crypto_pmksa *pmksa, + bool set_pmk) { QDF_STATUS status = QDF_STATUS_E_FAILURE; struct mac_context *mac = MAC_CONTEXT(mac_handle); + struct wlan_objmgr_vdev *vdev; MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_RX_HDD_ROAM_DEL_PMKIDCACHE, - sessionId, flush_cache)); - status = sme_acquire_global_lock(&mac->sme); - if (QDF_IS_STATUS_SUCCESS(status)) { - if (CSR_IS_SESSION_VALID(mac, sessionId)) - status = csr_roam_del_pmkid_from_cache(mac, sessionId, - pmksa, flush_cache); - else - status = QDF_STATUS_E_INVAL; - sme_release_global_lock(&mac->sme); + vdev_id, set_pmk)); + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc, vdev_id, + WLAN_LEGACY_SME_ID); + if (!vdev) { + sme_err("Vdev[%d] is NULL!", vdev_id); + return QDF_STATUS_E_FAILURE; } + + status = wlan_crypto_set_del_pmksa(vdev, pmksa, set_pmk); + if (QDF_IS_STATUS_ERROR(status)) + sme_err("Delete PMK entry failed"); + + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID); return status; } diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 4b760a0b343a..a6c616496961 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -9468,7 +9468,7 @@ static void csr_roam_join_rsp_processor(struct mac_context *mac, mac_handle_t mac_handle = MAC_HANDLE(mac); struct csr_roam_session *session_ptr; struct csr_roam_connectedinfo *prev_connect_info; - tPmkidCacheInfo *pmksa_entry; + struct wlan_crypto_pmksa *pmksa; uint32_t len = 0, roamId = 0, reason_code = 0; bool is_dis_pending; @@ -9563,18 +9563,18 @@ static void csr_roam_join_rsp_processor(struct mac_context *mac, * AP. */ if (reason_code == eSIR_MAC_INVALID_PMKID) { - pmksa_entry = qdf_mem_malloc(sizeof(*pmksa_entry)); - if (!pmksa_entry) + pmksa = qdf_mem_malloc(sizeof(*pmksa)); + if (!pmksa) return; sme_warn("Assoc reject from BSSID:%pM due to invalid PMKID", session_ptr->joinFailStatusCode.bssId); - qdf_mem_copy(pmksa_entry->BSSID.bytes, + qdf_mem_copy(pmksa->bssid.bytes, &session_ptr->joinFailStatusCode.bssId, sizeof(tSirMacAddr)); sme_roam_del_pmkid_from_cache(mac_handle, session_ptr->vdev_id, - pmksa_entry, false); - qdf_mem_free(pmksa_entry); + pmksa, false); + qdf_mem_free(pmksa); } /* If Join fails while Handoff is in progress, indicate