blob: ed18255a23a813422c923fc432389f601a61d04c [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Satyanarayana Dash6f438272015-03-03 18:01:06 +05302 * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
Kiet Lam842dad02014-02-18 18:44:02 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
Kiet Lama7f454d2014-07-24 12:04:06 -070023 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080026 */
Kiet Lam842dad02014-02-18 18:44:02 -080027
28
Kiet Lama7f454d2014-07-24 12:04:06 -070029
30
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080031/*
Jeff Johnson295189b2012-06-20 16:38:30 -070032 * This file limApi.cc contains the functions that are
33 * exported by LIM to other modules.
34 *
35 * Author: Chandra Modumudi
36 * Date: 02/11/02
37 * History:-
38 * Date Modified by Modification Information
39 * --------------------------------------------------------------------
40 *
41 */
42#include "palTypes.h"
Satyanarayana Dash6f438272015-03-03 18:01:06 +053043#include "wniCfg.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070044#include "wniApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070045#include "sirCommon.h"
46#include "sirDebug.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070047#include "cfgApi.h"
48
49#include "schApi.h"
50#include "utilsApi.h"
51#include "limApi.h"
52#include "limGlobal.h"
53#include "limTypes.h"
54#include "limUtils.h"
55#include "limAssocUtils.h"
56#include "limPropExtsUtils.h"
57#include "limSerDesUtils.h"
58#include "limIbssPeerMgmt.h"
59#include "limAdmitControl.h"
60#include "pmmApi.h"
61#include "logDump.h"
62#include "limSendSmeRspMessages.h"
63#include "wmmApsd.h"
64#include "limTrace.h"
65#include "limSession.h"
66#include "wlan_qct_wda.h"
67
68#if defined WLAN_FEATURE_VOWIFI
69#include "rrmApi.h"
70#endif
71
72#include <limFT.h>
Jeff Johnson295189b2012-06-20 16:38:30 -070073#include "vos_types.h"
74#include "vos_packet.h"
75#include "wlan_qct_tl.h"
76#include "sysStartup.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070077
78
79static void __limInitScanVars(tpAniSirGlobal pMac)
80{
81 pMac->lim.gLimUseScanModeForLearnMode = 1;
82
83 pMac->lim.gLimSystemInScanLearnMode = 0;
84
85 // Scan related globals on STA
86 pMac->lim.gLimReturnAfterFirstMatch = 0;
87 pMac->lim.gLim24Band11dScanDone = 0;
88 pMac->lim.gLim50Band11dScanDone = 0;
89 pMac->lim.gLimReturnUniqueResults = 0;
90
91 // Background Scan related globals on STA
92 pMac->lim.gLimNumOfBackgroundScanSuccess = 0;
93 pMac->lim.gLimNumOfConsecutiveBkgndScanFailure = 0;
94 pMac->lim.gLimNumOfForcedBkgndScan = 0;
95 pMac->lim.gLimBackgroundScanDisable = false; //based on BG timer
96 pMac->lim.gLimForceBackgroundScanDisable = false; //debug control flag
97 pMac->lim.gLimBackgroundScanTerminate = TRUE; //controlled by SME
Jeff Johnson92751692013-03-06 16:00:33 -080098 pMac->lim.gLimReportBackgroundScanResults = FALSE; //controlled by SME
Jeff Johnson295189b2012-06-20 16:38:30 -070099
100 pMac->lim.gLimCurrentScanChannelId = 0;
101 pMac->lim.gpLimMlmScanReq = NULL;
Viral Modid440e682013-03-06 02:25:31 -0800102 pMac->lim.gDeferMsgTypeForNOA = 0;
103 pMac->lim.gpDefdSmeMsgForNOA = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700104 pMac->lim.gLimMlmScanResultLength = 0;
105 pMac->lim.gLimSmeScanResultLength = 0;
106
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530107 vos_mem_set(pMac->lim.gLimCachedScanHashTable,
108 sizeof(pMac->lim.gLimCachedScanHashTable), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700109
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700110#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
111
112 pMac->lim.gLimMlmLfrScanResultLength = 0;
113 pMac->lim.gLimSmeLfrScanResultLength = 0;
114
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530115 vos_mem_set(pMac->lim.gLimCachedLfrScanHashTable,
116 sizeof(pMac->lim.gLimCachedLfrScanHashTable), 0);
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700117#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700118 pMac->lim.gLimBackgroundScanChannelId = 0;
119 pMac->lim.gLimBackgroundScanStarted = 0;
120 pMac->lim.gLimRestoreCBNumScanInterval = LIM_RESTORE_CB_NUM_SCAN_INTERVAL_DEFAULT;
121 pMac->lim.gLimRestoreCBCount = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530122 vos_mem_set(pMac->lim.gLimLegacyBssidList,
123 sizeof(pMac->lim.gLimLegacyBssidList), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700124
125 /* Fill in default values */
126 pMac->lim.gLimTriggerBackgroundScanDuringQuietBss = 0;
127
Jeff Johnson295189b2012-06-20 16:38:30 -0700128
129 // abort scan is used to abort an on-going scan
130 pMac->lim.abortScan = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530131 vos_mem_set(&pMac->lim.scanChnInfo, sizeof(tLimScanChnInfo), 0);
132 vos_mem_set(&pMac->lim.dfschannelList, sizeof(tSirDFSChannelList), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700133
134//WLAN_SUSPEND_LINK Related
135 pMac->lim.gpLimSuspendCallback = NULL;
136 pMac->lim.gpLimResumeCallback = NULL;
137//end WLAN_SUSPEND_LINK Related
138}
139
140
141static void __limInitBssVars(tpAniSirGlobal pMac)
142{
143
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530144 vos_mem_set((void*)pMac->lim.gpSession,
145 sizeof(*pMac->lim.gpSession)*pMac->lim.maxBssId, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700146
147
148 //pMac->lim.gpLimStartBssReq = NULL;
149
Jeff Johnson295189b2012-06-20 16:38:30 -0700150
151
152
153/* These global variables are moved to session table and intialization is done during session creation Oct 9th Review */
154#if 0
155
156 // Place holder for BSS description that we're
157 // currently joined with
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530158 vos_mem_set(&pMac->lim.gLimCurrentBssId, sizeof(tSirMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700159 pMac->lim.gLimCurrentChannelId = HAL_INVALID_CHANNEL_ID;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530160 vos_mem_set(&pMac->lim.gLimCurrentSSID, sizeof(tSirMacSSid), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700161 pMac->lim.gLimCurrentBssCaps = 0;
162 QosCaps is a bit map of various qos capabilities - see defn above
163 pMac->lim.gLimCurrentBssQosCaps = 0;
164 pMac->lim.gLimCurrentBssPropCap = 0;
165 pMac->lim.gLimSentCapsChangeNtf = 0;
166
167 // Place holder for BSS description that
168 // we're currently Reassociating
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530169 vos_mem_set(&pMac->lim.gLimReassocBssId, sizeof(tSirMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700170 pMac->lim.gLimReassocChannelId = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530171 vos_mem_set(&pMac->lim.gLimReassocSSID, sizeof(tSirMacSSid), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700172 pMac->lim.gLimReassocBssCaps = 0;
173 pMac->lim.gLimReassocBssQosCaps = 0;
174 pMac->lim.gLimReassocBssPropCap = 0;
175 #endif
176
177 /* This is for testing purposes only, be default should always be off */
178 pMac->lim.gLimForceNoPropIE = 0;
179
180 // pMac->lim.gLimBssIdx = 0;
181
182 pMac->lim.gpLimMlmSetKeysReq = NULL;
183 pMac->lim.gpLimMlmRemoveKeyReq = NULL;
184 // pMac->lim.gLimStaid = 0; //TO SUPPORT BT-AMP
185
186}
187
188
189static void __limInitStatsVars(tpAniSirGlobal pMac)
190{
191 pMac->lim.gLimNumBeaconsRcvd = 0;
192 pMac->lim.gLimNumBeaconsIgnored = 0;
193
194 pMac->lim.gLimNumDeferredMsgs = 0;
195
196 /// Variable to keep track of number of currently associated STAs
Gopichand Nakkala777e6032012-12-31 16:39:21 -0800197 //pMac->lim.gLimNumOfCurrentSTAs = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700198 pMac->lim.gLimNumOfAniSTAs = 0; // count of ANI peers
199
200 /// This indicates number of RXed Beacons during HB period
201 //pMac->lim.gLimRxedBeaconCntDuringHB = 0;
202
203 // Heart-Beat interval value
204 pMac->lim.gLimHeartBeatCount = 0;
205
Abhishek Singhde51a412014-05-20 19:17:26 +0530206 vos_mem_zero(pMac->lim.gLimHeartBeatApMac[0],
207 sizeof(tSirMacAddr));
208 vos_mem_zero(pMac->lim.gLimHeartBeatApMac[1],
209 sizeof(tSirMacAddr));
210 pMac->lim.gLimHeartBeatApMacIndex = 0;
211
Jeff Johnson295189b2012-06-20 16:38:30 -0700212 // Statistics to keep track of no. beacons rcvd in heart beat interval
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530213 vos_mem_set(pMac->lim.gLimHeartBeatBeaconStats,
214 sizeof(pMac->lim.gLimHeartBeatBeaconStats), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700215
216#ifdef WLAN_DEBUG
217 // Debug counters
218 pMac->lim.numTot = 0;
219 pMac->lim.numBbt = 0;
220 pMac->lim.numProtErr = 0;
221 pMac->lim.numLearn = 0;
222 pMac->lim.numLearnIgnore = 0;
223 pMac->lim.numSme = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530224 vos_mem_set(pMac->lim.numMAC, sizeof(pMac->lim.numMAC), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700225 pMac->lim.gLimNumAssocReqDropInvldState = 0;
226 pMac->lim.gLimNumAssocReqDropACRejectTS = 0;
227 pMac->lim.gLimNumAssocReqDropACRejectSta = 0;
228 pMac->lim.gLimNumReassocReqDropInvldState = 0;
229 pMac->lim.gLimNumHashMissIgnored = 0;
230 pMac->lim.gLimUnexpBcnCnt = 0;
231 pMac->lim.gLimBcnSSIDMismatchCnt = 0;
232 pMac->lim.gLimNumLinkEsts = 0;
233 pMac->lim.gLimNumRxCleanup = 0;
234 pMac->lim.gLim11bStaAssocRejectCount = 0;
235#endif
236}
237
238
239
240static void __limInitStates(tpAniSirGlobal pMac)
241{
242 // Counts Heartbeat failures
243 pMac->lim.gLimHBfailureCntInLinkEstState = 0;
244 pMac->lim.gLimProbeFailureAfterHBfailedCnt = 0;
245 pMac->lim.gLimHBfailureCntInOtherStates = 0;
246 pMac->lim.gLimRspReqd = 0;
247 pMac->lim.gLimPrevSmeState = eLIM_SME_OFFLINE_STATE;
248
249 /// MLM State visible across all Sirius modules
Jeff Johnsone7245742012-09-05 17:12:55 -0700250 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, eLIM_MLM_IDLE_STATE));
Jeff Johnson295189b2012-06-20 16:38:30 -0700251 pMac->lim.gLimMlmState = eLIM_MLM_IDLE_STATE;
252
253 /// Previous MLM State
254 pMac->lim.gLimPrevMlmState = eLIM_MLM_OFFLINE_STATE;
255
256#ifdef GEN4_SCAN
257 // LIM to HAL SCAN Management Message Interface states
258 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
259#endif // GEN4_SCAN
260
Jeff Johnson295189b2012-06-20 16:38:30 -0700261 /**
Jeff Johnsone7245742012-09-05 17:12:55 -0700262 * Initialize state to eLIM_SME_OFFLINE_STATE
Jeff Johnson295189b2012-06-20 16:38:30 -0700263 */
Jeff Johnsone7245742012-09-05 17:12:55 -0700264 pMac->lim.gLimSmeState = eLIM_SME_OFFLINE_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700265
266 /**
267 * By default assume 'unknown' role. This will be updated
268 * when SME_START_BSS_REQ is received.
269 */
270
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530271 vos_mem_set(&pMac->lim.gLimOverlap11gParams, sizeof(tLimProtStaParams), 0);
272 vos_mem_set(&pMac->lim.gLimOverlap11aParams, sizeof(tLimProtStaParams), 0);
273 vos_mem_set(&pMac->lim.gLimOverlapHt20Params, sizeof(tLimProtStaParams), 0);
274 vos_mem_set(&pMac->lim.gLimOverlapNonGfParams, sizeof(tLimProtStaParams), 0);
275 vos_mem_set(&pMac->lim.gLimNoShortParams, sizeof(tLimNoShortParams), 0);
276 vos_mem_set(&pMac->lim.gLimNoShortSlotParams, sizeof(tLimNoShortSlotParams), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700277
278 pMac->lim.gLimPhyMode = 0;
279 pMac->lim.scanStartTime = 0; // used to measure scan time
280
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530281 vos_mem_set(pMac->lim.gLimMyMacAddr, sizeof(pMac->lim.gLimMyMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700282 pMac->lim.ackPolicy = 0;
283
284#if 0 /* Moving all these to session specific elements */
285 pMac->lim.gLimQosEnabled = 0; //11E
286 pMac->lim.gLimWmeEnabled = 0; //WME
287 pMac->lim.gLimWsmEnabled = 0; //WSM
288 pMac->lim.gLimHcfEnabled = 0;
289 pMac->lim.gLim11dEnabled = 0;
290#endif
291
292 pMac->lim.gLimProbeRespDisableFlag = 0; // control over probe response
293}
294
295static void __limInitVars(tpAniSirGlobal pMac)
296{
297
Jeff Johnson295189b2012-06-20 16:38:30 -0700298
299 // Place holder for Measurement Req/Rsp/Ind related info
Jeff Johnson295189b2012-06-20 16:38:30 -0700300
301 // WDS info
302 pMac->lim.gLimNumWdsInfoInd = 0;
303 pMac->lim.gLimNumWdsInfoSet = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530304 vos_mem_set(&pMac->lim.gLimWdsInfo, sizeof(tSirWdsInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700305 /* initialize some parameters */
306 limInitWdsInfoParams(pMac);
307
308 // Deferred Queue Paramters
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530309 vos_mem_set(&pMac->lim.gLimDeferredMsgQ, sizeof(tSirAddtsReq), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700310
311 // addts request if any - only one can be outstanding at any time
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530312 vos_mem_set(&pMac->lim.gLimAddtsReq, sizeof(tSirAddtsReq) , 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700313 pMac->lim.gLimAddtsSent = 0;
314 pMac->lim.gLimAddtsRspTimerCount = 0;
315
316 //protection related config cache
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530317 vos_mem_set(&pMac->lim.cfgProtection, sizeof(tCfgProtection), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700318 pMac->lim.gLimProtectionControl = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530319 vos_mem_set(&pMac->lim.gLimAlternateRadio, sizeof(tSirAlternateRadioInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700320 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
321
Jeff Johnsone7245742012-09-05 17:12:55 -0700322#if 0
Jeff Johnson295189b2012-06-20 16:38:30 -0700323 // 11h Spectrum Management Related Flag
Jeff Johnson295189b2012-06-20 16:38:30 -0700324 LIM_SET_RADAR_DETECTED(pMac, eANI_BOOLEAN_FALSE);
325 pMac->sys.gSysEnableLearnMode = eANI_BOOLEAN_TRUE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700326#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700327 // WMM Related Flag
328 pMac->lim.gUapsdEnable = 0;
329 pMac->lim.gUapsdPerAcBitmask = 0;
330 pMac->lim.gUapsdPerAcTriggerEnableMask = 0;
331 pMac->lim.gUapsdPerAcDeliveryEnableMask = 0;
332
333 // QoS-AC Downgrade: Initially, no AC is admitted
334 pMac->lim.gAcAdmitMask[SIR_MAC_DIRECTION_UPLINK] = 0;
335 pMac->lim.gAcAdmitMask[SIR_MAC_DIRECTION_DNLINK] = 0;
336
337 //dialogue token List head/tail for Action frames request sent.
338 pMac->lim.pDialogueTokenHead = NULL;
339 pMac->lim.pDialogueTokenTail = NULL;
340
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530341 vos_mem_set(&pMac->lim.tspecInfo,
342 sizeof(tLimTspecInfo) * LIM_NUM_TSPEC_MAX, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700343
344 // admission control policy information
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530345 vos_mem_set(&pMac->lim.admitPolicyInfo, sizeof(tLimAdmitPolicyInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700346
347 pMac->lim.gLastBeaconDtimCount = 0;
348 pMac->lim.gLastBeaconDtimPeriod = 0;
349
350 //Scan in Power Save Flag
351 pMac->lim.gScanInPowersave = 0;
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -0800352 pMac->lim.probeCounter = 0;
353 pMac->lim.maxProbe = 0;
Ganesh Kondabattini10e67352015-03-16 17:41:57 +0530354 pMac->lim.txBdToken = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700355}
356
357static void __limInitAssocVars(tpAniSirGlobal pMac)
358{
Madan Mohan Koyyalamudi59efbe02013-01-10 15:38:42 -0800359 tANI_U32 val;
Gopichand Nakkala777e6032012-12-31 16:39:21 -0800360#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530361 vos_mem_set(pMac->lim.gpLimAIDpool,
362 sizeof(*pMac->lim.gpLimAIDpool) * (WNI_CFG_ASSOC_STA_LIMIT_STAMAX+1), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700363 pMac->lim.freeAidHead = 0;
364 pMac->lim.freeAidTail = 0;
Gopichand Nakkala777e6032012-12-31 16:39:21 -0800365#endif
Madan Mohan Koyyalamudi59efbe02013-01-10 15:38:42 -0800366 if(wlan_cfgGetInt(pMac, WNI_CFG_ASSOC_STA_LIMIT, &val) != eSIR_SUCCESS)
367 {
368 limLog( pMac, LOGP, FL( "cfg get assoc sta limit failed" ));
369 }
370 pMac->lim.gLimAssocStaLimit = val;
Ravi Joshi0fc681b2013-09-11 16:46:07 -0700371 pMac->lim.gLimIbssStaLimit = val;
Jeff Johnson295189b2012-06-20 16:38:30 -0700372
373 // Place holder for current authentication request
374 // being handled
375 pMac->lim.gpLimMlmAuthReq = NULL;
Jeff Johnsone7245742012-09-05 17:12:55 -0700376 //pMac->lim.gpLimMlmJoinReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -0700377
378 /// MAC level Pre-authentication related globals
379 pMac->lim.gLimPreAuthChannelNumber = 0;
380 pMac->lim.gLimPreAuthType = eSIR_OPEN_SYSTEM;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530381 vos_mem_set(&pMac->lim.gLimPreAuthPeerAddr, sizeof(tSirMacAddr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700382 pMac->lim.gLimNumPreAuthContexts = 0;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530383 vos_mem_set(&pMac->lim.gLimPreAuthTimerTable, sizeof(tLimPreAuthTable), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700384
385 // Placed holder to deauth reason
386 pMac->lim.gLimDeauthReasonCode = 0;
387
388 // Place holder for Pre-authentication node list
389 pMac->lim.pLimPreAuthList = NULL;
390
Jeff Johnson295189b2012-06-20 16:38:30 -0700391 //One cache for each overlap and associated case.
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530392 vos_mem_set(pMac->lim.protStaOverlapCache,
393 sizeof(tCacheParams) * LIM_PROT_STA_OVERLAP_CACHE_SIZE, 0);
394 vos_mem_set(pMac->lim.protStaCache,
395 sizeof(tCacheParams) * LIM_PROT_STA_CACHE_SIZE, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700396
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -0800397#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
Madan Mohan Koyyalamudi61bc5662012-11-02 14:33:10 -0700398 pMac->lim.pSessionEntry = NULL;
399 pMac->lim.reAssocRetryAttempt = 0;
400#endif
401
Jeff Johnson295189b2012-06-20 16:38:30 -0700402}
403
404
405static void __limInitTitanVars(tpAniSirGlobal pMac)
406{
Jeff Johnsone7245742012-09-05 17:12:55 -0700407#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530408 vos_mem_set(&pMac->lim.gLimChannelSwitch, sizeof(tLimChannelSwitchInfo), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700409 pMac->lim.gLimChannelSwitch.state = eLIM_CHANNEL_SWITCH_IDLE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700410 pMac->lim.gLimChannelSwitch.secondarySubBand = PHY_SINGLE_CHANNEL_CENTERED;
411#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700412 // Debug workaround for BEACON's
413 // State change triggered by "dump 222"
414 pMac->lim.gLimScanOverride = 1;
415 pMac->lim.gLimScanOverrideSaved = eSIR_ACTIVE_SCAN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700416 pMac->lim.gLimTitanStaCount = 0;
417 pMac->lim.gLimBlockNonTitanSta = 0;
418}
419
420static void __limInitHTVars(tpAniSirGlobal pMac)
421{
422 pMac->lim.htCapabilityPresentInBeacon = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700423 pMac->lim.gHTGreenfield = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700424 pMac->lim.gHTShortGI40Mhz = 0;
425 pMac->lim.gHTShortGI20Mhz = 0;
426 pMac->lim.gHTMaxAmsduLength = 0;
427 pMac->lim.gHTDsssCckRate40MHzSupport = 0;
428 pMac->lim.gHTPSMPSupport = 0;
429 pMac->lim.gHTLsigTXOPProtection = 0;
430 pMac->lim.gHTMIMOPSState = eSIR_HT_MIMO_PS_STATIC;
431 pMac->lim.gHTAMpduDensity = 0;
432
433 pMac->lim.gMaxAmsduSizeEnabled = false;
434 pMac->lim.gHTMaxRxAMpduFactor = 0;
435 pMac->lim.gHTServiceIntervalGranularity = 0;
436 pMac->lim.gHTControlledAccessOnly = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700437 pMac->lim.gHTOperMode = eSIR_HT_OP_MODE_PURE;
438 pMac->lim.gHTPCOActive = 0;
439
440 pMac->lim.gHTPCOPhase = 0;
441 pMac->lim.gHTSecondaryBeacon = 0;
442 pMac->lim.gHTDualCTSProtection = 0;
443 pMac->lim.gHTSTBCBasicMCS = 0;
444 pMac->lim.gAddBA_Declined = 0; // Flag to Decline the BAR if the particular bit (0-7) is being set
445}
446
Jeff Johnson295189b2012-06-20 16:38:30 -0700447static tSirRetStatus __limInitConfig( tpAniSirGlobal pMac )
448{
Jeff Johnsone7245742012-09-05 17:12:55 -0700449 tANI_U32 val1, val2, val3;
Jeff Johnson295189b2012-06-20 16:38:30 -0700450 tANI_U16 val16;
451 tANI_U8 val8;
452 tSirMacHTCapabilityInfo *pHTCapabilityInfo;
453 tSirMacHTInfoField1 *pHTInfoField1;
454 tpSirPowerSaveCfg pPowerSaveConfig;
455 tSirMacHTParametersInfo *pAmpduParamInfo;
456
457 /* Read all the CFGs here that were updated before peStart is called */
Jeff Johnsone7245742012-09-05 17:12:55 -0700458 /* All these CFG READS/WRITES are only allowed in init, at start when there is no session
459 * and they will be used throughout when there is no session
460 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700461
Jeff Johnson295189b2012-06-20 16:38:30 -0700462 if(wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &val1) != eSIR_SUCCESS)
463 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700464 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT Cap CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700465 return eSIR_FAILURE;
466 }
467
468 if(wlan_cfgGetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, &val2) != eSIR_SUCCESS)
469 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700470 PELOGE(limLog(pMac, LOGE, FL("could not retrieve Channel Bonding CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700471 return eSIR_FAILURE;
472 }
473 val16 = ( tANI_U16 ) val1;
474 pHTCapabilityInfo = ( tSirMacHTCapabilityInfo* ) &val16;
475
476 //channel bonding mode could be set to anything from 0 to 4(Titan had these
477 // modes But for Taurus we have only two modes: enable(>0) or disable(=0)
478 pHTCapabilityInfo->supportedChannelWidthSet = val2 ?
479 WNI_CFG_CHANNEL_BONDING_MODE_ENABLE : WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
480 if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo)
481 != eSIR_SUCCESS)
482 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700483 PELOGE(limLog(pMac, LOGE, FL("could not update HT Cap Info CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700484 return eSIR_FAILURE;
485 }
486
487 if(wlan_cfgGetInt(pMac, WNI_CFG_HT_INFO_FIELD1, &val1) != eSIR_SUCCESS)
488 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700489 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT INFO Field1 CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700490 return eSIR_FAILURE;
491 }
492
493 val8 = ( tANI_U8 ) val1;
494 pHTInfoField1 = ( tSirMacHTInfoField1* ) &val8;
495 pHTInfoField1->recommendedTxWidthSet =
496 (tANI_U8)pHTCapabilityInfo->supportedChannelWidthSet;
Jeff Johnson295189b2012-06-20 16:38:30 -0700497 if(cfgSetInt(pMac, WNI_CFG_HT_INFO_FIELD1, *(tANI_U8*)pHTInfoField1)
498 != eSIR_SUCCESS)
499 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700500 PELOGE(limLog(pMac, LOGE, FL("could not update HT Info Field"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700501 return eSIR_FAILURE;
502 }
503
504 /* WNI_CFG_HEART_BEAT_THRESHOLD */
505
506 if( wlan_cfgGetInt(pMac, WNI_CFG_HEART_BEAT_THRESHOLD, &val1) !=
507 eSIR_SUCCESS )
508 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700509 PELOGE(limLog(pMac, LOGE, FL("could not retrieve WNI_CFG_HEART_BEAT_THRESHOLD CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700510 return eSIR_FAILURE;
511 }
512 if(!val1)
513 {
514 limDeactivateAndChangeTimer(pMac, eLIM_HEART_BEAT_TIMER);
515 pMac->sys.gSysEnableLinkMonitorMode = 0;
516 }
517 else
518 {
519 //No need to activate the timer during init time.
520 pMac->sys.gSysEnableLinkMonitorMode = 1;
521 }
522
523 /* WNI_CFG_SHORT_GI_20MHZ */
524
525 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &val1) != eSIR_SUCCESS)
526 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700527 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT Cap CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700528 return eSIR_FAILURE;
529 }
530 if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_GI_20MHZ, &val2) != eSIR_SUCCESS)
531 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700532 PELOGE(limLog(pMac, LOGE, FL("could not retrieve shortGI 20Mhz CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700533 return eSIR_FAILURE;
534 }
535 if (wlan_cfgGetInt(pMac, WNI_CFG_SHORT_GI_40MHZ, &val3) != eSIR_SUCCESS)
536 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700537 PELOGE(limLog(pMac, LOGE, FL("could not retrieve shortGI 40Mhz CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700538 return eSIR_FAILURE;
539 }
540
541 val16 = ( tANI_U16 ) val1;
542 pHTCapabilityInfo = ( tSirMacHTCapabilityInfo* ) &val16;
543 pHTCapabilityInfo->shortGI20MHz = (tANI_U16)val2;
544 pHTCapabilityInfo->shortGI40MHz = (tANI_U16)val3;
545
546 if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo) !=
547 eSIR_SUCCESS)
548 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700549 PELOGE(limLog(pMac, LOGE, FL("could not update HT Cap Info CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700550 return eSIR_FAILURE;
551 }
552
553 /* WNI_CFG_MAX_RX_AMPDU_FACTOR */
554
555 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_AMPDU_PARAMS, &val1) != eSIR_SUCCESS)
556 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700557 PELOGE(limLog(pMac, LOGE, FL("could not retrieve HT AMPDU Param CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700558 return eSIR_FAILURE;
559 }
560 if (wlan_cfgGetInt(pMac, WNI_CFG_MAX_RX_AMPDU_FACTOR, &val2) != eSIR_SUCCESS)
561 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700562 PELOGE(limLog(pMac, LOGE, FL("could not retrieve AMPDU Factor CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700563 return eSIR_FAILURE;
564 }
565 val16 = ( tANI_U16 ) val1;
566 pAmpduParamInfo = ( tSirMacHTParametersInfo* ) &val16;
567 pAmpduParamInfo->maxRxAMPDUFactor = (tANI_U8)val2;
568 if(cfgSetInt(pMac, WNI_CFG_HT_AMPDU_PARAMS, *(tANI_U8*)pAmpduParamInfo) !=
569 eSIR_SUCCESS)
570 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700571 PELOGE(limLog(pMac, LOGE, FL("could not update HT AMPDU Param CFG"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700572 return eSIR_FAILURE;
573 }
574
575 /* WNI_CFG_SHORT_PREAMBLE - this one is not updated in
576 limHandleCFGparamUpdate do we want to update this? */
577 if(wlan_cfgGetInt(pMac, WNI_CFG_SHORT_PREAMBLE, &val1) != eSIR_SUCCESS)
578 {
Shake M Subhani5d80fda2013-12-09 17:28:23 +0530579 limLog(pMac, LOGE, FL("cfg get short preamble failed"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700580 return eSIR_FAILURE;
581 }
582
Jeff Johnson295189b2012-06-20 16:38:30 -0700583 /* WNI_CFG_MAX_PS_POLL */
584
585 /* Allocate and fill in power save configuration. */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530586 pPowerSaveConfig = vos_mem_malloc(sizeof(tSirPowerSaveCfg));
587 if (NULL == pPowerSaveConfig)
Jeff Johnson295189b2012-06-20 16:38:30 -0700588 {
589 PELOGE(limLog(pMac, LOGE, FL("LIM: Cannot allocate memory for power save "
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700590 "configuration"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700591 return eSIR_FAILURE;
592 }
593
594 /* This context should be valid if power-save configuration message has been
595 * already dispatched during initialization process. Re-using the present
596 * configuration mask
597 */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530598 vos_mem_copy(pPowerSaveConfig, (tANI_U8 *)&pMac->pmm.gPmmCfg, sizeof(tSirPowerSaveCfg));
Jeff Johnson295189b2012-06-20 16:38:30 -0700599
600 /* Note: it is okay to do this since DAL/HAL is alrady started */
601 if ( (pmmSendPowerSaveCfg(pMac, pPowerSaveConfig)) != eSIR_SUCCESS)
602 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700603 PELOGE(limLog(pMac, LOGE, FL("LIM: pmmSendPowerSaveCfg() failed "));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700604 return eSIR_FAILURE;
605 }
606
607 /* WNI_CFG_BG_SCAN_CHANNEL_LIST_CHANNEL_LIST */
608
Jeff Johnson295189b2012-06-20 16:38:30 -0700609 PELOG1(limLog(pMac, LOG1,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700610 FL("VALID_CHANNEL_LIST has changed, reset next bg scan channel"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700611 pMac->lim.gLimBackgroundScanChannelId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700612
613 /* WNI_CFG_PROBE_RSP_BCN_ADDNIE_DATA - not needed */
614
615 /* This was initially done after resume notification from HAL. Now, DAL is
616 started before PE so this can be done here */
Jeff Johnsone7245742012-09-05 17:12:55 -0700617 handleHTCapabilityandHTInfo(pMac, NULL);
Leela V Kiran Kumar Reddy Chiralab1f7d342013-02-11 00:27:02 -0800618 if(wlan_cfgGetInt(pMac, WNI_CFG_DISABLE_LDPC_WITH_TXBF_AP,(tANI_U32 *) &pMac->lim.disableLDPCWithTxbfAP) != eSIR_SUCCESS)
619 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700620 limLog(pMac, LOGP, FL("cfg get disableLDPCWithTxbfAP failed"));
Leela V Kiran Kumar Reddy Chiralab1f7d342013-02-11 00:27:02 -0800621 return eSIR_FAILURE;
622 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +0530623#ifdef FEATURE_WLAN_TDLS
624 if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_BUF_STA_ENABLED,(tANI_U32 *) &pMac->lim.gLimTDLSBufStaEnabled) != eSIR_SUCCESS)
625 {
626 limLog(pMac, LOGP, FL("cfg get LimTDLSBufStaEnabled failed"));
627 return eSIR_FAILURE;
628 }
629 if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK,(tANI_U32 *) &pMac->lim.gLimTDLSUapsdMask) != eSIR_SUCCESS)
630 {
631 limLog(pMac, LOGP, FL("cfg get LimTDLSUapsdMask failed"));
632 return eSIR_FAILURE;
633 }
Naresh Jayaramf73f3762014-02-04 16:13:20 +0530634 if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_OFF_CHANNEL_ENABLED,(tANI_U32 *) &pMac->lim.gLimTDLSOffChannelEnabled) != eSIR_SUCCESS)
635 {
636 limLog(pMac, LOGP, FL("cfg get LimTDLSUapsdMask failed"));
637 return eSIR_FAILURE;
638 }
Pradeep Reddy POTTETIa9c80d52014-05-09 18:05:29 +0530639
640 if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_WMM_MODE_ENABLED,(tANI_U32 *) &pMac->lim.gLimTDLSWmmMode) != eSIR_SUCCESS)
641 {
642 limLog(pMac, LOGP, FL("cfg get LimTDLSWmmMode failed"));
643 return eSIR_FAILURE;
644 }
Gopichand Nakkala79ff85d2013-05-27 17:05:29 +0530645#endif
Pradeep Reddy POTTETIa9c80d52014-05-09 18:05:29 +0530646
Rashmi Ramannac7744532013-10-06 16:49:08 +0530647 if (eSIR_SUCCESS !=
648 wlan_cfgGetInt(pMac, WNI_CFG_DEBUG_P2P_REMAIN_ON_CHANNEL,
649 (tANI_U32 *)&pMac->lim.gDebugP2pRemainOnChannel))
650 {
651 limLog( pMac, LOGE,
652 "%s: Couldn't get WNI_CFG_DEBUG_P2P_REMAIN_ON_CHANNEL value",
653 __func__);
654 pMac->lim.gDebugP2pRemainOnChannel = 0;
655 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700656 return eSIR_SUCCESS;
657}
Jeff Johnson295189b2012-06-20 16:38:30 -0700658
659/*
660 limStart
661 This function is to replace the __limProcessSmeStartReq since there is no
662 eWNI_SME_START_REQ post to PE.
663*/
664tSirRetStatus limStart(tpAniSirGlobal pMac)
665{
666 tSirResultCodes retCode = eSIR_SUCCESS;
667
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530668 limLog(pMac, LOG1, FL(" enter"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700669
670 if (pMac->lim.gLimSmeState == eLIM_SME_OFFLINE_STATE)
671 {
672 pMac->lim.gLimSmeState = eLIM_SME_IDLE_STATE;
673
Jeff Johnsone7245742012-09-05 17:12:55 -0700674 MTRACE(macTrace(pMac, TRACE_CODE_SME_STATE, NO_SESSION, pMac->lim.gLimSmeState));
Jeff Johnson295189b2012-06-20 16:38:30 -0700675
676 // By default do not return after first scan match
677 pMac->lim.gLimReturnAfterFirstMatch = 0;
678
679 // Initialize MLM state machine
680 limInitMlm(pMac);
681
682 // By default return unique scan results
683 pMac->lim.gLimReturnUniqueResults = true;
684 pMac->lim.gLimSmeScanResultLength = 0;
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700685#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
686 pMac->lim.gLimSmeLfrScanResultLength = 0;
687#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700688 }
689 else
690 {
691 /**
692 * Should not have received eWNI_SME_START_REQ in states
693 * other than OFFLINE. Return response to host and
694 * log error
695 */
Sushant Kaushik1b645382014-10-13 16:39:36 +0530696 limLog(pMac, LOGE, FL("Invalid SME state %d"),pMac->lim.gLimSmeState );
Jeff Johnson295189b2012-06-20 16:38:30 -0700697 retCode = eSIR_FAILURE;
698 }
699
700 return retCode;
701}
702
703/**
704 * limInitialize()
705 *
706 *FUNCTION:
707 * This function is called from LIM thread entry function.
708 * LIM related global data structures are initialized in this function.
709 *
710 *LOGIC:
711 * NA
712 *
713 *ASSUMPTIONS:
714 * NA
715 *
716 *NOTE:
717 * NA
718 *
719 * @param pMac - Pointer to global MAC structure
720 * @return None
721 */
722
723tSirRetStatus
724limInitialize(tpAniSirGlobal pMac)
725{
726 tSirRetStatus status = eSIR_SUCCESS;
727
728 __limInitAssocVars(pMac);
729 __limInitVars(pMac);
730 __limInitStates(pMac);
731 __limInitStatsVars(pMac);
732 __limInitBssVars(pMac);
733 __limInitScanVars(pMac);
734 __limInitHTVars(pMac);
735 __limInitTitanVars(pMac);
736
Jeff Johnson295189b2012-06-20 16:38:30 -0700737 status = limStart(pMac);
738 if(eSIR_SUCCESS != status)
739 {
740 return status;
741 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700742
743 /*
744 * MLM will be intitalized when 'START' request comes from SME.
745 * limInitMlm calls limCreateTimers, which actually relies on
746 * CFG to be downloaded. So it should not be called as part of
747 * peStart, as CFG download is happening after peStart.
748 */
749 //limInitMlm(pMac);
750 // Initializations for maintaining peers in IBSS
751 limIbssInit(pMac);
752
753 pmmInitialize(pMac);
754
755
756#if defined WLAN_FEATURE_VOWIFI
757 rrmInitialize(pMac);
758#endif
759#if defined WLAN_FEATURE_VOWIFI_11R
760 limFTOpen(pMac);
761#endif
762
Jeff Johnson295189b2012-06-20 16:38:30 -0700763 vos_list_init(&pMac->lim.gLimMgmtFrameRegistratinQueue);
Jeff Johnson295189b2012-06-20 16:38:30 -0700764
765#if 0
766
767 vos_trace_setLevel(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR);
768 vos_trace_setLevel(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_WARN);
769 vos_trace_setLevel(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_FATAL);
770
771 vos_trace_setLevel(VOS_MODULE_ID_HAL, VOS_TRACE_LEVEL_WARN);
772 vos_trace_setLevel(VOS_MODULE_ID_HAL, VOS_TRACE_LEVEL_ERROR);
773
774 vos_trace_setLevel(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_WARN);
775 vos_trace_setLevel(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR);
776 vos_trace_setLevel(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR);
777
778 vos_trace_setLevel(VOS_MODULE_ID_SAL, VOS_TRACE_LEVEL_ERROR);
779
780 vos_trace_setLevel(VOS_MODULE_ID_SSC, VOS_TRACE_LEVEL_ERROR);
781
782 vos_trace_setLevel(VOS_MODULE_ID_SAL, VOS_TRACE_LEVEL_ERROR);
783 vos_trace_setLevel(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR);
784
785 vos_trace_setLevel(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR);
786
787
788 vos_trace_setLevel(VOS_MODULE_ID_BAL, VOS_TRACE_LEVEL_ERROR);
789
790 vos_trace_setLevel(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR);
791#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700792
Jeff Johnson295189b2012-06-20 16:38:30 -0700793 //Initialize the configurations needed by PE
794 if( eSIR_FAILURE == __limInitConfig(pMac))
795 {
796 //We need to undo everything in limStart
797 limCleanupMlm(pMac);
798 return eSIR_FAILURE;
799 }
800
801 //initialize the TSPEC admission control table.
802 //Note that this was initially done after resume notification from HAL.
803 //Now, DAL is started before PE so this can be done here
804 limAdmitControlInit(pMac);
805 limRegisterHalIndCallBack(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -0700806
807 return status;
808
809} /*** end limInitialize() ***/
810
811
812
813/**
814 * limCleanup()
815 *
816 *FUNCTION:
817 * This function is called upon reset or persona change
818 * to cleanup LIM state
819 *
820 *LOGIC:
821 * NA
822 *
823 *ASSUMPTIONS:
824 * NA
825 *
826 *NOTE:
827 * NA
828 *
829 * @param pMac - Pointer to Global MAC structure
830 * @return None
831 */
832
833void
834limCleanup(tpAniSirGlobal pMac)
835{
Jeff Johnson295189b2012-06-20 16:38:30 -0700836 v_PVOID_t pvosGCTx;
837 VOS_STATUS retStatus;
Jeff Johnson295189b2012-06-20 16:38:30 -0700838
Jeff Johnson295189b2012-06-20 16:38:30 -0700839//Before destroying the list making sure all the nodes have been deleted.
840//Which should be the normal case, but a memory leak has been reported.
841
842 tpLimMgmtFrameRegistration pLimMgmtRegistration = NULL;
843
844 while(vos_list_remove_front(&pMac->lim.gLimMgmtFrameRegistratinQueue,
845 (vos_list_node_t**)&pLimMgmtRegistration) == VOS_STATUS_SUCCESS)
846 {
847 VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO,
848 FL("Fixing leak! Deallocating pLimMgmtRegistration node"));
849
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530850 vos_mem_free(pLimMgmtRegistration);
Jeff Johnson295189b2012-06-20 16:38:30 -0700851 }
852
853 vos_list_destroy(&pMac->lim.gLimMgmtFrameRegistratinQueue);
Jeff Johnson295189b2012-06-20 16:38:30 -0700854
855 limCleanupMlm(pMac);
856 limCleanupLmm(pMac);
857
858 // free up preAuth table
859 if (pMac->lim.gLimPreAuthTimerTable.pTable != NULL)
860 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530861 vos_mem_free(pMac->lim.gLimPreAuthTimerTable.pTable);
Jeff Johnson295189b2012-06-20 16:38:30 -0700862 pMac->lim.gLimPreAuthTimerTable.pTable = NULL;
863 pMac->lim.gLimPreAuthTimerTable.numEntry = 0;
864 }
865
866 if(NULL != pMac->lim.pDialogueTokenHead)
867 {
868 limDeleteDialogueTokenList(pMac);
869 }
870
871 if(NULL != pMac->lim.pDialogueTokenTail)
872 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530873 vos_mem_free(pMac->lim.pDialogueTokenTail);
Jeff Johnson295189b2012-06-20 16:38:30 -0700874 pMac->lim.pDialogueTokenTail = NULL;
875 }
876
877 # if 0
878 if (pMac->lim.gpLimStartBssReq != NULL)
879 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530880 vos_mem_free(pMac->lim.gpLimStartBssReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700881 pMac->lim.gpLimStartBssReq = NULL;
882 }
883 #endif
884
885 if (pMac->lim.gpLimMlmSetKeysReq != NULL)
886 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530887 vos_mem_free(pMac->lim.gpLimMlmSetKeysReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700888 pMac->lim.gpLimMlmSetKeysReq = NULL;
889 }
890
891 #if 0
892 if (pMac->lim.gpLimJoinReq != NULL)
893 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530894 vos_mem_free(pMac->lim.gpLimJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700895 pMac->lim.gpLimJoinReq = NULL;
896 }
897 #endif
898
899 if (pMac->lim.gpLimMlmAuthReq != NULL)
900 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530901 vos_mem_free(pMac->lim.gpLimMlmAuthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700902 pMac->lim.gpLimMlmAuthReq = NULL;
903 }
904
Jeff Johnsone7245742012-09-05 17:12:55 -0700905#if 0
Jeff Johnson295189b2012-06-20 16:38:30 -0700906 if (pMac->lim.gpLimMlmJoinReq != NULL)
907 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530908 vos_mem_free(pMac->lim.gpLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700909 pMac->lim.gpLimMlmJoinReq = NULL;
910 }
Jeff Johnsone7245742012-09-05 17:12:55 -0700911#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700912
913 #if 0
914 if (pMac->lim.gpLimReassocReq != NULL)
915 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530916 vos_mem_free(pMac->lim.gpLimReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700917 pMac->lim.gpLimReassocReq = NULL;
918 }
919 #endif
920
921 if (pMac->lim.gpLimMlmRemoveKeyReq != NULL)
922 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530923 vos_mem_free(pMac->lim.gpLimMlmRemoveKeyReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700924 pMac->lim.gpLimMlmRemoveKeyReq = NULL;
925 }
926
Viral Modid440e682013-03-06 02:25:31 -0800927 if (pMac->lim.gpDefdSmeMsgForNOA != NULL)
Viral Modid86bde22012-12-10 13:09:21 -0800928 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530929 vos_mem_free(pMac->lim.gpDefdSmeMsgForNOA);
Viral Modid440e682013-03-06 02:25:31 -0800930 pMac->lim.gpDefdSmeMsgForNOA = NULL;
Viral Modid86bde22012-12-10 13:09:21 -0800931 }
Viral Modid86bde22012-12-10 13:09:21 -0800932
Jeff Johnson295189b2012-06-20 16:38:30 -0700933 if (pMac->lim.gpLimMlmScanReq != NULL)
934 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530935 vos_mem_free(pMac->lim.gpLimMlmScanReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700936 pMac->lim.gpLimMlmScanReq = NULL;
937 }
938
939#if 0
940 if(NULL != pMac->lim.beacon)
941 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530942 vos_mem_free((void*) pMac->lim.beacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700943 pMac->lim.beacon = NULL;
944 }
945#endif
946 #if 0
947 if(NULL != pMac->lim.assocReq)
948 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530949 vos_mem_free((void*) pMac->lim.assocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -0700950 pMac->lim.assocReq= NULL;
951 }
952 #endif
953
954#if 0
955 if(NULL != pMac->lim.assocRsp)
956 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +0530957 vos_mem_free((void*) pMac->lim.assocRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700958 pMac->lim.assocRsp= NULL;
959 }
960#endif
961 // Now, finally reset the deferred message queue pointers
962 limResetDeferredMsgQ(pMac);
963
Jeff Johnson295189b2012-06-20 16:38:30 -0700964
965 pvosGCTx = vos_get_global_context(VOS_MODULE_ID_PE, (v_VOID_t *) pMac);
966 retStatus = WLANTL_DeRegisterMgmtFrmClient(pvosGCTx);
967
968 if ( retStatus != VOS_STATUS_SUCCESS )
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700969 PELOGE(limLog(pMac, LOGE, FL("DeRegistering the PE Handle with TL has failed bailing out..."));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700970
971#if defined WLAN_FEATURE_VOWIFI
972 rrmCleanup(pMac);
973#endif
974#if defined WLAN_FEATURE_VOWIFI_11R
975 limFTCleanup(pMac);
976#endif
977
978} /*** end limCleanup() ***/
979
980
981/** -------------------------------------------------------------
982\fn peOpen
983\brief will be called in Open sequence from macOpen
984\param tpAniSirGlobal pMac
985\param tHalOpenParameters *pHalOpenParam
986\return tSirRetStatus
987 -------------------------------------------------------------*/
988
989tSirRetStatus peOpen(tpAniSirGlobal pMac, tMacOpenParameters *pMacOpenParam)
990{
Kaushik, Sushant16def7c2014-06-17 14:20:49 +0530991 if (eDRIVER_TYPE_MFG == pMacOpenParam->driverType)
992 return eSIR_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700993 pMac->lim.maxBssId = pMacOpenParam->maxBssId;
994 pMac->lim.maxStation = pMacOpenParam->maxStation;
Katya Nigam53799202014-12-18 15:59:38 +0530995 vos_spin_lock_init( &pMac->sys.lock );
Jeff Johnson295189b2012-06-20 16:38:30 -0700996
997 if ((pMac->lim.maxBssId == 0) || (pMac->lim.maxStation == 0))
998 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -0700999 PELOGE(limLog(pMac, LOGE, FL("max number of Bssid or Stations cannot be zero!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001000 return eSIR_FAILURE;
1001 }
1002
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301003 pMac->lim.limTimers.gpLimCnfWaitTimer = vos_mem_malloc(sizeof(TX_TIMER) * pMac->lim.maxStation);
1004 if (NULL == pMac->lim.limTimers.gpLimCnfWaitTimer)
Jeff Johnson295189b2012-06-20 16:38:30 -07001005 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001006 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001007 return eSIR_FAILURE;
1008 }
1009
Gopichand Nakkala777e6032012-12-31 16:39:21 -08001010#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301011 pMac->lim.gpLimAIDpool = vos_mem_malloc(sizeof(*pMac->lim.gpLimAIDpool) * (WNI_CFG_ASSOC_STA_LIMIT_STAMAX+1));
1012 if (NULL == pMac->lim.gpLimAIDpool)
Jeff Johnson295189b2012-06-20 16:38:30 -07001013 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001014 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001015 return eSIR_FAILURE;
1016 }
Gopichand Nakkala777e6032012-12-31 16:39:21 -08001017#endif
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301018 pMac->lim.gpSession = vos_mem_malloc(sizeof(tPESession)* pMac->lim.maxBssId);
1019 if (NULL == pMac->lim.gpSession)
Jeff Johnson295189b2012-06-20 16:38:30 -07001020 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001021 limLog(pMac, LOGE, FL("memory allocate failed!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001022 return eSIR_FAILURE;
1023 }
1024
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301025 vos_mem_set(pMac->lim.gpSession, sizeof(tPESession)*pMac->lim.maxBssId, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001026
1027
1028 /*
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301029 pMac->dph.dphHashTable.pHashTable = vos_mem_malloc(sizeof(tpDphHashNode)*pMac->lim.maxStation);
1030 if (NULL == pMac->dph.dphHashTable.pHashTable)
Jeff Johnson295189b2012-06-20 16:38:30 -07001031 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001032 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001033 return eSIR_FAILURE;
1034 }
1035
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301036 pMac->dph.dphHashTable.pDphNodeArray = vos_mem_malloc(sizeof(tDphHashNode)*pMac->lim.maxStation);
1037 if (NULL == pMac->dph.dphHashTable.pDphNodeArray)
Jeff Johnson295189b2012-06-20 16:38:30 -07001038 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001039 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001040 return eSIR_FAILURE;
1041 }
1042 */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301043 pMac->pmm.gPmmTim.pTim = vos_mem_malloc(sizeof(tANI_U8)*pMac->lim.maxStation);
1044 if (NULL == pMac->pmm.gPmmTim.pTim)
Jeff Johnson295189b2012-06-20 16:38:30 -07001045 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001046 PELOGE(limLog(pMac, LOGE, FL("memory allocate failed for pTim!"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001047 return eSIR_FAILURE;
1048 }
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301049 vos_mem_set(pMac->pmm.gPmmTim.pTim, sizeof(tANI_U8)*pMac->lim.maxStation, 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001050
Gopichand Nakkalab977a972013-02-18 19:15:09 -08001051 pMac->lim.mgmtFrameSessionId = 0xff;
Leela Venkata Kiran Kumar Reddy Chirala2247e962013-03-22 19:21:10 -07001052 pMac->lim.deferredMsgCnt = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001053
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08001054 if( !VOS_IS_STATUS_SUCCESS( vos_lock_init( &pMac->lim.lkPeGlobalLock ) ) )
1055 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001056 PELOGE(limLog(pMac, LOGE, FL("pe lock init failed!"));)
Leela Venkata Kiran Kumar Reddy Chiralabcf1b8b2013-12-16 17:13:52 -08001057 vos_mem_free(pMac->lim.limTimers.gpLimCnfWaitTimer);
1058 pMac->lim.limTimers.gpLimCnfWaitTimer = NULL;
1059 vos_mem_free(pMac->lim.gpSession);
1060 pMac->lim.gpSession = NULL;
1061 vos_mem_free(pMac->pmm.gPmmTim.pTim);
1062 pMac->pmm.gPmmTim.pTim = NULL;
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08001063 return eSIR_FAILURE;
1064 }
Venkata Prathyusha Kuntupalli22ba5982013-04-24 13:09:20 -07001065 pMac->lim.deauthMsgCnt = 0;
Agarwal Ashishb4ce9922014-11-04 18:40:38 +05301066 pMac->lim.retryPacketCnt = 0;
Sushant Kaushike06bd872015-03-12 16:17:48 +05301067 pMac->lim.gLimIbssRetryCnt = 0;
Leela Venkata Kiran Kumar Reddy Chirala57af2692013-04-10 22:39:51 -07001068
1069 /*
1070 * peOpen is successful by now, so it is right time to initialize
1071 * MTRACE for PE module. if LIM_TRACE_RECORD is not defined in build file
1072 * then nothing will be logged for PE module.
1073 */
1074#ifdef LIM_TRACE_RECORD
1075 MTRACE(limTraceInit(pMac));
1076#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001077 return eSIR_SUCCESS;
1078}
1079
1080/** -------------------------------------------------------------
1081\fn peClose
1082\brief will be called in close sequence from macClose
1083\param tpAniSirGlobal pMac
1084\return tSirRetStatus
1085 -------------------------------------------------------------*/
1086
1087tSirRetStatus peClose(tpAniSirGlobal pMac)
1088{
1089 tANI_U8 i;
1090
1091 if (ANI_DRIVER_TYPE(pMac) == eDRIVER_TYPE_MFG)
1092 return eSIR_SUCCESS;
Katya Nigam53799202014-12-18 15:59:38 +05301093
1094 vos_spin_lock_destroy( &pMac->sys.lock );
1095
Jeff Johnson295189b2012-06-20 16:38:30 -07001096 for(i =0; i < pMac->lim.maxBssId; i++)
1097 {
1098 if(pMac->lim.gpSession[i].valid == TRUE)
1099 {
1100 peDeleteSession(pMac,&pMac->lim.gpSession[i]);
1101 }
1102 }
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301103 vos_mem_free(pMac->lim.limTimers.gpLimCnfWaitTimer);
Jeff Johnsone7245742012-09-05 17:12:55 -07001104 pMac->lim.limTimers.gpLimCnfWaitTimer = NULL;
Gopichand Nakkala777e6032012-12-31 16:39:21 -08001105#if 0
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301106 vos_mem_free(pMac->lim.gpLimAIDpool);
Jeff Johnsone7245742012-09-05 17:12:55 -07001107 pMac->lim.gpLimAIDpool = NULL;
Gopichand Nakkala777e6032012-12-31 16:39:21 -08001108#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07001109
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301110 vos_mem_free(pMac->lim.gpSession);
Jeff Johnson295189b2012-06-20 16:38:30 -07001111 pMac->lim.gpSession = NULL;
1112 /*
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301113 vos_mem_free(pMac->dph.dphHashTable.pHashTable);
Jeff Johnson295189b2012-06-20 16:38:30 -07001114 pMac->dph.dphHashTable.pHashTable = NULL;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301115 vos_mem_free(pMac->dph.dphHashTable.pDphNodeArray);
Jeff Johnson295189b2012-06-20 16:38:30 -07001116 pMac->dph.dphHashTable.pDphNodeArray = NULL;
1117 */
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301118 vos_mem_free(pMac->pmm.gPmmTim.pTim);
Jeff Johnson295189b2012-06-20 16:38:30 -07001119 pMac->pmm.gPmmTim.pTim = NULL;
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08001120 if( !VOS_IS_STATUS_SUCCESS( vos_lock_destroy( &pMac->lim.lkPeGlobalLock ) ) )
1121 {
1122 return eSIR_FAILURE;
1123 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001124 return eSIR_SUCCESS;
1125}
1126
1127/** -------------------------------------------------------------
1128\fn peStart
1129\brief will be called in start sequence from macStart
1130\param tpAniSirGlobal pMac
1131\return none
1132 -------------------------------------------------------------*/
1133
1134tSirRetStatus peStart(tpAniSirGlobal pMac)
1135{
1136 tSirRetStatus status = eSIR_SUCCESS;
1137
1138 status = limInitialize(pMac);
1139#if defined(ANI_LOGDUMP)
1140 limDumpInit(pMac);
1141#endif //#if defined(ANI_LOGDUMP)
1142
1143 return status;
1144}
1145
1146/** -------------------------------------------------------------
1147\fn peStop
1148\brief will be called in stop sequence from macStop
1149\param tpAniSirGlobal pMac
1150\return none
1151 -------------------------------------------------------------*/
1152
1153void peStop(tpAniSirGlobal pMac)
1154{
1155 limCleanup(pMac);
1156 SET_LIM_MLM_STATE(pMac, eLIM_MLM_OFFLINE_STATE);
1157 return;
1158}
1159
1160/** -------------------------------------------------------------
1161\fn peFreeMsg
1162\brief Called by VOS scheduler (function vos_sched_flush_mc_mqs)
1163\ to free a given PE message on the TX and MC thread.
1164\ This happens when there are messages pending in the PE
1165\ queue when system is being stopped and reset.
1166\param tpAniSirGlobal pMac
1167\param tSirMsgQ pMsg
1168\return none
1169-----------------------------------------------------------------*/
1170v_VOID_t peFreeMsg( tpAniSirGlobal pMac, tSirMsgQ* pMsg)
1171{
1172 if (pMsg != NULL)
1173 {
1174 if (NULL != pMsg->bodyptr)
1175 {
1176 if (SIR_BB_XPORT_MGMT_MSG == pMsg->type)
1177 {
1178 vos_pkt_return_packet((vos_pkt_t *)pMsg->bodyptr);
1179 }
1180 else
1181 {
1182 vos_mem_free((v_VOID_t*)pMsg->bodyptr);
1183 }
1184 }
1185 pMsg->bodyptr = 0;
1186 pMsg->bodyval = 0;
1187 pMsg->type = 0;
1188 }
1189 return;
1190}
1191
1192
1193/**
1194 * The function checks if a particular timer should be allowed
1195 * into LIM while device is sleeping
1196 */
1197tANI_U8 limIsTimerAllowedInPowerSaveState(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
1198{
1199 tANI_U8 retStatus = TRUE;
1200
1201 if(!limIsSystemInActiveState(pMac))
1202 {
1203 switch(pMsg->type)
1204 {
1205 /* Don't allow following timer messages if in sleep */
1206 case SIR_LIM_MIN_CHANNEL_TIMEOUT:
1207 case SIR_LIM_MAX_CHANNEL_TIMEOUT:
1208 case SIR_LIM_PERIODIC_PROBE_REQ_TIMEOUT:
1209 retStatus = FALSE;
1210 break;
1211 /* May allow following timer messages in sleep mode */
Jeff Johnson295189b2012-06-20 16:38:30 -07001212
1213 /* Safe to allow as of today, this triggers background scan
1214 * which will not be started if the device is in power-save mode
1215 * might need to block in the future if we decide to implement
1216 * spectrum management
1217 */
1218 case SIR_LIM_QUIET_TIMEOUT:
1219
1220 /* Safe to allow as of today, this triggers background scan
1221 * which will not be started if the device is in power-save mode
1222 * might need to block in the future if we decide to implement
1223 * spectrum management
1224 */
1225 case SIR_LIM_QUIET_BSS_TIMEOUT:
1226
1227 /* Safe to allow this timermessage, triggers background scan
1228 * which is blocked in sleep mode
1229 */
1230 case SIR_LIM_CHANNEL_SCAN_TIMEOUT:
1231
1232 /* Safe to allow this timer, since, while in IMPS this timer will not
1233 * be started. In case of BMPS sleep, SoftMAC handles the heart-beat
1234 * when heart-beat control is handled back to PE, device would have
1235 * already woken-up due to EXIT_BMPS_IND mesage from SoftMAC
1236 */
1237 case SIR_LIM_HEART_BEAT_TIMEOUT:
1238 case SIR_LIM_PROBE_HB_FAILURE_TIMEOUT:
1239
1240 /* Safe to allow, PE is not handling this message as of now. May need
1241 * to block it, basically, free the buffer and restart the timer
1242 */
1243 case SIR_LIM_REASSOC_FAIL_TIMEOUT:
1244 case SIR_LIM_JOIN_FAIL_TIMEOUT:
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08001245 case SIR_LIM_PERIODIC_JOIN_PROBE_REQ_TIMEOUT:
Jeff Johnson295189b2012-06-20 16:38:30 -07001246 case SIR_LIM_ASSOC_FAIL_TIMEOUT:
1247 case SIR_LIM_AUTH_FAIL_TIMEOUT:
1248 case SIR_LIM_ADDTS_RSP_TIMEOUT:
Sushant Kaushik9e923872015-04-02 17:09:31 +05301249 case SIR_LIM_AUTH_RETRY_TIMEOUT:
Jeff Johnson295189b2012-06-20 16:38:30 -07001250 retStatus = TRUE;
1251 break;
1252
1253 /* by default allow rest of messages */
1254 default:
1255 retStatus = TRUE;
1256 break;
1257
1258
1259 }
1260 }
1261
1262 return retStatus;
1263
1264}
1265
1266
1267
1268/**
1269 * limPostMsgApi()
1270 *
1271 *FUNCTION:
1272 * This function is called from other thread while posting a
1273 * message to LIM message Queue gSirLimMsgQ.
1274 *
1275 *LOGIC:
1276 * NA
1277 *
1278 *ASSUMPTIONS:
1279 * NA
1280 *
1281 *NOTE:
1282 * NA
1283 *
1284 * @param pMac - Pointer to Global MAC structure
1285 * @param pMsg - Pointer to the message structure
1286 * @return None
1287 */
1288
1289tANI_U32
1290limPostMsgApi(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
1291{
Jeff Johnson295189b2012-06-20 16:38:30 -07001292 return vos_mq_post_message(VOS_MQ_ID_PE, (vos_msg_t *) pMsg);
1293
1294
Jeff Johnson295189b2012-06-20 16:38:30 -07001295} /*** end limPostMsgApi() ***/
1296
1297
1298/*--------------------------------------------------------------------------
1299
1300 \brief pePostMsgApi() - A wrapper function to post message to Voss msg queues
1301
1302 This function can be called by legacy code to post message to voss queues OR
1303 legacy code may keep on invoking 'limPostMsgApi' to post the message to voss queue
1304 for dispatching it later.
1305
1306 \param pMac - Pointer to Global MAC structure
1307 \param pMsg - Pointer to the message structure
1308
1309 \return tANI_U32 - TX_SUCCESS for success.
1310
1311 --------------------------------------------------------------------------*/
1312
1313tSirRetStatus pePostMsgApi(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
1314{
1315 return (tSirRetStatus)limPostMsgApi(pMac, pMsg);
1316}
1317
1318/*--------------------------------------------------------------------------
1319
1320 \brief peProcessMessages() - Message Processor for PE
1321
1322 Voss calls this function to dispatch the message to PE
1323
1324 \param pMac - Pointer to Global MAC structure
1325 \param pMsg - Pointer to the message structure
1326
1327 \return tANI_U32 - TX_SUCCESS for success.
1328
1329 --------------------------------------------------------------------------*/
1330
1331tSirRetStatus peProcessMessages(tpAniSirGlobal pMac, tSirMsgQ* pMsg)
1332{
1333 if(pMac->gDriverType == eDRIVER_TYPE_MFG)
1334 {
1335 return eSIR_SUCCESS;
1336 }
1337 /**
1338 * If the Message to be handled is for CFG Module call the CFG Msg Handler and
1339 * for all the other cases post it to LIM
1340 */
1341 if ( SIR_CFG_PARAM_UPDATE_IND != pMsg->type && IS_CFG_MSG(pMsg->type))
1342 cfgProcessMbMsg(pMac, (tSirMbMsg*)pMsg->bodyptr);
1343 else
1344 limMessageProcessor(pMac, pMsg);
1345 return eSIR_SUCCESS;
1346}
1347
Katya Nigam53799202014-12-18 15:59:38 +05301348#define RSRVD_MGMT_RX_PACKETS 10
Jeff Johnson295189b2012-06-20 16:38:30 -07001349
1350// ---------------------------------------------------------------------------
1351/**
1352 * peHandleMgmtFrame
1353 *
1354 * FUNCTION:
1355 * Process the Management frames from TL
1356 *
1357 * LOGIC:
1358 *
1359 * ASSUMPTIONS: TL sends the packet along with the VOS GlobalContext
1360 *
1361 * NOTE:
1362 *
1363 * @param pvosGCtx Global Vos Context
1364 * @param vossBuff Packet
1365 * @return None
1366 */
1367
1368VOS_STATUS peHandleMgmtFrame( v_PVOID_t pvosGCtx, v_PVOID_t vosBuff)
1369{
1370 tpAniSirGlobal pMac;
1371 tpSirMacMgmtHdr mHdr;
1372 tSirMsgQ msg;
1373 vos_pkt_t *pVosPkt;
1374 VOS_STATUS vosStatus;
1375 v_U8_t *pRxPacketInfo;
1376
1377 pVosPkt = (vos_pkt_t *)vosBuff;
1378 if (NULL == pVosPkt)
1379 {
1380 return VOS_STATUS_E_FAILURE;
1381 }
1382
1383 pMac = (tpAniSirGlobal)vos_get_context(VOS_MODULE_ID_PE, pvosGCtx);
1384 if (NULL == pMac)
1385 {
1386 // cannot log a failure without a valid pMac
1387 vos_pkt_return_packet(pVosPkt);
1388 return VOS_STATUS_E_FAILURE;
1389 }
1390
1391 vosStatus = WDA_DS_PeekRxPacketInfo( pVosPkt, (void *)&pRxPacketInfo, VOS_FALSE );
1392
1393 if(!VOS_IS_STATUS_SUCCESS(vosStatus))
1394 {
1395 vos_pkt_return_packet(pVosPkt);
1396 return VOS_STATUS_E_FAILURE;
1397 }
1398
1399
1400 //
1401 // The MPDU header is now present at a certain "offset" in
1402 // the BD and is specified in the BD itself
1403 //
1404 mHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
1405 if(mHdr->fc.type == SIR_MAC_MGMT_FRAME)
1406 {
1407 PELOG1(limLog( pMac, LOG1,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001408 FL ( "RxBd=%p mHdr=%p Type: %d Subtype: %d Sizes:FC%d Mgmt%d"),
Jeff Johnsone7245742012-09-05 17:12:55 -07001409 pRxPacketInfo, mHdr, mHdr->fc.type, mHdr->fc.subType, sizeof(tSirMacFrameCtl), sizeof(tSirMacMgmtHdr) );)
Jeff Johnson295189b2012-06-20 16:38:30 -07001410
Jeff Johnsone7245742012-09-05 17:12:55 -07001411 MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT, NO_SESSION,
Jeff Johnson295189b2012-06-20 16:38:30 -07001412 LIM_TRACE_MAKE_RXMGMT(mHdr->fc.subType,
1413 (tANI_U16) (((tANI_U16) (mHdr->seqControl.seqNumHi << 4)) | mHdr->seqControl.seqNumLo)));)
Padma, Santhosh Kumar30971cf2015-04-06 19:59:37 +05301414
1415#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
1416 if (WDA_GET_ROAMCANDIDATEIND(pRxPacketInfo))
1417 limLog(pMac, LOG1, FL("roamCandidateInd %d"),
1418 WDA_GET_ROAMCANDIDATEIND(pRxPacketInfo));
1419
1420 if (WDA_GET_OFFLOADSCANLEARN(pRxPacketInfo))
1421 limLog(pMac, LOG1, FL("offloadScanLearn %d"),
1422 WDA_GET_OFFLOADSCANLEARN(pRxPacketInfo));
1423#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001424 }
1425
1426
1427 // Forward to MAC via mesg = SIR_BB_XPORT_MGMT_MSG
1428 msg.type = SIR_BB_XPORT_MGMT_MSG;
1429 msg.bodyptr = vosBuff;
1430 msg.bodyval = 0;
1431
Katya Nigam53799202014-12-18 15:59:38 +05301432 vos_spin_lock_acquire( &pMac->sys.lock );
1433 if( pMac->sys.gSysBbtPendingMgmtCount > (vos_pkt_get_num_of_rx_raw_pkts()/4) )
1434 {
1435 vos_spin_lock_release( &pMac->sys.lock );
1436 // drop all management packets
Katya Nigamfdf5a522015-02-03 14:38:55 +05301437 limLog( pMac, LOGW,
1438 FL ( "Management queue 1/4th full, dropping management packets" ));
Katya Nigam53799202014-12-18 15:59:38 +05301439 vos_pkt_return_packet(pVosPkt);
1440 return VOS_STATUS_SUCCESS;
1441 }
1442
1443 if( pMac->sys.gSysBbtPendingMgmtCount > ( vos_pkt_get_num_of_rx_raw_pkts()/4
1444 - RSRVD_MGMT_RX_PACKETS ))
1445 {
1446 // drop all probereq, proberesp and beacons
1447 if( mHdr->fc.subType == SIR_MAC_MGMT_BEACON || mHdr->fc.subType ==
1448 SIR_MAC_MGMT_PROBE_REQ || mHdr->fc.subType == SIR_MAC_MGMT_PROBE_RSP )
1449 {
1450 vos_spin_lock_release( &pMac->sys.lock );
Katya Nigamfdf5a522015-02-03 14:38:55 +05301451 limLog( pMac, LOGW,
1452 FL ( "Dropping probe req, probe resp or beacon" ));
Katya Nigam53799202014-12-18 15:59:38 +05301453 vos_pkt_return_packet(pVosPkt);
1454 return VOS_STATUS_SUCCESS;
1455 }
1456 }
1457 pMac->sys.gSysBbtPendingMgmtCount++;
1458 vos_spin_lock_release( &pMac->sys.lock );
1459
Jeff Johnson295189b2012-06-20 16:38:30 -07001460 if( eSIR_SUCCESS != sysBbtProcessMessageCore( pMac,
1461 &msg,
1462 mHdr->fc.type,
1463 mHdr->fc.subType ))
1464 {
1465 vos_pkt_return_packet(pVosPkt);
Abhishek Singh5d765712015-03-12 14:04:16 +05301466
1467 /* Decrement gSysBbtPendingMgmtCount if packet
1468 * is dropped before posting to LIM
1469 */
1470 limDecrementPendingMgmtCount(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07001471 limLog( pMac, LOGW,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001472 FL ( "sysBbtProcessMessageCore failed to process SIR_BB_XPORT_MGMT_MSG" ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001473 return VOS_STATUS_E_FAILURE;
1474 }
1475
1476 return VOS_STATUS_SUCCESS;
1477}
1478
1479// ---------------------------------------------------------------------------
1480/**
1481 * peRegisterTLHandle
1482 *
1483 * FUNCTION:
1484 * Registers the Handler which, process the Management frames from TL
1485 *
1486 * LOGIC:
1487 *
1488 * ASSUMPTIONS:
1489 *
1490 * NOTE:
1491 *
1492 * @return None
1493 */
1494
1495void peRegisterTLHandle(tpAniSirGlobal pMac)
1496{
1497 v_PVOID_t pvosGCTx;
1498 VOS_STATUS retStatus;
1499
1500 pvosGCTx = vos_get_global_context(VOS_MODULE_ID_PE, (v_VOID_t *) pMac);
1501
1502 retStatus = WLANTL_RegisterMgmtFrmClient(pvosGCTx, peHandleMgmtFrame);
1503
1504 if (retStatus != VOS_STATUS_SUCCESS)
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001505 limLog( pMac, LOGP, FL("Registering the PE Handle with TL has failed bailing out..."));
Jeff Johnson295189b2012-06-20 16:38:30 -07001506
1507}
Jeff Johnson295189b2012-06-20 16:38:30 -07001508
1509
1510/**
Jeff Johnson295189b2012-06-20 16:38:30 -07001511 * limIsSystemInScanState()
1512 *
1513 *FUNCTION:
1514 * This function is called by various MAC software modules to
1515 * determine if System is in Scan/Learn state
1516 *
1517 *LOGIC:
1518 * NA
1519 *
1520 *ASSUMPTIONS:
1521 * NA
1522 *
1523 *NOTE:
1524 *
1525 * @param pMac - Pointer to Global MAC structure
1526 * @return true - System is in Scan/Learn state
1527 * false - System is NOT in Scan/Learn state
1528 */
1529
1530tANI_U8
1531limIsSystemInScanState(tpAniSirGlobal pMac)
1532{
1533 switch (pMac->lim.gLimSmeState)
1534 {
1535 case eLIM_SME_CHANNEL_SCAN_STATE:
1536 case eLIM_SME_NORMAL_CHANNEL_SCAN_STATE:
1537 case eLIM_SME_LINK_EST_WT_SCAN_STATE:
1538 case eLIM_SME_WT_SCAN_STATE:
1539 // System is in Learn mode
1540 return true;
1541
1542 default:
1543 // System is NOT in Learn mode
1544 return false;
1545 }
1546} /*** end limIsSystemInScanState() ***/
1547
1548
1549
1550/**
1551 * limIsSystemInActiveState()
1552 *
1553 *FUNCTION:
1554 * This function is called by various MAC software modules to
1555 * determine if System is in Active/Wakeup state
1556 *
1557 *LOGIC:
1558 * NA
1559 *
1560 *ASSUMPTIONS:
1561 * NA
1562 *
1563 *NOTE:
1564 *
1565 * @param pMac - Pointer to Global MAC structure
1566 * @return true - System is in Active state
1567 * false - System is not in Active state
1568 */
1569
1570tANI_U8 limIsSystemInActiveState(tpAniSirGlobal pMac)
1571{
1572 switch (pMac->pmm.gPmmState)
1573 {
1574 case ePMM_STATE_BMPS_WAKEUP:
1575 case ePMM_STATE_IMPS_WAKEUP:
1576 case ePMM_STATE_READY:
1577 // System is in Active mode
1578 return true;
1579 default:
1580 return false;
1581 // System is NOT in Active mode
1582 }
1583}
1584
1585
Jeff Johnson295189b2012-06-20 16:38:30 -07001586
Jeff Johnson295189b2012-06-20 16:38:30 -07001587
1588
1589/**
1590*\brief limReceivedHBHandler()
1591*
1592* This function is called by schBeaconProcess() upon
1593* receiving a Beacon on STA. This also gets called upon
1594* receiving Probe Response after heat beat failure is
1595* detected.
1596*
1597* param pMac - global mac structure
1598* param channel - channel number indicated in Beacon, Probe Response
1599* return - none
1600*/
1601
1602
1603void
1604limReceivedHBHandler(tpAniSirGlobal pMac, tANI_U8 channelId, tpPESession psessionEntry)
1605{
1606 if((channelId == 0 ) || (channelId == psessionEntry->currentOperChannel) )
1607 psessionEntry->LimRxedBeaconCntDuringHB++;
1608
1609 pMac->pmm.inMissedBeaconScenario = FALSE;
1610} /*** end limReceivedHBHandler() ***/
1611
1612
1613
1614#if 0
1615void limResetHBPktCount(tpPESession psessionEntry)
1616{
1617 psessionEntry->LimRxedBeaconCntDuringHB = 0;
1618}
1619#endif
1620
1621
1622/*
1623 * limProcessWdsInfo()
1624 *
1625 *FUNCTION:
1626 * This function is called from schBeaconProcess in BP
1627 *
1628 *PARAMS:
1629 * @param pMac - Pointer to Global MAC structure
1630 * @param propIEInfo - proprietary IE info
1631 *
1632 *LOGIC:
1633 *
1634 *ASSUMPTIONS:
1635 * NA
1636 *
1637 *NOTE:
1638 *
1639 *
1640 *RETURNS:
1641 *
1642 */
1643
1644void limProcessWdsInfo(tpAniSirGlobal pMac,
1645 tSirPropIEStruct propIEInfo)
1646{
Jeff Johnson295189b2012-06-20 16:38:30 -07001647}
1648
1649
1650
1651/**
1652 * limInitWdsInfoParams()
1653 *
1654 *FUNCTION:
1655 * This function is called while processing
1656 * START_BSS/JOIN/REASSOC_REQ to initialize WDS info
1657 * ind/set related parameters.
1658 *
1659 *LOGIC:
1660 *
1661 *ASSUMPTIONS:
1662 *
1663 *NOTE:
1664 *
1665 * @param pMac Pointer to Global MAC structure
1666 * @return None
1667 */
1668
1669void
1670limInitWdsInfoParams(tpAniSirGlobal pMac)
1671{
1672 pMac->lim.gLimWdsInfo.wdsLength = 0;
1673 pMac->lim.gLimNumWdsInfoInd = 0;
1674 pMac->lim.gLimNumWdsInfoSet = 0;
1675} /*** limInitWdsInfoParams() ***/
1676
1677
1678/** -------------------------------------------------------------
1679\fn limUpdateOverlapStaParam
1680\brief Updates overlap cache and param data structure
1681\param tpAniSirGlobal pMac
1682\param tSirMacAddr bssId
1683\param tpLimProtStaParams pStaParams
1684\return None
1685 -------------------------------------------------------------*/
1686void
1687limUpdateOverlapStaParam(tpAniSirGlobal pMac, tSirMacAddr bssId, tpLimProtStaParams pStaParams)
1688{
1689 int i;
1690 if (!pStaParams->numSta)
1691 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301692 vos_mem_copy(pMac->lim.protStaOverlapCache[0].addr,
1693 bssId,
1694 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001695 pMac->lim.protStaOverlapCache[0].active = true;
1696
1697 pStaParams->numSta = 1;
1698
1699 return;
1700 }
1701
1702 for (i=0; i<LIM_PROT_STA_OVERLAP_CACHE_SIZE; i++)
1703 {
1704 if (pMac->lim.protStaOverlapCache[i].active)
1705 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301706 if (vos_mem_compare( pMac->lim.protStaOverlapCache[i].addr,
Jeff Johnson295189b2012-06-20 16:38:30 -07001707 bssId,
1708 sizeof(tSirMacAddr))) {
1709 return; }
1710 }
1711 else
1712 break;
1713 }
1714
1715 if (i == LIM_PROT_STA_OVERLAP_CACHE_SIZE)
1716 {
Shake M Subhani5d80fda2013-12-09 17:28:23 +05301717 PELOG1(limLog(pMac, LOGW, FL("Overlap cache is full"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001718 }
1719 else
1720 {
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301721 vos_mem_copy(pMac->lim.protStaOverlapCache[i].addr,
1722 bssId,
1723 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001724 pMac->lim.protStaOverlapCache[i].active = true;
1725
1726 pStaParams->numSta++;
1727 }
1728}
1729
1730
1731/**
1732 * limHandleIBSScoalescing()
1733 *
1734 *FUNCTION:
1735 * This function is called upon receiving Beacon/Probe Response
1736 * while operating in IBSS mode.
1737 *
1738 *LOGIC:
1739 *
1740 *ASSUMPTIONS:
1741 *
1742 *NOTE:
1743 *
1744 * @param pMac - Pointer to Global MAC structure
1745 * @param pBeacon - Parsed Beacon Frame structure
1746 * @param pRxPacketInfo - Pointer to RX packet info structure
1747 *
1748 * @return Status whether to process or ignore received Beacon Frame
1749 */
1750
1751tSirRetStatus
1752limHandleIBSScoalescing(
1753 tpAniSirGlobal pMac,
1754 tpSchBeaconStruct pBeacon,
1755 tANI_U8 *pRxPacketInfo,tpPESession psessionEntry)
1756{
1757 tpSirMacMgmtHdr pHdr;
1758 tSirRetStatus retCode;
1759
1760 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
Ravi Joshi2c83c7e2013-10-29 10:21:08 -07001761 if ( (!pBeacon->capabilityInfo.ibss) ||
Abhishek Singhd5c31272014-03-07 14:46:50 +05301762 ( psessionEntry->privacy !=
1763 (tANI_U8)pBeacon->capabilityInfo.privacy ) ||
Ravi Joshi2c83c7e2013-10-29 10:21:08 -07001764 (limCmpSSid(pMac, &pBeacon->ssId,psessionEntry) != true) ||
1765 (psessionEntry->currentOperChannel != pBeacon->channelNumber) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001766 /* Received SSID does not match => Ignore received Beacon frame. */
1767 retCode = eSIR_LIM_IGNORE_BEACON;
1768 else
1769 {
1770 tANI_U32 ieLen;
1771 tANI_U16 tsfLater;
1772 tANI_U8 *pIEs;
1773 ieLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
1774 tsfLater = WDA_GET_RX_TSF_LATER(pRxPacketInfo);
1775 pIEs = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
Abhishek Singh127a8442014-12-15 17:31:27 +05301776 limLog(pMac, LOG1, FL("BEFORE Coalescing tsfLater val :%d"), tsfLater);
Jeff Johnson295189b2012-06-20 16:38:30 -07001777 retCode = limIbssCoalesce(pMac, pHdr, pBeacon, pIEs, ieLen, tsfLater,psessionEntry);
1778 }
1779 return retCode;
1780} /*** end limHandleIBSScoalescing() ***/
1781
Abhishek Singh5fef4042014-11-25 18:33:00 +05301782tAniBool limEncTypeMatched(tpAniSirGlobal pMac, tpSchBeaconStruct pBeacon,
1783 tpPESession pSession)
1784{
1785 if (!pBeacon || !pSession)
1786 return eSIR_FALSE;
1787
1788 limLog(pMac, LOG1,
1789 FL("Beacon/Probe:: Privacy :%d WPA Present:%d RSN Present: %d"),
1790 pBeacon->capabilityInfo.privacy, pBeacon->wpaPresent,
1791 pBeacon->rsnPresent);
1792 limLog(pMac, LOG1,
1793 FL("pSession:: Privacy :%d EncyptionType: %d"),
1794 SIR_MAC_GET_PRIVACY(pSession->limCurrentBssCaps),
1795 pSession->encryptType);
1796
1797 /* This is handled by sending probe req due to IOT issues so return TRUE
1798 */
1799 if ( (pBeacon->capabilityInfo.privacy) !=
1800 SIR_MAC_GET_PRIVACY(pSession->limCurrentBssCaps))
1801 {
1802 limLog(pMac, LOG1, FL("Return for Privacy bit miss match, As "
1803 "for this driver need to send the probe request to handle"
1804 " IOT issues "));
1805 return eSIR_TRUE;
1806 }
1807
1808 /*Open*/
1809 if( (pBeacon->capabilityInfo.privacy == 0) &&
1810 (pSession->encryptType == eSIR_ED_NONE))
1811 return eSIR_TRUE;
1812
1813 /* WEP */
1814 if ( (pBeacon->capabilityInfo.privacy == 1) && (pBeacon->wpaPresent == 0) &&
1815 (pBeacon->rsnPresent == 0) &&
Abhishek Singh31dfa3c2014-12-12 17:25:19 +05301816 ( ( pSession->encryptType == eSIR_ED_WEP40 ) ||
1817 ( pSession->encryptType == eSIR_ED_WEP104 )
1818#ifdef FEATURE_WLAN_WAPI
1819 || ( pSession->encryptType == eSIR_ED_WPI )
1820#endif
1821 ))
Abhishek Singh5fef4042014-11-25 18:33:00 +05301822 return eSIR_TRUE;
1823
1824 /* WPA OR RSN*/
1825 if ( (pBeacon->capabilityInfo.privacy == 1) &&
1826 ( (pBeacon->wpaPresent == 1) ||
1827 ( pBeacon->rsnPresent == 1)) &&
1828 ( (pSession->encryptType == eSIR_ED_TKIP) ||
1829 (pSession->encryptType == eSIR_ED_CCMP) ||
1830 (pSession->encryptType == eSIR_ED_AES_128_CMAC)))
1831 return eSIR_TRUE;
1832
Sushant Kaushik74df8db2015-03-11 18:09:05 +05301833 /* For HS2.0, RSN ie is not present
1834 * in beacon. Therefore no need to
1835 * check for security type in case
1836 * OSEN session.
1837 */
1838 /*TODO: AP capability mismatch
1839 * is not checked here because
1840 * no logic for beacon parsing
1841 * is avilable for HS2.0.
1842 */
1843 if (pSession->bOSENAssociation)
1844 return eSIR_TRUE;
1845
Abhishek Singh5fef4042014-11-25 18:33:00 +05301846 return eSIR_FALSE;
1847}
Jeff Johnson295189b2012-06-20 16:38:30 -07001848
1849
1850/**
1851 * limDetectChangeInApCapabilities()
1852 *
1853 *FUNCTION:
1854 * This function is called while SCH is processing
1855 * received Beacon from AP on STA to detect any
1856 * change in AP's capabilities. If there any change
1857 * is detected, Roaming is informed of such change
1858 * so that it can trigger reassociation.
1859 *
1860 *LOGIC:
1861 *
1862 *ASSUMPTIONS:
1863 *
1864 *NOTE:
1865 * Notification is enabled for STA product only since
1866 * it is not a requirement on BP side.
1867 *
1868 * @param pMac Pointer to Global MAC structure
1869 * @param pBeacon Pointer to parsed Beacon structure
1870 * @return None
1871 */
1872
1873void
1874limDetectChangeInApCapabilities(tpAniSirGlobal pMac,
1875 tpSirProbeRespBeacon pBeacon,
1876 tpPESession psessionEntry)
1877{
Jeff Johnson295189b2012-06-20 16:38:30 -07001878 tANI_U8 len;
1879 tSirSmeApNewCaps apNewCaps;
1880 tANI_U8 newChannel;
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301881 tSirRetStatus status = eSIR_SUCCESS;
Abhishek Singh5fef4042014-11-25 18:33:00 +05301882 tAniBool securityCapsMatched = eSIR_TRUE;
1883
Jeff Johnson295189b2012-06-20 16:38:30 -07001884 apNewCaps.capabilityInfo = limGetU16((tANI_U8 *) &pBeacon->capabilityInfo);
1885 newChannel = (tANI_U8) pBeacon->channelNumber;
1886
Abhishek Singh5fef4042014-11-25 18:33:00 +05301887 securityCapsMatched = limEncTypeMatched(pMac, pBeacon, psessionEntry);
1888
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301889 if ( ( false == psessionEntry->limSentCapsChangeNtf ) &&
Abhishek Singh4f8446a2014-05-22 14:07:31 +05301890 ( ( ( !limIsNullSsid(&pBeacon->ssId) ) &&
1891 ( false == limCmpSSid(pMac, &pBeacon->ssId, psessionEntry) ) ) ||
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301892 ( (SIR_MAC_GET_ESS(apNewCaps.capabilityInfo) !=
1893 SIR_MAC_GET_ESS(psessionEntry->limCurrentBssCaps) ) ||
1894 ( SIR_MAC_GET_PRIVACY(apNewCaps.capabilityInfo) !=
1895 SIR_MAC_GET_PRIVACY(psessionEntry->limCurrentBssCaps) ) ||
1896 ( SIR_MAC_GET_SHORT_PREAMBLE(apNewCaps.capabilityInfo) !=
1897 SIR_MAC_GET_SHORT_PREAMBLE(psessionEntry->limCurrentBssCaps) ) ||
1898 ( SIR_MAC_GET_QOS(apNewCaps.capabilityInfo) !=
1899 SIR_MAC_GET_QOS(psessionEntry->limCurrentBssCaps) ) ||
Abhishek Singh5fef4042014-11-25 18:33:00 +05301900 ( newChannel != psessionEntry->currentOperChannel ) ||
1901 (eSIR_FALSE == securityCapsMatched)
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301902 ) ) )
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301903 {
Abhishek Singha9325f72015-01-05 11:49:23 +05301904 if ( false == psessionEntry->fWaitForProbeRsp )
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301905 {
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301906 /* If Beacon capabilities is not matching with the current capability,
1907 * then send unicast probe request to AP and take decision after
1908 * receiving probe response */
1909 if ( true == psessionEntry->fIgnoreCapsChange )
1910 {
1911 limLog(pMac, LOGW, FL("Ignoring the Capability change as it is false alarm"));
1912 return;
1913 }
1914 psessionEntry->fWaitForProbeRsp = true;
1915 limLog(pMac, LOGW, FL("AP capabilities are not matching,"
1916 "sending directed probe request.. "));
1917 status = limSendProbeReqMgmtFrame(pMac, &psessionEntry->ssId, psessionEntry->bssId,
1918 psessionEntry->currentOperChannel,psessionEntry->selfMacAddr,
1919 psessionEntry->dot11mode, 0, NULL);
1920
1921 if ( eSIR_SUCCESS != status )
1922 {
1923 limLog(pMac, LOGE, FL("send ProbeReq failed"));
1924 psessionEntry->fWaitForProbeRsp = false;
1925 }
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301926 return;
1927 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001928 /**
1929 * BSS capabilities have changed.
1930 * Inform Roaming.
1931 */
1932 len = sizeof(tSirMacCapabilityInfo) +
1933 sizeof(tSirMacAddr) + sizeof(tANI_U8) +
1934 3 * sizeof(tANI_U8) + // reserved fields
1935 pBeacon->ssId.length + 1;
1936
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301937 vos_mem_copy(apNewCaps.bssId,
1938 psessionEntry->bssId,
1939 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001940 if (newChannel != psessionEntry->currentOperChannel)
1941 {
1942 PELOGE(limLog(pMac, LOGE, FL("Channel Change from %d --> %d - "
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001943 "Ignoring beacon!"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001944 psessionEntry->currentOperChannel, newChannel);)
1945 return;
1946 }
Madan Mohan Koyyalamudi84479982013-01-24 17:58:05 +05301947
1948 /**
1949 * When Cisco 1262 Enterprise APs are configured with WPA2-PSK with
1950 * AES+TKIP Pairwise ciphers and WEP-40 Group cipher, they do not set
1951 * the privacy bit in Beacons (wpa/rsnie is still present in beacons),
1952 * the privacy bit is set in Probe and association responses.
1953 * Due to this anomaly, we detect a change in
1954 * AP capabilities when we receive a beacon after association and
1955 * disconnect from the AP. The following check makes sure that we can
1956 * connect to such APs
1957 */
1958 else if ((SIR_MAC_GET_PRIVACY(apNewCaps.capabilityInfo) == 0) &&
1959 (pBeacon->rsnPresent || pBeacon->wpaPresent))
1960 {
1961 PELOGE(limLog(pMac, LOGE, FL("BSS Caps (Privacy) bit 0 in beacon,"
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07001962 " but WPA or RSN IE present, Ignore Beacon!"));)
Madan Mohan Koyyalamudi84479982013-01-24 17:58:05 +05301963 return;
1964 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001965 else
1966 apNewCaps.channelId = psessionEntry->currentOperChannel;
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05301967 vos_mem_copy((tANI_U8 *) &apNewCaps.ssId,
1968 (tANI_U8 *) &pBeacon->ssId,
Jeff Johnson295189b2012-06-20 16:38:30 -07001969 pBeacon->ssId.length + 1);
1970
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +05301971 psessionEntry->fIgnoreCapsChange = false;
1972 psessionEntry->fWaitForProbeRsp = false;
Jeff Johnson295189b2012-06-20 16:38:30 -07001973 psessionEntry->limSentCapsChangeNtf = true;
1974 limSendSmeWmStatusChangeNtf(pMac, eSIR_SME_AP_CAPS_CHANGED,
1975 (tANI_U32 *) &apNewCaps,
1976 len, psessionEntry->smeSessionId);
1977 }
Abhishek Singh4136e4e2013-12-15 11:56:29 +05301978 else if ( true == psessionEntry->fWaitForProbeRsp )
1979 {
1980 /* Only for probe response frames and matching capabilities the control
1981 * will come here. If beacon is with broadcast ssid then fWaitForProbeRsp
1982 * will be false, the control will not come here*/
1983
1984 limLog(pMac, LOG1, FL("capabilities in probe response are"
1985 "matching with the current setting,"
1986 "Ignoring subsequent capability"
1987 "mismatch"));
1988 psessionEntry->fIgnoreCapsChange = true;
1989 psessionEntry->fWaitForProbeRsp = false;
1990 }
1991
Jeff Johnson295189b2012-06-20 16:38:30 -07001992} /*** limDetectChangeInApCapabilities() ***/
1993
1994
1995
1996
1997// ---------------------------------------------------------------------
1998/**
1999 * limUpdateShortSlot
2000 *
2001 * FUNCTION:
2002 * Enable/Disable short slot
2003 *
2004 * LOGIC:
2005 *
2006 * ASSUMPTIONS:
2007 *
2008 * NOTE:
2009 *
2010 * @param enable Flag to enable/disable short slot
2011 * @return None
2012 */
2013
2014tSirRetStatus limUpdateShortSlot(tpAniSirGlobal pMac, tpSirProbeRespBeacon pBeacon, tpUpdateBeaconParams pBeaconParams,tpPESession psessionEntry)
2015{
2016
2017 tSirSmeApNewCaps apNewCaps;
Jeff Johnsone7245742012-09-05 17:12:55 -07002018 tANI_U32 nShortSlot;
2019 tANI_U32 val = 0;
2020 tANI_U32 phyMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07002021
Jeff Johnsone7245742012-09-05 17:12:55 -07002022 // Check Admin mode first. If it is disabled just return
2023 if (wlan_cfgGetInt(pMac, WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED, &val)
2024 != eSIR_SUCCESS)
2025 {
2026 limLog(pMac, LOGP,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002027 FL("cfg get WNI_CFG_11G_SHORT_SLOT_TIME failed"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002028 return eSIR_FAILURE;
2029 }
2030 if (val == false)
2031 return eSIR_SUCCESS;
2032
2033 // Check for 11a mode or 11b mode. In both cases return since slot time is constant and cannot/should not change in beacon
2034 limGetPhyMode(pMac, &phyMode, psessionEntry);
2035 if ((phyMode == WNI_CFG_PHY_MODE_11A) || (phyMode == WNI_CFG_PHY_MODE_11B))
2036 return eSIR_SUCCESS;
2037
2038 apNewCaps.capabilityInfo = limGetU16((tANI_U8 *) &pBeacon->capabilityInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -07002039
2040 // Earlier implementation: determine the appropriate short slot mode based on AP advertised modes
2041 // when erp is present, apply short slot always unless, prot=on && shortSlot=off
2042 // if no erp present, use short slot based on current ap caps
2043
2044 // Issue with earlier implementation : Cisco 1231 BG has shortSlot = 0, erpIEPresent and useProtection = 0 (Case4);
2045
2046 //Resolution : always use the shortSlot setting the capability info to decide slot time.
2047 // The difference between the earlier implementation and the new one is only Case4.
2048 /*
2049 ERP IE Present | useProtection | shortSlot = QC STA Short Slot
2050 Case1 1 1 1 1 //AP should not advertise this combination.
2051 Case2 1 1 0 0
2052 Case3 1 0 1 1
2053 Case4 1 0 0 0
2054 Case5 0 1 1 1
2055 Case6 0 1 0 0
2056 Case7 0 0 1 1
2057 Case8 0 0 0 0
2058 */
2059 nShortSlot = SIR_MAC_GET_SHORT_SLOT_TIME(apNewCaps.capabilityInfo);
2060
Jeff Johnsone7245742012-09-05 17:12:55 -07002061 if (nShortSlot != psessionEntry->shortSlotTimeSupported)
Jeff Johnson295189b2012-06-20 16:38:30 -07002062 {
2063 // Short slot time capability of AP has changed. Adopt to it.
Abhishek Singh3cbf6052014-12-15 16:46:42 +05302064 limLog(pMac, LOG1, FL("Shortslot capability of AP changed: %d"), nShortSlot);
Jeff Johnson295189b2012-06-20 16:38:30 -07002065 ((tpSirMacCapabilityInfo)&psessionEntry->limCurrentBssCaps)->shortSlotTime = (tANI_U16)nShortSlot;
Jeff Johnsone7245742012-09-05 17:12:55 -07002066 psessionEntry->shortSlotTimeSupported = nShortSlot;
Jeff Johnson295189b2012-06-20 16:38:30 -07002067 pBeaconParams->fShortSlotTime = (tANI_U8) nShortSlot;
2068 pBeaconParams->paramChangeBitmap |= PARAM_SHORT_SLOT_TIME_CHANGED;
Jeff Johnson295189b2012-06-20 16:38:30 -07002069 }
2070 return eSIR_SUCCESS;
2071}
2072
2073
Jeff Johnson295189b2012-06-20 16:38:30 -07002074
2075
Jeff Johnson295189b2012-06-20 16:38:30 -07002076
Jeff Johnson295189b2012-06-20 16:38:30 -07002077
2078
2079/** -----------------------------------------------------------------
2080 \brief limHandleLowRssiInd() - handles low rssi indication
2081
2082 This function process the SIR_HAL_LOW_RSSI_IND message from
2083 HAL, and sends a eWNI_SME_LOW_RSSI_IND to CSR.
2084
2085 \param pMac - global mac structure
2086
2087 \return
2088
2089 \sa
2090 ----------------------------------------------------------------- */
2091void limHandleLowRssiInd(tpAniSirGlobal pMac)
2092{
2093#if 0 //RSSI related indications will now go to TL and not PE
2094 if ( (pMac->pmm.gPmmState == ePMM_STATE_BMPS_SLEEP) ||
2095 (pMac->pmm.gPmmState == ePMM_STATE_UAPSD_SLEEP)||
2096 (pMac->pmm.gPmmState == ePMM_STATE_WOWLAN) )
2097 {
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002098 PELOG1(limLog(pMac, LOG1, FL("Sending LOW_RSSI_IND to SME "));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002099 limSendSmeRsp(pMac, eWNI_SME_LOW_RSSI_IND, eSIR_SME_SUCCESS, 0, 0);
2100 }
2101 else
2102 {
2103 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002104 FL("Received SIR_HAL_LOW_RSSI_IND while in incorrect state: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002105 pMac->pmm.gPmmState);
2106 }
2107 return;
2108#endif
2109}
2110
2111
2112/** -----------------------------------------------------------------
2113 \brief limHandleBmpsStatusInd() - handles BMPS status indication
2114
2115 This function process the SIR_HAL_BMPS_STATUS_IND message from HAL,
2116 and invokes limSendExitBmpsInd( ) to send an eWNI_PMC_EXIT_BMPS_IND
2117 to SME with reason code 'eSME_EXIT_BMPS_IND_RCVD'.
2118
2119 HAL sends this message when Firmware fails to enter BMPS mode 'AFTER'
2120 HAL had already send PE a SIR_HAL_ENTER_BMPS_RSP with status
2121 code "success". Hence, HAL needs to notify PE to get out of BMPS mode.
2122 This message can also come from FW anytime after we have entered BMPS.
2123 This means we should handle it in WoWL and UAPSD states as well
2124
2125 \param pMac - global mac structure
2126 \return - none
2127 \sa
2128 ----------------------------------------------------------------- */
2129void limHandleBmpsStatusInd(tpAniSirGlobal pMac)
2130{
2131 switch(pMac->pmm.gPmmState)
2132 {
2133 case ePMM_STATE_BMPS_SLEEP:
2134 case ePMM_STATE_UAPSD_WT_SLEEP_RSP:
2135 case ePMM_STATE_UAPSD_SLEEP:
2136 case ePMM_STATE_UAPSD_WT_WAKEUP_RSP:
2137 case ePMM_STATE_WOWLAN:
Abhishek Singh3cbf6052014-12-15 16:46:42 +05302138 limLog(pMac, LOG1, FL("Sending EXIT_BMPS_IND to SME "));
Jeff Johnson295189b2012-06-20 16:38:30 -07002139 limSendExitBmpsInd(pMac, eSME_BMPS_STATUS_IND_RCVD);
2140 break;
2141
2142 default:
2143 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002144 FL("Received SIR_HAL_BMPS_STATUS_IND while in incorrect state: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002145 pMac->pmm.gPmmState);
2146 break;
2147 }
2148 return;
2149}
2150
2151
2152/** -----------------------------------------------------------------
2153 \brief limHandleMissedBeaconInd() - handles missed beacon indication
2154
2155 This function process the SIR_HAL_MISSED_BEACON_IND message from HAL,
2156 and invokes limSendExitBmpsInd( ) to send an eWNI_PMC_EXIT_BMPS_IND
2157 to SME with reason code 'eSME_MISSED_BEACON_IND_RCVD'.
2158
2159 \param pMac - global mac structure
2160 \return - none
2161 \sa
2162 ----------------------------------------------------------------- */
Leela Venkata Kiran Kumar Reddy Chirala3ca17902013-02-27 19:50:05 -08002163void limHandleMissedBeaconInd(tpAniSirGlobal pMac, tpSirMsgQ pMsg)
Jeff Johnson295189b2012-06-20 16:38:30 -07002164{
Leela Venkata Kiran Kumar Reddy Chirala3ca17902013-02-27 19:50:05 -08002165#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
2166 tpSirSmeMissedBeaconInd pSirMissedBeaconInd =
2167 (tpSirSmeMissedBeaconInd)pMsg->bodyptr;
2168 tpPESession psessionEntry = peFindSessionByBssIdx(pMac,pSirMissedBeaconInd->bssIdx);
2169 if (psessionEntry == NULL)
2170 {
2171 limLog(pMac, LOGE,
2172 FL("session does not exist for given BSSIdx:%d"),
2173 pSirMissedBeaconInd->bssIdx);
2174 return;
2175 }
2176#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002177 if ( (pMac->pmm.gPmmState == ePMM_STATE_BMPS_SLEEP) ||
2178 (pMac->pmm.gPmmState == ePMM_STATE_UAPSD_SLEEP)||
2179 (pMac->pmm.gPmmState == ePMM_STATE_WOWLAN) )
2180 {
2181 pMac->pmm.inMissedBeaconScenario = TRUE;
Madan Mohan Koyyalamudi1a30a552013-09-17 21:20:07 +05302182 PELOGE(limLog(pMac, LOGE,
2183 FL("Sending EXIT_BMPS_IND to SME due to Missed beacon from FW"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002184 limSendExitBmpsInd(pMac, eSME_MISSED_BEACON_IND_RCVD);
2185 }
Yathish9f22e662012-12-10 14:21:35 -08002186/* ACTIVE_MODE_HB_OFFLOAD */
2187#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
2188 else if(((pMac->pmm.gPmmState == ePMM_STATE_READY) ||
2189 (pMac->pmm.gPmmState == ePMM_STATE_BMPS_WAKEUP)) &&
2190 (IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
2191 {
2192 pMac->pmm.inMissedBeaconScenario = TRUE;
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002193 PELOGE(limLog(pMac, LOGE, FL("Received Heart Beat Failure"));)
Leela Venkata Kiran Kumar Reddy Chirala3ca17902013-02-27 19:50:05 -08002194 limMissedBeaconInActiveMode(pMac, psessionEntry);
Yathish9f22e662012-12-10 14:21:35 -08002195 }
2196#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002197 else
2198 {
2199 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002200 FL("Received SIR_HAL_MISSED_BEACON_IND while in incorrect state: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002201 pMac->pmm.gPmmState);
2202 }
2203 return;
2204}
2205
2206/** -----------------------------------------------------------------
2207 \brief limMicFailureInd() - handles mic failure indication
2208
2209 This function process the SIR_HAL_MIC_FAILURE_IND message from HAL,
2210
2211 \param pMac - global mac structure
2212 \return - none
2213 \sa
2214 ----------------------------------------------------------------- */
2215void limMicFailureInd(tpAniSirGlobal pMac, tpSirMsgQ pMsg)
2216{
2217 tpSirSmeMicFailureInd pSirSmeMicFailureInd;
2218 tpSirSmeMicFailureInd pSirMicFailureInd = (tpSirSmeMicFailureInd)pMsg->bodyptr;
2219 tSirMsgQ mmhMsg;
2220 tpPESession psessionEntry ;
2221 tANI_U8 sessionId;
2222
2223 if((psessionEntry = peFindSessionByBssid(pMac,pSirMicFailureInd->bssId,&sessionId))== NULL)
2224 {
2225 limLog(pMac, LOGE,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002226 FL("session does not exist for given BSSId"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002227 return;
2228 }
2229
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302230 pSirSmeMicFailureInd = vos_mem_malloc(sizeof(tSirSmeMicFailureInd));
2231 if (NULL == pSirSmeMicFailureInd)
Jeff Johnson295189b2012-06-20 16:38:30 -07002232 {
2233 // Log error
2234 limLog(pMac, LOGP,
Kiran Kumar Lokere80007262013-03-18 19:45:50 -07002235 FL("memory allocate failed for eWNI_SME_MIC_FAILURE_IND"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002236 return;
2237 }
2238
2239 pSirSmeMicFailureInd->messageType = eWNI_SME_MIC_FAILURE_IND;
2240 pSirSmeMicFailureInd->length = sizeof(pSirSmeMicFailureInd);
2241 pSirSmeMicFailureInd->sessionId = psessionEntry->smeSessionId;
2242
2243 vos_mem_copy(pSirSmeMicFailureInd->bssId,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302244 pSirMicFailureInd->bssId,
2245 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002246
2247 vos_mem_copy(pSirSmeMicFailureInd->info.srcMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302248 pSirMicFailureInd->info.srcMacAddr,
2249 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002250
2251 vos_mem_copy(pSirSmeMicFailureInd->info.taMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302252 pSirMicFailureInd->info.taMacAddr,
2253 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002254
2255 vos_mem_copy(pSirSmeMicFailureInd->info.dstMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302256 pSirMicFailureInd->info.dstMacAddr,
2257 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002258
2259 vos_mem_copy(pSirSmeMicFailureInd->info.rxMacAddr,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302260 pSirMicFailureInd->info.rxMacAddr,
2261 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002262
2263 pSirSmeMicFailureInd->info.multicast =
2264 pSirMicFailureInd->info.multicast;
2265
2266 pSirSmeMicFailureInd->info.keyId=
2267 pSirMicFailureInd->info.keyId;
2268
2269 pSirSmeMicFailureInd->info.IV1=
2270 pSirMicFailureInd->info.IV1;
2271
2272 vos_mem_copy(pSirSmeMicFailureInd->info.TSC,
Bansidhar Gopalachari3999e2e2013-07-12 10:57:01 +05302273 pSirMicFailureInd->info.TSC,SIR_CIPHER_SEQ_CTR_SIZE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002274
2275 mmhMsg.type = eWNI_SME_MIC_FAILURE_IND;
2276 mmhMsg.bodyptr = pSirSmeMicFailureInd;
2277 mmhMsg.bodyval = 0;
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08002278 MTRACE(macTraceMsgTx(pMac, sessionId, mmhMsg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07002279 limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
2280 return;
2281}
2282
2283
2284/** -----------------------------------------------------------------
2285 \brief limIsPktCandidateForDrop() - decides whether to drop the frame or not
2286
2287 This function is called before enqueuing the frame to PE queue for further processing.
2288 This prevents unnecessary frames getting into PE Queue and drops them right away.
2289 Frames will be droped in the following scenarios:
2290
2291 - In Scan State, drop the frames which are not marked as scan frames
2292 - In non-Scan state, drop the frames which are marked as scan frames.
2293 - Drop INFRA Beacons and Probe Responses in IBSS Mode
2294 - Drop the Probe Request in IBSS mode, if STA did not send out the last beacon
2295
2296 \param pMac - global mac structure
2297 \return - none
2298 \sa
2299 ----------------------------------------------------------------- */
2300
2301tMgmtFrmDropReason limIsPktCandidateForDrop(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tANI_U32 subType)
2302{
2303 tANI_U32 framelen;
2304 tANI_U8 *pBody;
2305 tSirMacCapabilityInfo capabilityInfo;
2306
2307 /*
2308 *
2309 * In scan mode, drop only Beacon/Probe Response which are NOT marked as scan-frames.
2310 * In non-scan mode, drop only Beacon/Probe Response which are marked as scan frames.
2311 * Allow other mgmt frames, they must be from our own AP, as we don't allow
2312 * other than beacons or probe responses in scan state.
2313 */
2314 if( (subType == SIR_MAC_MGMT_BEACON) ||
2315 (subType == SIR_MAC_MGMT_PROBE_RSP))
2316 {
2317 if(pMac->pmm.inMissedBeaconScenario)
2318 {
Leela Venkata Kiran Kumar Reddy Chiralaf3fe6302013-03-18 12:32:14 -07002319 MTRACE(macTrace(pMac, TRACE_CODE_INFO_LOG, 0, eLOG_NODROP_MISSED_BEACON_SCENARIO));
2320 return eMGMT_DROP_NO_DROP;
Jeff Johnson295189b2012-06-20 16:38:30 -07002321 }
2322 if (limIsSystemInScanState(pMac))
2323 {
Jeff Johnson04dd8a82012-06-29 20:41:40 -07002324 return eMGMT_DROP_NO_DROP;
Jeff Johnson295189b2012-06-20 16:38:30 -07002325 }
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -07002326#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
2327 else if (WDA_GET_OFFLOADSCANLEARN(pRxPacketInfo) || WDA_GET_ROAMCANDIDATEIND(pRxPacketInfo))
2328 {
2329 return eMGMT_DROP_NO_DROP;
2330 }
2331#endif
Dino Mycle7a76e662014-06-10 11:36:34 +05302332#ifdef WLAN_FEATURE_EXTSCAN
2333 else if (WDA_GET_EXTSCANFULLSCANRESIND(pRxPacketInfo))
2334 {
2335 return eMGMT_DROP_NO_DROP;
2336 }
2337#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002338 else if (WDA_IS_RX_IN_SCAN(pRxPacketInfo))
2339 {
2340 return eMGMT_DROP_SCAN_MODE_FRAME;
2341 }
2342 }
2343
2344 framelen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
2345 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
2346
2347 /* Note sure if this is sufficient, basically this condition allows all probe responses and
2348 * beacons from an infrastructure network
2349 */
2350 *((tANI_U16*) &capabilityInfo) = sirReadU16(pBody+ LIM_BCN_PR_CAPABILITY_OFFSET);
2351 if(!capabilityInfo.ibss)
2352 return eMGMT_DROP_NO_DROP;
2353#if 0
2354 //Allow the mgmt frames to be queued if STA not in IBSS mode.
2355 if (pMac->lim.gLimSystemRole != eLIM_STA_IN_IBSS_ROLE)
2356 return eMGMT_DROP_NO_DROP;
2357#endif
2358
2359 //Drop INFRA Beacons and Probe Responses in IBSS Mode
2360 if( (subType == SIR_MAC_MGMT_BEACON) ||
2361 (subType == SIR_MAC_MGMT_PROBE_RSP))
2362 {
2363 //drop the frame if length is less than 12
2364 if(framelen < LIM_MIN_BCN_PR_LENGTH)
2365 return eMGMT_DROP_INVALID_SIZE;
2366
2367 *((tANI_U16*) &capabilityInfo) = sirReadU16(pBody+ LIM_BCN_PR_CAPABILITY_OFFSET);
2368
2369 //This can be enhanced to even check the SSID before deciding to enque the frame.
2370 if(capabilityInfo.ess)
2371 return eMGMT_DROP_INFRA_BCN_IN_IBSS;
2372 }
2373 else if( (subType == SIR_MAC_MGMT_PROBE_REQ) &&
2374 (!WDA_GET_RX_BEACON_SENT(pRxPacketInfo)))
2375 {
2376 //Drop the Probe Request in IBSS mode, if STA did not send out the last beacon
2377 //In IBSS, the node which sends out the beacon, is supposed to respond to ProbeReq
2378 return eMGMT_DROP_NOT_LAST_IBSS_BCN;
2379 }
2380
2381 return eMGMT_DROP_NO_DROP;
2382}
2383
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08002384eHalStatus pe_AcquireGlobalLock( tAniSirLim *psPe)
2385{
2386 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
Jeff Johnson295189b2012-06-20 16:38:30 -07002387
Leela V Kiran Kumar Reddy Chiralac3b9d382013-01-31 20:49:53 -08002388 if(psPe)
2389 {
2390 if( VOS_IS_STATUS_SUCCESS( vos_lock_acquire( &psPe->lkPeGlobalLock) ) )
2391 {
2392 status = eHAL_STATUS_SUCCESS;
2393 }
2394 }
2395 return (status);
2396}
2397eHalStatus pe_ReleaseGlobalLock( tAniSirLim *psPe)
2398{
2399 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
2400 if(psPe)
2401 {
2402 if( VOS_IS_STATUS_SUCCESS( vos_lock_release( &psPe->lkPeGlobalLock) ) )
2403 {
2404 status = eHAL_STATUS_SUCCESS;
2405 }
2406 }
2407 return (status);
2408}