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/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 0e6685e..9fdc24d 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -220,6 +220,7 @@
#define CSR_SCAN_TIME_DEFAULT 0
#define CSR_VALUE_IGNORED 0xFFFFFFFF
#define CSR_RSN_PMKID_SIZE 16
+#define CSR_RSN_MAX_PMK_LEN 48
#define CSR_MAX_PMKID_ALLOWED 32
#define CSR_WEP40_KEY_LEN 5
#define CSR_WEP104_KEY_LEN 13
@@ -848,6 +849,11 @@
{
tCsrBssid BSSID;
tANI_U8 PMKID[CSR_RSN_PMKID_SIZE];
+ uint8_t pmk[CSR_RSN_MAX_PMK_LEN];
+ uint8_t pmk_len;
+ uint8_t ssid_len;
+ uint8_t ssid[SIR_MAC_MAX_SSID_LENGTH];
+ uint8_t cache_id[CACHE_ID_LEN];
}tPmkidCacheInfo;
#ifdef FEATURE_WLAN_WAPI
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 68b1e92..0acded1 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -3731,9 +3731,9 @@
eHalStatus sme_RoamDelPMKIDfromCache( tHalHandle hHal, tANI_U8 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 );
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 */
diff --git a/CORE/SME/src/csr/csrInsideApi.h b/CORE/SME/src/csr/csrInsideApi.h
index 81c3f16..b8c9e44 100644
--- a/CORE/SME/src/csr/csrInsideApi.h
+++ b/CORE/SME/src/csr/csrInsideApi.h
@@ -1112,9 +1112,9 @@
eHalStatus csrUpdateChannelList(tpAniSirGlobal pMac);
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 );
tANI_BOOLEAN csrElectedCountryInfo(tpAniSirGlobal pMac);
diff --git a/CORE/SME/src/csr/csrUtil.c b/CORE/SME/src/csr/csrUtil.c
index dbcab60..40a1e5e 100644
--- a/CORE/SME/src/csr/csrUtil.c
+++ b/CORE/SME/src/csr/csrUtil.c
@@ -4093,8 +4093,72 @@
return( fRSNMatch );
}
+/**
+ * csr_lookup_pmkid_using_ssid() - lookup pmkid using ssid and cache_id
+ * @mac: pointer to mac
+ * @session: sme session pointer
+ * @pmk_cache: pointer to pmk cache
+ * @index: index value needs to be seached
+ *
+ * Return: true if pmkid is found else false
+ */
+static bool csr_lookup_pmkid_using_ssid(tpAniSirGlobal mac,
+ tCsrRoamSession *session,
+ tPmkidCacheInfo *pmk_cache,
+ uint32_t *index)
+{
+ uint32_t i;
+ tPmkidCacheInfo *session_pmk;
-tANI_BOOLEAN csrLookupPMKID( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U8 *pBSSId, tANI_U8 *pPMKId )
+ for (i = 0; i < session->NumPmkidCache; i++) {
+ session_pmk = &session->PmkidCacheInfo[i];
+
+ if ((!vos_mem_compare(pmk_cache->ssid, session_pmk->ssid,
+ pmk_cache->ssid_len)) &&
+ (!vos_mem_compare(session_pmk->cache_id,
+ pmk_cache->cache_id, CACHE_ID_LEN))) {
+ /* match found */
+ *index = i;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/**
+ * csr_lookup_pmkid_using_bssid() - lookup pmkid using bssid
+ * @mac: pointer to mac
+ * @session: sme session pointer
+ * @pmk_cache: pointer to pmk cache
+ * @index: index value needs to be seached
+ *
+ * Return: true if pmkid is found else false
+ */
+static bool csr_lookup_pmkid_using_bssid(tpAniSirGlobal mac,
+ tCsrRoamSession *session,
+ tPmkidCacheInfo *pmk_cache,
+ uint32_t *index)
+{
+ uint32_t i;
+ tPmkidCacheInfo *session_pmk;
+
+ for (i = 0; i < session->NumPmkidCache; i++) {
+ session_pmk = &session->PmkidCacheInfo[i];
+ if (vos_is_macaddr_equal((v_MACADDR_t *)pmk_cache->BSSID,
+ (v_MACADDR_t *)session_pmk->BSSID)) {
+ /* match found */
+ *index = i;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+tANI_BOOLEAN csrLookupPMKID(tpAniSirGlobal pMac, tANI_U32 sessionId,
+ tPmkidCacheInfo *pmk_cache)
+
{
tANI_BOOLEAN fRC = FALSE, fMatchFound = FALSE;
tANI_U32 Index;
@@ -4115,25 +4179,30 @@
return fRC;
}
- do
- {
- for( Index=0; Index < CSR_MAX_PMKID_ALLOWED; Index++ )
- {
- if( vos_mem_compare(pBSSId, pSession->PmkidCacheInfo[Index].BSSID, sizeof(tCsrBssid)) )
- {
- // match found
- fMatchFound = TRUE;
- break;
- }
- }
+ if (pmk_cache->ssid_len) {
+ /* Try to find based on cache_id and ssid first */
+ fMatchFound = csr_lookup_pmkid_using_ssid(pMac, pSession, pmk_cache,
+ &Index);
+ }
- if( !fMatchFound ) break;
+ /* If not able to find using cache id or ssid_len is not present */
+ if (!fMatchFound)
+ fMatchFound = csr_lookup_pmkid_using_bssid(pMac, pSession, pmk_cache,
+ &Index);
- vos_mem_copy(pPMKId, pSession->PmkidCacheInfo[Index].PMKID, CSR_RSN_PMKID_SIZE);
+ if (!fMatchFound) {
+ smsLog(pMac, LOG2, "No PMKID Match Found");
+ return false;
- fRC = TRUE;
- }
- while( 0 );
+ }
+
+ vos_mem_copy(pmk_cache->PMKID, pSession->PmkidCacheInfo[Index].PMKID, CSR_RSN_PMKID_SIZE);
+ vos_mem_copy(pmk_cache->pmk, pSession->PmkidCacheInfo[Index].pmk,
+ pSession->PmkidCacheInfo[Index].pmk_len);
+ pmk_cache->pmk_len = pSession->PmkidCacheInfo[Index].pmk_len;
+
+ fRC = TRUE;
+
smsLog(pMac, LOG1, "csrLookupPMKID called return match = %d pMac->roam.NumPmkidCache = %d",
fRC, pSession->NumPmkidCache);
@@ -4153,7 +4222,7 @@
tCsrRSNAuthIe *pAuthSuite;
tCsrRSNCapabilities RSNCapabilities;
tCsrRSNPMKIe *pPMK;
- tANI_U8 PMKId[CSR_RSN_PMKID_SIZE];
+ tPmkidCacheInfo pmkid_cache;
uint32_t ret;
#ifdef WLAN_FEATURE_11W
tANI_U8 *pGroupMgmtCipherSuite;
@@ -4221,16 +4290,19 @@
*(tANI_U16 *)( &pAuthSuite->AuthOui[ 1 ] ) = *((tANI_U16 *)(&RSNCapabilities));
pPMK = (tCsrRSNPMKIe *)( ((tANI_U8 *)(&pAuthSuite->AuthOui[ 1 ])) + sizeof(tANI_U16) );
+ vos_mem_copy((v_MACADDR_t *)pmkid_cache.BSSID,
+ (v_MACADDR_t *)pSirBssDesc->bssId, VOS_MAC_ADDR_SIZE);
if (
#ifdef FEATURE_WLAN_ESE
(eCSR_AUTH_TYPE_CCKM_RSN != negAuthType) &&
#endif
- csrLookupPMKID( pMac, sessionId, pSirBssDesc->bssId, &(PMKId[0]) ) )
+ csrLookupPMKID( pMac, sessionId, &pmkid_cache))
{
pPMK->cPMKIDs = 1;
- vos_mem_copy(pPMK->PMKIDList[0].PMKID, PMKId, CSR_RSN_PMKID_SIZE);
+ vos_mem_copy(pPMK->PMKIDList[0].PMKID, pmkid_cache.PMKID,
+ CSR_RSN_PMKID_SIZE);
}
else
{
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 142d289..a62bcec 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -4487,9 +4487,9 @@
eHalStatus sme_RoamDelPMKIDfromCache( tHalHandle hHal, tANI_U8 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 )
{
@@ -4504,7 +4504,7 @@
if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
{
status = csrRoamDelPMKIDfromCache( pMac, sessionId,
- pBSSId, flush_cache );
+ pmksa, flush_cache );
}
else
{