wlan: In case of HB failure send Deauth to AP before reconnection.
If last disconnection is due to HB failure, send deauth to the
AP/GO, before proceeding with the connection, to clear the
previous connetion on Peer.
Added an ini param gSendDeauthBeforeCon to enable this logic.
Change-Id: Ifcd860906c8209cad556bf25417ce58e28b22ee5
CRs-Fixed: 669350
diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c
index 83bc602..ca7ca1d 100644
--- a/CORE/MAC/src/pe/lim/limApi.c
+++ b/CORE/MAC/src/pe/lim/limApi.c
@@ -202,6 +202,12 @@
// Heart-Beat interval value
pMac->lim.gLimHeartBeatCount = 0;
+ vos_mem_zero(pMac->lim.gLimHeartBeatApMac[0],
+ sizeof(tSirMacAddr));
+ vos_mem_zero(pMac->lim.gLimHeartBeatApMac[1],
+ sizeof(tSirMacAddr));
+ pMac->lim.gLimHeartBeatApMacIndex = 0;
+
// Statistics to keep track of no. beacons rcvd in heart beat interval
vos_mem_set(pMac->lim.gLimHeartBeatBeaconStats,
sizeof(pMac->lim.gLimHeartBeatBeaconStats), 0);
diff --git a/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c b/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
index c10b09d..2807281 100644
--- a/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
+++ b/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
@@ -367,6 +367,27 @@
vos_mem_copy((tANI_U8 *) &mlmDeauthInd.peerMacAddr,
pStaDs->staAddr,
sizeof(tSirMacAddr));
+ /* if sendDeauthBeforeCon is enabled and reasoncode is Beacon Missed
+ * Store the MAC of AP in the flip flop buffer. This MAC will be
+ * used to send Deauth before connection, if we connect to same AP
+ * after HB failure.
+ */
+ if(pMac->roam.configParam.sendDeauthBeforeCon &&
+ eSIR_BEACON_MISSED == reasonCode)
+ {
+ int apCount = pMac->lim.gLimHeartBeatApMacIndex;
+
+ if(pMac->lim.gLimHeartBeatApMacIndex)
+ pMac->lim.gLimHeartBeatApMacIndex = 0;
+ else
+ pMac->lim.gLimHeartBeatApMacIndex = 1;
+
+ limLog(pMac, LOGE, FL("HB Failure on MAC "
+ MAC_ADDRESS_STR" Store it on Index %d"),
+ MAC_ADDR_ARRAY(pStaDs->staAddr),apCount);
+
+ sirCopyMacAddr(pMac->lim.gLimHeartBeatApMac[apCount],pStaDs->staAddr);
+ }
mlmDeauthInd.reasonCode = (tANI_U8) pStaDs->mlmStaContext.disassocReason;
mlmDeauthInd.deauthTrigger = pStaDs->mlmStaContext.cleanupTrigger;
@@ -463,7 +484,7 @@
}
/* Connected on DFS channel so should not send the probe request
* tear down the link directly */
- limTearDownLinkWithAp(pMac, psessionEntry->peSessionId, eSIR_MAC_UNSPEC_FAILURE_REASON);
+ limTearDownLinkWithAp(pMac, psessionEntry->peSessionId, eSIR_BEACON_MISSED);
}
}
else
diff --git a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
index c2e5854..a27c16f 100644
--- a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
@@ -3739,6 +3739,36 @@
pMac->lim.gLimTriggerBackgroundScanDuringQuietBss = (val) ? 1 : 0;
// Apply previously set configuration at HW
limApplyConfiguration(pMac, psessionEntry);
+
+ /* If sendDeauthBeforeCon is enabled, Send Deauth first to AP if last
+ * disconnection was caused by HB failure.
+ */
+ if(pMac->roam.configParam.sendDeauthBeforeCon)
+ {
+ int apCount;
+
+ for(apCount = 0; apCount < 2; apCount++)
+ {
+
+ if (vos_mem_compare(psessionEntry->pLimMlmJoinReq->bssDescription.bssId,
+ pMac->lim.gLimHeartBeatApMac[apCount], sizeof(tSirMacAddr)))
+ {
+ limLog(pMac, LOGE, FL("Index %d Sessionid: %d Send deauth on "
+ "channel %d to BSSID: "MAC_ADDRESS_STR ), apCount,
+ psessionEntry->peSessionId, psessionEntry->currentOperChannel,
+ MAC_ADDR_ARRAY(psessionEntry->pLimMlmJoinReq->bssDescription.bssId));
+
+ limSendDeauthMgmtFrame( pMac, eSIR_MAC_UNSPEC_FAILURE_REASON,
+ psessionEntry->pLimMlmJoinReq->bssDescription.bssId,
+ psessionEntry, FALSE );
+
+ vos_mem_zero(pMac->lim.gLimHeartBeatApMac[apCount],
+ sizeof(tSirMacAddr));
+ break;
+ }
+ }
+ }
+
/// Wait for Beacon to announce join success
vos_mem_copy(ssId.ssId,
psessionEntry->ssId.ssId,
@@ -3749,9 +3779,9 @@
//assign appropriate sessionId to the timer object
pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer.sessionId = psessionEntry->peSessionId;
- limLog(pMac, LOG1, FL("Sessionid: %d Send Probe req on channel %d ssid: %s "
- "BSSID: "MAC_ADDRESS_STR), psessionEntry->peSessionId,
- psessionEntry->currentOperChannel, ssId.ssId,
+ limLog(pMac, LOG1, FL("Sessionid: %d Send Probe req on channel %d ssid: %.*s "
+ "BSSID: "MAC_ADDRESS_STR ), psessionEntry->peSessionId,
+ psessionEntry->currentOperChannel, ssId.length, ssId.ssId,
MAC_ADDR_ARRAY(psessionEntry->pLimMlmJoinReq->bssDescription.bssId));
// include additional IE if there is
limSendProbeReqMgmtFrame( pMac, &ssId,