wlan: Support for PMKSA caching
propagation from qcacld-3.0 to prima
Add support for PMK and PMKID cache based on either bssid or
ssid + cache identifier
CRs-Fixed: 2531198
Change-Id: Ic29b9dc3ad0c6c3d56af297494bc746d78e838d5
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 33eeebd..513add9 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -19344,6 +19344,92 @@
return ret;
}
+
+#if defined(WLAN_FEATURE_SAE) && \
+ defined(CFG80211_EXTERNAL_AUTH_SUPPORT)
+/*
+ * wlan_hdd_is_pmksa_valid: API to validate pmksa
+ * @pmksa: pointer to cfg80211_pmksa structure
+ *
+ * Return: True if valid else false
+ */
+static inline bool wlan_hdd_is_pmksa_valid(struct cfg80211_pmksa *pmksa)
+{
+ if (pmksa->bssid){
+ return true;
+ }
+ else
+ {
+ hddLog(LOGE, FL(" Either of bssid (%p) is NULL"), pmksa->bssid);
+ return false;
+ }
+}
+
+/*
+ * hdd_update_pmksa_info: API to update tPmkidCacheInfo from cfg80211_pmksa
+ * @pmk_cache: pmksa from supplicant
+ * @pmk_cache: pmk needs to be updated
+ *
+ * Return: None
+ */
+static void hdd_update_pmksa_info(tPmkidCacheInfo *pmk_cache,
+ struct cfg80211_pmksa *pmksa, bool is_delete)
+{
+ if (pmksa->bssid) {
+ hddLog(VOS_TRACE_LEVEL_DEBUG,"set PMKSA for " MAC_ADDRESS_STR,
+ MAC_ADDR_ARRAY(pmksa->bssid));
+ vos_mem_copy(pmk_cache->BSSID,
+ pmksa->bssid, VOS_MAC_ADDR_SIZE);
+ }
+
+ if (is_delete)
+ return;
+
+ vos_mem_copy(pmk_cache->PMKID, pmksa->pmkid, CSR_RSN_PMKID_SIZE);
+ if (pmksa->pmk_len && (pmksa->pmk_len <= CSR_RSN_MAX_PMK_LEN)) {
+ vos_mem_copy(pmk_cache->pmk, pmksa->pmk, pmksa->pmk_len);
+ pmk_cache->pmk_len = pmksa->pmk_len;
+ } else
+ hddLog(VOS_TRACE_LEVEL_INFO, "pmk len is %zu", pmksa->pmk_len);
+}
+#else
+/*
+ * wlan_hdd_is_pmksa_valid: API to validate pmksa
+ * @pmksa: pointer to cfg80211_pmksa structure
+ *
+ * Return: True if valid else false
+ */
+static inline bool wlan_hdd_is_pmksa_valid(struct cfg80211_pmksa *pmksa)
+{
+ if (!pmksa->bssid) {
+ hddLog(LOGE,FL("both bssid is NULL %p"), pmksa->bssid);
+ return false;
+ }
+ return true;
+}
+
+/*
+ * hdd_update_pmksa_info: API to update tPmkidCacheInfo from cfg80211_pmksa
+ * @pmk_cache: pmksa from supplicant
+ * @pmk_cache: pmk needs to be updated
+ *
+ * Return: None
+ */
+static void hdd_update_pmksa_info(tPmkidCacheInfo *pmk_cache,
+ struct cfg80211_pmksa *pmksa, bool is_delete)
+{
+ hddLog(VOS_TRACE_LEVEL_INFO,"set PMKSA for " MAC_ADDRESS_STR,
+ MAC_ADDR_ARRAY(pmksa->bssid));
+ vos_mem_copy(pmk_cache->BSSID,
+ pmksa->bssid, VOS_MAC_ADDR_SIZE);
+
+ if (is_delete)
+ return;
+
+ vos_mem_copy(pmk_cache->PMKID, pmksa->pmkid, CSR_RSN_PMKID_SIZE);
+}
+#endif
+
#ifdef FEATURE_WLAN_LFR
static int __wlan_hdd_cfg80211_set_pmksa(struct wiphy *wiphy, struct net_device *dev,
@@ -19354,7 +19440,7 @@
eHalStatus result;
int status;
hdd_context_t *pHddCtx;
- tPmkidCacheInfo pmk_id;
+ tPmkidCacheInfo pmk_cache;
ENTER();
@@ -19370,14 +19456,13 @@
return -EINVAL;
}
- if (!pmksa->bssid || !pmksa->pmkid) {
- hddLog(LOGE, FL("pmksa->bssid(%pK) or pmksa->pmkid(%pK) is NULL"),
- pmksa->bssid, pmksa->pmkid);
+ if (!pmksa->pmkid) {
+ hddLog(LOGE, FL("pmksa->pmkid(%p) is NULL"), pmksa->pmkid);
return -EINVAL;
}
- hddLog(VOS_TRACE_LEVEL_DEBUG, "%s: set PMKSA for " MAC_ADDRESS_STR,
- __func__, MAC_ADDR_ARRAY(pmksa->bssid));
+ if (!wlan_hdd_is_pmksa_valid(pmksa))
+ return -EINVAL;
pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
status = wlan_hdd_validate_context(pHddCtx);
@@ -19389,12 +19474,19 @@
// Retrieve halHandle
halHandle = WLAN_HDD_GET_HAL_CTX(pAdapter);
- vos_mem_copy(pmk_id.BSSID, pmksa->bssid, ETHER_ADDR_LEN);
- vos_mem_copy(pmk_id.PMKID, pmksa->pmkid, CSR_RSN_PMKID_SIZE);
+ vos_mem_zero(&pmk_cache, sizeof(pmk_cache));
- /* Add to the PMKSA ID Cache in CSR */
- result = sme_RoamSetPMKIDCache(halHandle,pAdapter->sessionId,
- &pmk_id, 1, FALSE);
+ hdd_update_pmksa_info(&pmk_cache, pmksa, false);
+
+
+ /* Add to the PMKSA ID Cache in CSR
+ * PMKSA cache will be having following
+ * 1. pmkid id
+ * 2. pmk 15733
+ * 3. bssid or cache identifier
+ */
+ result = sme_RoamSetPMKIDCache(halHandle,pAdapter->sessionId,
+ &pmk_cache, 1, FALSE);
MTRACE(vos_trace(VOS_MODULE_ID_HDD,
TRACE_CODE_HDD_CFG80211_SET_PMKSA,
@@ -19424,6 +19516,7 @@
tHalHandle halHandle;
hdd_context_t *pHddCtx;
int status = 0;
+ tPmkidCacheInfo pmk_cache;
ENTER();
@@ -19439,13 +19532,9 @@
return -EINVAL;
}
- if (!pmksa->bssid) {
- hddLog(LOGE, FL("pmksa->bssid is NULL"));
- return -EINVAL;
- }
+ if (!wlan_hdd_is_pmksa_valid(pmksa))
+ return -EINVAL;
- hddLog(VOS_TRACE_LEVEL_DEBUG, "%s: deleting PMKSA for " MAC_ADDRESS_STR,
- __func__, MAC_ADDR_ARRAY(pmksa->bssid));
pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
status = wlan_hdd_validate_context(pHddCtx);
@@ -19460,10 +19549,15 @@
MTRACE(vos_trace(VOS_MODULE_ID_HDD,
TRACE_CODE_HDD_CFG80211_DEL_PMKSA,
pAdapter->sessionId, 0));
+
+ vos_mem_zero(&pmk_cache, sizeof(pmk_cache));
+
+ hdd_update_pmksa_info(&pmk_cache, pmksa, true);
+
/* Delete the PMKID CSR cache */
if (eHAL_STATUS_SUCCESS !=
sme_RoamDelPMKIDfromCache(halHandle,
- pAdapter->sessionId, pmksa->bssid, FALSE)) {
+ pAdapter->sessionId, &pmk_cache, FALSE)) {
hddLog(LOGE, FL("Failed to delete PMKSA for "MAC_ADDRESS_STR),
MAC_ADDR_ARRAY(pmksa->bssid));
status = -EINVAL;