blob: c9106f951d703762f1961d4b1a19395da4fff6a8 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Gopichand Nakkala92f07d82013-01-08 21:16:34 -08002 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
3 *
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.
20 */
21/*
Jeff Johnson32d95a32012-09-10 13:15:23 -070022 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Jeff Johnson295189b2012-06-20 16:38:30 -070023 *
24 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
25 *
26 *
27 * Permission to use, copy, modify, and/or distribute this software for
28 * any purpose with or without fee is hereby granted, provided that the
29 * above copyright notice and this permission notice appear in all
30 * copies.
31 *
32 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
33 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
34 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
35 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
36 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
37 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
38 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
39 * PERFORMANCE OF THIS SOFTWARE.
40 */
41
42/*
43 * Airgo Networks, Inc proprietary. All rights reserved.
44 * This file limApi.cc contains the functions that are
45 * exported by LIM to other modules.
46 *
47 * Author: Chandra Modumudi
48 * Date: 02/11/02
49 * History:-
50 * Date Modified by Modification Information
51 * --------------------------------------------------------------------
52 *
53 */
54#include "palTypes.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070055#include "wniCfgSta.h"
56#include "wniApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070057#include "sirCommon.h"
58#include "sirDebug.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070059#include "cfgApi.h"
60
61#include "schApi.h"
62#include "utilsApi.h"
63#include "limApi.h"
64#include "limGlobal.h"
65#include "limTypes.h"
66#include "limUtils.h"
67#include "limAssocUtils.h"
68#include "limPropExtsUtils.h"
69#include "limSerDesUtils.h"
70#include "limIbssPeerMgmt.h"
71#include "limAdmitControl.h"
72#include "pmmApi.h"
73#include "logDump.h"
74#include "limSendSmeRspMessages.h"
75#include "wmmApsd.h"
76#include "limTrace.h"
77#include "limSession.h"
78#include "wlan_qct_wda.h"
79
80#if defined WLAN_FEATURE_VOWIFI
81#include "rrmApi.h"
82#endif
83
84#include <limFT.h>
Jeff Johnson295189b2012-06-20 16:38:30 -070085#include "vos_types.h"
86#include "vos_packet.h"
87#include "wlan_qct_tl.h"
88#include "sysStartup.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070089
90
91static void __limInitScanVars(tpAniSirGlobal pMac)
92{
93 pMac->lim.gLimUseScanModeForLearnMode = 1;
94
95 pMac->lim.gLimSystemInScanLearnMode = 0;
96
97 // Scan related globals on STA
98 pMac->lim.gLimReturnAfterFirstMatch = 0;
99 pMac->lim.gLim24Band11dScanDone = 0;
100 pMac->lim.gLim50Band11dScanDone = 0;
101 pMac->lim.gLimReturnUniqueResults = 0;
102
103 // Background Scan related globals on STA
104 pMac->lim.gLimNumOfBackgroundScanSuccess = 0;
105 pMac->lim.gLimNumOfConsecutiveBkgndScanFailure = 0;
106 pMac->lim.gLimNumOfForcedBkgndScan = 0;
107 pMac->lim.gLimBackgroundScanDisable = false; //based on BG timer
108 pMac->lim.gLimForceBackgroundScanDisable = false; //debug control flag
109 pMac->lim.gLimBackgroundScanTerminate = TRUE; //controlled by SME
Jeff Johnson92751692013-03-06 16:00:33 -0800110 pMac->lim.gLimReportBackgroundScanResults = FALSE; //controlled by SME
Jeff Johnson295189b2012-06-20 16:38:30 -0700111
112 pMac->lim.gLimCurrentScanChannelId = 0;
113 pMac->lim.gpLimMlmScanReq = NULL;
Viral Modid440e682013-03-06 02:25:31 -0800114 pMac->lim.gDeferMsgTypeForNOA = 0;
115 pMac->lim.gpDefdSmeMsgForNOA = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700116 pMac->lim.gLimMlmScanResultLength = 0;
117 pMac->lim.gLimSmeScanResultLength = 0;
118
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530119 vos_mem_set(pMac->lim.gLimCachedScanHashTable,
120 sizeof(pMac->lim.gLimCachedScanHashTable), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700121
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700122#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
123
124 pMac->lim.gLimMlmLfrScanResultLength = 0;
125 pMac->lim.gLimSmeLfrScanResultLength = 0;
126
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530127 vos_mem_set(pMac->lim.gLimCachedLfrScanHashTable,
128 sizeof(pMac->lim.gLimCachedLfrScanHashTable), 0);
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700129#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700130 pMac->lim.gLimBackgroundScanChannelId = 0;
131 pMac->lim.gLimBackgroundScanStarted = 0;
132 pMac->lim.gLimRestoreCBNumScanInterval = LIM_RESTORE_CB_NUM_SCAN_INTERVAL_DEFAULT;
133 pMac->lim.gLimRestoreCBCount = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530134 vos_mem_set(pMac->lim.gLimLegacyBssidList,
135 sizeof(pMac->lim.gLimLegacyBssidList), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700136
137 /* Fill in default values */
138 pMac->lim.gLimTriggerBackgroundScanDuringQuietBss = 0;
139
Jeff Johnson295189b2012-06-20 16:38:30 -0700140
141 // abort scan is used to abort an on-going scan
142 pMac->lim.abortScan = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530143 vos_mem_set(&pMac->lim.scanChnInfo, sizeof(tLimScanChnInfo), 0);
144 vos_mem_set(&pMac->lim.dfschannelList, sizeof(tSirDFSChannelList), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700145
146//WLAN_SUSPEND_LINK Related
147 pMac->lim.gpLimSuspendCallback = NULL;
148 pMac->lim.gpLimResumeCallback = NULL;
149//end WLAN_SUSPEND_LINK Related
150}
151
152
153static void __limInitBssVars(tpAniSirGlobal pMac)
154{
155
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530156 vos_mem_set((void*)pMac->lim.gpSession,
157 sizeof(*pMac->lim.gpSession)*pMac->lim.maxBssId, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700158
159
160 //pMac->lim.gpLimStartBssReq = NULL;
161
Jeff Johnson295189b2012-06-20 16:38:30 -0700162
163
164
165/* These global variables are moved to session table and intialization is done during session creation Oct 9th Review */
166#if 0
167
168 // Place holder for BSS description that we're
169 // currently joined with
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530170 vos_mem_set(&pMac->lim.gLimCurrentBssId, sizeof(tSirMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700171 pMac->lim.gLimCurrentChannelId = HAL_INVALID_CHANNEL_ID;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530172 vos_mem_set(&pMac->lim.gLimCurrentSSID, sizeof(tSirMacSSid), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700173 pMac->lim.gLimCurrentBssCaps = 0;
174 QosCaps is a bit map of various qos capabilities - see defn above
175 pMac->lim.gLimCurrentBssQosCaps = 0;
176 pMac->lim.gLimCurrentBssPropCap = 0;
177 pMac->lim.gLimSentCapsChangeNtf = 0;
178
179 // Place holder for BSS description that
180 // we're currently Reassociating
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530181 vos_mem_set(&pMac->lim.gLimReassocBssId, sizeof(tSirMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700182 pMac->lim.gLimReassocChannelId = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530183 vos_mem_set(&pMac->lim.gLimReassocSSID, sizeof(tSirMacSSid), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700184 pMac->lim.gLimReassocBssCaps = 0;
185 pMac->lim.gLimReassocBssQosCaps = 0;
186 pMac->lim.gLimReassocBssPropCap = 0;
187 #endif
188
189 /* This is for testing purposes only, be default should always be off */
190 pMac->lim.gLimForceNoPropIE = 0;
191
192 // pMac->lim.gLimBssIdx = 0;
193
194 pMac->lim.gpLimMlmSetKeysReq = NULL;
195 pMac->lim.gpLimMlmRemoveKeyReq = NULL;
196 // pMac->lim.gLimStaid = 0; //TO SUPPORT BT-AMP
197
198}
199
200
201static void __limInitStatsVars(tpAniSirGlobal pMac)
202{
203 pMac->lim.gLimNumBeaconsRcvd = 0;
204 pMac->lim.gLimNumBeaconsIgnored = 0;
205
206 pMac->lim.gLimNumDeferredMsgs = 0;
207
208 /// Variable to keep track of number of currently associated STAs
Gopichand Nakkala777e6032012-12-31 16:39:21 -0800209 //pMac->lim.gLimNumOfCurrentSTAs = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700210 pMac->lim.gLimNumOfAniSTAs = 0; // count of ANI peers
211
212 /// This indicates number of RXed Beacons during HB period
213 //pMac->lim.gLimRxedBeaconCntDuringHB = 0;
214
215 // Heart-Beat interval value
216 pMac->lim.gLimHeartBeatCount = 0;
217
218 // Statistics to keep track of no. beacons rcvd in heart beat interval
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530219 vos_mem_set(pMac->lim.gLimHeartBeatBeaconStats,
220 sizeof(pMac->lim.gLimHeartBeatBeaconStats), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700221
222#ifdef WLAN_DEBUG
223 // Debug counters
224 pMac->lim.numTot = 0;
225 pMac->lim.numBbt = 0;
226 pMac->lim.numProtErr = 0;
227 pMac->lim.numLearn = 0;
228 pMac->lim.numLearnIgnore = 0;
229 pMac->lim.numSme = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530230 vos_mem_set(pMac->lim.numMAC, sizeof(pMac->lim.numMAC), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700231 pMac->lim.gLimNumAssocReqDropInvldState = 0;
232 pMac->lim.gLimNumAssocReqDropACRejectTS = 0;
233 pMac->lim.gLimNumAssocReqDropACRejectSta = 0;
234 pMac->lim.gLimNumReassocReqDropInvldState = 0;
235 pMac->lim.gLimNumHashMissIgnored = 0;
236 pMac->lim.gLimUnexpBcnCnt = 0;
237 pMac->lim.gLimBcnSSIDMismatchCnt = 0;
238 pMac->lim.gLimNumLinkEsts = 0;
239 pMac->lim.gLimNumRxCleanup = 0;
240 pMac->lim.gLim11bStaAssocRejectCount = 0;
241#endif
242}
243
244
245
246static void __limInitStates(tpAniSirGlobal pMac)
247{
248 // Counts Heartbeat failures
249 pMac->lim.gLimHBfailureCntInLinkEstState = 0;
250 pMac->lim.gLimProbeFailureAfterHBfailedCnt = 0;
251 pMac->lim.gLimHBfailureCntInOtherStates = 0;
252 pMac->lim.gLimRspReqd = 0;
253 pMac->lim.gLimPrevSmeState = eLIM_SME_OFFLINE_STATE;
254
255 /// MLM State visible across all Sirius modules
Jeff Johnsone7245742012-09-05 17:12:55 -0700256 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, eLIM_MLM_IDLE_STATE));
Jeff Johnson295189b2012-06-20 16:38:30 -0700257 pMac->lim.gLimMlmState = eLIM_MLM_IDLE_STATE;
258
259 /// Previous MLM State
260 pMac->lim.gLimPrevMlmState = eLIM_MLM_OFFLINE_STATE;
261
262#ifdef GEN4_SCAN
263 // LIM to HAL SCAN Management Message Interface states
264 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
265#endif // GEN4_SCAN
266
Jeff Johnson295189b2012-06-20 16:38:30 -0700267 /**
Jeff Johnsone7245742012-09-05 17:12:55 -0700268 * Initialize state to eLIM_SME_OFFLINE_STATE
Jeff Johnson295189b2012-06-20 16:38:30 -0700269 */
Jeff Johnsone7245742012-09-05 17:12:55 -0700270 pMac->lim.gLimSmeState = eLIM_SME_OFFLINE_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700271
272 /**
273 * By default assume 'unknown' role. This will be updated
274 * when SME_START_BSS_REQ is received.
275 */
276
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530277 vos_mem_set(&pMac->lim.gLimOverlap11gParams, sizeof(tLimProtStaParams), 0);
278 vos_mem_set(&pMac->lim.gLimOverlap11aParams, sizeof(tLimProtStaParams), 0);
279 vos_mem_set(&pMac->lim.gLimOverlapHt20Params, sizeof(tLimProtStaParams), 0);
280 vos_mem_set(&pMac->lim.gLimOverlapNonGfParams, sizeof(tLimProtStaParams), 0);
281 vos_mem_set(&pMac->lim.gLimNoShortParams, sizeof(tLimNoShortParams), 0);
282 vos_mem_set(&pMac->lim.gLimNoShortSlotParams, sizeof(tLimNoShortSlotParams), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700283
284 pMac->lim.gLimPhyMode = 0;
285 pMac->lim.scanStartTime = 0; // used to measure scan time
286
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530287 vos_mem_set(pMac->lim.gLimMyMacAddr, sizeof(pMac->lim.gLimMyMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700288 pMac->lim.ackPolicy = 0;
289
290#if 0 /* Moving all these to session specific elements */
291 pMac->lim.gLimQosEnabled = 0; //11E
292 pMac->lim.gLimWmeEnabled = 0; //WME
293 pMac->lim.gLimWsmEnabled = 0; //WSM
294 pMac->lim.gLimHcfEnabled = 0;
295 pMac->lim.gLim11dEnabled = 0;
296#endif
297
298 pMac->lim.gLimProbeRespDisableFlag = 0; // control over probe response
299}
300
301static void __limInitVars(tpAniSirGlobal pMac)
302{
303
Jeff Johnson295189b2012-06-20 16:38:30 -0700304
305 // Place holder for Measurement Req/Rsp/Ind related info
Jeff Johnson295189b2012-06-20 16:38:30 -0700306
307 // WDS info
308 pMac->lim.gLimNumWdsInfoInd = 0;
309 pMac->lim.gLimNumWdsInfoSet = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530310 vos_mem_set(&pMac->lim.gLimWdsInfo, sizeof(tSirWdsInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700311 /* initialize some parameters */
312 limInitWdsInfoParams(pMac);
313
314 // Deferred Queue Paramters
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530315 vos_mem_set(&pMac->lim.gLimDeferredMsgQ, sizeof(tSirAddtsReq), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700316
317 // addts request if any - only one can be outstanding at any time
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530318 vos_mem_set(&pMac->lim.gLimAddtsReq, sizeof(tSirAddtsReq) , 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700319 pMac->lim.gLimAddtsSent = 0;
320 pMac->lim.gLimAddtsRspTimerCount = 0;
321
322 //protection related config cache
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530323 vos_mem_set(&pMac->lim.cfgProtection, sizeof(tCfgProtection), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700324 pMac->lim.gLimProtectionControl = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530325 vos_mem_set(&pMac->lim.gLimAlternateRadio, sizeof(tSirAlternateRadioInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700326 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
327
Jeff Johnsone7245742012-09-05 17:12:55 -0700328#if 0
Jeff Johnson295189b2012-06-20 16:38:30 -0700329 // 11h Spectrum Management Related Flag
Jeff Johnson295189b2012-06-20 16:38:30 -0700330 LIM_SET_RADAR_DETECTED(pMac, eANI_BOOLEAN_FALSE);
331 pMac->sys.gSysEnableLearnMode = eANI_BOOLEAN_TRUE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700332#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700333 // WMM Related Flag
334 pMac->lim.gUapsdEnable = 0;
335 pMac->lim.gUapsdPerAcBitmask = 0;
336 pMac->lim.gUapsdPerAcTriggerEnableMask = 0;
337 pMac->lim.gUapsdPerAcDeliveryEnableMask = 0;
338
339 // QoS-AC Downgrade: Initially, no AC is admitted
340 pMac->lim.gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] = 0;
341 pMac->lim.gAcAdmitMask[SIR_MAC_DIRECTION_DNLINK] = 0;
342
343 //dialogue token List head/tail for Action frames request sent.
344 pMac->lim.pDialogueTokenHead = NULL;
345 pMac->lim.pDialogueTokenTail = NULL;
346
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530347 vos_mem_set(&pMac->lim.tspecInfo,
348 sizeof(tLimTspecInfo) * LIM_NUM_TSPEC_MAX, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700349
350 // admission control policy information
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530351 vos_mem_set(&pMac->lim.admitPolicyInfo, sizeof(tLimAdmitPolicyInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700352
353 pMac->lim.gLastBeaconDtimCount = 0;
354 pMac->lim.gLastBeaconDtimPeriod = 0;
355
356 //Scan in Power Save Flag
357 pMac->lim.gScanInPowersave = 0;
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -0800358 pMac->lim.probeCounter = 0;
359 pMac->lim.maxProbe = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700360}
361
362static void __limInitAssocVars(tpAniSirGlobal pMac)
363{
Madan Mohan Koyyalamudi59efbe02013-01-10 15:38:42 -0800364 tANI_U32 val;
Gopichand Nakkala777e6032012-12-31 16:39:21 -0800365#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530366 vos_mem_set(pMac->lim.gpLimAIDpool,
367 sizeof(*pMac->lim.gpLimAIDpool) * (WNI_CFG_ASSOC_STA_LIMIT_STAMAX+1), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700368 pMac->lim.freeAidHead = 0;
369 pMac->lim.freeAidTail = 0;
Gopichand Nakkala777e6032012-12-31 16:39:21 -0800370#endif
Madan Mohan Koyyalamudi59efbe02013-01-10 15:38:42 -0800371 if(wlan_cfgGetInt(pMac, WNI_CFG_ASSOC_STA_LIMIT, &val) != eSIR_SUCCESS)
372 {
373 limLog( pMac, LOGP, FL( "cfg get assoc sta limit failed" ));
374 }
375 pMac->lim.gLimAssocStaLimit = val;
Ravi Joshi0fc681b2013-09-11 16:46:07 -0700376 pMac->lim.gLimIbssStaLimit = val;
Jeff Johnson295189b2012-06-20 16:38:30 -0700377
378 // Place holder for current authentication request
379 // being handled
380 pMac->lim.gpLimMlmAuthReq = NULL;
Jeff Johnsone7245742012-09-05 17:12:55 -0700381 //pMac->lim.gpLimMlmJoinReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700382
383 /// MAC level Pre-authentication related globals
384 pMac->lim.gLimPreAuthChannelNumber = 0;
385 pMac->lim.gLimPreAuthType = eSIR_OPEN_SYSTEM;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530386 vos_mem_set(&pMac->lim.gLimPreAuthPeerAddr, sizeof(tSirMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700387 pMac->lim.gLimNumPreAuthContexts = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530388 vos_mem_set(&pMac->lim.gLimPreAuthTimerTable, sizeof(tLimPreAuthTable), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700389
390 // Placed holder to deauth reason
391 pMac->lim.gLimDeauthReasonCode = 0;
392
393 // Place holder for Pre-authentication node list
394 pMac->lim.pLimPreAuthList = NULL;
395
396 // Send Disassociate frame threshold parameters
397 pMac->lim.gLimDisassocFrameThreshold = LIM_SEND_DISASSOC_FRAME_THRESHOLD;
398 pMac->lim.gLimDisassocFrameCredit = 0;
399
400 //One cache for each overlap and associated case.
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530401 vos_mem_set(pMac->lim.protStaOverlapCache,
402 sizeof(tCacheParams) * LIM_PROT_STA_OVERLAP_CACHE_SIZE, 0);
403 vos_mem_set(pMac->lim.protStaCache,
404 sizeof(tCacheParams) * LIM_PROT_STA_CACHE_SIZE, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700405
Madan Mohan Koyyalamudi61bc5662012-11-02 14:33:10 -0700406#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
407 pMac->lim.pSessionEntry = NULL;
408 pMac->lim.reAssocRetryAttempt = 0;
409#endif
410
Jeff Johnson295189b2012-06-20 16:38:30 -0700411}
412
413
414static void __limInitTitanVars(tpAniSirGlobal pMac)
415{
Jeff Johnsone7245742012-09-05 17:12:55 -0700416#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530417 vos_mem_set(&pMac->lim.gLimChannelSwitch, sizeof(tLimChannelSwitchInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700418 pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_IDLE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700419 pMac->lim.gLimChannelSwitch.secondarySubBand = PHY_SINGLE_CHANNEL_CENTERED;
420#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700421 // Debug workaround for BEACON's
422 // State change triggered by "dump 222"
423 pMac->lim.gLimScanOverride = 1;
424 pMac->lim.gLimScanOverrideSaved = eSIR_ACTIVE_SCAN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700425 pMac->lim.gLimTitanStaCount = 0;
426 pMac->lim.gLimBlockNonTitanSta = 0;
427}
428
429static void __limInitHTVars(tpAniSirGlobal pMac)
430{
431 pMac->lim.htCapabilityPresentInBeacon = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700432 pMac->lim.gHTGreenfield = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700433 pMac->lim.gHTShortGI40Mhz = 0;
434 pMac->lim.gHTShortGI20Mhz = 0;
435 pMac->lim.gHTMaxAmsduLength = 0;
436 pMac->lim.gHTDsssCckRate40MHzSupport = 0;
437 pMac->lim.gHTPSMPSupport = 0;
438 pMac->lim.gHTLsigTXOPProtection = 0;
439 pMac->lim.gHTMIMOPSState = eSIR_HT_MIMO_PS_STATIC;
440 pMac->lim.gHTAMpduDensity = 0;
441
442 pMac->lim.gMaxAmsduSizeEnabled = false;
443 pMac->lim.gHTMaxRxAMpduFactor = 0;
444 pMac->lim.gHTServiceIntervalGranularity = 0;
445 pMac->lim.gHTControlledAccessOnly = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700446 pMac->lim.gHTOperMode = eSIR_HT_OP_MODE_PURE;
447 pMac->lim.gHTPCOActive = 0;
448
449 pMac->lim.gHTPCOPhase = 0;
450 pMac->lim.gHTSecondaryBeacon = 0;
451 pMac->lim.gHTDualCTSProtection = 0;
452 pMac->lim.gHTSTBCBasicMCS = 0;
453 pMac->lim.gAddBA_Declined = 0; // Flag to Decline the BAR if the particular bit (0-7) is being set
454}
455
Jeff Johnson295189b2012-06-20 16:38:30 -0700456static tSirRetStatus __limInitConfig( tpAniSirGlobal pMac )
457{
Jeff Johnsone7245742012-09-05 17:12:55 -0700458 tANI_U32 val1, val2, val3;
Jeff Johnson295189b2012-06-20 16:38:30 -0700459 tANI_U16 val16;
460 tANI_U8 val8;
461 tSirMacHTCapabilityInfo *pHTCapabilityInfo;
462 tSirMacHTInfoField1 *pHTInfoField1;
463 tpSirPowerSaveCfg pPowerSaveConfig;
464 tSirMacHTParametersInfo *pAmpduParamInfo;
465
466 /* Read all the CFGs here that were updated before peStart is called */
Jeff Johnsone7245742012-09-05 17:12:55 -0700467 /* All these CFG READS/WRITES are only allowed in init, at start when there is no session
468 * and they will be used throughout when there is no session
469 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700470
Jeff Johnson295189b2012-06-20 16:38:30 -0700471 if(wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &val1) != eSIR_SUCCESS)
472 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700473 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT Cap CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700474 return eSIR_FAILURE;
475 }
476
477 if(wlan_cfgGetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, &val2) != eSIR_SUCCESS)
478 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700479 PELOGE(limLog(pMac, LOGE, FL("could not retrieve Channel Bonding CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700480 return eSIR_FAILURE;
481 }
482 val16 = ( tANI_U16 ) val1;
483 pHTCapabilityInfo = ( tSirMacHTCapabilityInfo* ) &val16;
484
485 //channel bonding mode could be set to anything from 0 to 4(Titan had these
486 // modes But for Taurus we have only two modes: enable(>0) or disable(=0)
487 pHTCapabilityInfo->supportedChannelWidthSet = val2 ?
488 WNI_CFG_CHANNEL_BONDING_MODE_ENABLE : WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
489 if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo)
490 != eSIR_SUCCESS)
491 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700492 PELOGE(limLog(pMac, LOGE, FL("could not update HT Cap Info CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700493 return eSIR_FAILURE;
494 }
495
496 if(wlan_cfgGetInt(pMac, WNI_CFG_HT_INFO_FIELD1, &val1) != eSIR_SUCCESS)
497 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700498 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT INFO Field1 CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700499 return eSIR_FAILURE;
500 }
501
502 val8 = ( tANI_U8 ) val1;
503 pHTInfoField1 = ( tSirMacHTInfoField1* ) &val8;
504 pHTInfoField1->recommendedTxWidthSet =
505 (tANI_U8)pHTCapabilityInfo->supportedChannelWidthSet;
Jeff Johnson295189b2012-06-20 16:38:30 -0700506 if(cfgSetInt(pMac, WNI_CFG_HT_INFO_FIELD1, *(tANI_U8*)pHTInfoField1)
507 != eSIR_SUCCESS)
508 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700509 PELOGE(limLog(pMac, LOGE, FL("could not update HT Info Field"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700510 return eSIR_FAILURE;
511 }
512
513 /* WNI_CFG_HEART_BEAT_THRESHOLD */
514
515 if( wlan_cfgGetInt(pMac, WNI_CFG_HEART_BEAT_THRESHOLD, &val1) !=
516 eSIR_SUCCESS )
517 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700518 PELOGE(limLog(pMac, LOGE, FL("could not retrieve WNI_CFG_HEART_BEAT_THRESHOLD CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700519 return eSIR_FAILURE;
520 }
521 if(!val1)
522 {
523 limDeactivateAndChangeTimer(pMac, eLIM_HEART_BEAT_TIMER);
524 pMac->sys.gSysEnableLinkMonitorMode = 0;
525 }
526 else
527 {
528 //No need to activate the timer during init time.
529 pMac->sys.gSysEnableLinkMonitorMode = 1;
530 }
531
532 /* WNI_CFG_SHORT_GI_20MHZ */
533
534 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &val1) != eSIR_SUCCESS)
535 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700536 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT Cap CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700537 return eSIR_FAILURE;
538 }
539 if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_GI_20MHZ, &val2) != eSIR_SUCCESS)
540 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700541 PELOGE(limLog(pMac, LOGE, FL("could not retrieve shortGI 20Mhz CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700542 return eSIR_FAILURE;
543 }
544 if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_GI_40MHZ, &val3) != eSIR_SUCCESS)
545 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700546 PELOGE(limLog(pMac, LOGE, FL("could not retrieve shortGI 40Mhz CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700547 return eSIR_FAILURE;
548 }
549
550 val16 = ( tANI_U16 ) val1;
551 pHTCapabilityInfo = ( tSirMacHTCapabilityInfo* ) &val16;
552 pHTCapabilityInfo->shortGI20MHz = (tANI_U16)val2;
553 pHTCapabilityInfo->shortGI40MHz = (tANI_U16)val3;
554
555 if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo) !=
556 eSIR_SUCCESS)
557 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700558 PELOGE(limLog(pMac, LOGE, FL("could not update HT Cap Info CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700559 return eSIR_FAILURE;
560 }
561
562 /* WNI_CFG_MAX_RX_AMPDU_FACTOR */
563
564 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_AMPDU_PARAMS, &val1) != eSIR_SUCCESS)
565 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700566 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT AMPDU Param CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700567 return eSIR_FAILURE;
568 }
569 if (wlan_cfgGetInt(pMac, WNI_CFG_MAX_RX_AMPDU_FACTOR, &val2) != eSIR_SUCCESS)
570 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700571 PELOGE(limLog(pMac, LOGE, FL("could not retrieve AMPDU Factor CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700572 return eSIR_FAILURE;
573 }
574 val16 = ( tANI_U16 ) val1;
575 pAmpduParamInfo = ( tSirMacHTParametersInfo* ) &val16;
576 pAmpduParamInfo->maxRxAMPDUFactor = (tANI_U8)val2;
577 if(cfgSetInt(pMac, WNI_CFG_HT_AMPDU_PARAMS, *(tANI_U8*)pAmpduParamInfo) !=
578 eSIR_SUCCESS)
579 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700580 PELOGE(limLog(pMac, LOGE, FL("could not update HT AMPDU Param CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700581 return eSIR_FAILURE;
582 }
583
584 /* WNI_CFG_SHORT_PREAMBLE - this one is not updated in
585 limHandleCFGparamUpdate do we want to update this? */
586 if(wlan_cfgGetInt(pMac, WNI_CFG_SHORT_PREAMBLE, &val1) != eSIR_SUCCESS)
587 {
Shake M Subhani5d80fda2013-12-09 17:28:23 +0530588 limLog(pMac, LOGE, FL("cfg get short preamble failed"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700589 return eSIR_FAILURE;
590 }
591
Jeff Johnson295189b2012-06-20 16:38:30 -0700592 /* WNI_CFG_MAX_PS_POLL */
593
594 /* Allocate and fill in power save configuration. */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530595 pPowerSaveConfig = vos_mem_malloc(sizeof(tSirPowerSaveCfg));
596 if (NULL == pPowerSaveConfig)
Jeff Johnson295189b2012-06-20 16:38:30 -0700597 {
598 PELOGE(limLog(pMac, LOGE, FL("LIM: Cannot allocate memory for power save "
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700599 "configuration"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700600 return eSIR_FAILURE;
601 }
602
603 /* This context should be valid if power-save configuration message has been
604 * already dispatched during initialization process. Re-using the present
605 * configuration mask
606 */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530607 vos_mem_copy(pPowerSaveConfig, (tANI_U8 *)&pMac->pmm.gPmmCfg, sizeof(tSirPowerSaveCfg));
Jeff Johnson295189b2012-06-20 16:38:30 -0700608
609 /* Note: it is okay to do this since DAL/HAL is alrady started */
610 if ( (pmmSendPowerSaveCfg(pMac, pPowerSaveConfig)) != eSIR_SUCCESS)
611 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700612 PELOGE(limLog(pMac, LOGE, FL("LIM: pmmSendPowerSaveCfg() failed "));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700613 return eSIR_FAILURE;
614 }
615
616 /* WNI_CFG_BG_SCAN_CHANNEL_LIST_CHANNEL_LIST */
617
Jeff Johnson295189b2012-06-20 16:38:30 -0700618 PELOG1(limLog(pMac, LOG1,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700619 FL("VALID_CHANNEL_LIST has changed, reset next bg scan channel"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700620 pMac->lim.gLimBackgroundScanChannelId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700621
622 /* WNI_CFG_PROBE_RSP_BCN_ADDNIE_DATA - not needed */
623
624 /* This was initially done after resume notification from HAL. Now, DAL is
625 started before PE so this can be done here */
Jeff Johnsone7245742012-09-05 17:12:55 -0700626 handleHTCapabilityandHTInfo(pMac, NULL);
Leela V Kiran Kumar Reddy Chiralab1f7d342013-02-11 00:27:02 -0800627 if(wlan_cfgGetInt(pMac, WNI_CFG_DISABLE_LDPC_WITH_TXBF_AP,(tANI_U32 *) &pMac->lim.disableLDPCWithTxbfAP) != eSIR_SUCCESS)
628 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700629 limLog(pMac, LOGP, FL("cfg get disableLDPCWithTxbfAP failed"));
Leela V Kiran Kumar Reddy Chiralab1f7d342013-02-11 00:27:02 -0800630 return eSIR_FAILURE;
631 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +0530632#ifdef FEATURE_WLAN_TDLS
633 if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_BUF_STA_ENABLED,(tANI_U32 *) &pMac->lim.gLimTDLSBufStaEnabled) != eSIR_SUCCESS)
634 {
635 limLog(pMac, LOGP, FL("cfg get LimTDLSBufStaEnabled failed"));
636 return eSIR_FAILURE;
637 }
638 if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK,(tANI_U32 *) &pMac->lim.gLimTDLSUapsdMask) != eSIR_SUCCESS)
639 {
640 limLog(pMac, LOGP, FL("cfg get LimTDLSUapsdMask failed"));
641 return eSIR_FAILURE;
642 }
643#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700644 return eSIR_SUCCESS;
645}
Jeff Johnson295189b2012-06-20 16:38:30 -0700646
647/*
648 limStart
649 This function is to replace the __limProcessSmeStartReq since there is no
650 eWNI_SME_START_REQ post to PE.
651*/
652tSirRetStatus limStart(tpAniSirGlobal pMac)
653{
654 tSirResultCodes retCode = eSIR_SUCCESS;
655
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700656 PELOG1(limLog(pMac, LOG1, FL(" enter"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700657
658 if (pMac->lim.gLimSmeState == eLIM_SME_OFFLINE_STATE)
659 {
660 pMac->lim.gLimSmeState = eLIM_SME_IDLE_STATE;
661
Jeff Johnsone7245742012-09-05 17:12:55 -0700662 MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, NO_SESSION, pMac->lim.gLimSmeState));
Jeff Johnson295189b2012-06-20 16:38:30 -0700663
664 // By default do not return after first scan match
665 pMac->lim.gLimReturnAfterFirstMatch = 0;
666
667 // Initialize MLM state machine
668 limInitMlm(pMac);
669
670 // By default return unique scan results
671 pMac->lim.gLimReturnUniqueResults = true;
672 pMac->lim.gLimSmeScanResultLength = 0;
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700673#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
674 pMac->lim.gLimSmeLfrScanResultLength = 0;
675#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700676 }
677 else
678 {
679 /**
680 * Should not have received eWNI_SME_START_REQ in states
681 * other than OFFLINE. Return response to host and
682 * log error
683 */
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700684 limLog(pMac, LOGE, FL("Invalid SME state %X"),pMac->lim.gLimSmeState );
Jeff Johnson295189b2012-06-20 16:38:30 -0700685 retCode = eSIR_FAILURE;
686 }
687
688 return retCode;
689}
690
691/**
692 * limInitialize()
693 *
694 *FUNCTION:
695 * This function is called from LIM thread entry function.
696 * LIM related global data structures are initialized in this function.
697 *
698 *LOGIC:
699 * NA
700 *
701 *ASSUMPTIONS:
702 * NA
703 *
704 *NOTE:
705 * NA
706 *
707 * @param pMac - Pointer to global MAC structure
708 * @return None
709 */
710
711tSirRetStatus
712limInitialize(tpAniSirGlobal pMac)
713{
714 tSirRetStatus status = eSIR_SUCCESS;
715
716 __limInitAssocVars(pMac);
717 __limInitVars(pMac);
718 __limInitStates(pMac);
719 __limInitStatsVars(pMac);
720 __limInitBssVars(pMac);
721 __limInitScanVars(pMac);
722 __limInitHTVars(pMac);
723 __limInitTitanVars(pMac);
724
Jeff Johnson295189b2012-06-20 16:38:30 -0700725 status = limStart(pMac);
726 if(eSIR_SUCCESS != status)
727 {
728 return status;
729 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700730
731 /*
732 * MLM will be intitalized when 'START' request comes from SME.
733 * limInitMlm calls limCreateTimers, which actually relies on
734 * CFG to be downloaded. So it should not be called as part of
735 * peStart, as CFG download is happening after peStart.
736 */
737 //limInitMlm(pMac);
738 // Initializations for maintaining peers in IBSS
739 limIbssInit(pMac);
740
741 pmmInitialize(pMac);
742
743
744#if defined WLAN_FEATURE_VOWIFI
745 rrmInitialize(pMac);
746#endif
747#if defined WLAN_FEATURE_VOWIFI_11R
748 limFTOpen(pMac);
749#endif
750
Jeff Johnson295189b2012-06-20 16:38:30 -0700751 vos_list_init(&pMac->lim.gLimMgmtFrameRegistratinQueue);
Jeff Johnson295189b2012-06-20 16:38:30 -0700752
753#if 0
754
755 vos_trace_setLevel(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR);
756 vos_trace_setLevel(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_WARN);
757 vos_trace_setLevel(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_FATAL);
758
759 vos_trace_setLevel(VOS_MODULE_ID_HAL, VOS_TRACE_LEVEL_WARN);
760 vos_trace_setLevel(VOS_MODULE_ID_HAL, VOS_TRACE_LEVEL_ERROR);
761
762 vos_trace_setLevel(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_WARN);
763 vos_trace_setLevel(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR);
764 vos_trace_setLevel(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR);
765
766 vos_trace_setLevel(VOS_MODULE_ID_SAL, VOS_TRACE_LEVEL_ERROR);
767
768 vos_trace_setLevel(VOS_MODULE_ID_SSC, VOS_TRACE_LEVEL_ERROR);
769
770 vos_trace_setLevel(VOS_MODULE_ID_SAL, VOS_TRACE_LEVEL_ERROR);
771 vos_trace_setLevel(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR);
772
773 vos_trace_setLevel(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR);
774
775
776 vos_trace_setLevel(VOS_MODULE_ID_BAL, VOS_TRACE_LEVEL_ERROR);
777
778 vos_trace_setLevel(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR);
779#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700780
Jeff Johnson295189b2012-06-20 16:38:30 -0700781 //Initialize the configurations needed by PE
782 if( eSIR_FAILURE == __limInitConfig(pMac))
783 {
784 //We need to undo everything in limStart
785 limCleanupMlm(pMac);
786 return eSIR_FAILURE;
787 }
788
789 //initialize the TSPEC admission control table.
790 //Note that this was initially done after resume notification from HAL.
791 //Now, DAL is started before PE so this can be done here
792 limAdmitControlInit(pMac);
793 limRegisterHalIndCallBack(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -0700794
795 return status;
796
797} /*** end limInitialize() ***/
798
799
800
801/**
802 * limCleanup()
803 *
804 *FUNCTION:
805 * This function is called upon reset or persona change
806 * to cleanup LIM state
807 *
808 *LOGIC:
809 * NA
810 *
811 *ASSUMPTIONS:
812 * NA
813 *
814 *NOTE:
815 * NA
816 *
817 * @param pMac - Pointer to Global MAC structure
818 * @return None
819 */
820
821void
822limCleanup(tpAniSirGlobal pMac)
823{
Jeff Johnson295189b2012-06-20 16:38:30 -0700824 v_PVOID_t pvosGCTx;
825 VOS_STATUS retStatus;
Jeff Johnson295189b2012-06-20 16:38:30 -0700826
Jeff Johnson295189b2012-06-20 16:38:30 -0700827//Before destroying the list making sure all the nodes have been deleted.
828//Which should be the normal case, but a memory leak has been reported.
829
830 tpLimMgmtFrameRegistration pLimMgmtRegistration = NULL;
831
832 while(vos_list_remove_front(&pMac->lim.gLimMgmtFrameRegistratinQueue,
833 (vos_list_node_t**)&pLimMgmtRegistration) == VOS_STATUS_SUCCESS)
834 {
835 VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO,
836 FL("Fixing leak! Deallocating pLimMgmtRegistration node"));
837
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530838 vos_mem_free(pLimMgmtRegistration);
Jeff Johnson295189b2012-06-20 16:38:30 -0700839 }
840
841 vos_list_destroy(&pMac->lim.gLimMgmtFrameRegistratinQueue);
Jeff Johnson295189b2012-06-20 16:38:30 -0700842
843 limCleanupMlm(pMac);
844 limCleanupLmm(pMac);
845
846 // free up preAuth table
847 if (pMac->lim.gLimPreAuthTimerTable.pTable != NULL)
848 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530849 vos_mem_free(pMac->lim.gLimPreAuthTimerTable.pTable);
Jeff Johnson295189b2012-06-20 16:38:30 -0700850 pMac->lim.gLimPreAuthTimerTable.pTable = NULL;
851 pMac->lim.gLimPreAuthTimerTable.numEntry = 0;
852 }
853
854 if(NULL != pMac->lim.pDialogueTokenHead)
855 {
856 limDeleteDialogueTokenList(pMac);
857 }
858
859 if(NULL != pMac->lim.pDialogueTokenTail)
860 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530861 vos_mem_free(pMac->lim.pDialogueTokenTail);
Jeff Johnson295189b2012-06-20 16:38:30 -0700862 pMac->lim.pDialogueTokenTail = NULL;
863 }
864
865 # if 0
866 if (pMac->lim.gpLimStartBssReq != NULL)
867 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530868 vos_mem_free(pMac->lim.gpLimStartBssReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700869 pMac->lim.gpLimStartBssReq = NULL;
870 }
871 #endif
872
873 if (pMac->lim.gpLimMlmSetKeysReq != NULL)
874 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530875 vos_mem_free(pMac->lim.gpLimMlmSetKeysReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700876 pMac->lim.gpLimMlmSetKeysReq = NULL;
877 }
878
879 #if 0
880 if (pMac->lim.gpLimJoinReq != NULL)
881 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530882 vos_mem_free(pMac->lim.gpLimJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700883 pMac->lim.gpLimJoinReq = NULL;
884 }
885 #endif
886
887 if (pMac->lim.gpLimMlmAuthReq != NULL)
888 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530889 vos_mem_free(pMac->lim.gpLimMlmAuthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700890 pMac->lim.gpLimMlmAuthReq = NULL;
891 }
892
Jeff Johnsone7245742012-09-05 17:12:55 -0700893#if 0
Jeff Johnson295189b2012-06-20 16:38:30 -0700894 if (pMac->lim.gpLimMlmJoinReq != NULL)
895 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530896 vos_mem_free(pMac->lim.gpLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700897 pMac->lim.gpLimMlmJoinReq = NULL;
898 }
Jeff Johnsone7245742012-09-05 17:12:55 -0700899#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700900
901 #if 0
902 if (pMac->lim.gpLimReassocReq != NULL)
903 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530904 vos_mem_free(pMac->lim.gpLimReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700905 pMac->lim.gpLimReassocReq = NULL;
906 }
907 #endif
908
909 if (pMac->lim.gpLimMlmRemoveKeyReq != NULL)
910 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530911 vos_mem_free(pMac->lim.gpLimMlmRemoveKeyReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700912 pMac->lim.gpLimMlmRemoveKeyReq = NULL;
913 }
914
Viral Modid440e682013-03-06 02:25:31 -0800915 if (pMac->lim.gpDefdSmeMsgForNOA != NULL)
Viral Modid86bde22012-12-10 13:09:21 -0800916 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530917 vos_mem_free(pMac->lim.gpDefdSmeMsgForNOA);
Viral Modid440e682013-03-06 02:25:31 -0800918 pMac->lim.gpDefdSmeMsgForNOA = NULL;
Viral Modid86bde22012-12-10 13:09:21 -0800919 }
Viral Modid86bde22012-12-10 13:09:21 -0800920
Jeff Johnson295189b2012-06-20 16:38:30 -0700921 if (pMac->lim.gpLimMlmScanReq != NULL)
922 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530923 vos_mem_free(pMac->lim.gpLimMlmScanReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700924 pMac->lim.gpLimMlmScanReq = NULL;
925 }
926
927#if 0
928 if(NULL != pMac->lim.beacon)
929 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530930 vos_mem_free((void*) pMac->lim.beacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700931 pMac->lim.beacon = NULL;
932 }
933#endif
934 #if 0
935 if(NULL != pMac->lim.assocReq)
936 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530937 vos_mem_free((void*) pMac->lim.assocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700938 pMac->lim.assocReq= NULL;
939 }
940 #endif
941
942#if 0
943 if(NULL != pMac->lim.assocRsp)
944 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530945 vos_mem_free((void*) pMac->lim.assocRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700946 pMac->lim.assocRsp= NULL;
947 }
948#endif
949 // Now, finally reset the deferred message queue pointers
950 limResetDeferredMsgQ(pMac);
951
Jeff Johnson295189b2012-06-20 16:38:30 -0700952
953 pvosGCTx = vos_get_global_context(VOS_MODULE_ID_PE, (v_VOID_t *) pMac);
954 retStatus = WLANTL_DeRegisterMgmtFrmClient(pvosGCTx);
955
956 if ( retStatus != VOS_STATUS_SUCCESS )
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700957 PELOGE(limLog(pMac, LOGE, FL("DeRegistering the PE Handle with TL has failed bailing out..."));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700958
959#if defined WLAN_FEATURE_VOWIFI
960 rrmCleanup(pMac);
961#endif
962#if defined WLAN_FEATURE_VOWIFI_11R
963 limFTCleanup(pMac);
964#endif
965
966} /*** end limCleanup() ***/
967
968
969/** -------------------------------------------------------------
970\fn peOpen
971\brief will be called in Open sequence from macOpen
972\param tpAniSirGlobal pMac
973\param tHalOpenParameters *pHalOpenParam
974\return tSirRetStatus
975 -------------------------------------------------------------*/
976
977tSirRetStatus peOpen(tpAniSirGlobal pMac, tMacOpenParameters *pMacOpenParam)
978{
979 pMac->lim.maxBssId = pMacOpenParam->maxBssId;
980 pMac->lim.maxStation = pMacOpenParam->maxStation;
981
982 if ((pMac->lim.maxBssId == 0) || (pMac->lim.maxStation == 0))
983 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700984 PELOGE(limLog(pMac, LOGE, FL("max number of Bssid or Stations cannot be zero!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700985 return eSIR_FAILURE;
986 }
987
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530988 pMac->lim.limTimers.gpLimCnfWaitTimer = vos_mem_malloc(sizeof(TX_TIMER) * pMac->lim.maxStation);
989 if (NULL == pMac->lim.limTimers.gpLimCnfWaitTimer)
Jeff Johnson295189b2012-06-20 16:38:30 -0700990 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700991 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700992 return eSIR_FAILURE;
993 }
994
Gopichand Nakkala777e6032012-12-31 16:39:21 -0800995#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530996 pMac->lim.gpLimAIDpool = vos_mem_malloc(sizeof(*pMac->lim.gpLimAIDpool) * (WNI_CFG_ASSOC_STA_LIMIT_STAMAX+1));
997 if (NULL == pMac->lim.gpLimAIDpool)
Jeff Johnson295189b2012-06-20 16:38:30 -0700998 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700999 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001000 return eSIR_FAILURE;
1001 }
Gopichand Nakkala777e6032012-12-31 16:39:21 -08001002#endif
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301003 pMac->lim.gpSession = vos_mem_malloc(sizeof(tPESession)* pMac->lim.maxBssId);
1004 if (NULL == pMac->lim.gpSession)
Jeff Johnson295189b2012-06-20 16:38:30 -07001005 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001006 limLog(pMac, LOGE, FL("memory allocate failed!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001007 return eSIR_FAILURE;
1008 }
1009
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301010 vos_mem_set(pMac->lim.gpSession, sizeof(tPESession)*pMac->lim.maxBssId, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001011
1012
1013 /*
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301014 pMac->dph.dphHashTable.pHashTable = vos_mem_malloc(sizeof(tpDphHashNode)*pMac->lim.maxStation);
1015 if (NULL == pMac->dph.dphHashTable.pHashTable)
Jeff Johnson295189b2012-06-20 16:38:30 -07001016 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001017 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001018 return eSIR_FAILURE;
1019 }
1020
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301021 pMac->dph.dphHashTable.pDphNodeArray = vos_mem_malloc(sizeof(tDphHashNode)*pMac->lim.maxStation);
1022 if (NULL == pMac->dph.dphHashTable.pDphNodeArray)
Jeff Johnson295189b2012-06-20 16:38:30 -07001023 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001024 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001025 return eSIR_FAILURE;
1026 }
1027 */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301028 pMac->pmm.gPmmTim.pTim = vos_mem_malloc(sizeof(tANI_U8)*pMac->lim.maxStation);
1029 if (NULL == pMac->pmm.gPmmTim.pTim)
Jeff Johnson295189b2012-06-20 16:38:30 -07001030 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001031 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed for pTim!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001032 return eSIR_FAILURE;
1033 }
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301034 vos_mem_set(pMac->pmm.gPmmTim.pTim, sizeof(tANI_U8)*pMac->lim.maxStation, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001035
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001036 pMac->lim.mgmtFrameSessionId = 0xff;
Leela Venkata Kiran Kumar Reddy Chirala2247e962013-03-22 19:21:10 -07001037 pMac->lim.deferredMsgCnt = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001038
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08001039 if( !VOS_IS_STATUS_SUCCESS( vos_lock_init( &pMac->lim.lkPeGlobalLock ) ) )
1040 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001041 PELOGE(limLog(pMac, LOGE, FL("pe lock init failed!"));)
Leela Venkata Kiran Kumar Reddy Chiralabcf1b8b2013-12-16 17:13:52 -08001042 vos_mem_free(pMac->lim.limTimers.gpLimCnfWaitTimer);
1043 pMac->lim.limTimers.gpLimCnfWaitTimer = NULL;
1044 vos_mem_free(pMac->lim.gpSession);
1045 pMac->lim.gpSession = NULL;
1046 vos_mem_free(pMac->pmm.gPmmTim.pTim);
1047 pMac->pmm.gPmmTim.pTim = NULL;
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08001048 return eSIR_FAILURE;
1049 }
Venkata Prathyusha Kuntupalli22ba5982013-04-24 13:09:20 -07001050 pMac->lim.deauthMsgCnt = 0;
Leela Venkata Kiran Kumar Reddy Chirala57af2692013-04-10 22:39:51 -07001051
1052 /*
1053 * peOpen is successful by now, so it is right time to initialize
1054 * MTRACE for PE module. if LIM_TRACE_RECORD is not defined in build file
1055 * then nothing will be logged for PE module.
1056 */
1057#ifdef LIM_TRACE_RECORD
1058 MTRACE(limTraceInit(pMac));
1059#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001060 return eSIR_SUCCESS;
1061}
1062
1063/** -------------------------------------------------------------
1064\fn peClose
1065\brief will be called in close sequence from macClose
1066\param tpAniSirGlobal pMac
1067\return tSirRetStatus
1068 -------------------------------------------------------------*/
1069
1070tSirRetStatus peClose(tpAniSirGlobal pMac)
1071{
1072 tANI_U8 i;
1073
1074 if (ANI_DRIVER_TYPE(pMac) == eDRIVER_TYPE_MFG)
1075 return eSIR_SUCCESS;
Jeff Johnsone7245742012-09-05 17:12:55 -07001076
Jeff Johnson295189b2012-06-20 16:38:30 -07001077 for(i =0; i < pMac->lim.maxBssId; i++)
1078 {
1079 if(pMac->lim.gpSession[i].valid == TRUE)
1080 {
1081 peDeleteSession(pMac,&pMac->lim.gpSession[i]);
1082 }
1083 }
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301084 vos_mem_free(pMac->lim.limTimers.gpLimCnfWaitTimer);
Jeff Johnsone7245742012-09-05 17:12:55 -07001085 pMac->lim.limTimers.gpLimCnfWaitTimer = NULL;
Gopichand Nakkala777e6032012-12-31 16:39:21 -08001086#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301087 vos_mem_free(pMac->lim.gpLimAIDpool);
Jeff Johnsone7245742012-09-05 17:12:55 -07001088 pMac->lim.gpLimAIDpool = NULL;
Gopichand Nakkala777e6032012-12-31 16:39:21 -08001089#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07001090
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301091 vos_mem_free(pMac->lim.gpSession);
Jeff Johnson295189b2012-06-20 16:38:30 -07001092 pMac->lim.gpSession = NULL;
1093 /*
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301094 vos_mem_free(pMac->dph.dphHashTable.pHashTable);
Jeff Johnson295189b2012-06-20 16:38:30 -07001095 pMac->dph.dphHashTable.pHashTable = NULL;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301096 vos_mem_free(pMac->dph.dphHashTable.pDphNodeArray);
Jeff Johnson295189b2012-06-20 16:38:30 -07001097 pMac->dph.dphHashTable.pDphNodeArray = NULL;
1098 */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301099 vos_mem_free(pMac->pmm.gPmmTim.pTim);
Jeff Johnson295189b2012-06-20 16:38:30 -07001100 pMac->pmm.gPmmTim.pTim = NULL;
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08001101 if( !VOS_IS_STATUS_SUCCESS( vos_lock_destroy( &pMac->lim.lkPeGlobalLock ) ) )
1102 {
1103 return eSIR_FAILURE;
1104 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001105 return eSIR_SUCCESS;
1106}
1107
1108/** -------------------------------------------------------------
1109\fn peStart
1110\brief will be called in start sequence from macStart
1111\param tpAniSirGlobal pMac
1112\return none
1113 -------------------------------------------------------------*/
1114
1115tSirRetStatus peStart(tpAniSirGlobal pMac)
1116{
1117 tSirRetStatus status = eSIR_SUCCESS;
1118
1119 status = limInitialize(pMac);
1120#if defined(ANI_LOGDUMP)
1121 limDumpInit(pMac);
1122#endif //#if defined(ANI_LOGDUMP)
1123
1124 return status;
1125}
1126
1127/** -------------------------------------------------------------
1128\fn peStop
1129\brief will be called in stop sequence from macStop
1130\param tpAniSirGlobal pMac
1131\return none
1132 -------------------------------------------------------------*/
1133
1134void peStop(tpAniSirGlobal pMac)
1135{
1136 limCleanup(pMac);
1137 SET_LIM_MLM_STATE(pMac, eLIM_MLM_OFFLINE_STATE);
1138 return;
1139}
1140
1141/** -------------------------------------------------------------
1142\fn peFreeMsg
1143\brief Called by VOS scheduler (function vos_sched_flush_mc_mqs)
1144\ to free a given PE message on the TX and MC thread.
1145\ This happens when there are messages pending in the PE
1146\ queue when system is being stopped and reset.
1147\param tpAniSirGlobal pMac
1148\param tSirMsgQ pMsg
1149\return none
1150-----------------------------------------------------------------*/
1151v_VOID_t peFreeMsg( tpAniSirGlobal pMac, tSirMsgQ* pMsg)
1152{
1153 if (pMsg != NULL)
1154 {
1155 if (NULL != pMsg->bodyptr)
1156 {
1157 if (SIR_BB_XPORT_MGMT_MSG == pMsg->type)
1158 {
1159 vos_pkt_return_packet((vos_pkt_t *)pMsg->bodyptr);
1160 }
1161 else
1162 {
1163 vos_mem_free((v_VOID_t*)pMsg->bodyptr);
1164 }
1165 }
1166 pMsg->bodyptr = 0;
1167 pMsg->bodyval = 0;
1168 pMsg->type = 0;
1169 }
1170 return;
1171}
1172
1173
1174/**
1175 * The function checks if a particular timer should be allowed
1176 * into LIM while device is sleeping
1177 */
1178tANI_U8 limIsTimerAllowedInPowerSaveState(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
1179{
1180 tANI_U8 retStatus = TRUE;
1181
1182 if(!limIsSystemInActiveState(pMac))
1183 {
1184 switch(pMsg->type)
1185 {
1186 /* Don't allow following timer messages if in sleep */
1187 case SIR_LIM_MIN_CHANNEL_TIMEOUT:
1188 case SIR_LIM_MAX_CHANNEL_TIMEOUT:
1189 case SIR_LIM_PERIODIC_PROBE_REQ_TIMEOUT:
1190 retStatus = FALSE;
1191 break;
1192 /* May allow following timer messages in sleep mode */
1193 case SIR_LIM_HASH_MISS_THRES_TIMEOUT:
1194
1195 /* Safe to allow as of today, this triggers background scan
1196 * which will not be started if the device is in power-save mode
1197 * might need to block in the future if we decide to implement
1198 * spectrum management
1199 */
1200 case SIR_LIM_QUIET_TIMEOUT:
1201
1202 /* Safe to allow as of today, this triggers background scan
1203 * which will not be started if the device is in power-save mode
1204 * might need to block in the future if we decide to implement
1205 * spectrum management
1206 */
1207 case SIR_LIM_QUIET_BSS_TIMEOUT:
1208
1209 /* Safe to allow this timermessage, triggers background scan
1210 * which is blocked in sleep mode
1211 */
1212 case SIR_LIM_CHANNEL_SCAN_TIMEOUT:
1213
1214 /* Safe to allow this timer, since, while in IMPS this timer will not
1215 * be started. In case of BMPS sleep, SoftMAC handles the heart-beat
1216 * when heart-beat control is handled back to PE, device would have
1217 * already woken-up due to EXIT_BMPS_IND mesage from SoftMAC
1218 */
1219 case SIR_LIM_HEART_BEAT_TIMEOUT:
1220 case SIR_LIM_PROBE_HB_FAILURE_TIMEOUT:
1221
1222 /* Safe to allow, PE is not handling this message as of now. May need
1223 * to block it, basically, free the buffer and restart the timer
1224 */
1225 case SIR_LIM_REASSOC_FAIL_TIMEOUT:
1226 case SIR_LIM_JOIN_FAIL_TIMEOUT:
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08001227 case SIR_LIM_PERIODIC_JOIN_PROBE_REQ_TIMEOUT:
Jeff Johnson295189b2012-06-20 16:38:30 -07001228 case SIR_LIM_ASSOC_FAIL_TIMEOUT:
1229 case SIR_LIM_AUTH_FAIL_TIMEOUT:
1230 case SIR_LIM_ADDTS_RSP_TIMEOUT:
1231 retStatus = TRUE;
1232 break;
1233
1234 /* by default allow rest of messages */
1235 default:
1236 retStatus = TRUE;
1237 break;
1238
1239
1240 }
1241 }
1242
1243 return retStatus;
1244
1245}
1246
1247
1248
1249/**
1250 * limPostMsgApi()
1251 *
1252 *FUNCTION:
1253 * This function is called from other thread while posting a
1254 * message to LIM message Queue gSirLimMsgQ.
1255 *
1256 *LOGIC:
1257 * NA
1258 *
1259 *ASSUMPTIONS:
1260 * NA
1261 *
1262 *NOTE:
1263 * NA
1264 *
1265 * @param pMac - Pointer to Global MAC structure
1266 * @param pMsg - Pointer to the message structure
1267 * @return None
1268 */
1269
1270tANI_U32
1271limPostMsgApi(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
1272{
Jeff Johnson295189b2012-06-20 16:38:30 -07001273 return vos_mq_post_message(VOS_MQ_ID_PE, (vos_msg_t *) pMsg);
1274
1275
Jeff Johnson295189b2012-06-20 16:38:30 -07001276} /*** end limPostMsgApi() ***/
1277
1278
1279/*--------------------------------------------------------------------------
1280
1281 \brief pePostMsgApi() - A wrapper function to post message to Voss msg queues
1282
1283 This function can be called by legacy code to post message to voss queues OR
1284 legacy code may keep on invoking 'limPostMsgApi' to post the message to voss queue
1285 for dispatching it later.
1286
1287 \param pMac - Pointer to Global MAC structure
1288 \param pMsg - Pointer to the message structure
1289
1290 \return tANI_U32 - TX_SUCCESS for success.
1291
1292 --------------------------------------------------------------------------*/
1293
1294tSirRetStatus pePostMsgApi(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
1295{
1296 return (tSirRetStatus)limPostMsgApi(pMac, pMsg);
1297}
1298
1299/*--------------------------------------------------------------------------
1300
1301 \brief peProcessMessages() - Message Processor for PE
1302
1303 Voss calls this function to dispatch the message to PE
1304
1305 \param pMac - Pointer to Global MAC structure
1306 \param pMsg - Pointer to the message structure
1307
1308 \return tANI_U32 - TX_SUCCESS for success.
1309
1310 --------------------------------------------------------------------------*/
1311
1312tSirRetStatus peProcessMessages(tpAniSirGlobal pMac, tSirMsgQ* pMsg)
1313{
1314 if(pMac->gDriverType == eDRIVER_TYPE_MFG)
1315 {
1316 return eSIR_SUCCESS;
1317 }
1318 /**
1319 * If the Message to be handled is for CFG Module call the CFG Msg Handler and
1320 * for all the other cases post it to LIM
1321 */
1322 if ( SIR_CFG_PARAM_UPDATE_IND != pMsg->type && IS_CFG_MSG(pMsg->type))
1323 cfgProcessMbMsg(pMac, (tSirMbMsg*)pMsg->bodyptr);
1324 else
1325 limMessageProcessor(pMac, pMsg);
1326 return eSIR_SUCCESS;
1327}
1328
1329
Jeff Johnson295189b2012-06-20 16:38:30 -07001330
1331// ---------------------------------------------------------------------------
1332/**
1333 * peHandleMgmtFrame
1334 *
1335 * FUNCTION:
1336 * Process the Management frames from TL
1337 *
1338 * LOGIC:
1339 *
1340 * ASSUMPTIONS: TL sends the packet along with the VOS GlobalContext
1341 *
1342 * NOTE:
1343 *
1344 * @param pvosGCtx Global Vos Context
1345 * @param vossBuff Packet
1346 * @return None
1347 */
1348
1349VOS_STATUS peHandleMgmtFrame( v_PVOID_t pvosGCtx, v_PVOID_t vosBuff)
1350{
1351 tpAniSirGlobal pMac;
1352 tpSirMacMgmtHdr mHdr;
1353 tSirMsgQ msg;
1354 vos_pkt_t *pVosPkt;
1355 VOS_STATUS vosStatus;
1356 v_U8_t *pRxPacketInfo;
1357
1358 pVosPkt = (vos_pkt_t *)vosBuff;
1359 if (NULL == pVosPkt)
1360 {
1361 return VOS_STATUS_E_FAILURE;
1362 }
1363
1364 pMac = (tpAniSirGlobal)vos_get_context(VOS_MODULE_ID_PE, pvosGCtx);
1365 if (NULL == pMac)
1366 {
1367 // cannot log a failure without a valid pMac
1368 vos_pkt_return_packet(pVosPkt);
1369 return VOS_STATUS_E_FAILURE;
1370 }
1371
1372 vosStatus = WDA_DS_PeekRxPacketInfo( pVosPkt, (void *)&pRxPacketInfo, VOS_FALSE );
1373
1374 if(!VOS_IS_STATUS_SUCCESS(vosStatus))
1375 {
1376 vos_pkt_return_packet(pVosPkt);
1377 return VOS_STATUS_E_FAILURE;
1378 }
1379
1380
1381 //
1382 // The MPDU header is now present at a certain "offset" in
1383 // the BD and is specified in the BD itself
1384 //
1385 mHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
1386 if(mHdr->fc.type == SIR_MAC_MGMT_FRAME)
1387 {
1388 PELOG1(limLog( pMac, LOG1,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001389 FL ( "RxBd=%p mHdr=%p Type: %d Subtype: %d Sizes:FC%d Mgmt%d"),
Jeff Johnsone7245742012-09-05 17:12:55 -07001390 pRxPacketInfo, mHdr, mHdr->fc.type, mHdr->fc.subType, sizeof(tSirMacFrameCtl), sizeof(tSirMacMgmtHdr) );)
Jeff Johnson295189b2012-06-20 16:38:30 -07001391
Jeff Johnsone7245742012-09-05 17:12:55 -07001392 MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT, NO_SESSION,
Jeff Johnson295189b2012-06-20 16:38:30 -07001393 LIM_TRACE_MAKE_RXMGMT(mHdr->fc.subType,
1394 (tANI_U16) (((tANI_U16) (mHdr->seqControl.seqNumHi << 4)) | mHdr->seqControl.seqNumLo)));)
1395 }
1396
1397
1398 // Forward to MAC via mesg = SIR_BB_XPORT_MGMT_MSG
1399 msg.type = SIR_BB_XPORT_MGMT_MSG;
1400 msg.bodyptr = vosBuff;
1401 msg.bodyval = 0;
1402
1403 if( eSIR_SUCCESS != sysBbtProcessMessageCore( pMac,
1404 &msg,
1405 mHdr->fc.type,
1406 mHdr->fc.subType ))
1407 {
1408 vos_pkt_return_packet(pVosPkt);
1409 limLog( pMac, LOGW,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001410 FL ( "sysBbtProcessMessageCore failed to process SIR_BB_XPORT_MGMT_MSG" ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001411 return VOS_STATUS_E_FAILURE;
1412 }
1413
1414 return VOS_STATUS_SUCCESS;
1415}
1416
1417// ---------------------------------------------------------------------------
1418/**
1419 * peRegisterTLHandle
1420 *
1421 * FUNCTION:
1422 * Registers the Handler which, process the Management frames from TL
1423 *
1424 * LOGIC:
1425 *
1426 * ASSUMPTIONS:
1427 *
1428 * NOTE:
1429 *
1430 * @return None
1431 */
1432
1433void peRegisterTLHandle(tpAniSirGlobal pMac)
1434{
1435 v_PVOID_t pvosGCTx;
1436 VOS_STATUS retStatus;
1437
1438 pvosGCTx = vos_get_global_context(VOS_MODULE_ID_PE, (v_VOID_t *) pMac);
1439
1440 retStatus = WLANTL_RegisterMgmtFrmClient(pvosGCTx, peHandleMgmtFrame);
1441
1442 if (retStatus != VOS_STATUS_SUCCESS)
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001443 limLog( pMac, LOGP, FL("Registering the PE Handle with TL has failed bailing out..."));
Jeff Johnson295189b2012-06-20 16:38:30 -07001444
1445}
Jeff Johnson295189b2012-06-20 16:38:30 -07001446
1447
1448/**
Jeff Johnson295189b2012-06-20 16:38:30 -07001449 * limIsSystemInScanState()
1450 *
1451 *FUNCTION:
1452 * This function is called by various MAC software modules to
1453 * determine if System is in Scan/Learn state
1454 *
1455 *LOGIC:
1456 * NA
1457 *
1458 *ASSUMPTIONS:
1459 * NA
1460 *
1461 *NOTE:
1462 *
1463 * @param pMac - Pointer to Global MAC structure
1464 * @return true - System is in Scan/Learn state
1465 * false - System is NOT in Scan/Learn state
1466 */
1467
1468tANI_U8
1469limIsSystemInScanState(tpAniSirGlobal pMac)
1470{
1471 switch (pMac->lim.gLimSmeState)
1472 {
1473 case eLIM_SME_CHANNEL_SCAN_STATE:
1474 case eLIM_SME_NORMAL_CHANNEL_SCAN_STATE:
1475 case eLIM_SME_LINK_EST_WT_SCAN_STATE:
1476 case eLIM_SME_WT_SCAN_STATE:
1477 // System is in Learn mode
1478 return true;
1479
1480 default:
1481 // System is NOT in Learn mode
1482 return false;
1483 }
1484} /*** end limIsSystemInScanState() ***/
1485
1486
1487
1488/**
1489 * limIsSystemInActiveState()
1490 *
1491 *FUNCTION:
1492 * This function is called by various MAC software modules to
1493 * determine if System is in Active/Wakeup state
1494 *
1495 *LOGIC:
1496 * NA
1497 *
1498 *ASSUMPTIONS:
1499 * NA
1500 *
1501 *NOTE:
1502 *
1503 * @param pMac - Pointer to Global MAC structure
1504 * @return true - System is in Active state
1505 * false - System is not in Active state
1506 */
1507
1508tANI_U8 limIsSystemInActiveState(tpAniSirGlobal pMac)
1509{
1510 switch (pMac->pmm.gPmmState)
1511 {
1512 case ePMM_STATE_BMPS_WAKEUP:
1513 case ePMM_STATE_IMPS_WAKEUP:
1514 case ePMM_STATE_READY:
1515 // System is in Active mode
1516 return true;
1517 default:
1518 return false;
1519 // System is NOT in Active mode
1520 }
1521}
1522
1523
Jeff Johnson295189b2012-06-20 16:38:30 -07001524
Jeff Johnson295189b2012-06-20 16:38:30 -07001525
1526
1527/**
1528*\brief limReceivedHBHandler()
1529*
1530* This function is called by schBeaconProcess() upon
1531* receiving a Beacon on STA. This also gets called upon
1532* receiving Probe Response after heat beat failure is
1533* detected.
1534*
1535* param pMac - global mac structure
1536* param channel - channel number indicated in Beacon, Probe Response
1537* return - none
1538*/
1539
1540
1541void
1542limReceivedHBHandler(tpAniSirGlobal pMac, tANI_U8 channelId, tpPESession psessionEntry)
1543{
1544 if((channelId == 0 ) || (channelId == psessionEntry->currentOperChannel) )
1545 psessionEntry->LimRxedBeaconCntDuringHB++;
1546
1547 pMac->pmm.inMissedBeaconScenario = FALSE;
1548} /*** end limReceivedHBHandler() ***/
1549
1550
1551
1552#if 0
1553void limResetHBPktCount(tpPESession psessionEntry)
1554{
1555 psessionEntry->LimRxedBeaconCntDuringHB = 0;
1556}
1557#endif
1558
1559
1560/*
1561 * limProcessWdsInfo()
1562 *
1563 *FUNCTION:
1564 * This function is called from schBeaconProcess in BP
1565 *
1566 *PARAMS:
1567 * @param pMac - Pointer to Global MAC structure
1568 * @param propIEInfo - proprietary IE info
1569 *
1570 *LOGIC:
1571 *
1572 *ASSUMPTIONS:
1573 * NA
1574 *
1575 *NOTE:
1576 *
1577 *
1578 *RETURNS:
1579 *
1580 */
1581
1582void limProcessWdsInfo(tpAniSirGlobal pMac,
1583 tSirPropIEStruct propIEInfo)
1584{
Jeff Johnson295189b2012-06-20 16:38:30 -07001585}
1586
1587
1588
1589/**
1590 * limInitWdsInfoParams()
1591 *
1592 *FUNCTION:
1593 * This function is called while processing
1594 * START_BSS/JOIN/REASSOC_REQ to initialize WDS info
1595 * ind/set related parameters.
1596 *
1597 *LOGIC:
1598 *
1599 *ASSUMPTIONS:
1600 *
1601 *NOTE:
1602 *
1603 * @param pMac Pointer to Global MAC structure
1604 * @return None
1605 */
1606
1607void
1608limInitWdsInfoParams(tpAniSirGlobal pMac)
1609{
1610 pMac->lim.gLimWdsInfo.wdsLength = 0;
1611 pMac->lim.gLimNumWdsInfoInd = 0;
1612 pMac->lim.gLimNumWdsInfoSet = 0;
1613} /*** limInitWdsInfoParams() ***/
1614
1615
1616/** -------------------------------------------------------------
1617\fn limUpdateOverlapStaParam
1618\brief Updates overlap cache and param data structure
1619\param tpAniSirGlobal pMac
1620\param tSirMacAddr bssId
1621\param tpLimProtStaParams pStaParams
1622\return None
1623 -------------------------------------------------------------*/
1624void
1625limUpdateOverlapStaParam(tpAniSirGlobal pMac, tSirMacAddr bssId, tpLimProtStaParams pStaParams)
1626{
1627 int i;
1628 if (!pStaParams->numSta)
1629 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301630 vos_mem_copy(pMac->lim.protStaOverlapCache[0].addr,
1631 bssId,
1632 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001633 pMac->lim.protStaOverlapCache[0].active = true;
1634
1635 pStaParams->numSta = 1;
1636
1637 return;
1638 }
1639
1640 for (i=0; i<LIM_PROT_STA_OVERLAP_CACHE_SIZE; i++)
1641 {
1642 if (pMac->lim.protStaOverlapCache[i].active)
1643 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301644 if (vos_mem_compare( pMac->lim.protStaOverlapCache[i].addr,
Jeff Johnson295189b2012-06-20 16:38:30 -07001645 bssId,
1646 sizeof(tSirMacAddr))) {
1647 return; }
1648 }
1649 else
1650 break;
1651 }
1652
1653 if (i == LIM_PROT_STA_OVERLAP_CACHE_SIZE)
1654 {
Shake M Subhani5d80fda2013-12-09 17:28:23 +05301655 PELOG1(limLog(pMac, LOGW, FL("Overlap cache is full"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001656 }
1657 else
1658 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301659 vos_mem_copy(pMac->lim.protStaOverlapCache[i].addr,
1660 bssId,
1661 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001662 pMac->lim.protStaOverlapCache[i].active = true;
1663
1664 pStaParams->numSta++;
1665 }
1666}
1667
1668
1669/**
1670 * limHandleIBSScoalescing()
1671 *
1672 *FUNCTION:
1673 * This function is called upon receiving Beacon/Probe Response
1674 * while operating in IBSS mode.
1675 *
1676 *LOGIC:
1677 *
1678 *ASSUMPTIONS:
1679 *
1680 *NOTE:
1681 *
1682 * @param pMac - Pointer to Global MAC structure
1683 * @param pBeacon - Parsed Beacon Frame structure
1684 * @param pRxPacketInfo - Pointer to RX packet info structure
1685 *
1686 * @return Status whether to process or ignore received Beacon Frame
1687 */
1688
1689tSirRetStatus
1690limHandleIBSScoalescing(
1691 tpAniSirGlobal pMac,
1692 tpSchBeaconStruct pBeacon,
1693 tANI_U8 *pRxPacketInfo,tpPESession psessionEntry)
1694{
1695 tpSirMacMgmtHdr pHdr;
1696 tSirRetStatus retCode;
1697
1698 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
Ravi Joshi2c83c7e2013-10-29 10:21:08 -07001699 if ( (!pBeacon->capabilityInfo.ibss) ||
1700 (limCmpSSid(pMac, &pBeacon->ssId,psessionEntry) != true) ||
1701 (psessionEntry->currentOperChannel != pBeacon->channelNumber) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001702 /* Received SSID does not match => Ignore received Beacon frame. */
1703 retCode = eSIR_LIM_IGNORE_BEACON;
1704 else
1705 {
1706 tANI_U32 ieLen;
1707 tANI_U16 tsfLater;
1708 tANI_U8 *pIEs;
1709 ieLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
1710 tsfLater = WDA_GET_RX_TSF_LATER(pRxPacketInfo);
1711 pIEs = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
1712 PELOG3(limLog(pMac, LOG3, FL("BEFORE Coalescing tsfLater val :%d"), tsfLater);)
1713 retCode = limIbssCoalesce(pMac, pHdr, pBeacon, pIEs, ieLen, tsfLater,psessionEntry);
1714 }
1715 return retCode;
1716} /*** end limHandleIBSScoalescing() ***/
1717
1718
1719
1720/**
1721 * limDetectChangeInApCapabilities()
1722 *
1723 *FUNCTION:
1724 * This function is called while SCH is processing
1725 * received Beacon from AP on STA to detect any
1726 * change in AP's capabilities. If there any change
1727 * is detected, Roaming is informed of such change
1728 * so that it can trigger reassociation.
1729 *
1730 *LOGIC:
1731 *
1732 *ASSUMPTIONS:
1733 *
1734 *NOTE:
1735 * Notification is enabled for STA product only since
1736 * it is not a requirement on BP side.
1737 *
1738 * @param pMac Pointer to Global MAC structure
1739 * @param pBeacon Pointer to parsed Beacon structure
1740 * @return None
1741 */
1742
1743void
1744limDetectChangeInApCapabilities(tpAniSirGlobal pMac,
1745 tpSirProbeRespBeacon pBeacon,
1746 tpPESession psessionEntry)
1747{
Jeff Johnson295189b2012-06-20 16:38:30 -07001748 tANI_U8 len;
1749 tSirSmeApNewCaps apNewCaps;
1750 tANI_U8 newChannel;
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301751 tSirRetStatus status = eSIR_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001752 apNewCaps.capabilityInfo = limGetU16((tANI_U8 *) &pBeacon->capabilityInfo);
1753 newChannel = (tANI_U8) pBeacon->channelNumber;
1754
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301755 if ( ( false == psessionEntry->limSentCapsChangeNtf ) &&
1756 ( ( ( limIsNullSsid(&pBeacon->ssId) ) ||
1757 ( ( !limIsNullSsid(&pBeacon->ssId) ) &&
1758 ( false == limCmpSSid(pMac, &pBeacon->ssId, psessionEntry) ) ) ) ||
1759 ( (SIR_MAC_GET_ESS(apNewCaps.capabilityInfo) !=
1760 SIR_MAC_GET_ESS(psessionEntry->limCurrentBssCaps) ) ||
1761 ( SIR_MAC_GET_PRIVACY(apNewCaps.capabilityInfo) !=
1762 SIR_MAC_GET_PRIVACY(psessionEntry->limCurrentBssCaps) ) ||
1763 ( SIR_MAC_GET_SHORT_PREAMBLE(apNewCaps.capabilityInfo) !=
1764 SIR_MAC_GET_SHORT_PREAMBLE(psessionEntry->limCurrentBssCaps) ) ||
1765 ( SIR_MAC_GET_QOS(apNewCaps.capabilityInfo) !=
1766 SIR_MAC_GET_QOS(psessionEntry->limCurrentBssCaps) ) ||
1767 ( newChannel != psessionEntry->currentOperChannel )
1768 ) ) )
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301769 {
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301770 if( false == psessionEntry->fWaitForProbeRsp )
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301771 {
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301772 /* If Beacon capabilities is not matching with the current capability,
1773 * then send unicast probe request to AP and take decision after
1774 * receiving probe response */
1775 if ( true == psessionEntry->fIgnoreCapsChange )
1776 {
1777 limLog(pMac, LOGW, FL("Ignoring the Capability change as it is false alarm"));
1778 return;
1779 }
1780 psessionEntry->fWaitForProbeRsp = true;
1781 limLog(pMac, LOGW, FL("AP capabilities are not matching,"
1782 "sending directed probe request.. "));
1783 status = limSendProbeReqMgmtFrame(pMac, &psessionEntry->ssId, psessionEntry->bssId,
1784 psessionEntry->currentOperChannel,psessionEntry->selfMacAddr,
1785 psessionEntry->dot11mode, 0, NULL);
1786
1787 if ( eSIR_SUCCESS != status )
1788 {
1789 limLog(pMac, LOGE, FL("send ProbeReq failed"));
1790 psessionEntry->fWaitForProbeRsp = false;
1791 }
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301792 return;
1793 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001794 /**
1795 * BSS capabilities have changed.
1796 * Inform Roaming.
1797 */
1798 len = sizeof(tSirMacCapabilityInfo) +
1799 sizeof(tSirMacAddr) + sizeof(tANI_U8) +
1800 3 * sizeof(tANI_U8) + // reserved fields
1801 pBeacon->ssId.length + 1;
1802
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301803 vos_mem_copy(apNewCaps.bssId,
1804 psessionEntry->bssId,
1805 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001806 if (newChannel != psessionEntry->currentOperChannel)
1807 {
1808 PELOGE(limLog(pMac, LOGE, FL("Channel Change from %d --> %d - "
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001809 "Ignoring beacon!"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001810 psessionEntry->currentOperChannel, newChannel);)
1811 return;
1812 }
Madan Mohan Koyyalamudi84479982013-01-24 17:58:05 +05301813
1814 /**
1815 * When Cisco 1262 Enterprise APs are configured with WPA2-PSK with
1816 * AES+TKIP Pairwise ciphers and WEP-40 Group cipher, they do not set
1817 * the privacy bit in Beacons (wpa/rsnie is still present in beacons),
1818 * the privacy bit is set in Probe and association responses.
1819 * Due to this anomaly, we detect a change in
1820 * AP capabilities when we receive a beacon after association and
1821 * disconnect from the AP. The following check makes sure that we can
1822 * connect to such APs
1823 */
1824 else if ((SIR_MAC_GET_PRIVACY(apNewCaps.capabilityInfo) == 0) &&
1825 (pBeacon->rsnPresent || pBeacon->wpaPresent))
1826 {
1827 PELOGE(limLog(pMac, LOGE, FL("BSS Caps (Privacy) bit 0 in beacon,"
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001828 " but WPA or RSN IE present, Ignore Beacon!"));)
Madan Mohan Koyyalamudi84479982013-01-24 17:58:05 +05301829 return;
1830 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001831 else
1832 apNewCaps.channelId = psessionEntry->currentOperChannel;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301833 vos_mem_copy((tANI_U8 *) &apNewCaps.ssId,
1834 (tANI_U8 *) &pBeacon->ssId,
Jeff Johnson295189b2012-06-20 16:38:30 -07001835 pBeacon->ssId.length + 1);
1836
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301837 psessionEntry->fIgnoreCapsChange = false;
1838 psessionEntry->fWaitForProbeRsp = false;
Jeff Johnson295189b2012-06-20 16:38:30 -07001839 psessionEntry->limSentCapsChangeNtf = true;
1840 limSendSmeWmStatusChangeNtf(pMac, eSIR_SME_AP_CAPS_CHANGED,
1841 (tANI_U32 *) &apNewCaps,
1842 len, psessionEntry->smeSessionId);
1843 }
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301844 else if ( true == psessionEntry->fWaitForProbeRsp )
1845 {
1846 /* Only for probe response frames and matching capabilities the control
1847 * will come here. If beacon is with broadcast ssid then fWaitForProbeRsp
1848 * will be false, the control will not come here*/
1849
1850 limLog(pMac, LOG1, FL("capabilities in probe response are"
1851 "matching with the current setting,"
1852 "Ignoring subsequent capability"
1853 "mismatch"));
1854 psessionEntry->fIgnoreCapsChange = true;
1855 psessionEntry->fWaitForProbeRsp = false;
1856 }
1857
Jeff Johnson295189b2012-06-20 16:38:30 -07001858} /*** limDetectChangeInApCapabilities() ***/
1859
1860
1861
1862
1863// ---------------------------------------------------------------------
1864/**
1865 * limUpdateShortSlot
1866 *
1867 * FUNCTION:
1868 * Enable/Disable short slot
1869 *
1870 * LOGIC:
1871 *
1872 * ASSUMPTIONS:
1873 *
1874 * NOTE:
1875 *
1876 * @param enable Flag to enable/disable short slot
1877 * @return None
1878 */
1879
1880tSirRetStatus limUpdateShortSlot(tpAniSirGlobal pMac, tpSirProbeRespBeacon pBeacon, tpUpdateBeaconParams pBeaconParams,tpPESession psessionEntry)
1881{
1882
1883 tSirSmeApNewCaps apNewCaps;
Jeff Johnsone7245742012-09-05 17:12:55 -07001884 tANI_U32 nShortSlot;
1885 tANI_U32 val = 0;
1886 tANI_U32 phyMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07001887
Jeff Johnsone7245742012-09-05 17:12:55 -07001888 // Check Admin mode first. If it is disabled just return
1889 if (wlan_cfgGetInt(pMac, WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED, &val)
1890 != eSIR_SUCCESS)
1891 {
1892 limLog(pMac, LOGP,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001893 FL("cfg get WNI_CFG_11G_SHORT_SLOT_TIME failed"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001894 return eSIR_FAILURE;
1895 }
1896 if (val == false)
1897 return eSIR_SUCCESS;
1898
1899 // Check for 11a mode or 11b mode. In both cases return since slot time is constant and cannot/should not change in beacon
1900 limGetPhyMode(pMac, &phyMode, psessionEntry);
1901 if ((phyMode == WNI_CFG_PHY_MODE_11A) || (phyMode == WNI_CFG_PHY_MODE_11B))
1902 return eSIR_SUCCESS;
1903
1904 apNewCaps.capabilityInfo = limGetU16((tANI_U8 *) &pBeacon->capabilityInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -07001905
1906 // Earlier implementation: determine the appropriate short slot mode based on AP advertised modes
1907 // when erp is present, apply short slot always unless, prot=on && shortSlot=off
1908 // if no erp present, use short slot based on current ap caps
1909
1910 // Issue with earlier implementation : Cisco 1231 BG has shortSlot = 0, erpIEPresent and useProtection = 0 (Case4);
1911
1912 //Resolution : always use the shortSlot setting the capability info to decide slot time.
1913 // The difference between the earlier implementation and the new one is only Case4.
1914 /*
1915 ERP IE Present | useProtection | shortSlot = QC STA Short Slot
1916 Case1 1 1 1 1 //AP should not advertise this combination.
1917 Case2 1 1 0 0
1918 Case3 1 0 1 1
1919 Case4 1 0 0 0
1920 Case5 0 1 1 1
1921 Case6 0 1 0 0
1922 Case7 0 0 1 1
1923 Case8 0 0 0 0
1924 */
1925 nShortSlot = SIR_MAC_GET_SHORT_SLOT_TIME(apNewCaps.capabilityInfo);
1926
Jeff Johnsone7245742012-09-05 17:12:55 -07001927 if (nShortSlot != psessionEntry->shortSlotTimeSupported)
Jeff Johnson295189b2012-06-20 16:38:30 -07001928 {
1929 // Short slot time capability of AP has changed. Adopt to it.
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001930 PELOG1(limLog(pMac, LOG1, FL("Shortslot capability of AP changed: %d"), nShortSlot);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001931 ((tpSirMacCapabilityInfo)&psessionEntry->limCurrentBssCaps)->shortSlotTime = (tANI_U16)nShortSlot;
Jeff Johnsone7245742012-09-05 17:12:55 -07001932 psessionEntry->shortSlotTimeSupported = nShortSlot;
Jeff Johnson295189b2012-06-20 16:38:30 -07001933 pBeaconParams->fShortSlotTime = (tANI_U8) nShortSlot;
1934 pBeaconParams->paramChangeBitmap |= PARAM_SHORT_SLOT_TIME_CHANGED;
Jeff Johnson295189b2012-06-20 16:38:30 -07001935 }
1936 return eSIR_SUCCESS;
1937}
1938
1939
Jeff Johnson295189b2012-06-20 16:38:30 -07001940
1941
Jeff Johnson295189b2012-06-20 16:38:30 -07001942
Jeff Johnson295189b2012-06-20 16:38:30 -07001943
1944
1945/** -----------------------------------------------------------------
1946 \brief limHandleLowRssiInd() - handles low rssi indication
1947
1948 This function process the SIR_HAL_LOW_RSSI_IND message from
1949 HAL, and sends a eWNI_SME_LOW_RSSI_IND to CSR.
1950
1951 \param pMac - global mac structure
1952
1953 \return
1954
1955 \sa
1956 ----------------------------------------------------------------- */
1957void limHandleLowRssiInd(tpAniSirGlobal pMac)
1958{
1959#if 0 //RSSI related indications will now go to TL and not PE
1960 if ( (pMac->pmm.gPmmState == ePMM_STATE_BMPS_SLEEP) ||
1961 (pMac->pmm.gPmmState == ePMM_STATE_UAPSD_SLEEP)||
1962 (pMac->pmm.gPmmState == ePMM_STATE_WOWLAN) )
1963 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001964 PELOG1(limLog(pMac, LOG1, FL("Sending LOW_RSSI_IND to SME "));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001965 limSendSmeRsp(pMac, eWNI_SME_LOW_RSSI_IND, eSIR_SME_SUCCESS, 0, 0);
1966 }
1967 else
1968 {
1969 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001970 FL("Received SIR_HAL_LOW_RSSI_IND while in incorrect state: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001971 pMac->pmm.gPmmState);
1972 }
1973 return;
1974#endif
1975}
1976
1977
1978/** -----------------------------------------------------------------
1979 \brief limHandleBmpsStatusInd() - handles BMPS status indication
1980
1981 This function process the SIR_HAL_BMPS_STATUS_IND message from HAL,
1982 and invokes limSendExitBmpsInd( ) to send an eWNI_PMC_EXIT_BMPS_IND
1983 to SME with reason code 'eSME_EXIT_BMPS_IND_RCVD'.
1984
1985 HAL sends this message when Firmware fails to enter BMPS mode 'AFTER'
1986 HAL had already send PE a SIR_HAL_ENTER_BMPS_RSP with status
1987 code "success". Hence, HAL needs to notify PE to get out of BMPS mode.
1988 This message can also come from FW anytime after we have entered BMPS.
1989 This means we should handle it in WoWL and UAPSD states as well
1990
1991 \param pMac - global mac structure
1992 \return - none
1993 \sa
1994 ----------------------------------------------------------------- */
1995void limHandleBmpsStatusInd(tpAniSirGlobal pMac)
1996{
1997 switch(pMac->pmm.gPmmState)
1998 {
1999 case ePMM_STATE_BMPS_SLEEP:
2000 case ePMM_STATE_UAPSD_WT_SLEEP_RSP:
2001 case ePMM_STATE_UAPSD_SLEEP:
2002 case ePMM_STATE_UAPSD_WT_WAKEUP_RSP:
2003 case ePMM_STATE_WOWLAN:
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002004 PELOG1(limLog(pMac, LOG1, FL("Sending EXIT_BMPS_IND to SME "));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002005 limSendExitBmpsInd(pMac, eSME_BMPS_STATUS_IND_RCVD);
2006 break;
2007
2008 default:
2009 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002010 FL("Received SIR_HAL_BMPS_STATUS_IND while in incorrect state: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002011 pMac->pmm.gPmmState);
2012 break;
2013 }
2014 return;
2015}
2016
2017
2018/** -----------------------------------------------------------------
2019 \brief limHandleMissedBeaconInd() - handles missed beacon indication
2020
2021 This function process the SIR_HAL_MISSED_BEACON_IND message from HAL,
2022 and invokes limSendExitBmpsInd( ) to send an eWNI_PMC_EXIT_BMPS_IND
2023 to SME with reason code 'eSME_MISSED_BEACON_IND_RCVD'.
2024
2025 \param pMac - global mac structure
2026 \return - none
2027 \sa
2028 ----------------------------------------------------------------- */
Leela Venkata Kiran Kumar Reddy Chirala3ca17902013-02-27 19:50:05 -08002029void limHandleMissedBeaconInd(tpAniSirGlobal pMac, tpSirMsgQ pMsg)
Jeff Johnson295189b2012-06-20 16:38:30 -07002030{
Leela Venkata Kiran Kumar Reddy Chirala3ca17902013-02-27 19:50:05 -08002031#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
2032 tpSirSmeMissedBeaconInd pSirMissedBeaconInd =
2033 (tpSirSmeMissedBeaconInd)pMsg->bodyptr;
2034 tpPESession psessionEntry = peFindSessionByBssIdx(pMac,pSirMissedBeaconInd->bssIdx);
2035 if (psessionEntry == NULL)
2036 {
2037 limLog(pMac, LOGE,
2038 FL("session does not exist for given BSSIdx:%d"),
2039 pSirMissedBeaconInd->bssIdx);
2040 return;
2041 }
2042#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002043 if ( (pMac->pmm.gPmmState == ePMM_STATE_BMPS_SLEEP) ||
2044 (pMac->pmm.gPmmState == ePMM_STATE_UAPSD_SLEEP)||
2045 (pMac->pmm.gPmmState == ePMM_STATE_WOWLAN) )
2046 {
2047 pMac->pmm.inMissedBeaconScenario = TRUE;
Madan Mohan Koyyalamudi1a30a552013-09-17 21:20:07 +05302048 PELOGE(limLog(pMac, LOGE,
2049 FL("Sending EXIT_BMPS_IND to SME due to Missed beacon from FW"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002050 limSendExitBmpsInd(pMac, eSME_MISSED_BEACON_IND_RCVD);
2051 }
Yathish9f22e662012-12-10 14:21:35 -08002052/* ACTIVE_MODE_HB_OFFLOAD */
2053#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
2054 else if(((pMac->pmm.gPmmState == ePMM_STATE_READY) ||
2055 (pMac->pmm.gPmmState == ePMM_STATE_BMPS_WAKEUP)) &&
2056 (IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
2057 {
2058 pMac->pmm.inMissedBeaconScenario = TRUE;
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002059 PELOGE(limLog(pMac, LOGE, FL("Received Heart Beat Failure"));)
Leela Venkata Kiran Kumar Reddy Chirala3ca17902013-02-27 19:50:05 -08002060 limMissedBeaconInActiveMode(pMac, psessionEntry);
Yathish9f22e662012-12-10 14:21:35 -08002061 }
2062#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002063 else
2064 {
2065 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002066 FL("Received SIR_HAL_MISSED_BEACON_IND while in incorrect state: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002067 pMac->pmm.gPmmState);
2068 }
2069 return;
2070}
2071
2072/** -----------------------------------------------------------------
2073 \brief limMicFailureInd() - handles mic failure indication
2074
2075 This function process the SIR_HAL_MIC_FAILURE_IND message from HAL,
2076
2077 \param pMac - global mac structure
2078 \return - none
2079 \sa
2080 ----------------------------------------------------------------- */
2081void limMicFailureInd(tpAniSirGlobal pMac, tpSirMsgQ pMsg)
2082{
2083 tpSirSmeMicFailureInd pSirSmeMicFailureInd;
2084 tpSirSmeMicFailureInd pSirMicFailureInd = (tpSirSmeMicFailureInd)pMsg->bodyptr;
2085 tSirMsgQ mmhMsg;
2086 tpPESession psessionEntry ;
2087 tANI_U8 sessionId;
2088
2089 if((psessionEntry = peFindSessionByBssid(pMac,pSirMicFailureInd->bssId,&sessionId))== NULL)
2090 {
2091 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002092 FL("session does not exist for given BSSId"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002093 return;
2094 }
2095
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302096 pSirSmeMicFailureInd = vos_mem_malloc(sizeof(tSirSmeMicFailureInd));
2097 if (NULL == pSirSmeMicFailureInd)
Jeff Johnson295189b2012-06-20 16:38:30 -07002098 {
2099 // Log error
2100 limLog(pMac, LOGP,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002101 FL("memory allocate failed for eWNI_SME_MIC_FAILURE_IND"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002102 return;
2103 }
2104
2105 pSirSmeMicFailureInd->messageType = eWNI_SME_MIC_FAILURE_IND;
2106 pSirSmeMicFailureInd->length = sizeof(pSirSmeMicFailureInd);
2107 pSirSmeMicFailureInd->sessionId = psessionEntry->smeSessionId;
2108
2109 vos_mem_copy(pSirSmeMicFailureInd->bssId,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302110 pSirMicFailureInd->bssId,
2111 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002112
2113 vos_mem_copy(pSirSmeMicFailureInd->info.srcMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302114 pSirMicFailureInd->info.srcMacAddr,
2115 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002116
2117 vos_mem_copy(pSirSmeMicFailureInd->info.taMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302118 pSirMicFailureInd->info.taMacAddr,
2119 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002120
2121 vos_mem_copy(pSirSmeMicFailureInd->info.dstMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302122 pSirMicFailureInd->info.dstMacAddr,
2123 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002124
2125 vos_mem_copy(pSirSmeMicFailureInd->info.rxMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302126 pSirMicFailureInd->info.rxMacAddr,
2127 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002128
2129 pSirSmeMicFailureInd->info.multicast =
2130 pSirMicFailureInd->info.multicast;
2131
2132 pSirSmeMicFailureInd->info.keyId=
2133 pSirMicFailureInd->info.keyId;
2134
2135 pSirSmeMicFailureInd->info.IV1=
2136 pSirMicFailureInd->info.IV1;
2137
2138 vos_mem_copy(pSirSmeMicFailureInd->info.TSC,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302139 pSirMicFailureInd->info.TSC,SIR_CIPHER_SEQ_CTR_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002140
2141 mmhMsg.type = eWNI_SME_MIC_FAILURE_IND;
2142 mmhMsg.bodyptr = pSirSmeMicFailureInd;
2143 mmhMsg.bodyval = 0;
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08002144 MTRACE(macTraceMsgTx(pMac, sessionId, mmhMsg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07002145 limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
2146 return;
2147}
2148
2149
2150/** -----------------------------------------------------------------
2151 \brief limIsPktCandidateForDrop() - decides whether to drop the frame or not
2152
2153 This function is called before enqueuing the frame to PE queue for further processing.
2154 This prevents unnecessary frames getting into PE Queue and drops them right away.
2155 Frames will be droped in the following scenarios:
2156
2157 - In Scan State, drop the frames which are not marked as scan frames
2158 - In non-Scan state, drop the frames which are marked as scan frames.
2159 - Drop INFRA Beacons and Probe Responses in IBSS Mode
2160 - Drop the Probe Request in IBSS mode, if STA did not send out the last beacon
2161
2162 \param pMac - global mac structure
2163 \return - none
2164 \sa
2165 ----------------------------------------------------------------- */
2166
2167tMgmtFrmDropReason limIsPktCandidateForDrop(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tANI_U32 subType)
2168{
2169 tANI_U32 framelen;
2170 tANI_U8 *pBody;
2171 tSirMacCapabilityInfo capabilityInfo;
2172
2173 /*
2174 *
2175 * In scan mode, drop only Beacon/Probe Response which are NOT marked as scan-frames.
2176 * In non-scan mode, drop only Beacon/Probe Response which are marked as scan frames.
2177 * Allow other mgmt frames, they must be from our own AP, as we don't allow
2178 * other than beacons or probe responses in scan state.
2179 */
2180 if( (subType == SIR_MAC_MGMT_BEACON) ||
2181 (subType == SIR_MAC_MGMT_PROBE_RSP))
2182 {
2183 if(pMac->pmm.inMissedBeaconScenario)
2184 {
Leela Venkata Kiran Kumar Reddy Chiralaf3fe6302013-03-18 12:32:14 -07002185 MTRACE(macTrace(pMac, TRACE_CODE_INFO_LOG, 0, eLOG_NODROP_MISSED_BEACON_SCENARIO));
2186 return eMGMT_DROP_NO_DROP;
Jeff Johnson295189b2012-06-20 16:38:30 -07002187 }
2188 if (limIsSystemInScanState(pMac))
2189 {
Jeff Johnson04dd8a82012-06-29 20:41:40 -07002190 return eMGMT_DROP_NO_DROP;
Jeff Johnson295189b2012-06-20 16:38:30 -07002191 }
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -07002192#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
2193 else if (WDA_GET_OFFLOADSCANLEARN(pRxPacketInfo) || WDA_GET_ROAMCANDIDATEIND(pRxPacketInfo))
2194 {
2195 return eMGMT_DROP_NO_DROP;
2196 }
2197#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002198 else if (WDA_IS_RX_IN_SCAN(pRxPacketInfo))
2199 {
2200 return eMGMT_DROP_SCAN_MODE_FRAME;
2201 }
2202 }
2203
2204 framelen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
2205 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
2206
2207 /* Note sure if this is sufficient, basically this condition allows all probe responses and
2208 * beacons from an infrastructure network
2209 */
2210 *((tANI_U16*) &capabilityInfo) = sirReadU16(pBody+ LIM_BCN_PR_CAPABILITY_OFFSET);
2211 if(!capabilityInfo.ibss)
2212 return eMGMT_DROP_NO_DROP;
2213#if 0
2214 //Allow the mgmt frames to be queued if STA not in IBSS mode.
2215 if (pMac->lim.gLimSystemRole != eLIM_STA_IN_IBSS_ROLE)
2216 return eMGMT_DROP_NO_DROP;
2217#endif
2218
2219 //Drop INFRA Beacons and Probe Responses in IBSS Mode
2220 if( (subType == SIR_MAC_MGMT_BEACON) ||
2221 (subType == SIR_MAC_MGMT_PROBE_RSP))
2222 {
2223 //drop the frame if length is less than 12
2224 if(framelen < LIM_MIN_BCN_PR_LENGTH)
2225 return eMGMT_DROP_INVALID_SIZE;
2226
2227 *((tANI_U16*) &capabilityInfo) = sirReadU16(pBody+ LIM_BCN_PR_CAPABILITY_OFFSET);
2228
2229 //This can be enhanced to even check the SSID before deciding to enque the frame.
2230 if(capabilityInfo.ess)
2231 return eMGMT_DROP_INFRA_BCN_IN_IBSS;
2232 }
2233 else if( (subType == SIR_MAC_MGMT_PROBE_REQ) &&
2234 (!WDA_GET_RX_BEACON_SENT(pRxPacketInfo)))
2235 {
2236 //Drop the Probe Request in IBSS mode, if STA did not send out the last beacon
2237 //In IBSS, the node which sends out the beacon, is supposed to respond to ProbeReq
2238 return eMGMT_DROP_NOT_LAST_IBSS_BCN;
2239 }
2240
2241 return eMGMT_DROP_NO_DROP;
2242}
2243
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08002244eHalStatus pe_AcquireGlobalLock( tAniSirLim *psPe)
2245{
2246 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
Jeff Johnson295189b2012-06-20 16:38:30 -07002247
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08002248 if(psPe)
2249 {
2250 if( VOS_IS_STATUS_SUCCESS( vos_lock_acquire( &psPe->lkPeGlobalLock) ) )
2251 {
2252 status = eHAL_STATUS_SUCCESS;
2253 }
2254 }
2255 return (status);
2256}
2257eHalStatus pe_ReleaseGlobalLock( tAniSirLim *psPe)
2258{
2259 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
2260 if(psPe)
2261 {
2262 if( VOS_IS_STATUS_SUCCESS( vos_lock_release( &psPe->lkPeGlobalLock) ) )
2263 {
2264 status = eHAL_STATUS_SUCCESS;
2265 }
2266 }
2267 return (status);
2268}