blob: ca7ca1de9e3a2b911a8206e1fe3d0263efb9de9c [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08002 * Copyright (c) 2012-2014 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.
20 */
21
22/*
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -080023 * Copyright (c) 2012-2014 Qualcomm Atheros, Inc.
Kiet Lamaa8e15a2014-02-11 23:30:06 -080024 * All Rights Reserved.
25 * Qualcomm Atheros Confidential and Proprietary.
Kiet Lam842dad02014-02-18 18:44:02 -080026 *
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080027 */
Kiet Lam842dad02014-02-18 18:44:02 -080028
29
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080030/*
Jeff Johnson295189b2012-06-20 16:38:30 -070031 * This file limApi.cc contains the functions that are
32 * exported by LIM to other modules.
33 *
34 * Author: Chandra Modumudi
35 * Date: 02/11/02
36 * History:-
37 * Date Modified by Modification Information
38 * --------------------------------------------------------------------
39 *
40 */
41#include "palTypes.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070042#include "wniCfgSta.h"
43#include "wniApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070044#include "sirCommon.h"
45#include "sirDebug.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070046#include "cfgApi.h"
47
48#include "schApi.h"
49#include "utilsApi.h"
50#include "limApi.h"
51#include "limGlobal.h"
52#include "limTypes.h"
53#include "limUtils.h"
54#include "limAssocUtils.h"
55#include "limPropExtsUtils.h"
56#include "limSerDesUtils.h"
57#include "limIbssPeerMgmt.h"
58#include "limAdmitControl.h"
59#include "pmmApi.h"
60#include "logDump.h"
61#include "limSendSmeRspMessages.h"
62#include "wmmApsd.h"
63#include "limTrace.h"
64#include "limSession.h"
65#include "wlan_qct_wda.h"
66
67#if defined WLAN_FEATURE_VOWIFI
68#include "rrmApi.h"
69#endif
70
71#include <limFT.h>
Jeff Johnson295189b2012-06-20 16:38:30 -070072#include "vos_types.h"
73#include "vos_packet.h"
74#include "wlan_qct_tl.h"
75#include "sysStartup.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070076
77
78static void __limInitScanVars(tpAniSirGlobal pMac)
79{
80 pMac->lim.gLimUseScanModeForLearnMode = 1;
81
82 pMac->lim.gLimSystemInScanLearnMode = 0;
83
84 // Scan related globals on STA
85 pMac->lim.gLimReturnAfterFirstMatch = 0;
86 pMac->lim.gLim24Band11dScanDone = 0;
87 pMac->lim.gLim50Band11dScanDone = 0;
88 pMac->lim.gLimReturnUniqueResults = 0;
89
90 // Background Scan related globals on STA
91 pMac->lim.gLimNumOfBackgroundScanSuccess = 0;
92 pMac->lim.gLimNumOfConsecutiveBkgndScanFailure = 0;
93 pMac->lim.gLimNumOfForcedBkgndScan = 0;
94 pMac->lim.gLimBackgroundScanDisable = false; //based on BG timer
95 pMac->lim.gLimForceBackgroundScanDisable = false; //debug control flag
96 pMac->lim.gLimBackgroundScanTerminate = TRUE; //controlled by SME
Jeff Johnson92751692013-03-06 16:00:33 -080097 pMac->lim.gLimReportBackgroundScanResults = FALSE; //controlled by SME
Jeff Johnson295189b2012-06-20 16:38:30 -070098
99 pMac->lim.gLimCurrentScanChannelId = 0;
100 pMac->lim.gpLimMlmScanReq = NULL;
Viral Modid440e682013-03-06 02:25:31 -0800101 pMac->lim.gDeferMsgTypeForNOA = 0;
102 pMac->lim.gpDefdSmeMsgForNOA = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700103 pMac->lim.gLimMlmScanResultLength = 0;
104 pMac->lim.gLimSmeScanResultLength = 0;
105
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530106 vos_mem_set(pMac->lim.gLimCachedScanHashTable,
107 sizeof(pMac->lim.gLimCachedScanHashTable), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700108
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700109#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
110
111 pMac->lim.gLimMlmLfrScanResultLength = 0;
112 pMac->lim.gLimSmeLfrScanResultLength = 0;
113
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530114 vos_mem_set(pMac->lim.gLimCachedLfrScanHashTable,
115 sizeof(pMac->lim.gLimCachedLfrScanHashTable), 0);
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700116#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700117 pMac->lim.gLimBackgroundScanChannelId = 0;
118 pMac->lim.gLimBackgroundScanStarted = 0;
119 pMac->lim.gLimRestoreCBNumScanInterval = LIM_RESTORE_CB_NUM_SCAN_INTERVAL_DEFAULT;
120 pMac->lim.gLimRestoreCBCount = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530121 vos_mem_set(pMac->lim.gLimLegacyBssidList,
122 sizeof(pMac->lim.gLimLegacyBssidList), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700123
124 /* Fill in default values */
125 pMac->lim.gLimTriggerBackgroundScanDuringQuietBss = 0;
126
Jeff Johnson295189b2012-06-20 16:38:30 -0700127
128 // abort scan is used to abort an on-going scan
129 pMac->lim.abortScan = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530130 vos_mem_set(&pMac->lim.scanChnInfo, sizeof(tLimScanChnInfo), 0);
131 vos_mem_set(&pMac->lim.dfschannelList, sizeof(tSirDFSChannelList), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700132
133//WLAN_SUSPEND_LINK Related
134 pMac->lim.gpLimSuspendCallback = NULL;
135 pMac->lim.gpLimResumeCallback = NULL;
136//end WLAN_SUSPEND_LINK Related
137}
138
139
140static void __limInitBssVars(tpAniSirGlobal pMac)
141{
142
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530143 vos_mem_set((void*)pMac->lim.gpSession,
144 sizeof(*pMac->lim.gpSession)*pMac->lim.maxBssId, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700145
146
147 //pMac->lim.gpLimStartBssReq = NULL;
148
Jeff Johnson295189b2012-06-20 16:38:30 -0700149
150
151
152/* These global variables are moved to session table and intialization is done during session creation Oct 9th Review */
153#if 0
154
155 // Place holder for BSS description that we're
156 // currently joined with
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530157 vos_mem_set(&pMac->lim.gLimCurrentBssId, sizeof(tSirMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700158 pMac->lim.gLimCurrentChannelId = HAL_INVALID_CHANNEL_ID;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530159 vos_mem_set(&pMac->lim.gLimCurrentSSID, sizeof(tSirMacSSid), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700160 pMac->lim.gLimCurrentBssCaps = 0;
161 QosCaps is a bit map of various qos capabilities - see defn above
162 pMac->lim.gLimCurrentBssQosCaps = 0;
163 pMac->lim.gLimCurrentBssPropCap = 0;
164 pMac->lim.gLimSentCapsChangeNtf = 0;
165
166 // Place holder for BSS description that
167 // we're currently Reassociating
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530168 vos_mem_set(&pMac->lim.gLimReassocBssId, sizeof(tSirMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700169 pMac->lim.gLimReassocChannelId = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530170 vos_mem_set(&pMac->lim.gLimReassocSSID, sizeof(tSirMacSSid), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700171 pMac->lim.gLimReassocBssCaps = 0;
172 pMac->lim.gLimReassocBssQosCaps = 0;
173 pMac->lim.gLimReassocBssPropCap = 0;
174 #endif
175
176 /* This is for testing purposes only, be default should always be off */
177 pMac->lim.gLimForceNoPropIE = 0;
178
179 // pMac->lim.gLimBssIdx = 0;
180
181 pMac->lim.gpLimMlmSetKeysReq = NULL;
182 pMac->lim.gpLimMlmRemoveKeyReq = NULL;
183 // pMac->lim.gLimStaid = 0; //TO SUPPORT BT-AMP
184
185}
186
187
188static void __limInitStatsVars(tpAniSirGlobal pMac)
189{
190 pMac->lim.gLimNumBeaconsRcvd = 0;
191 pMac->lim.gLimNumBeaconsIgnored = 0;
192
193 pMac->lim.gLimNumDeferredMsgs = 0;
194
195 /// Variable to keep track of number of currently associated STAs
Gopichand Nakkala777e6032012-12-31 16:39:21 -0800196 //pMac->lim.gLimNumOfCurrentSTAs = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700197 pMac->lim.gLimNumOfAniSTAs = 0; // count of ANI peers
198
199 /// This indicates number of RXed Beacons during HB period
200 //pMac->lim.gLimRxedBeaconCntDuringHB = 0;
201
202 // Heart-Beat interval value
203 pMac->lim.gLimHeartBeatCount = 0;
204
Abhishek Singhde51a412014-05-20 19:17:26 +0530205 vos_mem_zero(pMac->lim.gLimHeartBeatApMac[0],
206 sizeof(tSirMacAddr));
207 vos_mem_zero(pMac->lim.gLimHeartBeatApMac[1],
208 sizeof(tSirMacAddr));
209 pMac->lim.gLimHeartBeatApMacIndex = 0;
210
Jeff Johnson295189b2012-06-20 16:38:30 -0700211 // Statistics to keep track of no. beacons rcvd in heart beat interval
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530212 vos_mem_set(pMac->lim.gLimHeartBeatBeaconStats,
213 sizeof(pMac->lim.gLimHeartBeatBeaconStats), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700214
215#ifdef WLAN_DEBUG
216 // Debug counters
217 pMac->lim.numTot = 0;
218 pMac->lim.numBbt = 0;
219 pMac->lim.numProtErr = 0;
220 pMac->lim.numLearn = 0;
221 pMac->lim.numLearnIgnore = 0;
222 pMac->lim.numSme = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530223 vos_mem_set(pMac->lim.numMAC, sizeof(pMac->lim.numMAC), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700224 pMac->lim.gLimNumAssocReqDropInvldState = 0;
225 pMac->lim.gLimNumAssocReqDropACRejectTS = 0;
226 pMac->lim.gLimNumAssocReqDropACRejectSta = 0;
227 pMac->lim.gLimNumReassocReqDropInvldState = 0;
228 pMac->lim.gLimNumHashMissIgnored = 0;
229 pMac->lim.gLimUnexpBcnCnt = 0;
230 pMac->lim.gLimBcnSSIDMismatchCnt = 0;
231 pMac->lim.gLimNumLinkEsts = 0;
232 pMac->lim.gLimNumRxCleanup = 0;
233 pMac->lim.gLim11bStaAssocRejectCount = 0;
234#endif
235}
236
237
238
239static void __limInitStates(tpAniSirGlobal pMac)
240{
241 // Counts Heartbeat failures
242 pMac->lim.gLimHBfailureCntInLinkEstState = 0;
243 pMac->lim.gLimProbeFailureAfterHBfailedCnt = 0;
244 pMac->lim.gLimHBfailureCntInOtherStates = 0;
245 pMac->lim.gLimRspReqd = 0;
246 pMac->lim.gLimPrevSmeState = eLIM_SME_OFFLINE_STATE;
247
248 /// MLM State visible across all Sirius modules
Jeff Johnsone7245742012-09-05 17:12:55 -0700249 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, eLIM_MLM_IDLE_STATE));
Jeff Johnson295189b2012-06-20 16:38:30 -0700250 pMac->lim.gLimMlmState = eLIM_MLM_IDLE_STATE;
251
252 /// Previous MLM State
253 pMac->lim.gLimPrevMlmState = eLIM_MLM_OFFLINE_STATE;
254
255#ifdef GEN4_SCAN
256 // LIM to HAL SCAN Management Message Interface states
257 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
258#endif // GEN4_SCAN
259
Jeff Johnson295189b2012-06-20 16:38:30 -0700260 /**
Jeff Johnsone7245742012-09-05 17:12:55 -0700261 * Initialize state to eLIM_SME_OFFLINE_STATE
Jeff Johnson295189b2012-06-20 16:38:30 -0700262 */
Jeff Johnsone7245742012-09-05 17:12:55 -0700263 pMac->lim.gLimSmeState = eLIM_SME_OFFLINE_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700264
265 /**
266 * By default assume 'unknown' role. This will be updated
267 * when SME_START_BSS_REQ is received.
268 */
269
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530270 vos_mem_set(&pMac->lim.gLimOverlap11gParams, sizeof(tLimProtStaParams), 0);
271 vos_mem_set(&pMac->lim.gLimOverlap11aParams, sizeof(tLimProtStaParams), 0);
272 vos_mem_set(&pMac->lim.gLimOverlapHt20Params, sizeof(tLimProtStaParams), 0);
273 vos_mem_set(&pMac->lim.gLimOverlapNonGfParams, sizeof(tLimProtStaParams), 0);
274 vos_mem_set(&pMac->lim.gLimNoShortParams, sizeof(tLimNoShortParams), 0);
275 vos_mem_set(&pMac->lim.gLimNoShortSlotParams, sizeof(tLimNoShortSlotParams), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700276
277 pMac->lim.gLimPhyMode = 0;
278 pMac->lim.scanStartTime = 0; // used to measure scan time
279
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530280 vos_mem_set(pMac->lim.gLimMyMacAddr, sizeof(pMac->lim.gLimMyMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700281 pMac->lim.ackPolicy = 0;
282
283#if 0 /* Moving all these to session specific elements */
284 pMac->lim.gLimQosEnabled = 0; //11E
285 pMac->lim.gLimWmeEnabled = 0; //WME
286 pMac->lim.gLimWsmEnabled = 0; //WSM
287 pMac->lim.gLimHcfEnabled = 0;
288 pMac->lim.gLim11dEnabled = 0;
289#endif
290
291 pMac->lim.gLimProbeRespDisableFlag = 0; // control over probe response
292}
293
294static void __limInitVars(tpAniSirGlobal pMac)
295{
296
Jeff Johnson295189b2012-06-20 16:38:30 -0700297
298 // Place holder for Measurement Req/Rsp/Ind related info
Jeff Johnson295189b2012-06-20 16:38:30 -0700299
300 // WDS info
301 pMac->lim.gLimNumWdsInfoInd = 0;
302 pMac->lim.gLimNumWdsInfoSet = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530303 vos_mem_set(&pMac->lim.gLimWdsInfo, sizeof(tSirWdsInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700304 /* initialize some parameters */
305 limInitWdsInfoParams(pMac);
306
307 // Deferred Queue Paramters
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530308 vos_mem_set(&pMac->lim.gLimDeferredMsgQ, sizeof(tSirAddtsReq), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700309
310 // addts request if any - only one can be outstanding at any time
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530311 vos_mem_set(&pMac->lim.gLimAddtsReq, sizeof(tSirAddtsReq) , 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700312 pMac->lim.gLimAddtsSent = 0;
313 pMac->lim.gLimAddtsRspTimerCount = 0;
314
315 //protection related config cache
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530316 vos_mem_set(&pMac->lim.cfgProtection, sizeof(tCfgProtection), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700317 pMac->lim.gLimProtectionControl = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530318 vos_mem_set(&pMac->lim.gLimAlternateRadio, sizeof(tSirAlternateRadioInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700319 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
320
Jeff Johnsone7245742012-09-05 17:12:55 -0700321#if 0
Jeff Johnson295189b2012-06-20 16:38:30 -0700322 // 11h Spectrum Management Related Flag
Jeff Johnson295189b2012-06-20 16:38:30 -0700323 LIM_SET_RADAR_DETECTED(pMac, eANI_BOOLEAN_FALSE);
324 pMac->sys.gSysEnableLearnMode = eANI_BOOLEAN_TRUE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700325#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700326 // WMM Related Flag
327 pMac->lim.gUapsdEnable = 0;
328 pMac->lim.gUapsdPerAcBitmask = 0;
329 pMac->lim.gUapsdPerAcTriggerEnableMask = 0;
330 pMac->lim.gUapsdPerAcDeliveryEnableMask = 0;
331
332 // QoS-AC Downgrade: Initially, no AC is admitted
333 pMac->lim.gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] = 0;
334 pMac->lim.gAcAdmitMask[SIR_MAC_DIRECTION_DNLINK] = 0;
335
336 //dialogue token List head/tail for Action frames request sent.
337 pMac->lim.pDialogueTokenHead = NULL;
338 pMac->lim.pDialogueTokenTail = NULL;
339
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530340 vos_mem_set(&pMac->lim.tspecInfo,
341 sizeof(tLimTspecInfo) * LIM_NUM_TSPEC_MAX, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700342
343 // admission control policy information
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530344 vos_mem_set(&pMac->lim.admitPolicyInfo, sizeof(tLimAdmitPolicyInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700345
346 pMac->lim.gLastBeaconDtimCount = 0;
347 pMac->lim.gLastBeaconDtimPeriod = 0;
348
349 //Scan in Power Save Flag
350 pMac->lim.gScanInPowersave = 0;
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -0800351 pMac->lim.probeCounter = 0;
352 pMac->lim.maxProbe = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700353}
354
355static void __limInitAssocVars(tpAniSirGlobal pMac)
356{
Madan Mohan Koyyalamudi59efbe02013-01-10 15:38:42 -0800357 tANI_U32 val;
Gopichand Nakkala777e6032012-12-31 16:39:21 -0800358#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530359 vos_mem_set(pMac->lim.gpLimAIDpool,
360 sizeof(*pMac->lim.gpLimAIDpool) * (WNI_CFG_ASSOC_STA_LIMIT_STAMAX+1), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700361 pMac->lim.freeAidHead = 0;
362 pMac->lim.freeAidTail = 0;
Gopichand Nakkala777e6032012-12-31 16:39:21 -0800363#endif
Madan Mohan Koyyalamudi59efbe02013-01-10 15:38:42 -0800364 if(wlan_cfgGetInt(pMac, WNI_CFG_ASSOC_STA_LIMIT, &val) != eSIR_SUCCESS)
365 {
366 limLog( pMac, LOGP, FL( "cfg get assoc sta limit failed" ));
367 }
368 pMac->lim.gLimAssocStaLimit = val;
Ravi Joshi0fc681b2013-09-11 16:46:07 -0700369 pMac->lim.gLimIbssStaLimit = val;
Jeff Johnson295189b2012-06-20 16:38:30 -0700370
371 // Place holder for current authentication request
372 // being handled
373 pMac->lim.gpLimMlmAuthReq = NULL;
Jeff Johnsone7245742012-09-05 17:12:55 -0700374 //pMac->lim.gpLimMlmJoinReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700375
376 /// MAC level Pre-authentication related globals
377 pMac->lim.gLimPreAuthChannelNumber = 0;
378 pMac->lim.gLimPreAuthType = eSIR_OPEN_SYSTEM;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530379 vos_mem_set(&pMac->lim.gLimPreAuthPeerAddr, sizeof(tSirMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700380 pMac->lim.gLimNumPreAuthContexts = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530381 vos_mem_set(&pMac->lim.gLimPreAuthTimerTable, sizeof(tLimPreAuthTable), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700382
383 // Placed holder to deauth reason
384 pMac->lim.gLimDeauthReasonCode = 0;
385
386 // Place holder for Pre-authentication node list
387 pMac->lim.pLimPreAuthList = NULL;
388
Jeff Johnson295189b2012-06-20 16:38:30 -0700389 //One cache for each overlap and associated case.
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530390 vos_mem_set(pMac->lim.protStaOverlapCache,
391 sizeof(tCacheParams) * LIM_PROT_STA_OVERLAP_CACHE_SIZE, 0);
392 vos_mem_set(pMac->lim.protStaCache,
393 sizeof(tCacheParams) * LIM_PROT_STA_CACHE_SIZE, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700394
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -0800395#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
Madan Mohan Koyyalamudi61bc5662012-11-02 14:33:10 -0700396 pMac->lim.pSessionEntry = NULL;
397 pMac->lim.reAssocRetryAttempt = 0;
398#endif
399
Jeff Johnson295189b2012-06-20 16:38:30 -0700400}
401
402
403static void __limInitTitanVars(tpAniSirGlobal pMac)
404{
Jeff Johnsone7245742012-09-05 17:12:55 -0700405#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530406 vos_mem_set(&pMac->lim.gLimChannelSwitch, sizeof(tLimChannelSwitchInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700407 pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_IDLE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700408 pMac->lim.gLimChannelSwitch.secondarySubBand = PHY_SINGLE_CHANNEL_CENTERED;
409#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700410 // Debug workaround for BEACON's
411 // State change triggered by "dump 222"
412 pMac->lim.gLimScanOverride = 1;
413 pMac->lim.gLimScanOverrideSaved = eSIR_ACTIVE_SCAN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700414 pMac->lim.gLimTitanStaCount = 0;
415 pMac->lim.gLimBlockNonTitanSta = 0;
416}
417
418static void __limInitHTVars(tpAniSirGlobal pMac)
419{
420 pMac->lim.htCapabilityPresentInBeacon = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700421 pMac->lim.gHTGreenfield = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700422 pMac->lim.gHTShortGI40Mhz = 0;
423 pMac->lim.gHTShortGI20Mhz = 0;
424 pMac->lim.gHTMaxAmsduLength = 0;
425 pMac->lim.gHTDsssCckRate40MHzSupport = 0;
426 pMac->lim.gHTPSMPSupport = 0;
427 pMac->lim.gHTLsigTXOPProtection = 0;
428 pMac->lim.gHTMIMOPSState = eSIR_HT_MIMO_PS_STATIC;
429 pMac->lim.gHTAMpduDensity = 0;
430
431 pMac->lim.gMaxAmsduSizeEnabled = false;
432 pMac->lim.gHTMaxRxAMpduFactor = 0;
433 pMac->lim.gHTServiceIntervalGranularity = 0;
434 pMac->lim.gHTControlledAccessOnly = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700435 pMac->lim.gHTOperMode = eSIR_HT_OP_MODE_PURE;
436 pMac->lim.gHTPCOActive = 0;
437
438 pMac->lim.gHTPCOPhase = 0;
439 pMac->lim.gHTSecondaryBeacon = 0;
440 pMac->lim.gHTDualCTSProtection = 0;
441 pMac->lim.gHTSTBCBasicMCS = 0;
442 pMac->lim.gAddBA_Declined = 0; // Flag to Decline the BAR if the particular bit (0-7) is being set
443}
444
Jeff Johnson295189b2012-06-20 16:38:30 -0700445static tSirRetStatus __limInitConfig( tpAniSirGlobal pMac )
446{
Jeff Johnsone7245742012-09-05 17:12:55 -0700447 tANI_U32 val1, val2, val3;
Jeff Johnson295189b2012-06-20 16:38:30 -0700448 tANI_U16 val16;
449 tANI_U8 val8;
450 tSirMacHTCapabilityInfo *pHTCapabilityInfo;
451 tSirMacHTInfoField1 *pHTInfoField1;
452 tpSirPowerSaveCfg pPowerSaveConfig;
453 tSirMacHTParametersInfo *pAmpduParamInfo;
454
455 /* Read all the CFGs here that were updated before peStart is called */
Jeff Johnsone7245742012-09-05 17:12:55 -0700456 /* All these CFG READS/WRITES are only allowed in init, at start when there is no session
457 * and they will be used throughout when there is no session
458 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700459
Jeff Johnson295189b2012-06-20 16:38:30 -0700460 if(wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &val1) != eSIR_SUCCESS)
461 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700462 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT Cap CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700463 return eSIR_FAILURE;
464 }
465
466 if(wlan_cfgGetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, &val2) != eSIR_SUCCESS)
467 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700468 PELOGE(limLog(pMac, LOGE, FL("could not retrieve Channel Bonding CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700469 return eSIR_FAILURE;
470 }
471 val16 = ( tANI_U16 ) val1;
472 pHTCapabilityInfo = ( tSirMacHTCapabilityInfo* ) &val16;
473
474 //channel bonding mode could be set to anything from 0 to 4(Titan had these
475 // modes But for Taurus we have only two modes: enable(>0) or disable(=0)
476 pHTCapabilityInfo->supportedChannelWidthSet = val2 ?
477 WNI_CFG_CHANNEL_BONDING_MODE_ENABLE : WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
478 if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo)
479 != eSIR_SUCCESS)
480 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700481 PELOGE(limLog(pMac, LOGE, FL("could not update HT Cap Info CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700482 return eSIR_FAILURE;
483 }
484
485 if(wlan_cfgGetInt(pMac, WNI_CFG_HT_INFO_FIELD1, &val1) != eSIR_SUCCESS)
486 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700487 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT INFO Field1 CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700488 return eSIR_FAILURE;
489 }
490
491 val8 = ( tANI_U8 ) val1;
492 pHTInfoField1 = ( tSirMacHTInfoField1* ) &val8;
493 pHTInfoField1->recommendedTxWidthSet =
494 (tANI_U8)pHTCapabilityInfo->supportedChannelWidthSet;
Jeff Johnson295189b2012-06-20 16:38:30 -0700495 if(cfgSetInt(pMac, WNI_CFG_HT_INFO_FIELD1, *(tANI_U8*)pHTInfoField1)
496 != eSIR_SUCCESS)
497 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700498 PELOGE(limLog(pMac, LOGE, FL("could not update HT Info Field"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700499 return eSIR_FAILURE;
500 }
501
502 /* WNI_CFG_HEART_BEAT_THRESHOLD */
503
504 if( wlan_cfgGetInt(pMac, WNI_CFG_HEART_BEAT_THRESHOLD, &val1) !=
505 eSIR_SUCCESS )
506 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700507 PELOGE(limLog(pMac, LOGE, FL("could not retrieve WNI_CFG_HEART_BEAT_THRESHOLD CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700508 return eSIR_FAILURE;
509 }
510 if(!val1)
511 {
512 limDeactivateAndChangeTimer(pMac, eLIM_HEART_BEAT_TIMER);
513 pMac->sys.gSysEnableLinkMonitorMode = 0;
514 }
515 else
516 {
517 //No need to activate the timer during init time.
518 pMac->sys.gSysEnableLinkMonitorMode = 1;
519 }
520
521 /* WNI_CFG_SHORT_GI_20MHZ */
522
523 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &val1) != eSIR_SUCCESS)
524 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700525 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT Cap CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700526 return eSIR_FAILURE;
527 }
528 if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_GI_20MHZ, &val2) != eSIR_SUCCESS)
529 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700530 PELOGE(limLog(pMac, LOGE, FL("could not retrieve shortGI 20Mhz CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700531 return eSIR_FAILURE;
532 }
533 if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_GI_40MHZ, &val3) != eSIR_SUCCESS)
534 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700535 PELOGE(limLog(pMac, LOGE, FL("could not retrieve shortGI 40Mhz CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700536 return eSIR_FAILURE;
537 }
538
539 val16 = ( tANI_U16 ) val1;
540 pHTCapabilityInfo = ( tSirMacHTCapabilityInfo* ) &val16;
541 pHTCapabilityInfo->shortGI20MHz = (tANI_U16)val2;
542 pHTCapabilityInfo->shortGI40MHz = (tANI_U16)val3;
543
544 if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo) !=
545 eSIR_SUCCESS)
546 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700547 PELOGE(limLog(pMac, LOGE, FL("could not update HT Cap Info CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700548 return eSIR_FAILURE;
549 }
550
551 /* WNI_CFG_MAX_RX_AMPDU_FACTOR */
552
553 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_AMPDU_PARAMS, &val1) != eSIR_SUCCESS)
554 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700555 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT AMPDU Param CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700556 return eSIR_FAILURE;
557 }
558 if (wlan_cfgGetInt(pMac, WNI_CFG_MAX_RX_AMPDU_FACTOR, &val2) != eSIR_SUCCESS)
559 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700560 PELOGE(limLog(pMac, LOGE, FL("could not retrieve AMPDU Factor CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700561 return eSIR_FAILURE;
562 }
563 val16 = ( tANI_U16 ) val1;
564 pAmpduParamInfo = ( tSirMacHTParametersInfo* ) &val16;
565 pAmpduParamInfo->maxRxAMPDUFactor = (tANI_U8)val2;
566 if(cfgSetInt(pMac, WNI_CFG_HT_AMPDU_PARAMS, *(tANI_U8*)pAmpduParamInfo) !=
567 eSIR_SUCCESS)
568 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700569 PELOGE(limLog(pMac, LOGE, FL("could not update HT AMPDU Param CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700570 return eSIR_FAILURE;
571 }
572
573 /* WNI_CFG_SHORT_PREAMBLE - this one is not updated in
574 limHandleCFGparamUpdate do we want to update this? */
575 if(wlan_cfgGetInt(pMac, WNI_CFG_SHORT_PREAMBLE, &val1) != eSIR_SUCCESS)
576 {
Shake M Subhani5d80fda2013-12-09 17:28:23 +0530577 limLog(pMac, LOGE, FL("cfg get short preamble failed"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700578 return eSIR_FAILURE;
579 }
580
Jeff Johnson295189b2012-06-20 16:38:30 -0700581 /* WNI_CFG_MAX_PS_POLL */
582
583 /* Allocate and fill in power save configuration. */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530584 pPowerSaveConfig = vos_mem_malloc(sizeof(tSirPowerSaveCfg));
585 if (NULL == pPowerSaveConfig)
Jeff Johnson295189b2012-06-20 16:38:30 -0700586 {
587 PELOGE(limLog(pMac, LOGE, FL("LIM: Cannot allocate memory for power save "
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700588 "configuration"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700589 return eSIR_FAILURE;
590 }
591
592 /* This context should be valid if power-save configuration message has been
593 * already dispatched during initialization process. Re-using the present
594 * configuration mask
595 */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530596 vos_mem_copy(pPowerSaveConfig, (tANI_U8 *)&pMac->pmm.gPmmCfg, sizeof(tSirPowerSaveCfg));
Jeff Johnson295189b2012-06-20 16:38:30 -0700597
598 /* Note: it is okay to do this since DAL/HAL is alrady started */
599 if ( (pmmSendPowerSaveCfg(pMac, pPowerSaveConfig)) != eSIR_SUCCESS)
600 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700601 PELOGE(limLog(pMac, LOGE, FL("LIM: pmmSendPowerSaveCfg() failed "));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700602 return eSIR_FAILURE;
603 }
604
605 /* WNI_CFG_BG_SCAN_CHANNEL_LIST_CHANNEL_LIST */
606
Jeff Johnson295189b2012-06-20 16:38:30 -0700607 PELOG1(limLog(pMac, LOG1,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700608 FL("VALID_CHANNEL_LIST has changed, reset next bg scan channel"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700609 pMac->lim.gLimBackgroundScanChannelId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700610
611 /* WNI_CFG_PROBE_RSP_BCN_ADDNIE_DATA - not needed */
612
613 /* This was initially done after resume notification from HAL. Now, DAL is
614 started before PE so this can be done here */
Jeff Johnsone7245742012-09-05 17:12:55 -0700615 handleHTCapabilityandHTInfo(pMac, NULL);
Leela V Kiran Kumar Reddy Chiralab1f7d342013-02-11 00:27:02 -0800616 if(wlan_cfgGetInt(pMac, WNI_CFG_DISABLE_LDPC_WITH_TXBF_AP,(tANI_U32 *) &pMac->lim.disableLDPCWithTxbfAP) != eSIR_SUCCESS)
617 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700618 limLog(pMac, LOGP, FL("cfg get disableLDPCWithTxbfAP failed"));
Leela V Kiran Kumar Reddy Chiralab1f7d342013-02-11 00:27:02 -0800619 return eSIR_FAILURE;
620 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +0530621#ifdef FEATURE_WLAN_TDLS
622 if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_BUF_STA_ENABLED,(tANI_U32 *) &pMac->lim.gLimTDLSBufStaEnabled) != eSIR_SUCCESS)
623 {
624 limLog(pMac, LOGP, FL("cfg get LimTDLSBufStaEnabled failed"));
625 return eSIR_FAILURE;
626 }
627 if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK,(tANI_U32 *) &pMac->lim.gLimTDLSUapsdMask) != eSIR_SUCCESS)
628 {
629 limLog(pMac, LOGP, FL("cfg get LimTDLSUapsdMask failed"));
630 return eSIR_FAILURE;
631 }
Naresh Jayaramf73f3762014-02-04 16:13:20 +0530632 if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_OFF_CHANNEL_ENABLED,(tANI_U32 *) &pMac->lim.gLimTDLSOffChannelEnabled) != eSIR_SUCCESS)
633 {
634 limLog(pMac, LOGP, FL("cfg get LimTDLSUapsdMask failed"));
635 return eSIR_FAILURE;
636 }
Pradeep Reddy POTTETIa9c80d52014-05-09 18:05:29 +0530637
638 if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_WMM_MODE_ENABLED,(tANI_U32 *) &pMac->lim.gLimTDLSWmmMode) != eSIR_SUCCESS)
639 {
640 limLog(pMac, LOGP, FL("cfg get LimTDLSWmmMode failed"));
641 return eSIR_FAILURE;
642 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +0530643#endif
Pradeep Reddy POTTETIa9c80d52014-05-09 18:05:29 +0530644
Rashmi Ramannac7744532013-10-06 16:49:08 +0530645 if (eSIR_SUCCESS !=
646 wlan_cfgGetInt(pMac, WNI_CFG_DEBUG_P2P_REMAIN_ON_CHANNEL,
647 (tANI_U32 *)&pMac->lim.gDebugP2pRemainOnChannel))
648 {
649 limLog( pMac, LOGE,
650 "%s: Couldn't get WNI_CFG_DEBUG_P2P_REMAIN_ON_CHANNEL value",
651 __func__);
652 pMac->lim.gDebugP2pRemainOnChannel = 0;
653 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700654 return eSIR_SUCCESS;
655}
Jeff Johnson295189b2012-06-20 16:38:30 -0700656
657/*
658 limStart
659 This function is to replace the __limProcessSmeStartReq since there is no
660 eWNI_SME_START_REQ post to PE.
661*/
662tSirRetStatus limStart(tpAniSirGlobal pMac)
663{
664 tSirResultCodes retCode = eSIR_SUCCESS;
665
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700666 PELOG1(limLog(pMac, LOG1, FL(" enter"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700667
668 if (pMac->lim.gLimSmeState == eLIM_SME_OFFLINE_STATE)
669 {
670 pMac->lim.gLimSmeState = eLIM_SME_IDLE_STATE;
671
Jeff Johnsone7245742012-09-05 17:12:55 -0700672 MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, NO_SESSION, pMac->lim.gLimSmeState));
Jeff Johnson295189b2012-06-20 16:38:30 -0700673
674 // By default do not return after first scan match
675 pMac->lim.gLimReturnAfterFirstMatch = 0;
676
677 // Initialize MLM state machine
678 limInitMlm(pMac);
679
680 // By default return unique scan results
681 pMac->lim.gLimReturnUniqueResults = true;
682 pMac->lim.gLimSmeScanResultLength = 0;
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700683#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
684 pMac->lim.gLimSmeLfrScanResultLength = 0;
685#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700686 }
687 else
688 {
689 /**
690 * Should not have received eWNI_SME_START_REQ in states
691 * other than OFFLINE. Return response to host and
692 * log error
693 */
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700694 limLog(pMac, LOGE, FL("Invalid SME state %X"),pMac->lim.gLimSmeState );
Jeff Johnson295189b2012-06-20 16:38:30 -0700695 retCode = eSIR_FAILURE;
696 }
697
698 return retCode;
699}
700
701/**
702 * limInitialize()
703 *
704 *FUNCTION:
705 * This function is called from LIM thread entry function.
706 * LIM related global data structures are initialized in this function.
707 *
708 *LOGIC:
709 * NA
710 *
711 *ASSUMPTIONS:
712 * NA
713 *
714 *NOTE:
715 * NA
716 *
717 * @param pMac - Pointer to global MAC structure
718 * @return None
719 */
720
721tSirRetStatus
722limInitialize(tpAniSirGlobal pMac)
723{
724 tSirRetStatus status = eSIR_SUCCESS;
725
726 __limInitAssocVars(pMac);
727 __limInitVars(pMac);
728 __limInitStates(pMac);
729 __limInitStatsVars(pMac);
730 __limInitBssVars(pMac);
731 __limInitScanVars(pMac);
732 __limInitHTVars(pMac);
733 __limInitTitanVars(pMac);
734
Jeff Johnson295189b2012-06-20 16:38:30 -0700735 status = limStart(pMac);
736 if(eSIR_SUCCESS != status)
737 {
738 return status;
739 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700740
741 /*
742 * MLM will be intitalized when 'START' request comes from SME.
743 * limInitMlm calls limCreateTimers, which actually relies on
744 * CFG to be downloaded. So it should not be called as part of
745 * peStart, as CFG download is happening after peStart.
746 */
747 //limInitMlm(pMac);
748 // Initializations for maintaining peers in IBSS
749 limIbssInit(pMac);
750
751 pmmInitialize(pMac);
752
753
754#if defined WLAN_FEATURE_VOWIFI
755 rrmInitialize(pMac);
756#endif
757#if defined WLAN_FEATURE_VOWIFI_11R
758 limFTOpen(pMac);
759#endif
760
Jeff Johnson295189b2012-06-20 16:38:30 -0700761 vos_list_init(&pMac->lim.gLimMgmtFrameRegistratinQueue);
Jeff Johnson295189b2012-06-20 16:38:30 -0700762
763#if 0
764
765 vos_trace_setLevel(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR);
766 vos_trace_setLevel(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_WARN);
767 vos_trace_setLevel(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_FATAL);
768
769 vos_trace_setLevel(VOS_MODULE_ID_HAL, VOS_TRACE_LEVEL_WARN);
770 vos_trace_setLevel(VOS_MODULE_ID_HAL, VOS_TRACE_LEVEL_ERROR);
771
772 vos_trace_setLevel(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_WARN);
773 vos_trace_setLevel(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR);
774 vos_trace_setLevel(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR);
775
776 vos_trace_setLevel(VOS_MODULE_ID_SAL, VOS_TRACE_LEVEL_ERROR);
777
778 vos_trace_setLevel(VOS_MODULE_ID_SSC, VOS_TRACE_LEVEL_ERROR);
779
780 vos_trace_setLevel(VOS_MODULE_ID_SAL, VOS_TRACE_LEVEL_ERROR);
781 vos_trace_setLevel(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR);
782
783 vos_trace_setLevel(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR);
784
785
786 vos_trace_setLevel(VOS_MODULE_ID_BAL, VOS_TRACE_LEVEL_ERROR);
787
788 vos_trace_setLevel(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR);
789#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700790
Jeff Johnson295189b2012-06-20 16:38:30 -0700791 //Initialize the configurations needed by PE
792 if( eSIR_FAILURE == __limInitConfig(pMac))
793 {
794 //We need to undo everything in limStart
795 limCleanupMlm(pMac);
796 return eSIR_FAILURE;
797 }
798
799 //initialize the TSPEC admission control table.
800 //Note that this was initially done after resume notification from HAL.
801 //Now, DAL is started before PE so this can be done here
802 limAdmitControlInit(pMac);
803 limRegisterHalIndCallBack(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -0700804
805 return status;
806
807} /*** end limInitialize() ***/
808
809
810
811/**
812 * limCleanup()
813 *
814 *FUNCTION:
815 * This function is called upon reset or persona change
816 * to cleanup LIM state
817 *
818 *LOGIC:
819 * NA
820 *
821 *ASSUMPTIONS:
822 * NA
823 *
824 *NOTE:
825 * NA
826 *
827 * @param pMac - Pointer to Global MAC structure
828 * @return None
829 */
830
831void
832limCleanup(tpAniSirGlobal pMac)
833{
Jeff Johnson295189b2012-06-20 16:38:30 -0700834 v_PVOID_t pvosGCTx;
835 VOS_STATUS retStatus;
Jeff Johnson295189b2012-06-20 16:38:30 -0700836
Jeff Johnson295189b2012-06-20 16:38:30 -0700837//Before destroying the list making sure all the nodes have been deleted.
838//Which should be the normal case, but a memory leak has been reported.
839
840 tpLimMgmtFrameRegistration pLimMgmtRegistration = NULL;
841
842 while(vos_list_remove_front(&pMac->lim.gLimMgmtFrameRegistratinQueue,
843 (vos_list_node_t**)&pLimMgmtRegistration) == VOS_STATUS_SUCCESS)
844 {
845 VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO,
846 FL("Fixing leak! Deallocating pLimMgmtRegistration node"));
847
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530848 vos_mem_free(pLimMgmtRegistration);
Jeff Johnson295189b2012-06-20 16:38:30 -0700849 }
850
851 vos_list_destroy(&pMac->lim.gLimMgmtFrameRegistratinQueue);
Jeff Johnson295189b2012-06-20 16:38:30 -0700852
853 limCleanupMlm(pMac);
854 limCleanupLmm(pMac);
855
856 // free up preAuth table
857 if (pMac->lim.gLimPreAuthTimerTable.pTable != NULL)
858 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530859 vos_mem_free(pMac->lim.gLimPreAuthTimerTable.pTable);
Jeff Johnson295189b2012-06-20 16:38:30 -0700860 pMac->lim.gLimPreAuthTimerTable.pTable = NULL;
861 pMac->lim.gLimPreAuthTimerTable.numEntry = 0;
862 }
863
864 if(NULL != pMac->lim.pDialogueTokenHead)
865 {
866 limDeleteDialogueTokenList(pMac);
867 }
868
869 if(NULL != pMac->lim.pDialogueTokenTail)
870 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530871 vos_mem_free(pMac->lim.pDialogueTokenTail);
Jeff Johnson295189b2012-06-20 16:38:30 -0700872 pMac->lim.pDialogueTokenTail = NULL;
873 }
874
875 # if 0
876 if (pMac->lim.gpLimStartBssReq != NULL)
877 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530878 vos_mem_free(pMac->lim.gpLimStartBssReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700879 pMac->lim.gpLimStartBssReq = NULL;
880 }
881 #endif
882
883 if (pMac->lim.gpLimMlmSetKeysReq != NULL)
884 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530885 vos_mem_free(pMac->lim.gpLimMlmSetKeysReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700886 pMac->lim.gpLimMlmSetKeysReq = NULL;
887 }
888
889 #if 0
890 if (pMac->lim.gpLimJoinReq != NULL)
891 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530892 vos_mem_free(pMac->lim.gpLimJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700893 pMac->lim.gpLimJoinReq = NULL;
894 }
895 #endif
896
897 if (pMac->lim.gpLimMlmAuthReq != NULL)
898 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530899 vos_mem_free(pMac->lim.gpLimMlmAuthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700900 pMac->lim.gpLimMlmAuthReq = NULL;
901 }
902
Jeff Johnsone7245742012-09-05 17:12:55 -0700903#if 0
Jeff Johnson295189b2012-06-20 16:38:30 -0700904 if (pMac->lim.gpLimMlmJoinReq != NULL)
905 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530906 vos_mem_free(pMac->lim.gpLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700907 pMac->lim.gpLimMlmJoinReq = NULL;
908 }
Jeff Johnsone7245742012-09-05 17:12:55 -0700909#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700910
911 #if 0
912 if (pMac->lim.gpLimReassocReq != NULL)
913 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530914 vos_mem_free(pMac->lim.gpLimReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700915 pMac->lim.gpLimReassocReq = NULL;
916 }
917 #endif
918
919 if (pMac->lim.gpLimMlmRemoveKeyReq != NULL)
920 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530921 vos_mem_free(pMac->lim.gpLimMlmRemoveKeyReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700922 pMac->lim.gpLimMlmRemoveKeyReq = NULL;
923 }
924
Viral Modid440e682013-03-06 02:25:31 -0800925 if (pMac->lim.gpDefdSmeMsgForNOA != NULL)
Viral Modid86bde22012-12-10 13:09:21 -0800926 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530927 vos_mem_free(pMac->lim.gpDefdSmeMsgForNOA);
Viral Modid440e682013-03-06 02:25:31 -0800928 pMac->lim.gpDefdSmeMsgForNOA = NULL;
Viral Modid86bde22012-12-10 13:09:21 -0800929 }
Viral Modid86bde22012-12-10 13:09:21 -0800930
Jeff Johnson295189b2012-06-20 16:38:30 -0700931 if (pMac->lim.gpLimMlmScanReq != NULL)
932 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530933 vos_mem_free(pMac->lim.gpLimMlmScanReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700934 pMac->lim.gpLimMlmScanReq = NULL;
935 }
936
937#if 0
938 if(NULL != pMac->lim.beacon)
939 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530940 vos_mem_free((void*) pMac->lim.beacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700941 pMac->lim.beacon = NULL;
942 }
943#endif
944 #if 0
945 if(NULL != pMac->lim.assocReq)
946 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530947 vos_mem_free((void*) pMac->lim.assocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700948 pMac->lim.assocReq= NULL;
949 }
950 #endif
951
952#if 0
953 if(NULL != pMac->lim.assocRsp)
954 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530955 vos_mem_free((void*) pMac->lim.assocRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700956 pMac->lim.assocRsp= NULL;
957 }
958#endif
959 // Now, finally reset the deferred message queue pointers
960 limResetDeferredMsgQ(pMac);
961
Jeff Johnson295189b2012-06-20 16:38:30 -0700962
963 pvosGCTx = vos_get_global_context(VOS_MODULE_ID_PE, (v_VOID_t *) pMac);
964 retStatus = WLANTL_DeRegisterMgmtFrmClient(pvosGCTx);
965
966 if ( retStatus != VOS_STATUS_SUCCESS )
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700967 PELOGE(limLog(pMac, LOGE, FL("DeRegistering the PE Handle with TL has failed bailing out..."));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700968
969#if defined WLAN_FEATURE_VOWIFI
970 rrmCleanup(pMac);
971#endif
972#if defined WLAN_FEATURE_VOWIFI_11R
973 limFTCleanup(pMac);
974#endif
975
976} /*** end limCleanup() ***/
977
978
979/** -------------------------------------------------------------
980\fn peOpen
981\brief will be called in Open sequence from macOpen
982\param tpAniSirGlobal pMac
983\param tHalOpenParameters *pHalOpenParam
984\return tSirRetStatus
985 -------------------------------------------------------------*/
986
987tSirRetStatus peOpen(tpAniSirGlobal pMac, tMacOpenParameters *pMacOpenParam)
988{
989 pMac->lim.maxBssId = pMacOpenParam->maxBssId;
990 pMac->lim.maxStation = pMacOpenParam->maxStation;
991
992 if ((pMac->lim.maxBssId == 0) || (pMac->lim.maxStation == 0))
993 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700994 PELOGE(limLog(pMac, LOGE, FL("max number of Bssid or Stations cannot be zero!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700995 return eSIR_FAILURE;
996 }
997
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530998 pMac->lim.limTimers.gpLimCnfWaitTimer = vos_mem_malloc(sizeof(TX_TIMER) * pMac->lim.maxStation);
999 if (NULL == pMac->lim.limTimers.gpLimCnfWaitTimer)
Jeff Johnson295189b2012-06-20 16:38:30 -07001000 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001001 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001002 return eSIR_FAILURE;
1003 }
1004
Gopichand Nakkala777e6032012-12-31 16:39:21 -08001005#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301006 pMac->lim.gpLimAIDpool = vos_mem_malloc(sizeof(*pMac->lim.gpLimAIDpool) * (WNI_CFG_ASSOC_STA_LIMIT_STAMAX+1));
1007 if (NULL == pMac->lim.gpLimAIDpool)
Jeff Johnson295189b2012-06-20 16:38:30 -07001008 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001009 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001010 return eSIR_FAILURE;
1011 }
Gopichand Nakkala777e6032012-12-31 16:39:21 -08001012#endif
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301013 pMac->lim.gpSession = vos_mem_malloc(sizeof(tPESession)* pMac->lim.maxBssId);
1014 if (NULL == pMac->lim.gpSession)
Jeff Johnson295189b2012-06-20 16:38:30 -07001015 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001016 limLog(pMac, LOGE, FL("memory allocate failed!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001017 return eSIR_FAILURE;
1018 }
1019
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301020 vos_mem_set(pMac->lim.gpSession, sizeof(tPESession)*pMac->lim.maxBssId, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001021
1022
1023 /*
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301024 pMac->dph.dphHashTable.pHashTable = vos_mem_malloc(sizeof(tpDphHashNode)*pMac->lim.maxStation);
1025 if (NULL == pMac->dph.dphHashTable.pHashTable)
Jeff Johnson295189b2012-06-20 16:38:30 -07001026 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001027 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001028 return eSIR_FAILURE;
1029 }
1030
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301031 pMac->dph.dphHashTable.pDphNodeArray = vos_mem_malloc(sizeof(tDphHashNode)*pMac->lim.maxStation);
1032 if (NULL == pMac->dph.dphHashTable.pDphNodeArray)
Jeff Johnson295189b2012-06-20 16:38:30 -07001033 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001034 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001035 return eSIR_FAILURE;
1036 }
1037 */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301038 pMac->pmm.gPmmTim.pTim = vos_mem_malloc(sizeof(tANI_U8)*pMac->lim.maxStation);
1039 if (NULL == pMac->pmm.gPmmTim.pTim)
Jeff Johnson295189b2012-06-20 16:38:30 -07001040 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001041 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed for pTim!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001042 return eSIR_FAILURE;
1043 }
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301044 vos_mem_set(pMac->pmm.gPmmTim.pTim, sizeof(tANI_U8)*pMac->lim.maxStation, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001045
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001046 pMac->lim.mgmtFrameSessionId = 0xff;
Leela Venkata Kiran Kumar Reddy Chirala2247e962013-03-22 19:21:10 -07001047 pMac->lim.deferredMsgCnt = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001048
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08001049 if( !VOS_IS_STATUS_SUCCESS( vos_lock_init( &pMac->lim.lkPeGlobalLock ) ) )
1050 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001051 PELOGE(limLog(pMac, LOGE, FL("pe lock init failed!"));)
Leela Venkata Kiran Kumar Reddy Chiralabcf1b8b2013-12-16 17:13:52 -08001052 vos_mem_free(pMac->lim.limTimers.gpLimCnfWaitTimer);
1053 pMac->lim.limTimers.gpLimCnfWaitTimer = NULL;
1054 vos_mem_free(pMac->lim.gpSession);
1055 pMac->lim.gpSession = NULL;
1056 vos_mem_free(pMac->pmm.gPmmTim.pTim);
1057 pMac->pmm.gPmmTim.pTim = NULL;
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08001058 return eSIR_FAILURE;
1059 }
Venkata Prathyusha Kuntupalli22ba5982013-04-24 13:09:20 -07001060 pMac->lim.deauthMsgCnt = 0;
Leela Venkata Kiran Kumar Reddy Chirala57af2692013-04-10 22:39:51 -07001061
1062 /*
1063 * peOpen is successful by now, so it is right time to initialize
1064 * MTRACE for PE module. if LIM_TRACE_RECORD is not defined in build file
1065 * then nothing will be logged for PE module.
1066 */
1067#ifdef LIM_TRACE_RECORD
1068 MTRACE(limTraceInit(pMac));
1069#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001070 return eSIR_SUCCESS;
1071}
1072
1073/** -------------------------------------------------------------
1074\fn peClose
1075\brief will be called in close sequence from macClose
1076\param tpAniSirGlobal pMac
1077\return tSirRetStatus
1078 -------------------------------------------------------------*/
1079
1080tSirRetStatus peClose(tpAniSirGlobal pMac)
1081{
1082 tANI_U8 i;
1083
1084 if (ANI_DRIVER_TYPE(pMac) == eDRIVER_TYPE_MFG)
1085 return eSIR_SUCCESS;
Jeff Johnsone7245742012-09-05 17:12:55 -07001086
Jeff Johnson295189b2012-06-20 16:38:30 -07001087 for(i =0; i < pMac->lim.maxBssId; i++)
1088 {
1089 if(pMac->lim.gpSession[i].valid == TRUE)
1090 {
1091 peDeleteSession(pMac,&pMac->lim.gpSession[i]);
1092 }
1093 }
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301094 vos_mem_free(pMac->lim.limTimers.gpLimCnfWaitTimer);
Jeff Johnsone7245742012-09-05 17:12:55 -07001095 pMac->lim.limTimers.gpLimCnfWaitTimer = NULL;
Gopichand Nakkala777e6032012-12-31 16:39:21 -08001096#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301097 vos_mem_free(pMac->lim.gpLimAIDpool);
Jeff Johnsone7245742012-09-05 17:12:55 -07001098 pMac->lim.gpLimAIDpool = NULL;
Gopichand Nakkala777e6032012-12-31 16:39:21 -08001099#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07001100
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301101 vos_mem_free(pMac->lim.gpSession);
Jeff Johnson295189b2012-06-20 16:38:30 -07001102 pMac->lim.gpSession = NULL;
1103 /*
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301104 vos_mem_free(pMac->dph.dphHashTable.pHashTable);
Jeff Johnson295189b2012-06-20 16:38:30 -07001105 pMac->dph.dphHashTable.pHashTable = NULL;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301106 vos_mem_free(pMac->dph.dphHashTable.pDphNodeArray);
Jeff Johnson295189b2012-06-20 16:38:30 -07001107 pMac->dph.dphHashTable.pDphNodeArray = NULL;
1108 */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301109 vos_mem_free(pMac->pmm.gPmmTim.pTim);
Jeff Johnson295189b2012-06-20 16:38:30 -07001110 pMac->pmm.gPmmTim.pTim = NULL;
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08001111 if( !VOS_IS_STATUS_SUCCESS( vos_lock_destroy( &pMac->lim.lkPeGlobalLock ) ) )
1112 {
1113 return eSIR_FAILURE;
1114 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001115 return eSIR_SUCCESS;
1116}
1117
1118/** -------------------------------------------------------------
1119\fn peStart
1120\brief will be called in start sequence from macStart
1121\param tpAniSirGlobal pMac
1122\return none
1123 -------------------------------------------------------------*/
1124
1125tSirRetStatus peStart(tpAniSirGlobal pMac)
1126{
1127 tSirRetStatus status = eSIR_SUCCESS;
1128
1129 status = limInitialize(pMac);
1130#if defined(ANI_LOGDUMP)
1131 limDumpInit(pMac);
1132#endif //#if defined(ANI_LOGDUMP)
1133
1134 return status;
1135}
1136
1137/** -------------------------------------------------------------
1138\fn peStop
1139\brief will be called in stop sequence from macStop
1140\param tpAniSirGlobal pMac
1141\return none
1142 -------------------------------------------------------------*/
1143
1144void peStop(tpAniSirGlobal pMac)
1145{
1146 limCleanup(pMac);
1147 SET_LIM_MLM_STATE(pMac, eLIM_MLM_OFFLINE_STATE);
1148 return;
1149}
1150
1151/** -------------------------------------------------------------
1152\fn peFreeMsg
1153\brief Called by VOS scheduler (function vos_sched_flush_mc_mqs)
1154\ to free a given PE message on the TX and MC thread.
1155\ This happens when there are messages pending in the PE
1156\ queue when system is being stopped and reset.
1157\param tpAniSirGlobal pMac
1158\param tSirMsgQ pMsg
1159\return none
1160-----------------------------------------------------------------*/
1161v_VOID_t peFreeMsg( tpAniSirGlobal pMac, tSirMsgQ* pMsg)
1162{
1163 if (pMsg != NULL)
1164 {
1165 if (NULL != pMsg->bodyptr)
1166 {
1167 if (SIR_BB_XPORT_MGMT_MSG == pMsg->type)
1168 {
1169 vos_pkt_return_packet((vos_pkt_t *)pMsg->bodyptr);
1170 }
1171 else
1172 {
1173 vos_mem_free((v_VOID_t*)pMsg->bodyptr);
1174 }
1175 }
1176 pMsg->bodyptr = 0;
1177 pMsg->bodyval = 0;
1178 pMsg->type = 0;
1179 }
1180 return;
1181}
1182
1183
1184/**
1185 * The function checks if a particular timer should be allowed
1186 * into LIM while device is sleeping
1187 */
1188tANI_U8 limIsTimerAllowedInPowerSaveState(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
1189{
1190 tANI_U8 retStatus = TRUE;
1191
1192 if(!limIsSystemInActiveState(pMac))
1193 {
1194 switch(pMsg->type)
1195 {
1196 /* Don't allow following timer messages if in sleep */
1197 case SIR_LIM_MIN_CHANNEL_TIMEOUT:
1198 case SIR_LIM_MAX_CHANNEL_TIMEOUT:
1199 case SIR_LIM_PERIODIC_PROBE_REQ_TIMEOUT:
1200 retStatus = FALSE;
1201 break;
1202 /* May allow following timer messages in sleep mode */
Jeff Johnson295189b2012-06-20 16:38:30 -07001203
1204 /* Safe to allow as of today, this triggers background scan
1205 * which will not be started if the device is in power-save mode
1206 * might need to block in the future if we decide to implement
1207 * spectrum management
1208 */
1209 case SIR_LIM_QUIET_TIMEOUT:
1210
1211 /* Safe to allow as of today, this triggers background scan
1212 * which will not be started if the device is in power-save mode
1213 * might need to block in the future if we decide to implement
1214 * spectrum management
1215 */
1216 case SIR_LIM_QUIET_BSS_TIMEOUT:
1217
1218 /* Safe to allow this timermessage, triggers background scan
1219 * which is blocked in sleep mode
1220 */
1221 case SIR_LIM_CHANNEL_SCAN_TIMEOUT:
1222
1223 /* Safe to allow this timer, since, while in IMPS this timer will not
1224 * be started. In case of BMPS sleep, SoftMAC handles the heart-beat
1225 * when heart-beat control is handled back to PE, device would have
1226 * already woken-up due to EXIT_BMPS_IND mesage from SoftMAC
1227 */
1228 case SIR_LIM_HEART_BEAT_TIMEOUT:
1229 case SIR_LIM_PROBE_HB_FAILURE_TIMEOUT:
1230
1231 /* Safe to allow, PE is not handling this message as of now. May need
1232 * to block it, basically, free the buffer and restart the timer
1233 */
1234 case SIR_LIM_REASSOC_FAIL_TIMEOUT:
1235 case SIR_LIM_JOIN_FAIL_TIMEOUT:
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08001236 case SIR_LIM_PERIODIC_JOIN_PROBE_REQ_TIMEOUT:
Jeff Johnson295189b2012-06-20 16:38:30 -07001237 case SIR_LIM_ASSOC_FAIL_TIMEOUT:
1238 case SIR_LIM_AUTH_FAIL_TIMEOUT:
1239 case SIR_LIM_ADDTS_RSP_TIMEOUT:
1240 retStatus = TRUE;
1241 break;
1242
1243 /* by default allow rest of messages */
1244 default:
1245 retStatus = TRUE;
1246 break;
1247
1248
1249 }
1250 }
1251
1252 return retStatus;
1253
1254}
1255
1256
1257
1258/**
1259 * limPostMsgApi()
1260 *
1261 *FUNCTION:
1262 * This function is called from other thread while posting a
1263 * message to LIM message Queue gSirLimMsgQ.
1264 *
1265 *LOGIC:
1266 * NA
1267 *
1268 *ASSUMPTIONS:
1269 * NA
1270 *
1271 *NOTE:
1272 * NA
1273 *
1274 * @param pMac - Pointer to Global MAC structure
1275 * @param pMsg - Pointer to the message structure
1276 * @return None
1277 */
1278
1279tANI_U32
1280limPostMsgApi(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
1281{
Jeff Johnson295189b2012-06-20 16:38:30 -07001282 return vos_mq_post_message(VOS_MQ_ID_PE, (vos_msg_t *) pMsg);
1283
1284
Jeff Johnson295189b2012-06-20 16:38:30 -07001285} /*** end limPostMsgApi() ***/
1286
1287
1288/*--------------------------------------------------------------------------
1289
1290 \brief pePostMsgApi() - A wrapper function to post message to Voss msg queues
1291
1292 This function can be called by legacy code to post message to voss queues OR
1293 legacy code may keep on invoking 'limPostMsgApi' to post the message to voss queue
1294 for dispatching it later.
1295
1296 \param pMac - Pointer to Global MAC structure
1297 \param pMsg - Pointer to the message structure
1298
1299 \return tANI_U32 - TX_SUCCESS for success.
1300
1301 --------------------------------------------------------------------------*/
1302
1303tSirRetStatus pePostMsgApi(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
1304{
1305 return (tSirRetStatus)limPostMsgApi(pMac, pMsg);
1306}
1307
1308/*--------------------------------------------------------------------------
1309
1310 \brief peProcessMessages() - Message Processor for PE
1311
1312 Voss calls this function to dispatch the message to PE
1313
1314 \param pMac - Pointer to Global MAC structure
1315 \param pMsg - Pointer to the message structure
1316
1317 \return tANI_U32 - TX_SUCCESS for success.
1318
1319 --------------------------------------------------------------------------*/
1320
1321tSirRetStatus peProcessMessages(tpAniSirGlobal pMac, tSirMsgQ* pMsg)
1322{
1323 if(pMac->gDriverType == eDRIVER_TYPE_MFG)
1324 {
1325 return eSIR_SUCCESS;
1326 }
1327 /**
1328 * If the Message to be handled is for CFG Module call the CFG Msg Handler and
1329 * for all the other cases post it to LIM
1330 */
1331 if ( SIR_CFG_PARAM_UPDATE_IND != pMsg->type && IS_CFG_MSG(pMsg->type))
1332 cfgProcessMbMsg(pMac, (tSirMbMsg*)pMsg->bodyptr);
1333 else
1334 limMessageProcessor(pMac, pMsg);
1335 return eSIR_SUCCESS;
1336}
1337
1338
Jeff Johnson295189b2012-06-20 16:38:30 -07001339
1340// ---------------------------------------------------------------------------
1341/**
1342 * peHandleMgmtFrame
1343 *
1344 * FUNCTION:
1345 * Process the Management frames from TL
1346 *
1347 * LOGIC:
1348 *
1349 * ASSUMPTIONS: TL sends the packet along with the VOS GlobalContext
1350 *
1351 * NOTE:
1352 *
1353 * @param pvosGCtx Global Vos Context
1354 * @param vossBuff Packet
1355 * @return None
1356 */
1357
1358VOS_STATUS peHandleMgmtFrame( v_PVOID_t pvosGCtx, v_PVOID_t vosBuff)
1359{
1360 tpAniSirGlobal pMac;
1361 tpSirMacMgmtHdr mHdr;
1362 tSirMsgQ msg;
1363 vos_pkt_t *pVosPkt;
1364 VOS_STATUS vosStatus;
1365 v_U8_t *pRxPacketInfo;
1366
1367 pVosPkt = (vos_pkt_t *)vosBuff;
1368 if (NULL == pVosPkt)
1369 {
1370 return VOS_STATUS_E_FAILURE;
1371 }
1372
1373 pMac = (tpAniSirGlobal)vos_get_context(VOS_MODULE_ID_PE, pvosGCtx);
1374 if (NULL == pMac)
1375 {
1376 // cannot log a failure without a valid pMac
1377 vos_pkt_return_packet(pVosPkt);
1378 return VOS_STATUS_E_FAILURE;
1379 }
1380
1381 vosStatus = WDA_DS_PeekRxPacketInfo( pVosPkt, (void *)&pRxPacketInfo, VOS_FALSE );
1382
1383 if(!VOS_IS_STATUS_SUCCESS(vosStatus))
1384 {
1385 vos_pkt_return_packet(pVosPkt);
1386 return VOS_STATUS_E_FAILURE;
1387 }
1388
1389
1390 //
1391 // The MPDU header is now present at a certain "offset" in
1392 // the BD and is specified in the BD itself
1393 //
1394 mHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
1395 if(mHdr->fc.type == SIR_MAC_MGMT_FRAME)
1396 {
1397 PELOG1(limLog( pMac, LOG1,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001398 FL ( "RxBd=%p mHdr=%p Type: %d Subtype: %d Sizes:FC%d Mgmt%d"),
Jeff Johnsone7245742012-09-05 17:12:55 -07001399 pRxPacketInfo, mHdr, mHdr->fc.type, mHdr->fc.subType, sizeof(tSirMacFrameCtl), sizeof(tSirMacMgmtHdr) );)
Jeff Johnson295189b2012-06-20 16:38:30 -07001400
Jeff Johnsone7245742012-09-05 17:12:55 -07001401 MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT, NO_SESSION,
Jeff Johnson295189b2012-06-20 16:38:30 -07001402 LIM_TRACE_MAKE_RXMGMT(mHdr->fc.subType,
1403 (tANI_U16) (((tANI_U16) (mHdr->seqControl.seqNumHi << 4)) | mHdr->seqControl.seqNumLo)));)
1404 }
1405
1406
1407 // Forward to MAC via mesg = SIR_BB_XPORT_MGMT_MSG
1408 msg.type = SIR_BB_XPORT_MGMT_MSG;
1409 msg.bodyptr = vosBuff;
1410 msg.bodyval = 0;
1411
1412 if( eSIR_SUCCESS != sysBbtProcessMessageCore( pMac,
1413 &msg,
1414 mHdr->fc.type,
1415 mHdr->fc.subType ))
1416 {
1417 vos_pkt_return_packet(pVosPkt);
1418 limLog( pMac, LOGW,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001419 FL ( "sysBbtProcessMessageCore failed to process SIR_BB_XPORT_MGMT_MSG" ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001420 return VOS_STATUS_E_FAILURE;
1421 }
1422
1423 return VOS_STATUS_SUCCESS;
1424}
1425
1426// ---------------------------------------------------------------------------
1427/**
1428 * peRegisterTLHandle
1429 *
1430 * FUNCTION:
1431 * Registers the Handler which, process the Management frames from TL
1432 *
1433 * LOGIC:
1434 *
1435 * ASSUMPTIONS:
1436 *
1437 * NOTE:
1438 *
1439 * @return None
1440 */
1441
1442void peRegisterTLHandle(tpAniSirGlobal pMac)
1443{
1444 v_PVOID_t pvosGCTx;
1445 VOS_STATUS retStatus;
1446
1447 pvosGCTx = vos_get_global_context(VOS_MODULE_ID_PE, (v_VOID_t *) pMac);
1448
1449 retStatus = WLANTL_RegisterMgmtFrmClient(pvosGCTx, peHandleMgmtFrame);
1450
1451 if (retStatus != VOS_STATUS_SUCCESS)
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001452 limLog( pMac, LOGP, FL("Registering the PE Handle with TL has failed bailing out..."));
Jeff Johnson295189b2012-06-20 16:38:30 -07001453
1454}
Jeff Johnson295189b2012-06-20 16:38:30 -07001455
1456
1457/**
Jeff Johnson295189b2012-06-20 16:38:30 -07001458 * limIsSystemInScanState()
1459 *
1460 *FUNCTION:
1461 * This function is called by various MAC software modules to
1462 * determine if System is in Scan/Learn state
1463 *
1464 *LOGIC:
1465 * NA
1466 *
1467 *ASSUMPTIONS:
1468 * NA
1469 *
1470 *NOTE:
1471 *
1472 * @param pMac - Pointer to Global MAC structure
1473 * @return true - System is in Scan/Learn state
1474 * false - System is NOT in Scan/Learn state
1475 */
1476
1477tANI_U8
1478limIsSystemInScanState(tpAniSirGlobal pMac)
1479{
1480 switch (pMac->lim.gLimSmeState)
1481 {
1482 case eLIM_SME_CHANNEL_SCAN_STATE:
1483 case eLIM_SME_NORMAL_CHANNEL_SCAN_STATE:
1484 case eLIM_SME_LINK_EST_WT_SCAN_STATE:
1485 case eLIM_SME_WT_SCAN_STATE:
1486 // System is in Learn mode
1487 return true;
1488
1489 default:
1490 // System is NOT in Learn mode
1491 return false;
1492 }
1493} /*** end limIsSystemInScanState() ***/
1494
1495
1496
1497/**
1498 * limIsSystemInActiveState()
1499 *
1500 *FUNCTION:
1501 * This function is called by various MAC software modules to
1502 * determine if System is in Active/Wakeup state
1503 *
1504 *LOGIC:
1505 * NA
1506 *
1507 *ASSUMPTIONS:
1508 * NA
1509 *
1510 *NOTE:
1511 *
1512 * @param pMac - Pointer to Global MAC structure
1513 * @return true - System is in Active state
1514 * false - System is not in Active state
1515 */
1516
1517tANI_U8 limIsSystemInActiveState(tpAniSirGlobal pMac)
1518{
1519 switch (pMac->pmm.gPmmState)
1520 {
1521 case ePMM_STATE_BMPS_WAKEUP:
1522 case ePMM_STATE_IMPS_WAKEUP:
1523 case ePMM_STATE_READY:
1524 // System is in Active mode
1525 return true;
1526 default:
1527 return false;
1528 // System is NOT in Active mode
1529 }
1530}
1531
1532
Jeff Johnson295189b2012-06-20 16:38:30 -07001533
Jeff Johnson295189b2012-06-20 16:38:30 -07001534
1535
1536/**
1537*\brief limReceivedHBHandler()
1538*
1539* This function is called by schBeaconProcess() upon
1540* receiving a Beacon on STA. This also gets called upon
1541* receiving Probe Response after heat beat failure is
1542* detected.
1543*
1544* param pMac - global mac structure
1545* param channel - channel number indicated in Beacon, Probe Response
1546* return - none
1547*/
1548
1549
1550void
1551limReceivedHBHandler(tpAniSirGlobal pMac, tANI_U8 channelId, tpPESession psessionEntry)
1552{
1553 if((channelId == 0 ) || (channelId == psessionEntry->currentOperChannel) )
1554 psessionEntry->LimRxedBeaconCntDuringHB++;
1555
1556 pMac->pmm.inMissedBeaconScenario = FALSE;
1557} /*** end limReceivedHBHandler() ***/
1558
1559
1560
1561#if 0
1562void limResetHBPktCount(tpPESession psessionEntry)
1563{
1564 psessionEntry->LimRxedBeaconCntDuringHB = 0;
1565}
1566#endif
1567
1568
1569/*
1570 * limProcessWdsInfo()
1571 *
1572 *FUNCTION:
1573 * This function is called from schBeaconProcess in BP
1574 *
1575 *PARAMS:
1576 * @param pMac - Pointer to Global MAC structure
1577 * @param propIEInfo - proprietary IE info
1578 *
1579 *LOGIC:
1580 *
1581 *ASSUMPTIONS:
1582 * NA
1583 *
1584 *NOTE:
1585 *
1586 *
1587 *RETURNS:
1588 *
1589 */
1590
1591void limProcessWdsInfo(tpAniSirGlobal pMac,
1592 tSirPropIEStruct propIEInfo)
1593{
Jeff Johnson295189b2012-06-20 16:38:30 -07001594}
1595
1596
1597
1598/**
1599 * limInitWdsInfoParams()
1600 *
1601 *FUNCTION:
1602 * This function is called while processing
1603 * START_BSS/JOIN/REASSOC_REQ to initialize WDS info
1604 * ind/set related parameters.
1605 *
1606 *LOGIC:
1607 *
1608 *ASSUMPTIONS:
1609 *
1610 *NOTE:
1611 *
1612 * @param pMac Pointer to Global MAC structure
1613 * @return None
1614 */
1615
1616void
1617limInitWdsInfoParams(tpAniSirGlobal pMac)
1618{
1619 pMac->lim.gLimWdsInfo.wdsLength = 0;
1620 pMac->lim.gLimNumWdsInfoInd = 0;
1621 pMac->lim.gLimNumWdsInfoSet = 0;
1622} /*** limInitWdsInfoParams() ***/
1623
1624
1625/** -------------------------------------------------------------
1626\fn limUpdateOverlapStaParam
1627\brief Updates overlap cache and param data structure
1628\param tpAniSirGlobal pMac
1629\param tSirMacAddr bssId
1630\param tpLimProtStaParams pStaParams
1631\return None
1632 -------------------------------------------------------------*/
1633void
1634limUpdateOverlapStaParam(tpAniSirGlobal pMac, tSirMacAddr bssId, tpLimProtStaParams pStaParams)
1635{
1636 int i;
1637 if (!pStaParams->numSta)
1638 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301639 vos_mem_copy(pMac->lim.protStaOverlapCache[0].addr,
1640 bssId,
1641 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001642 pMac->lim.protStaOverlapCache[0].active = true;
1643
1644 pStaParams->numSta = 1;
1645
1646 return;
1647 }
1648
1649 for (i=0; i<LIM_PROT_STA_OVERLAP_CACHE_SIZE; i++)
1650 {
1651 if (pMac->lim.protStaOverlapCache[i].active)
1652 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301653 if (vos_mem_compare( pMac->lim.protStaOverlapCache[i].addr,
Jeff Johnson295189b2012-06-20 16:38:30 -07001654 bssId,
1655 sizeof(tSirMacAddr))) {
1656 return; }
1657 }
1658 else
1659 break;
1660 }
1661
1662 if (i == LIM_PROT_STA_OVERLAP_CACHE_SIZE)
1663 {
Shake M Subhani5d80fda2013-12-09 17:28:23 +05301664 PELOG1(limLog(pMac, LOGW, FL("Overlap cache is full"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001665 }
1666 else
1667 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301668 vos_mem_copy(pMac->lim.protStaOverlapCache[i].addr,
1669 bssId,
1670 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001671 pMac->lim.protStaOverlapCache[i].active = true;
1672
1673 pStaParams->numSta++;
1674 }
1675}
1676
1677
1678/**
1679 * limHandleIBSScoalescing()
1680 *
1681 *FUNCTION:
1682 * This function is called upon receiving Beacon/Probe Response
1683 * while operating in IBSS mode.
1684 *
1685 *LOGIC:
1686 *
1687 *ASSUMPTIONS:
1688 *
1689 *NOTE:
1690 *
1691 * @param pMac - Pointer to Global MAC structure
1692 * @param pBeacon - Parsed Beacon Frame structure
1693 * @param pRxPacketInfo - Pointer to RX packet info structure
1694 *
1695 * @return Status whether to process or ignore received Beacon Frame
1696 */
1697
1698tSirRetStatus
1699limHandleIBSScoalescing(
1700 tpAniSirGlobal pMac,
1701 tpSchBeaconStruct pBeacon,
1702 tANI_U8 *pRxPacketInfo,tpPESession psessionEntry)
1703{
1704 tpSirMacMgmtHdr pHdr;
1705 tSirRetStatus retCode;
1706
1707 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
Ravi Joshi2c83c7e2013-10-29 10:21:08 -07001708 if ( (!pBeacon->capabilityInfo.ibss) ||
Abhishek Singhd5c31272014-03-07 14:46:50 +05301709 ( psessionEntry->privacy !=
1710 (tANI_U8)pBeacon->capabilityInfo.privacy ) ||
Ravi Joshi2c83c7e2013-10-29 10:21:08 -07001711 (limCmpSSid(pMac, &pBeacon->ssId,psessionEntry) != true) ||
1712 (psessionEntry->currentOperChannel != pBeacon->channelNumber) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001713 /* Received SSID does not match => Ignore received Beacon frame. */
1714 retCode = eSIR_LIM_IGNORE_BEACON;
1715 else
1716 {
1717 tANI_U32 ieLen;
1718 tANI_U16 tsfLater;
1719 tANI_U8 *pIEs;
1720 ieLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
1721 tsfLater = WDA_GET_RX_TSF_LATER(pRxPacketInfo);
1722 pIEs = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
1723 PELOG3(limLog(pMac, LOG3, FL("BEFORE Coalescing tsfLater val :%d"), tsfLater);)
1724 retCode = limIbssCoalesce(pMac, pHdr, pBeacon, pIEs, ieLen, tsfLater,psessionEntry);
1725 }
1726 return retCode;
1727} /*** end limHandleIBSScoalescing() ***/
1728
1729
1730
1731/**
1732 * limDetectChangeInApCapabilities()
1733 *
1734 *FUNCTION:
1735 * This function is called while SCH is processing
1736 * received Beacon from AP on STA to detect any
1737 * change in AP's capabilities. If there any change
1738 * is detected, Roaming is informed of such change
1739 * so that it can trigger reassociation.
1740 *
1741 *LOGIC:
1742 *
1743 *ASSUMPTIONS:
1744 *
1745 *NOTE:
1746 * Notification is enabled for STA product only since
1747 * it is not a requirement on BP side.
1748 *
1749 * @param pMac Pointer to Global MAC structure
1750 * @param pBeacon Pointer to parsed Beacon structure
1751 * @return None
1752 */
1753
1754void
1755limDetectChangeInApCapabilities(tpAniSirGlobal pMac,
1756 tpSirProbeRespBeacon pBeacon,
1757 tpPESession psessionEntry)
1758{
Jeff Johnson295189b2012-06-20 16:38:30 -07001759 tANI_U8 len;
1760 tSirSmeApNewCaps apNewCaps;
1761 tANI_U8 newChannel;
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301762 tSirRetStatus status = eSIR_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001763 apNewCaps.capabilityInfo = limGetU16((tANI_U8 *) &pBeacon->capabilityInfo);
1764 newChannel = (tANI_U8) pBeacon->channelNumber;
1765
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301766 if ( ( false == psessionEntry->limSentCapsChangeNtf ) &&
Abhishek Singh4f8446a2014-05-22 14:07:31 +05301767 ( ( ( !limIsNullSsid(&pBeacon->ssId) ) &&
1768 ( false == limCmpSSid(pMac, &pBeacon->ssId, psessionEntry) ) ) ||
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301769 ( (SIR_MAC_GET_ESS(apNewCaps.capabilityInfo) !=
1770 SIR_MAC_GET_ESS(psessionEntry->limCurrentBssCaps) ) ||
1771 ( SIR_MAC_GET_PRIVACY(apNewCaps.capabilityInfo) !=
1772 SIR_MAC_GET_PRIVACY(psessionEntry->limCurrentBssCaps) ) ||
1773 ( SIR_MAC_GET_SHORT_PREAMBLE(apNewCaps.capabilityInfo) !=
1774 SIR_MAC_GET_SHORT_PREAMBLE(psessionEntry->limCurrentBssCaps) ) ||
1775 ( SIR_MAC_GET_QOS(apNewCaps.capabilityInfo) !=
1776 SIR_MAC_GET_QOS(psessionEntry->limCurrentBssCaps) ) ||
1777 ( newChannel != psessionEntry->currentOperChannel )
1778 ) ) )
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301779 {
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301780 if( false == psessionEntry->fWaitForProbeRsp )
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301781 {
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301782 /* If Beacon capabilities is not matching with the current capability,
1783 * then send unicast probe request to AP and take decision after
1784 * receiving probe response */
1785 if ( true == psessionEntry->fIgnoreCapsChange )
1786 {
1787 limLog(pMac, LOGW, FL("Ignoring the Capability change as it is false alarm"));
1788 return;
1789 }
1790 psessionEntry->fWaitForProbeRsp = true;
1791 limLog(pMac, LOGW, FL("AP capabilities are not matching,"
1792 "sending directed probe request.. "));
1793 status = limSendProbeReqMgmtFrame(pMac, &psessionEntry->ssId, psessionEntry->bssId,
1794 psessionEntry->currentOperChannel,psessionEntry->selfMacAddr,
1795 psessionEntry->dot11mode, 0, NULL);
1796
1797 if ( eSIR_SUCCESS != status )
1798 {
1799 limLog(pMac, LOGE, FL("send ProbeReq failed"));
1800 psessionEntry->fWaitForProbeRsp = false;
1801 }
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301802 return;
1803 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001804 /**
1805 * BSS capabilities have changed.
1806 * Inform Roaming.
1807 */
1808 len = sizeof(tSirMacCapabilityInfo) +
1809 sizeof(tSirMacAddr) + sizeof(tANI_U8) +
1810 3 * sizeof(tANI_U8) + // reserved fields
1811 pBeacon->ssId.length + 1;
1812
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301813 vos_mem_copy(apNewCaps.bssId,
1814 psessionEntry->bssId,
1815 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001816 if (newChannel != psessionEntry->currentOperChannel)
1817 {
1818 PELOGE(limLog(pMac, LOGE, FL("Channel Change from %d --> %d - "
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001819 "Ignoring beacon!"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001820 psessionEntry->currentOperChannel, newChannel);)
1821 return;
1822 }
Madan Mohan Koyyalamudi84479982013-01-24 17:58:05 +05301823
1824 /**
1825 * When Cisco 1262 Enterprise APs are configured with WPA2-PSK with
1826 * AES+TKIP Pairwise ciphers and WEP-40 Group cipher, they do not set
1827 * the privacy bit in Beacons (wpa/rsnie is still present in beacons),
1828 * the privacy bit is set in Probe and association responses.
1829 * Due to this anomaly, we detect a change in
1830 * AP capabilities when we receive a beacon after association and
1831 * disconnect from the AP. The following check makes sure that we can
1832 * connect to such APs
1833 */
1834 else if ((SIR_MAC_GET_PRIVACY(apNewCaps.capabilityInfo) == 0) &&
1835 (pBeacon->rsnPresent || pBeacon->wpaPresent))
1836 {
1837 PELOGE(limLog(pMac, LOGE, FL("BSS Caps (Privacy) bit 0 in beacon,"
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001838 " but WPA or RSN IE present, Ignore Beacon!"));)
Madan Mohan Koyyalamudi84479982013-01-24 17:58:05 +05301839 return;
1840 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001841 else
1842 apNewCaps.channelId = psessionEntry->currentOperChannel;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301843 vos_mem_copy((tANI_U8 *) &apNewCaps.ssId,
1844 (tANI_U8 *) &pBeacon->ssId,
Jeff Johnson295189b2012-06-20 16:38:30 -07001845 pBeacon->ssId.length + 1);
1846
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301847 psessionEntry->fIgnoreCapsChange = false;
1848 psessionEntry->fWaitForProbeRsp = false;
Jeff Johnson295189b2012-06-20 16:38:30 -07001849 psessionEntry->limSentCapsChangeNtf = true;
1850 limSendSmeWmStatusChangeNtf(pMac, eSIR_SME_AP_CAPS_CHANGED,
1851 (tANI_U32 *) &apNewCaps,
1852 len, psessionEntry->smeSessionId);
1853 }
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301854 else if ( true == psessionEntry->fWaitForProbeRsp )
1855 {
1856 /* Only for probe response frames and matching capabilities the control
1857 * will come here. If beacon is with broadcast ssid then fWaitForProbeRsp
1858 * will be false, the control will not come here*/
1859
1860 limLog(pMac, LOG1, FL("capabilities in probe response are"
1861 "matching with the current setting,"
1862 "Ignoring subsequent capability"
1863 "mismatch"));
1864 psessionEntry->fIgnoreCapsChange = true;
1865 psessionEntry->fWaitForProbeRsp = false;
1866 }
1867
Jeff Johnson295189b2012-06-20 16:38:30 -07001868} /*** limDetectChangeInApCapabilities() ***/
1869
1870
1871
1872
1873// ---------------------------------------------------------------------
1874/**
1875 * limUpdateShortSlot
1876 *
1877 * FUNCTION:
1878 * Enable/Disable short slot
1879 *
1880 * LOGIC:
1881 *
1882 * ASSUMPTIONS:
1883 *
1884 * NOTE:
1885 *
1886 * @param enable Flag to enable/disable short slot
1887 * @return None
1888 */
1889
1890tSirRetStatus limUpdateShortSlot(tpAniSirGlobal pMac, tpSirProbeRespBeacon pBeacon, tpUpdateBeaconParams pBeaconParams,tpPESession psessionEntry)
1891{
1892
1893 tSirSmeApNewCaps apNewCaps;
Jeff Johnsone7245742012-09-05 17:12:55 -07001894 tANI_U32 nShortSlot;
1895 tANI_U32 val = 0;
1896 tANI_U32 phyMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07001897
Jeff Johnsone7245742012-09-05 17:12:55 -07001898 // Check Admin mode first. If it is disabled just return
1899 if (wlan_cfgGetInt(pMac, WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED, &val)
1900 != eSIR_SUCCESS)
1901 {
1902 limLog(pMac, LOGP,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001903 FL("cfg get WNI_CFG_11G_SHORT_SLOT_TIME failed"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001904 return eSIR_FAILURE;
1905 }
1906 if (val == false)
1907 return eSIR_SUCCESS;
1908
1909 // Check for 11a mode or 11b mode. In both cases return since slot time is constant and cannot/should not change in beacon
1910 limGetPhyMode(pMac, &phyMode, psessionEntry);
1911 if ((phyMode == WNI_CFG_PHY_MODE_11A) || (phyMode == WNI_CFG_PHY_MODE_11B))
1912 return eSIR_SUCCESS;
1913
1914 apNewCaps.capabilityInfo = limGetU16((tANI_U8 *) &pBeacon->capabilityInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -07001915
1916 // Earlier implementation: determine the appropriate short slot mode based on AP advertised modes
1917 // when erp is present, apply short slot always unless, prot=on && shortSlot=off
1918 // if no erp present, use short slot based on current ap caps
1919
1920 // Issue with earlier implementation : Cisco 1231 BG has shortSlot = 0, erpIEPresent and useProtection = 0 (Case4);
1921
1922 //Resolution : always use the shortSlot setting the capability info to decide slot time.
1923 // The difference between the earlier implementation and the new one is only Case4.
1924 /*
1925 ERP IE Present | useProtection | shortSlot = QC STA Short Slot
1926 Case1 1 1 1 1 //AP should not advertise this combination.
1927 Case2 1 1 0 0
1928 Case3 1 0 1 1
1929 Case4 1 0 0 0
1930 Case5 0 1 1 1
1931 Case6 0 1 0 0
1932 Case7 0 0 1 1
1933 Case8 0 0 0 0
1934 */
1935 nShortSlot = SIR_MAC_GET_SHORT_SLOT_TIME(apNewCaps.capabilityInfo);
1936
Jeff Johnsone7245742012-09-05 17:12:55 -07001937 if (nShortSlot != psessionEntry->shortSlotTimeSupported)
Jeff Johnson295189b2012-06-20 16:38:30 -07001938 {
1939 // Short slot time capability of AP has changed. Adopt to it.
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001940 PELOG1(limLog(pMac, LOG1, FL("Shortslot capability of AP changed: %d"), nShortSlot);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001941 ((tpSirMacCapabilityInfo)&psessionEntry->limCurrentBssCaps)->shortSlotTime = (tANI_U16)nShortSlot;
Jeff Johnsone7245742012-09-05 17:12:55 -07001942 psessionEntry->shortSlotTimeSupported = nShortSlot;
Jeff Johnson295189b2012-06-20 16:38:30 -07001943 pBeaconParams->fShortSlotTime = (tANI_U8) nShortSlot;
1944 pBeaconParams->paramChangeBitmap |= PARAM_SHORT_SLOT_TIME_CHANGED;
Jeff Johnson295189b2012-06-20 16:38:30 -07001945 }
1946 return eSIR_SUCCESS;
1947}
1948
1949
Jeff Johnson295189b2012-06-20 16:38:30 -07001950
1951
Jeff Johnson295189b2012-06-20 16:38:30 -07001952
Jeff Johnson295189b2012-06-20 16:38:30 -07001953
1954
1955/** -----------------------------------------------------------------
1956 \brief limHandleLowRssiInd() - handles low rssi indication
1957
1958 This function process the SIR_HAL_LOW_RSSI_IND message from
1959 HAL, and sends a eWNI_SME_LOW_RSSI_IND to CSR.
1960
1961 \param pMac - global mac structure
1962
1963 \return
1964
1965 \sa
1966 ----------------------------------------------------------------- */
1967void limHandleLowRssiInd(tpAniSirGlobal pMac)
1968{
1969#if 0 //RSSI related indications will now go to TL and not PE
1970 if ( (pMac->pmm.gPmmState == ePMM_STATE_BMPS_SLEEP) ||
1971 (pMac->pmm.gPmmState == ePMM_STATE_UAPSD_SLEEP)||
1972 (pMac->pmm.gPmmState == ePMM_STATE_WOWLAN) )
1973 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001974 PELOG1(limLog(pMac, LOG1, FL("Sending LOW_RSSI_IND to SME "));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001975 limSendSmeRsp(pMac, eWNI_SME_LOW_RSSI_IND, eSIR_SME_SUCCESS, 0, 0);
1976 }
1977 else
1978 {
1979 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001980 FL("Received SIR_HAL_LOW_RSSI_IND while in incorrect state: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001981 pMac->pmm.gPmmState);
1982 }
1983 return;
1984#endif
1985}
1986
1987
1988/** -----------------------------------------------------------------
1989 \brief limHandleBmpsStatusInd() - handles BMPS status indication
1990
1991 This function process the SIR_HAL_BMPS_STATUS_IND message from HAL,
1992 and invokes limSendExitBmpsInd( ) to send an eWNI_PMC_EXIT_BMPS_IND
1993 to SME with reason code 'eSME_EXIT_BMPS_IND_RCVD'.
1994
1995 HAL sends this message when Firmware fails to enter BMPS mode 'AFTER'
1996 HAL had already send PE a SIR_HAL_ENTER_BMPS_RSP with status
1997 code "success". Hence, HAL needs to notify PE to get out of BMPS mode.
1998 This message can also come from FW anytime after we have entered BMPS.
1999 This means we should handle it in WoWL and UAPSD states as well
2000
2001 \param pMac - global mac structure
2002 \return - none
2003 \sa
2004 ----------------------------------------------------------------- */
2005void limHandleBmpsStatusInd(tpAniSirGlobal pMac)
2006{
2007 switch(pMac->pmm.gPmmState)
2008 {
2009 case ePMM_STATE_BMPS_SLEEP:
2010 case ePMM_STATE_UAPSD_WT_SLEEP_RSP:
2011 case ePMM_STATE_UAPSD_SLEEP:
2012 case ePMM_STATE_UAPSD_WT_WAKEUP_RSP:
2013 case ePMM_STATE_WOWLAN:
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002014 PELOG1(limLog(pMac, LOG1, FL("Sending EXIT_BMPS_IND to SME "));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002015 limSendExitBmpsInd(pMac, eSME_BMPS_STATUS_IND_RCVD);
2016 break;
2017
2018 default:
2019 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002020 FL("Received SIR_HAL_BMPS_STATUS_IND while in incorrect state: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002021 pMac->pmm.gPmmState);
2022 break;
2023 }
2024 return;
2025}
2026
2027
2028/** -----------------------------------------------------------------
2029 \brief limHandleMissedBeaconInd() - handles missed beacon indication
2030
2031 This function process the SIR_HAL_MISSED_BEACON_IND message from HAL,
2032 and invokes limSendExitBmpsInd( ) to send an eWNI_PMC_EXIT_BMPS_IND
2033 to SME with reason code 'eSME_MISSED_BEACON_IND_RCVD'.
2034
2035 \param pMac - global mac structure
2036 \return - none
2037 \sa
2038 ----------------------------------------------------------------- */
Leela Venkata Kiran Kumar Reddy Chirala3ca17902013-02-27 19:50:05 -08002039void limHandleMissedBeaconInd(tpAniSirGlobal pMac, tpSirMsgQ pMsg)
Jeff Johnson295189b2012-06-20 16:38:30 -07002040{
Leela Venkata Kiran Kumar Reddy Chirala3ca17902013-02-27 19:50:05 -08002041#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
2042 tpSirSmeMissedBeaconInd pSirMissedBeaconInd =
2043 (tpSirSmeMissedBeaconInd)pMsg->bodyptr;
2044 tpPESession psessionEntry = peFindSessionByBssIdx(pMac,pSirMissedBeaconInd->bssIdx);
2045 if (psessionEntry == NULL)
2046 {
2047 limLog(pMac, LOGE,
2048 FL("session does not exist for given BSSIdx:%d"),
2049 pSirMissedBeaconInd->bssIdx);
2050 return;
2051 }
2052#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002053 if ( (pMac->pmm.gPmmState == ePMM_STATE_BMPS_SLEEP) ||
2054 (pMac->pmm.gPmmState == ePMM_STATE_UAPSD_SLEEP)||
2055 (pMac->pmm.gPmmState == ePMM_STATE_WOWLAN) )
2056 {
2057 pMac->pmm.inMissedBeaconScenario = TRUE;
Madan Mohan Koyyalamudi1a30a552013-09-17 21:20:07 +05302058 PELOGE(limLog(pMac, LOGE,
2059 FL("Sending EXIT_BMPS_IND to SME due to Missed beacon from FW"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002060 limSendExitBmpsInd(pMac, eSME_MISSED_BEACON_IND_RCVD);
2061 }
Yathish9f22e662012-12-10 14:21:35 -08002062/* ACTIVE_MODE_HB_OFFLOAD */
2063#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
2064 else if(((pMac->pmm.gPmmState == ePMM_STATE_READY) ||
2065 (pMac->pmm.gPmmState == ePMM_STATE_BMPS_WAKEUP)) &&
2066 (IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
2067 {
2068 pMac->pmm.inMissedBeaconScenario = TRUE;
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002069 PELOGE(limLog(pMac, LOGE, FL("Received Heart Beat Failure"));)
Leela Venkata Kiran Kumar Reddy Chirala3ca17902013-02-27 19:50:05 -08002070 limMissedBeaconInActiveMode(pMac, psessionEntry);
Yathish9f22e662012-12-10 14:21:35 -08002071 }
2072#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002073 else
2074 {
2075 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002076 FL("Received SIR_HAL_MISSED_BEACON_IND while in incorrect state: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002077 pMac->pmm.gPmmState);
2078 }
2079 return;
2080}
2081
2082/** -----------------------------------------------------------------
2083 \brief limMicFailureInd() - handles mic failure indication
2084
2085 This function process the SIR_HAL_MIC_FAILURE_IND message from HAL,
2086
2087 \param pMac - global mac structure
2088 \return - none
2089 \sa
2090 ----------------------------------------------------------------- */
2091void limMicFailureInd(tpAniSirGlobal pMac, tpSirMsgQ pMsg)
2092{
2093 tpSirSmeMicFailureInd pSirSmeMicFailureInd;
2094 tpSirSmeMicFailureInd pSirMicFailureInd = (tpSirSmeMicFailureInd)pMsg->bodyptr;
2095 tSirMsgQ mmhMsg;
2096 tpPESession psessionEntry ;
2097 tANI_U8 sessionId;
2098
2099 if((psessionEntry = peFindSessionByBssid(pMac,pSirMicFailureInd->bssId,&sessionId))== NULL)
2100 {
2101 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002102 FL("session does not exist for given BSSId"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002103 return;
2104 }
2105
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302106 pSirSmeMicFailureInd = vos_mem_malloc(sizeof(tSirSmeMicFailureInd));
2107 if (NULL == pSirSmeMicFailureInd)
Jeff Johnson295189b2012-06-20 16:38:30 -07002108 {
2109 // Log error
2110 limLog(pMac, LOGP,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002111 FL("memory allocate failed for eWNI_SME_MIC_FAILURE_IND"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002112 return;
2113 }
2114
2115 pSirSmeMicFailureInd->messageType = eWNI_SME_MIC_FAILURE_IND;
2116 pSirSmeMicFailureInd->length = sizeof(pSirSmeMicFailureInd);
2117 pSirSmeMicFailureInd->sessionId = psessionEntry->smeSessionId;
2118
2119 vos_mem_copy(pSirSmeMicFailureInd->bssId,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302120 pSirMicFailureInd->bssId,
2121 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002122
2123 vos_mem_copy(pSirSmeMicFailureInd->info.srcMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302124 pSirMicFailureInd->info.srcMacAddr,
2125 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002126
2127 vos_mem_copy(pSirSmeMicFailureInd->info.taMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302128 pSirMicFailureInd->info.taMacAddr,
2129 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002130
2131 vos_mem_copy(pSirSmeMicFailureInd->info.dstMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302132 pSirMicFailureInd->info.dstMacAddr,
2133 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002134
2135 vos_mem_copy(pSirSmeMicFailureInd->info.rxMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302136 pSirMicFailureInd->info.rxMacAddr,
2137 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002138
2139 pSirSmeMicFailureInd->info.multicast =
2140 pSirMicFailureInd->info.multicast;
2141
2142 pSirSmeMicFailureInd->info.keyId=
2143 pSirMicFailureInd->info.keyId;
2144
2145 pSirSmeMicFailureInd->info.IV1=
2146 pSirMicFailureInd->info.IV1;
2147
2148 vos_mem_copy(pSirSmeMicFailureInd->info.TSC,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302149 pSirMicFailureInd->info.TSC,SIR_CIPHER_SEQ_CTR_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002150
2151 mmhMsg.type = eWNI_SME_MIC_FAILURE_IND;
2152 mmhMsg.bodyptr = pSirSmeMicFailureInd;
2153 mmhMsg.bodyval = 0;
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08002154 MTRACE(macTraceMsgTx(pMac, sessionId, mmhMsg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07002155 limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
2156 return;
2157}
2158
2159
2160/** -----------------------------------------------------------------
2161 \brief limIsPktCandidateForDrop() - decides whether to drop the frame or not
2162
2163 This function is called before enqueuing the frame to PE queue for further processing.
2164 This prevents unnecessary frames getting into PE Queue and drops them right away.
2165 Frames will be droped in the following scenarios:
2166
2167 - In Scan State, drop the frames which are not marked as scan frames
2168 - In non-Scan state, drop the frames which are marked as scan frames.
2169 - Drop INFRA Beacons and Probe Responses in IBSS Mode
2170 - Drop the Probe Request in IBSS mode, if STA did not send out the last beacon
2171
2172 \param pMac - global mac structure
2173 \return - none
2174 \sa
2175 ----------------------------------------------------------------- */
2176
2177tMgmtFrmDropReason limIsPktCandidateForDrop(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tANI_U32 subType)
2178{
2179 tANI_U32 framelen;
2180 tANI_U8 *pBody;
2181 tSirMacCapabilityInfo capabilityInfo;
2182
2183 /*
2184 *
2185 * In scan mode, drop only Beacon/Probe Response which are NOT marked as scan-frames.
2186 * In non-scan mode, drop only Beacon/Probe Response which are marked as scan frames.
2187 * Allow other mgmt frames, they must be from our own AP, as we don't allow
2188 * other than beacons or probe responses in scan state.
2189 */
2190 if( (subType == SIR_MAC_MGMT_BEACON) ||
2191 (subType == SIR_MAC_MGMT_PROBE_RSP))
2192 {
2193 if(pMac->pmm.inMissedBeaconScenario)
2194 {
Leela Venkata Kiran Kumar Reddy Chiralaf3fe6302013-03-18 12:32:14 -07002195 MTRACE(macTrace(pMac, TRACE_CODE_INFO_LOG, 0, eLOG_NODROP_MISSED_BEACON_SCENARIO));
2196 return eMGMT_DROP_NO_DROP;
Jeff Johnson295189b2012-06-20 16:38:30 -07002197 }
2198 if (limIsSystemInScanState(pMac))
2199 {
Jeff Johnson04dd8a82012-06-29 20:41:40 -07002200 return eMGMT_DROP_NO_DROP;
Jeff Johnson295189b2012-06-20 16:38:30 -07002201 }
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -07002202#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
2203 else if (WDA_GET_OFFLOADSCANLEARN(pRxPacketInfo) || WDA_GET_ROAMCANDIDATEIND(pRxPacketInfo))
2204 {
2205 return eMGMT_DROP_NO_DROP;
2206 }
2207#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002208 else if (WDA_IS_RX_IN_SCAN(pRxPacketInfo))
2209 {
2210 return eMGMT_DROP_SCAN_MODE_FRAME;
2211 }
2212 }
2213
2214 framelen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
2215 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
2216
2217 /* Note sure if this is sufficient, basically this condition allows all probe responses and
2218 * beacons from an infrastructure network
2219 */
2220 *((tANI_U16*) &capabilityInfo) = sirReadU16(pBody+ LIM_BCN_PR_CAPABILITY_OFFSET);
2221 if(!capabilityInfo.ibss)
2222 return eMGMT_DROP_NO_DROP;
2223#if 0
2224 //Allow the mgmt frames to be queued if STA not in IBSS mode.
2225 if (pMac->lim.gLimSystemRole != eLIM_STA_IN_IBSS_ROLE)
2226 return eMGMT_DROP_NO_DROP;
2227#endif
2228
2229 //Drop INFRA Beacons and Probe Responses in IBSS Mode
2230 if( (subType == SIR_MAC_MGMT_BEACON) ||
2231 (subType == SIR_MAC_MGMT_PROBE_RSP))
2232 {
2233 //drop the frame if length is less than 12
2234 if(framelen < LIM_MIN_BCN_PR_LENGTH)
2235 return eMGMT_DROP_INVALID_SIZE;
2236
2237 *((tANI_U16*) &capabilityInfo) = sirReadU16(pBody+ LIM_BCN_PR_CAPABILITY_OFFSET);
2238
2239 //This can be enhanced to even check the SSID before deciding to enque the frame.
2240 if(capabilityInfo.ess)
2241 return eMGMT_DROP_INFRA_BCN_IN_IBSS;
2242 }
2243 else if( (subType == SIR_MAC_MGMT_PROBE_REQ) &&
2244 (!WDA_GET_RX_BEACON_SENT(pRxPacketInfo)))
2245 {
2246 //Drop the Probe Request in IBSS mode, if STA did not send out the last beacon
2247 //In IBSS, the node which sends out the beacon, is supposed to respond to ProbeReq
2248 return eMGMT_DROP_NOT_LAST_IBSS_BCN;
2249 }
2250
2251 return eMGMT_DROP_NO_DROP;
2252}
2253
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08002254eHalStatus pe_AcquireGlobalLock( tAniSirLim *psPe)
2255{
2256 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
Jeff Johnson295189b2012-06-20 16:38:30 -07002257
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08002258 if(psPe)
2259 {
2260 if( VOS_IS_STATUS_SUCCESS( vos_lock_acquire( &psPe->lkPeGlobalLock) ) )
2261 {
2262 status = eHAL_STATUS_SUCCESS;
2263 }
2264 }
2265 return (status);
2266}
2267eHalStatus pe_ReleaseGlobalLock( tAniSirLim *psPe)
2268{
2269 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
2270 if(psPe)
2271 {
2272 if( VOS_IS_STATUS_SUCCESS( vos_lock_release( &psPe->lkPeGlobalLock) ) )
2273 {
2274 status = eHAL_STATUS_SUCCESS;
2275 }
2276 }
2277 return (status);
2278}