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
This commit is contained in:
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -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) {
|
||||
|
Reference in New Issue
Block a user