wlan: NCHO related fix for duplicate check in scan cache
If the reassoc req from supplicant has a wrong channel, let's
honor it instead of using existing entry on the same BSSID from
the scan cache
Change-Id: I3e0faade31edfa06121dc283c90d663dde51c97c
CRs-fixed: 504339
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 56820d2..68d5640 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -5369,7 +5369,7 @@
}
if (!CSR_IS_INFRA_AP(pProfile))
{
- pScanResult = csrScanAppendBssDescription( pMac, pSirBssDesc, pIes );
+ pScanResult = csrScanAppendBssDescription( pMac, pSirBssDesc, pIes, FALSE );
}
csrRoamSaveConnectedBssDesc(pMac, sessionId, pSirBssDesc);
csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
@@ -15054,7 +15054,7 @@
csrNeighborRoamProceedWithHandoffReq(pMac);
break;
default:
- VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG, "Rsp for Roam Scan Offload with unknown Reason %d", reason);
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO, "Rsp for Roam Scan Offload with reason %d", reason);
}
return eHAL_STATUS_SUCCESS;
}
diff --git a/CORE/SME/src/csr/csrApiScan.c b/CORE/SME/src/csr/csrApiScan.c
index 5fbd93b..24eeef7 100644
--- a/CORE/SME/src/csr/csrApiScan.c
+++ b/CORE/SME/src/csr/csrApiScan.c
@@ -2576,7 +2576,7 @@
//pIes may be NULL
tANI_BOOLEAN csrRemoveDupBssDescription( tpAniSirGlobal pMac, tSirBssDescription *pSirBssDescr,
- tDot11fBeaconIEs *pIes, tAniSSID *pSsid , v_TIME_t *timer )
+ tDot11fBeaconIEs *pIes, tAniSSID *pSsid , v_TIME_t *timer, tANI_BOOLEAN fForced )
{
tListElem *pEntry;
@@ -2595,7 +2595,7 @@
// we have a duplicate scan results only when BSSID, SSID, Channel and NetworkType
// matches
if ( csrIsDuplicateBssDescription( pMac, &pBssDesc->Result.BssDescriptor,
- pSirBssDescr, pIes ) )
+ pSirBssDescr, pIes, fForced ) )
{
pSirBssDescr->rssi = (tANI_S8)( (((tANI_S32)pSirBssDescr->rssi * CSR_SCAN_RESULT_RSSI_WEIGHT ) +
((tANI_S32)pBssDesc->Result.BssDescriptor.rssi * (100 - CSR_SCAN_RESULT_RSSI_WEIGHT) )) / 100 );
@@ -2863,7 +2863,7 @@
csrFreeScanResultEntry(pMac, pBssDescription);
continue;
}
- fDupBss = csrRemoveDupBssDescription( pMac, &pBssDescription->Result.BssDescriptor, pIesLocal, &tmpSsid , &timer );
+ fDupBss = csrRemoveDupBssDescription( pMac, &pBssDescription->Result.BssDescriptor, pIesLocal, &tmpSsid , &timer, FALSE );
//Check whether we have reach out limit, but don't lose the LFR candidates came from FW
if( CSR_SCAN_IS_OVER_BSS_LIMIT(pMac)
#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
@@ -2994,7 +2994,7 @@
// Append a Bss Description...
tCsrScanResult *csrScanAppendBssDescription( tpAniSirGlobal pMac,
tSirBssDescription *pSirBssDescription,
- tDot11fBeaconIEs *pIes )
+ tDot11fBeaconIEs *pIes, tANI_BOOLEAN fForced )
{
tCsrScanResult *pCsrBssDescription = NULL;
tAniSSID tmpSsid;
@@ -3002,7 +3002,7 @@
int result;
tmpSsid.length = 0;
- result = csrRemoveDupBssDescription( pMac, pSirBssDescription, pIes, &tmpSsid, &timer );
+ result = csrRemoveDupBssDescription( pMac, pSirBssDescription, pIes, &tmpSsid, &timer, fForced );
pCsrBssDescription = csrScanSaveBssDescription( pMac, pSirBssDescription, pIes );
if (result && (pCsrBssDescription != NULL))
{
@@ -4305,7 +4305,7 @@
// matches
if ( csrIsDuplicateBssDescription( pMac, &pCsrBssDescription->Result.BssDescriptor,
- pSirBssDescr, pIes ) )
+ pSirBssDescr, pIes, FALSE ) )
{
pSirBssDescr->rssi = (tANI_S8)( (((tANI_S32)pSirBssDescr->rssi * CSR_SCAN_RESULT_RSSI_WEIGHT ) +
((tANI_S32)pCsrBssDescription->Result.BssDescriptor.rssi * (100 - CSR_SCAN_RESULT_RSSI_WEIGHT) )) / 100 );
@@ -4376,7 +4376,7 @@
tANI_BOOLEAN csrIsDuplicateBssDescription( tpAniSirGlobal pMac, tSirBssDescription *pSirBssDesc1,
- tSirBssDescription *pSirBssDesc2, tDot11fBeaconIEs *pIes2 )
+ tSirBssDescription *pSirBssDesc2, tDot11fBeaconIEs *pIes2, tANI_BOOLEAN fForced )
{
tANI_BOOLEAN fMatch = FALSE;
tSirMacCapabilityInfo *pCap1, *pCap2;
@@ -4389,7 +4389,7 @@
{
if (pCap1->ess &&
csrIsMacAddressEqual( pMac, (tCsrBssid *)pSirBssDesc1->bssId, (tCsrBssid *)pSirBssDesc2->bssId)&&
- (pSirBssDesc1->channelId == pSirBssDesc2->channelId))
+ (fForced || (pSirBssDesc1->channelId == pSirBssDesc2->channelId)))
{
fMatch = TRUE;
// Check for SSID match, if exists
@@ -4961,7 +4961,7 @@
//Not to remove the BSS we are connected to.
if(csrIsConnStateDisconnected(pMac, i) || (NULL == pSession->pConnectBssDesc) ||
(!csrIsDuplicateBssDescription(pMac, &pResult->Result.BssDescriptor,
- pSession->pConnectBssDesc, NULL))
+ pSession->pConnectBssDesc, NULL, FALSE))
)
{
smsLog(pMac, LOGW, "Aging out BSS %02X-%02X-%02X-%02X-%02X-%02X Channel %d",
@@ -7572,7 +7572,7 @@
}
fDupBss = csrRemoveDupBssDescription( pMac,
- &pScanResult->Result.BssDescriptor, pIesLocal, &tmpSsid , &timer);
+ &pScanResult->Result.BssDescriptor, pIesLocal, &tmpSsid , &timer, FALSE);
//Check whether we have reach out limit
if ( CSR_SCAN_IS_OVER_BSS_LIMIT(pMac) )
{
@@ -7711,9 +7711,9 @@
palCopyMemory( pMac->hHdd, pNewBssDescriptor->bssId, bssid,
sizeof(tSirMacAddr) );
pNewBssDescriptor->channelId = channel;
- if(NULL == csrScanSaveBssDescription( pMac, pNewBssDescriptor, pNewIes ))
+ if(NULL == csrScanAppendBssDescription( pMac, pNewBssDescriptor, pNewIes, TRUE ))
{
- smsLog(pMac, LOGE, FL("%s: csrScanSaveBssDescription failed"),
+ smsLog(pMac, LOGE, FL("%s: csrScanAppendBssDescription failed"),
__func__);
status = eHAL_STATUS_FAILURE;
break;
diff --git a/CORE/SME/src/csr/csrInsideApi.h b/CORE/SME/src/csr/csrInsideApi.h
index 139513d..766e866 100644
--- a/CORE/SME/src/csr/csrInsideApi.h
+++ b/CORE/SME/src/csr/csrInsideApi.h
@@ -225,7 +225,7 @@
void csrReleaseCommandWmStatusChange(tpAniSirGlobal pMac, tSmeCmd *pCommand);
//pIes2 can be NULL
tANI_BOOLEAN csrIsDuplicateBssDescription( tpAniSirGlobal pMac, tSirBssDescription *pSirBssDesc1,
- tSirBssDescription *pSirBssDesc2, tDot11fBeaconIEs *pIes2 );
+ tSirBssDescription *pSirBssDesc2, tDot11fBeaconIEs *pIes2, tANI_BOOLEAN fForced );
eHalStatus csrRoamSaveConnectedBssDesc( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDesc );
tANI_BOOLEAN csrIsNetworkTypeEqual( tSirBssDescription *pSirBssDesc1, tSirBssDescription *pSirBssDesc2 );
eHalStatus csrScanSmeScanResponse( tpAniSirGlobal pMac, void *pMsgBuf );
@@ -253,7 +253,7 @@
eHalStatus csrScanHandleFailedLostlink3(tpAniSirGlobal pMac, tANI_U32 sessionId);
tCsrScanResult *csrScanAppendBssDescription( tpAniSirGlobal pMac,
tSirBssDescription *pSirBssDescription,
- tDot11fBeaconIEs *pIes);
+ tDot11fBeaconIEs *pIes, tANI_BOOLEAN fForced);
void csrScanCallCallback(tpAniSirGlobal pMac, tSmeCmd *pCommand, eCsrScanStatus scanStatus);
eHalStatus csrScanCopyRequest(tpAniSirGlobal pMac, tCsrScanRequest *pDstReq, tCsrScanRequest *pSrcReq);
eHalStatus csrScanFreeRequest(tpAniSirGlobal pMac, tCsrScanRequest *pReq);
diff --git a/CORE/SME/src/csr/csrNeighborRoam.c b/CORE/SME/src/csr/csrNeighborRoam.c
index 22eed72..6fd76a1 100644
--- a/CORE/SME/src/csr/csrNeighborRoam.c
+++ b/CORE/SME/src/csr/csrNeighborRoam.c
@@ -1406,6 +1406,24 @@
continue;
}
+#ifdef FEATURE_WLAN_LFR
+#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
+ /* In case of reassoc requested by upper layer, look for exact match of bssid & channel;
+ csr cache might have duplicates*/
+ if ((pNeighborRoamInfo->uOsRequestedHandoff) &&
+ ((VOS_FALSE == vos_mem_compare(pScanResult->BssDescriptor.bssId,
+ pNeighborRoamInfo->handoffReqInfo.bssid,
+ sizeof(tSirMacAddr)))||
+ (pScanResult->BssDescriptor.channelId != pNeighborRoamInfo->handoffReqInfo.channel)))
+
+ {
+ VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ "SKIP-not a candidate AP for OS requested roam");
+ continue;
+ }
+#endif
+#endif
+
/* This condition is to ensure to roam to an AP with better RSSI. if the value of RoamRssiDiff is Zero, this feature
* is disabled and we continue to roam without any check*/
if ((RoamRssiDiff > 0)