Parcourir la source

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
Liangwei Dong il y a 6 ans
Parent
commit
ca4abcf92f

+ 1 - 0
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

+ 13 - 0
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

+ 5 - 1
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;
 };
 
 /**

+ 20 - 12
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) {