blob: 1c92204fb81a6d59b8aa8e05c7196c0c766c423a [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Satyanarayana Dash6f438272015-03-03 18:01:06 +05302 * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
Kiet Lam842dad02014-02-18 18:44:02 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080028/*
Jeff Johnson295189b2012-06-20 16:38:30 -070029 * This file limLinkMonitoringAlgo.cc contains the code for
30 * Link monitoring algorithm on AP and heart beat failure
31 * handling on STA.
32 * Author: Chandra Modumudi
33 * Date: 03/01/02
34 * History:-
35 * Date Modified by Modification Information
36 * --------------------------------------------------------------------
37 *
38 */
39
40#include "aniGlobal.h"
Satyanarayana Dash6f438272015-03-03 18:01:06 +053041#include "wniCfg.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070042#include "cfgApi.h"
43
Jeff Johnson295189b2012-06-20 16:38:30 -070044
45#include "schApi.h"
46#include "pmmApi.h"
47#include "utilsApi.h"
48#include "limAssocUtils.h"
49#include "limTypes.h"
50#include "limUtils.h"
51#include "limPropExtsUtils.h"
52
53#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT
54#include "vos_diag_core_log.h"
55#endif //FEATURE_WLAN_DIAG_SUPPORT
56#include "limSession.h"
57#include "limSerDesUtils.h"
58
59
60/**
61 * limSendKeepAliveToPeer()
62 *
63 *FUNCTION:
64 * This function is called to send Keep alive message to peer
65 *
66 *LOGIC:
67 *
68 *ASSUMPTIONS:
69 *
70 *NOTE:
71 * NA
72 *
73 * @param pMac - Pointer to Global MAC structure
74 * @return None
75 */
76
77void
78limSendKeepAliveToPeer(tpAniSirGlobal pMac)
79{
80
Jeff Johnson295189b2012-06-20 16:38:30 -070081} /*** limSendKeepAliveToPeer() ***/
82
83
84/** ---------------------------------------------------------
85\fn limDeleteStaContext
86\brief This function handles the message from HAL:
87\ WDA_DELETE_STA_CONTEXT_IND. This function
88\ validates that the given station id exist, and if so,
89\ deletes the station by calling limTriggerSTAdeletion.
90\param tpAniSirGlobal pMac
91\param tpSirMsgQ limMsg
92\return none
93 -----------------------------------------------------------*/
94void
95limDeleteStaContext(tpAniSirGlobal pMac, tpSirMsgQ limMsg)
96{
97 tpDeleteStaContext pMsg = (tpDeleteStaContext)limMsg->bodyptr;
98 tpDphHashNode pStaDs;
99 tpPESession psessionEntry ;
100 tANI_U8 sessionId;
101
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530102 if(NULL == pMsg)
103 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700104 PELOGE(limLog(pMac, LOGE,FL("Invalid body pointer in message"));)
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530105 return;
106 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700107 if((psessionEntry = peFindSessionByBssid(pMac,pMsg->bssId,&sessionId))== NULL)
108 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700109 PELOGE(limLog(pMac, LOGE,FL("session does not exist for given BSSId"));)
Bansidhar Gopalachari2f7395d2013-07-12 11:24:23 +0530110 vos_mem_free(pMsg);
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530111 return;
Jeff Johnson295189b2012-06-20 16:38:30 -0700112 }
113
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530114 switch(pMsg->reasonCode)
Jeff Johnson295189b2012-06-20 16:38:30 -0700115 {
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530116 case HAL_DEL_STA_REASON_CODE_KEEP_ALIVE:
117 case HAL_DEL_STA_REASON_CODE_TIM_BASED:
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700118 PELOGE(limLog(pMac, LOGE, FL(" Deleting station: staId = %d, reasonCode = %d"), pMsg->staId, pMsg->reasonCode);)
Shailender Karmuchia734f332013-04-19 14:02:48 -0700119 if (eLIM_STA_IN_IBSS_ROLE == psessionEntry->limSystemRole)
Mukul Sharma91947a22014-06-09 11:07:51 +0530120 {
121 vos_mem_free(pMsg);
Shailender Karmuchia734f332013-04-19 14:02:48 -0700122 return;
Mukul Sharma91947a22014-06-09 11:07:51 +0530123 }
Shailender Karmuchia734f332013-04-19 14:02:48 -0700124
Gopichand Nakkala94253192013-03-28 15:35:48 -0700125 pStaDs = dphLookupAssocId(pMac, pMsg->staId, &pMsg->assocId, &psessionEntry->dph.dphHashTable);
Hoonki Leee6bfe942013-02-05 15:01:19 -0800126
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530127 if (!pStaDs)
128 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700129 PELOGE(limLog(pMac, LOGE, FL("Skip STA deletion (invalid STA) limSystemRole=%d"),psessionEntry->limSystemRole);)
Bansidhar Gopalachari2f7395d2013-07-12 11:24:23 +0530130 vos_mem_free(pMsg);
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530131 return;
132 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700133
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530134 /* check and see if same staId. This is to avoid the scenario
135 * where we're trying to delete a staId we just added.
136 */
137 if (pStaDs->staIndex != pMsg->staId)
138 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700139 PELOGE(limLog(pMac, LOGE, FL("staid mismatch: %d vs %d "), pStaDs->staIndex, pMsg->staId);)
Bansidhar Gopalachari2f7395d2013-07-12 11:24:23 +0530140 vos_mem_free(pMsg);
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530141 return;
142 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700143
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530144 if((eLIM_BT_AMP_AP_ROLE == psessionEntry->limSystemRole) ||
145 (eLIM_AP_ROLE == psessionEntry->limSystemRole))
146 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530147 limLog(pMac, LOG1, FL("SAP:lim Delete Station Context (staId: %d, assocId: %d) "),
148 pMsg->staId, pMsg->assocId);
Sachin Ahuja876dade2014-07-15 17:07:35 +0530149 /*
150 * Check if Deauth/Disassoc is triggered from Host.
151 * If mlmState is in some transient state then
152 * don't trigger STA deletion to avoid the race
153 * condition.
154 */
155 if ((pStaDs &&
156 ((pStaDs->mlmStaContext.mlmState !=
157 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
158 (pStaDs->mlmStaContext.mlmState !=
159 eLIM_MLM_WT_ASSOC_CNF_STATE) &&
160 (pStaDs->mlmStaContext.mlmState !=
161 eLIM_MLM_ASSOCIATED_STATE))))
162 {
163 PELOGE(limLog(pMac, LOGE, FL("SAP:received Del STA context in some transit state(staId: %d, assocId: %d)"),
164 pMsg->staId, pMsg->assocId);)
165 vos_mem_free(pMsg);
166 return;
167 }
168 else
169 limTriggerSTAdeletion(pMac, pStaDs, psessionEntry);
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530170 }
171 else
172 {
Hoonki Leee6bfe942013-02-05 15:01:19 -0800173#ifdef FEATURE_WLAN_TDLS
174 if(eLIM_STA_ROLE == psessionEntry->limSystemRole &&
175 STA_ENTRY_TDLS_PEER == pStaDs->staType)
176 {
177 //TeardownLink with PEER
178 //Reason code HAL_DEL_STA_REASON_CODE_KEEP_ALIVE means
179 //eSIR_MAC_TDLS_TEARDOWN_PEER_UNREACHABLE
180 limSendSmeTDLSDelStaInd(pMac, pStaDs, psessionEntry,
181 /*pMsg->reasonCode*/ eSIR_MAC_TDLS_TEARDOWN_PEER_UNREACHABLE);
182 }
183 else
184 {
185#endif
186 //TearDownLink with AP
187 tLimMlmDeauthInd mlmDeauthInd;
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700188 PELOGW(limLog(pMac, LOGW, FL("lim Delete Station Context (staId: %d, assocId: %d) "),
Hoonki Leee6bfe942013-02-05 15:01:19 -0800189 pMsg->staId, pMsg->assocId);)
Mukul Sharma91947a22014-06-09 11:07:51 +0530190 if ((pStaDs &&
191 ((pStaDs->mlmStaContext.mlmState !=
192 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
193 (pStaDs->mlmStaContext.mlmState !=
194 eLIM_MLM_WT_ASSOC_CNF_STATE) &&
195 (pStaDs->mlmStaContext.mlmState !=
196 eLIM_MLM_ASSOCIATED_STATE))))
197 {
198 /**
199 * Received WDA_DELETE_STA_CONTEXT_IND for STA that does not
200 * have context or in some transit state.
201 * Log error
202 */
203 PELOGE(limLog(pMac, LOGE,
204 FL("received WDA_DELETE_STA_CONTEXT_IND for STA that either has no context or in some transit state, Addr= "
205 MAC_ADDRESS_STR), MAC_ADDR_ARRAY(pMsg->bssId));)
206 vos_mem_free(pMsg);
207 return;
208 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700209
Abhishek Singhaddb08b2014-06-06 14:16:36 +0530210 if( pMac->roam.configParam.sendDeauthBeforeCon )
211 {
212 tANI_U8 apCount = pMac->lim.gLimHeartBeatApMacIndex;
213
214 if(pMac->lim.gLimHeartBeatApMacIndex)
215 pMac->lim.gLimHeartBeatApMacIndex = 0;
216 else
217 pMac->lim.gLimHeartBeatApMacIndex = 1;
218
219 limLog(pMac, LOG1, FL("lim Delete Station Context for MAC "
220 MAC_ADDRESS_STR" Store it on Index %d"),
221 MAC_ADDR_ARRAY(pStaDs->staAddr),apCount);
222
223 sirCopyMacAddr(pMac->lim.gLimHeartBeatApMac[apCount],pStaDs->staAddr);
224 }
Deepthi Gowridf91a662014-12-17 17:14:35 +0530225 pStaDs->mlmStaContext.disassocReason =
226 eSIR_MAC_DISASSOC_DUE_TO_INACTIVITY_REASON;
Hoonki Leee6bfe942013-02-05 15:01:19 -0800227 pStaDs->mlmStaContext.cleanupTrigger = eLIM_LINK_MONITORING_DEAUTH;
Jeff Johnson295189b2012-06-20 16:38:30 -0700228
Padma, Santhosh Kumar6dc7be62015-08-07 18:13:31 +0530229 if (pStaDs->isDisassocDeauthInProgress)
230 {
231 limLog(pMac, LOGE, FL("No need to cleanup as already"
232 "disassoc or deauth in progress"));
233 return;
234 }
235 else
236 pStaDs->isDisassocDeauthInProgress++;
Mukul Sharma91947a22014-06-09 11:07:51 +0530237
Hoonki Leee6bfe942013-02-05 15:01:19 -0800238 // Issue Deauth Indication to SME.
Bansidhar Gopalachari2f7395d2013-07-12 11:24:23 +0530239 vos_mem_copy((tANI_U8 *) &mlmDeauthInd.peerMacAddr,
240 pStaDs->staAddr, sizeof(tSirMacAddr));
Hoonki Leee6bfe942013-02-05 15:01:19 -0800241 mlmDeauthInd.reasonCode = (tANI_U8) pStaDs->mlmStaContext.disassocReason;
242 mlmDeauthInd.deauthTrigger = pStaDs->mlmStaContext.cleanupTrigger;
Jeff Johnson295189b2012-06-20 16:38:30 -0700243
Gopichand Nakkalaca35d292013-03-05 11:06:03 -0800244#ifdef FEATURE_WLAN_TDLS
245 /* Delete all TDLS peers connected before leaving BSS*/
246 limDeleteTDLSPeers(pMac, psessionEntry);
247#endif
Hoonki Leee6bfe942013-02-05 15:01:19 -0800248 limPostSmeMessage(pMac, LIM_MLM_DEAUTH_IND, (tANI_U32 *) &mlmDeauthInd);
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530249
Hoonki Leee6bfe942013-02-05 15:01:19 -0800250 limSendSmeDeauthInd(pMac, pStaDs, psessionEntry);
251#ifdef FEATURE_WLAN_TDLS
252 }
253#endif
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530254 }
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530255 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700256
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530257 case HAL_DEL_STA_REASON_CODE_UNKNOWN_A2:
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700258 PELOGE(limLog(pMac, LOGE, FL(" Deleting Unknown station "));)
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530259 limPrintMacAddr(pMac, pMsg->addr2, LOGE);
260 limSendDeauthMgmtFrame( pMac, eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON, pMsg->addr2, psessionEntry, FALSE);
261 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700262
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530263 default:
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700264 PELOGE(limLog(pMac, LOGE, FL(" Unknown reason code "));)
Pratik Bhalgataa1ae392012-11-22 17:44:33 +0530265 break;
266
Jeff Johnson295189b2012-06-20 16:38:30 -0700267 }
Bansidhar Gopalachari2f7395d2013-07-12 11:24:23 +0530268 vos_mem_free(pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -0700269 return;
270}
271
272
273/**
274 * limTriggerSTAdeletion()
275 *
276 *FUNCTION:
277 * This function is called to trigger STA context deletion
278 *
279 *LOGIC:
280 *
281 *ASSUMPTIONS:
282 *
283 *NOTE:
284 * NA
285 *
286 * @param pMac - Pointer to global MAC structure
287 * @param pStaDs - Pointer to internal STA Datastructure
288 * @return None
289 */
290void
291limTriggerSTAdeletion(tpAniSirGlobal pMac, tpDphHashNode pStaDs, tpPESession psessionEntry)
292{
293 tSirSmeDeauthReq *pSmeDeauthReq;
294 tANI_U8 *pBuf;
295 tANI_U8 *pLen;
296 tANI_U16 msgLength = 0;
297
298 if (! pStaDs)
299 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700300 PELOGW(limLog(pMac, LOGW, FL("Skip STA deletion (invalid STA)"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700301 return;
302 }
303 /**
304 * MAC based Authentication was used. Trigger
305 * Deauthentication frame to peer since it will
306 * take care of disassociation as well.
307 */
308
Bansidhar Gopalachari2f7395d2013-07-12 11:24:23 +0530309 pSmeDeauthReq = vos_mem_malloc(sizeof(tSirSmeDeauthReq));
310 if (NULL == pSmeDeauthReq)
Jeff Johnson295189b2012-06-20 16:38:30 -0700311 {
Bansidhar Gopalachari2f7395d2013-07-12 11:24:23 +0530312 limLog(pMac, LOGP, FL("AllocateMemory failed for eWNI_SME_DEAUTH_REQ "));
Jeff Johnson295189b2012-06-20 16:38:30 -0700313 return;
314 }
315
316 pBuf = (tANI_U8 *) &pSmeDeauthReq->messageType;
317
318 //messageType
Jeff Johnson295189b2012-06-20 16:38:30 -0700319 limCopyU16((tANI_U8*)pBuf, eWNI_SME_DISASSOC_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -0700320 pBuf += sizeof(tANI_U16);
321 msgLength += sizeof(tANI_U16);
322
323 //length
324 pLen = pBuf;
325 pBuf += sizeof(tANI_U16);
326 msgLength += sizeof(tANI_U16);
Jeff Johnsone7245742012-09-05 17:12:55 -0700327
Jeff Johnson295189b2012-06-20 16:38:30 -0700328 //sessionId
Jeff Johnsone7245742012-09-05 17:12:55 -0700329 *pBuf = psessionEntry->smeSessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -0700330 pBuf++;
331 msgLength++;
Jeff Johnsone7245742012-09-05 17:12:55 -0700332
Jeff Johnson295189b2012-06-20 16:38:30 -0700333 //transactionId
334 limCopyU16((tANI_U8*)pBuf, psessionEntry->transactionId);
335 pBuf += sizeof(tANI_U16);
336 msgLength += sizeof(tANI_U16);
337
338 //bssId
Bansidhar Gopalachari2f7395d2013-07-12 11:24:23 +0530339 vos_mem_copy(pBuf, psessionEntry->bssId, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -0700340 pBuf += sizeof(tSirMacAddr);
341 msgLength += sizeof(tSirMacAddr);
342
343 //peerMacAddr
Bansidhar Gopalachari2f7395d2013-07-12 11:24:23 +0530344 vos_mem_copy(pBuf, pStaDs->staAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -0700345 pBuf += sizeof(tSirMacAddr);
346 msgLength += sizeof(tSirMacAddr);
347
348 //reasonCode
Deepthi Gowri41716672015-07-27 17:18:13 +0530349 limCopyU16((tANI_U8*)pBuf,
350 (tANI_U16)eSIR_MAC_DISASSOC_DUE_TO_INACTIVITY_REASON);
Jeff Johnson295189b2012-06-20 16:38:30 -0700351 pBuf += sizeof(tANI_U16);
352 msgLength += sizeof(tANI_U16);
353
354 //Do not send disassoc OTA
355 //pBuf[0] = 1 means do not send the disassoc frame over the air
356 //pBuf[0] = 0 means send the disassoc frame over the air
357 pBuf[0]= 0;
358 pBuf += sizeof(tANI_U8);
359 msgLength += sizeof(tANI_U8);
360
361
Jeff Johnson295189b2012-06-20 16:38:30 -0700362
363 //Fill in length
Gopichand Nakkala114718f2013-03-25 19:19:46 -0700364 limCopyU16((tANI_U8*)pLen , msgLength);
Jeff Johnson295189b2012-06-20 16:38:30 -0700365
Jeff Johnson295189b2012-06-20 16:38:30 -0700366 limPostSmeMessage(pMac, eWNI_SME_DISASSOC_REQ, (tANI_U32 *) pSmeDeauthReq);
Bansidhar Gopalachari2f7395d2013-07-12 11:24:23 +0530367 vos_mem_free(pSmeDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700368
369} /*** end limTriggerSTAdeletion() ***/
370
371
372
373/**
374 * limTearDownLinkWithAp()
375 *
376 *FUNCTION:
377 * This function is called when heartbeat (beacon reception)
378 * fails on STA
379 *
380 *LOGIC:
381 *
382 *ASSUMPTIONS:
383 *
384 *NOTE:
385 *
386 * @param pMac - Pointer to Global MAC structure
387 * @return None
388 */
389
390void
391limTearDownLinkWithAp(tpAniSirGlobal pMac, tANI_U8 sessionId, tSirMacReasonCodes reasonCode)
392{
393 tpDphHashNode pStaDs = NULL;
394
395 //tear down the following sessionEntry
396 tpPESession psessionEntry;
397
398 if((psessionEntry = peFindSessionBySessionId(pMac, sessionId))== NULL)
399 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700400 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700401 return;
402 }
403 /**
404 * Heart beat failed for upto threshold value
405 * and AP did not respond for Probe request.
406 * Trigger link tear down.
407 */
408
409 pMac->pmm.inMissedBeaconScenario = FALSE;
410 limLog(pMac, LOGW,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700411 FL("No ProbeRsp from AP after HB failure. Tearing down link"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700412
413 // Deactivate heartbeat timer
414 limHeartBeatDeactivateAndChangeTimer(pMac, psessionEntry);
415
416 // Announce loss of link to Roaming algorithm
417 // and cleanup by sending SME_DISASSOC_REQ to SME
418
419 pStaDs = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable);
420
421
422 if (pStaDs != NULL)
423 {
424 tLimMlmDeauthInd mlmDeauthInd;
425
Gopichand Nakkalae9b72e12013-02-27 20:51:16 -0800426#ifdef FEATURE_WLAN_TDLS
427 /* Delete all TDLS peers connected before leaving BSS*/
428 limDeleteTDLSPeers(pMac, psessionEntry);
429#endif
430
Jeff Johnson295189b2012-06-20 16:38:30 -0700431 pStaDs->mlmStaContext.disassocReason = reasonCode;
432 pStaDs->mlmStaContext.cleanupTrigger = eLIM_LINK_MONITORING_DEAUTH;
433
434 /// Issue Deauth Indication to SME.
Bansidhar Gopalachari2f7395d2013-07-12 11:24:23 +0530435 vos_mem_copy((tANI_U8 *) &mlmDeauthInd.peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -0700436 pStaDs->staAddr,
437 sizeof(tSirMacAddr));
Abhishek Singhde51a412014-05-20 19:17:26 +0530438 /* if sendDeauthBeforeCon is enabled and reasoncode is Beacon Missed
439 * Store the MAC of AP in the flip flop buffer. This MAC will be
440 * used to send Deauth before connection, if we connect to same AP
441 * after HB failure.
442 */
443 if(pMac->roam.configParam.sendDeauthBeforeCon &&
444 eSIR_BEACON_MISSED == reasonCode)
445 {
446 int apCount = pMac->lim.gLimHeartBeatApMacIndex;
447
448 if(pMac->lim.gLimHeartBeatApMacIndex)
449 pMac->lim.gLimHeartBeatApMacIndex = 0;
450 else
451 pMac->lim.gLimHeartBeatApMacIndex = 1;
452
453 limLog(pMac, LOGE, FL("HB Failure on MAC "
454 MAC_ADDRESS_STR" Store it on Index %d"),
455 MAC_ADDR_ARRAY(pStaDs->staAddr),apCount);
456
457 sirCopyMacAddr(pMac->lim.gLimHeartBeatApMac[apCount],pStaDs->staAddr);
458 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700459 mlmDeauthInd.reasonCode = (tANI_U8) pStaDs->mlmStaContext.disassocReason;
460 mlmDeauthInd.deauthTrigger = pStaDs->mlmStaContext.cleanupTrigger;
461
462 limPostSmeMessage(pMac, LIM_MLM_DEAUTH_IND, (tANI_U32 *) &mlmDeauthInd);
463
464 limSendSmeDeauthInd(pMac, pStaDs, psessionEntry);
465 }
466} /*** limTearDownLinkWithAp() ***/
467
468
469
470
471/**
472 * limHandleHeartBeatFailure()
473 *
474 *FUNCTION:
475 * This function is called when heartbeat (beacon reception)
476 * fails on STA
477 *
478 *LOGIC:
479 *
480 *ASSUMPTIONS:
481 *
482 *NOTE:
483 *
484 * @param pMac - Pointer to Global MAC structure
485 * @return None
486 */
487
488void limHandleHeartBeatFailure(tpAniSirGlobal pMac,tpPESession psessionEntry)
489{
490
491#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT
492 vos_log_beacon_update_pkt_type *log_ptr = NULL;
493#endif //FEATURE_WLAN_DIAG_SUPPORT
494
495 /* If gLimHeartBeatTimer fires between the interval of sending WDA_ENTER_BMPS_REQUEST
496 * to the HAL and receiving WDA_ENTER_BMPS_RSP from the HAL, then LIM (PE) tries to Process the
497 * SIR_LIM_HEAR_BEAT_TIMEOUT message but The PE state is ePMM_STATE_BMPS_SLEEP so PE dont
498 * want to handle heartbeat timeout in the BMPS, because Firmware handles it in BMPS.
499 * So just return from heartbeatfailure handler
500 */
Yathish9f22e662012-12-10 14:21:35 -0800501 if(!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE && (!limIsSystemInActiveState(pMac)))
502 return;
Jeff Johnson295189b2012-06-20 16:38:30 -0700503
504#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT
505 WLAN_VOS_DIAG_LOG_ALLOC(log_ptr, vos_log_beacon_update_pkt_type, LOG_WLAN_BEACON_UPDATE_C);
506 if(log_ptr)
507 log_ptr->bcn_rx_cnt = psessionEntry->LimRxedBeaconCntDuringHB;
508 WLAN_VOS_DIAG_LOG_REPORT(log_ptr);
509#endif //FEATURE_WLAN_DIAG_SUPPORT
510
511 /* Ensure HB Status for the session has been reseted */
512 psessionEntry->LimHBFailureStatus = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700513
Sushant Kaushikc14c4d82014-06-30 11:42:21 +0530514 if (((psessionEntry->limSystemRole == eLIM_STA_ROLE)||
515 (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE))&&
516 (psessionEntry->limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)&&
517 (psessionEntry->limSmeState != eLIM_SME_WT_DISASSOC_STATE) &&
518 (psessionEntry->limSmeState != eLIM_SME_WT_DEAUTH_STATE))
Jeff Johnson295189b2012-06-20 16:38:30 -0700519 {
520 if (!pMac->sys.gSysEnableLinkMonitorMode)
521 return;
522
523 /**
524 * Beacon frame not received within heartbeat timeout.
525 */
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700526 PELOGW(limLog(pMac, LOGW, FL("Heartbeat Failure"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700527 pMac->lim.gLimHBfailureCntInLinkEstState++;
528
529 /**
530 * Check if connected on the DFS channel, if not connected on
531 * DFS channel then only send the probe request otherwise tear down the link
532 */
533 if(!limIsconnectedOnDFSChannel(psessionEntry->currentOperChannel))
534 {
535 /*** Detected continuous Beacon Misses ***/
536 psessionEntry->LimHBFailureStatus= eANI_BOOLEAN_TRUE;
Abhishek Singh11761d02014-05-28 18:39:48 +0530537 /*Reset the HB packet count before sending probe*/
538 limResetHBPktCount(psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700539 /**
540 * Send Probe Request frame to AP to see if
541 * it is still around. Wait until certain
542 * timeout for Probe Response from AP.
543 */
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700544 PELOGW(limLog(pMac, LOGW, FL("Heart Beat missed from AP. Sending Probe Req"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700545 /* for searching AP, we don't include any additional IE */
546 limSendProbeReqMgmtFrame(pMac, &psessionEntry->ssId, psessionEntry->bssId,
547 psessionEntry->currentOperChannel,psessionEntry->selfMacAddr,
548 psessionEntry->dot11mode, 0, NULL);
549 }
550 else
551 {
Praveen Kumar Sirisillaedf67e82013-08-21 19:17:10 -0700552 PELOGW(limLog(pMac, LOGW,
553 FL("Heart Beat missed from AP on DFS chanel moving to passive"));)
554 if (psessionEntry->currentOperChannel < SIR_MAX_24G_5G_CHANNEL_RANGE){
555 limCovertChannelScanType(pMac, psessionEntry->currentOperChannel, false);
556 pMac->lim.dfschannelList.timeStamp[psessionEntry->currentOperChannel] = 0;
557 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700558 /* Connected on DFS channel so should not send the probe request
559 * tear down the link directly */
Abhishek Singhde51a412014-05-20 19:17:26 +0530560 limTearDownLinkWithAp(pMac, psessionEntry->peSessionId, eSIR_BEACON_MISSED);
Jeff Johnson295189b2012-06-20 16:38:30 -0700561 }
562 }
563 else
564 {
565 /**
566 * Heartbeat timer may have timed out
567 * while we're doing background scanning/learning
568 * or in states other than link-established state.
569 * Log error.
570 */
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530571 limLog(pMac, LOG1, FL("received heartbeat timeout in state %d"),
572 psessionEntry->limMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -0700573 limPrintMlmState(pMac, LOG1, psessionEntry->limMlmState);
574 pMac->lim.gLimHBfailureCntInOtherStates++;
575 limReactivateHeartBeatTimer(pMac, psessionEntry);
576 }
577} /*** limHandleHeartBeatFailure() ***/