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/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index ec3b07e..6a0297a 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -12874,6 +12874,48 @@
return (pMac->roam.roamSession[sessionId].NumBkidCache);
}
#endif /* FEATURE_WLAN_WAPI */
+
+static void csr_update_pmk_cache(tCsrRoamSession *pSession,
+ tPmkidCacheInfo *pmksa)
+{
+ uint16_t cache_idx = pSession->CurCacheIndex;
+
+ /* Add entry to the cache */
+ if (!pmksa->ssid_len) {
+ vos_copy_macaddr(
+ (v_MACADDR_t *)pSession->PmkidCacheInfo[cache_idx].BSSID,
+ (v_MACADDR_t *)pmksa->BSSID);
+ pSession->PmkidCacheInfo[cache_idx].ssid_len = 0;
+ } else {
+ vos_mem_copy(pSession->PmkidCacheInfo[cache_idx].ssid,
+ pmksa->ssid, pmksa->ssid_len);
+ pSession->PmkidCacheInfo[cache_idx].ssid_len =
+ pmksa->ssid_len;
+ vos_mem_copy(pSession->PmkidCacheInfo[cache_idx].cache_id,
+ pmksa->cache_id, CACHE_ID_LEN);
+
+ }
+ vos_mem_copy(
+ pSession->PmkidCacheInfo[cache_idx].PMKID,
+ pmksa->PMKID, CSR_RSN_PMKID_SIZE);
+
+ if (pmksa->pmk_len)
+ vos_mem_copy(pSession->PmkidCacheInfo[cache_idx].pmk,
+ pmksa->pmk, pmksa->pmk_len);
+
+ pSession->PmkidCacheInfo[cache_idx].pmk_len = pmksa->pmk_len;
+
+ /* Increment the CSR local cache index */
+ if (cache_idx < (CSR_MAX_PMKID_ALLOWED - 1))
+ pSession->CurCacheIndex++;
+ else
+ pSession->CurCacheIndex = 0;
+
+ pSession->NumPmkidCache++;
+ if (pSession->NumPmkidCache > CSR_MAX_PMKID_ALLOWED)
+ pSession->NumPmkidCache = CSR_MAX_PMKID_ALLOWED;
+}
+
eHalStatus csrRoamSetPMKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId,
tPmkidCacheInfo *pPMKIDCache,
tANI_U32 numItems,
@@ -12925,25 +12967,10 @@
pmksa = &pPMKIDCache[i];
/* Delete the entry if present */
- csrRoamDelPMKIDfromCache(pMac,sessionId,pmksa->BSSID,FALSE);
+ csrRoamDelPMKIDfromCache(pMac,sessionId,pmksa,FALSE);
- /* Add entry to the cache */
- vos_mem_copy(
- pSession->PmkidCacheInfo[pSession->CurCacheIndex].BSSID,
- pmksa->BSSID, VOS_MAC_ADDR_SIZE);
- vos_mem_copy(
- pSession->PmkidCacheInfo[pSession->CurCacheIndex].PMKID,
- pmksa->PMKID, CSR_RSN_PMKID_SIZE);
+ csr_update_pmk_cache(pSession, pmksa);
- /* Increment the CSR local cache index */
- if (pSession->CurCacheIndex < (CSR_MAX_PMKID_ALLOWED - 1))
- pSession->CurCacheIndex++;
- else
- pSession->CurCacheIndex = 0;
-
- pSession->NumPmkidCache++;
- if(pSession->NumPmkidCache > CSR_MAX_PMKID_ALLOWED)
- pSession->NumPmkidCache = CSR_MAX_PMKID_ALLOWED;
}
}
}
@@ -12952,9 +12979,9 @@
eHalStatus csrRoamDelPMKIDfromCache( tpAniSirGlobal pMac, tANI_U32 sessionId,
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
- const tANI_U8 *pBSSId,
+ tPmkidCacheInfo *pmksa,
#else
- tANI_U8 *pBSSId,
+ tPmkidCacheInfo *pmksa,
#endif
tANI_BOOLEAN flush_cache )
{
@@ -12963,6 +12990,7 @@
tANI_U32 Index;
tANI_U32 CurIndex;
tANI_U32 i;
+ tPmkidCacheInfo *cached_pmksa;
if(!pSession)
{
@@ -12978,20 +13006,28 @@
if (!flush_cache) {
for (Index = 0; Index < CSR_MAX_PMKID_ALLOWED; Index++) {
- if (vos_mem_compare(pSession->PmkidCacheInfo[Index].BSSID,
- pBSSId, VOS_MAC_ADDR_SIZE)) {
- fMatchFound = 1;
+ cached_pmksa = &pSession->PmkidCacheInfo[Index];
+ if (((!cached_pmksa->ssid_len) &&
+ vos_is_macaddr_equal((v_MACADDR_t *)cached_pmksa->BSSID,
+ (v_MACADDR_t *)pmksa->BSSID))) {
+ fMatchFound = 1;
+ } else if ((!vos_mem_compare(cached_pmksa->ssid,
+ pmksa->ssid, pmksa->ssid_len)) &&
+ (!vos_mem_compare(cached_pmksa->cache_id,
+ pmksa->cache_id, CACHE_ID_LEN)))
+ fMatchFound = 1;
+
+ if(fMatchFound) {
/* Clear this - the matched entry */
- vos_mem_zero(&pSession->PmkidCacheInfo[Index],
- sizeof(tPmkidCacheInfo));
+ vos_mem_zero(cached_pmksa, sizeof(tPmkidCacheInfo));
break;
}
}
if (Index == CSR_MAX_PMKID_ALLOWED && !fMatchFound) {
- smsLog(pMac, LOG1, FL("No such PMKSA entry exists "MAC_ADDRESS_STR),
- MAC_ADDR_ARRAY(pBSSId));
+ smsLog(pMac, LOG1, FL("No such PMKSA entry exists "));
+
}
else {
/* Match Found */