From ca4abcf92fa9a324a4e21b3c9694901cf8b286a3 Mon Sep 17 00:00:00 2001 From: Liangwei Dong Date: Wed, 20 Mar 2019 04:06:54 -0400 Subject: [PATCH] qcacmn: Add PMK field to pmkid cache In roaming offload, PMK will be sent to firmware. So,save the PMK to pmkcache when supplicant provide from os interface. Change-Id: Ibfd3d354b9150b40755ba2ab1dd90c2e3c6ddbc3 CRs-Fixed: 2420359 --- .../cmn_defs/inc/wlan_cmn_ieee80211.h | 1 + .../crypto/inc/wlan_crypto_global_api.h | 13 ++++++++ .../crypto/inc/wlan_crypto_global_def.h | 6 +++- .../crypto/src/wlan_crypto_global_api.c | 32 ++++++++++++------- 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h index b2feb8675542..db5bd8addcd0 100644 --- a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h +++ b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h @@ -377,6 +377,7 @@ enum extn_element_ie { #define WLAN_RSN_SELECTOR_LEN 4 #define WLAN_WPA_SELECTOR_LEN 4 #define PMKID_LEN 16 +#define MAX_PMK_LEN 64 #define MAX_PMKID 4 #define WLAN_WPA_OUI 0xf25000 diff --git a/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h b/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h index ca2f55178558..cf962e67b10e 100644 --- a/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h +++ b/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h @@ -804,6 +804,19 @@ QDF_STATUS wlan_crypto_set_key_req(struct wlan_objmgr_vdev *vdev, return QDF_STATUS_SUCCESS; } #endif /* CRYPTO_SET_KEY_CONVERGED */ +/** + * wlan_crypto_get_pmksa - called to get pmksa of bssid passed. + * @vdev: vdev + * @bssid: bssid + * + * This function gets called from to get pmksa for the bssid. + * + * Return: wlan_crypto_pmksa when match found else NULL. + */ +struct wlan_crypto_pmksa * +wlan_crypto_get_pmksa(struct wlan_objmgr_vdev *vdev, + struct qdf_mac_addr *bssid); + /** * wlan_crypto_pmksa_flush - called to flush saved pmksa * @crypto_params: crypto_params diff --git a/umac/cmn_services/crypto/inc/wlan_crypto_global_def.h b/umac/cmn_services/crypto/inc/wlan_crypto_global_def.h index 87f563ba0202..87c7e564d2d2 100644 --- a/umac/cmn_services/crypto/inc/wlan_crypto_global_def.h +++ b/umac/cmn_services/crypto/inc/wlan_crypto_global_def.h @@ -213,12 +213,16 @@ enum wlan_crypto_key_type { /** * struct wlan_crypto_pmksa - structure of crypto to contain pmkid * @bssid: bssid for which pmkid is saved - * @pmkid: pmkid + * @pmkid: pmkid info + * @pmk: pmk info + * @pmk_len: pmk len */ struct wlan_crypto_pmksa { struct qdf_mac_addr bssid; uint8_t pmkid[PMKID_LEN]; + uint8_t pmk[MAX_PMK_LEN]; + uint8_t pmk_len; }; /** diff --git a/umac/cmn_services/crypto/src/wlan_crypto_global_api.c b/umac/cmn_services/crypto/src/wlan_crypto_global_api.c index 552723dd7974..29d50d341a7c 100644 --- a/umac/cmn_services/crypto/src/wlan_crypto_global_api.c +++ b/umac/cmn_services/crypto/src/wlan_crypto_global_api.c @@ -331,6 +331,8 @@ QDF_STATUS wlan_crypto_set_pmksa(struct wlan_crypto_params *crypto_params, if (qdf_is_macaddr_equal(&pmksa->bssid, &crypto_params->pmksa[i]->bssid)) { /* free the current pmksa and use this slot */ + qdf_mem_zero(crypto_params->pmksa[i], + sizeof(struct wlan_crypto_pmksa)); qdf_mem_free(crypto_params->pmksa[i]); crypto_params->pmksa[i] = pmksa; return QDF_STATUS_SUCCESS; @@ -339,7 +341,6 @@ QDF_STATUS wlan_crypto_set_pmksa(struct wlan_crypto_params *crypto_params, if (i == WLAN_CRYPTO_MAX_PMKID && !slot_found) { crypto_err("no entry available for pmksa"); - qdf_mem_free(pmksa); return QDF_STATUS_E_INVAL; } crypto_params->pmksa[first_available_slot] = pmksa; @@ -359,6 +360,8 @@ QDF_STATUS wlan_crypto_del_pmksa(struct wlan_crypto_params *crypto_params, continue; if (qdf_is_macaddr_equal(&pmksa->bssid, &crypto_params->pmksa[i]->bssid)) { + qdf_mem_zero(crypto_params->pmksa[i], + sizeof(struct wlan_crypto_pmksa)); qdf_mem_free(crypto_params->pmksa[i]); crypto_params->pmksa[i] = NULL; return QDF_STATUS_SUCCESS; @@ -375,6 +378,8 @@ QDF_STATUS wlan_crypto_pmksa_flush(struct wlan_crypto_params *crypto_params) for (i = 0; i < WLAN_CRYPTO_MAX_PMKID; i++) { if (!crypto_params->pmksa[i]) continue; + qdf_mem_zero(crypto_params->pmksa[i], + sizeof(struct wlan_crypto_pmksa)); qdf_mem_free(crypto_params->pmksa[i]); crypto_params->pmksa[i] = NULL; } @@ -420,16 +425,7 @@ QDF_STATUS wlan_crypto_set_del_pmksa(struct wlan_objmgr_vdev *vdev, return status; } -/** - * wlan_crypto_get_pmksa - called to get pmksa of bssid passed. - * @vdev: vdev - * @bssid: bssid - * - * This function gets called from to get pmksa for the bssid. - * - * Return: wlan_crypto_pmksa when match found else NULL. - */ -static struct wlan_crypto_pmksa * +struct wlan_crypto_pmksa * wlan_crypto_get_pmksa(struct wlan_objmgr_vdev *vdev, struct qdf_mac_addr *bssid) { struct wlan_crypto_comp_priv *crypto_priv; @@ -3835,6 +3831,18 @@ wlan_crypto_merge_prarams(struct wlan_crypto_params *dst_params, dst_params->rsn_caps |= src_params->rsn_caps; } +static void +wlan_crypto_reset_prarams(struct wlan_crypto_params *params) +{ + params->authmodeset = 0; + params->ucastcipherset = 0; + params->mcastcipherset = 0; + params->mgmtcipherset = 0; + params->cipher_caps = 0; + params->key_mgmt = 0; + params->rsn_caps = 0; +} + QDF_STATUS wlan_set_vdev_crypto_prarams_from_ie(struct wlan_objmgr_vdev *vdev, uint8_t *ie_ptr, uint16_t ie_len) @@ -3865,7 +3873,7 @@ QDF_STATUS wlan_set_vdev_crypto_prarams_from_ie(struct wlan_objmgr_vdev *vdev, vdev_crypto_params = &crypto_priv->crypto_params; - qdf_mem_zero(vdev_crypto_params, sizeof(struct wlan_crypto_params)); + wlan_crypto_reset_prarams(vdev_crypto_params); status = wlan_get_crypto_params_from_rsn_ie(&crypto_params, ie_ptr, ie_len); if (QDF_STATUS_SUCCESS == status) {