blob: 1639fdb04215d6414b89c1f00784be8ccdbe7760 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
2 * Copyright (c) 2012, Code Aurora Forum. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * Airgo Networks, Inc proprietary. All rights reserved.
24 * This file lim ProcessMessageQueue.cc contains the code
25 * for processing LIM message Queue.
26 * Author: Chandra Modumudi
27 * Date: 02/11/02
28 * History:-
29 * Date Modified by Modification Information
30 * --------------------------------------------------------------------
31 *
32 */
33#include "palTypes.h"
34#include "wniApi.h"
35#ifdef FEATURE_WLAN_NON_INTEGRATED_SOC
36#include "halDataStruct.h"
37#include "halCommonApi.h"
38#elif defined FEATURE_WLAN_INTEGRATED_SOC
39#include "wlan_qct_wdi_ds.h"
40#include "wlan_qct_pal_packet.h"
41#include "wlan_qct_wda.h"
42#endif
43
44#ifdef ANI_PRODUCT_TYPE_AP
45#include "wniCfgAp.h"
46#else
47#include "wniCfgSta.h"
48#endif
49#include "cfgApi.h"
50#include "sirCommon.h"
51#include "utilsApi.h"
52#include "limTypes.h"
53#include "limUtils.h"
54#include "limAssocUtils.h"
55#include "limPropExtsUtils.h"
56
57#include "limAdmitControl.h"
58#include "pmmApi.h"
59#include "limIbssPeerMgmt.h"
60#include "schApi.h"
61#include "limSession.h"
62
63#if defined WLAN_FEATURE_VOWIFI
64#include "rrmApi.h"
65#endif
66#if defined FEATURE_WLAN_CCX
67#include "ccxApi.h"
68#endif
69
70#if defined WLAN_FEATURE_VOWIFI_11R
71#include "limFT.h"
72#endif
73
74#ifdef WMM_APSD
75#include "wmmApsd.h"
76#endif
77
78#ifdef VOSS_ENABLED
79#include "vos_types.h"
80#include "vos_packet.h"
81#include "vos_memory.h"
82#endif
83
84void limLogSessionStates(tpAniSirGlobal pMac);
85
86/** -------------------------------------------------------------
87\fn defMsgDecision
88\brief The function decides whether to defer a message or not in limProcessMessage function
89\param tpAniSirGlobal pMac
90\param tSirMsgQ limMsg
91\param tSirMacTspecIE *ppInfo
92\return none
93 -------------------------------------------------------------*/
94
95tANI_U8 static
96defMsgDecision(tpAniSirGlobal pMac, tpSirMsgQ limMsg)
97{
98
99
100/* this function should not changed */
Jeff Johnsone7245742012-09-05 17:12:55 -0700101 if(pMac->lim.gLimSmeState == eLIM_SME_OFFLINE_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -0700102 {
103 // Defer processsing this message
104 if (limDeferMsg(pMac, limMsg) != TX_SUCCESS)
105 {
106 PELOGE(limLog(pMac, LOGE, FL("Unable to Defer message(0x%X) %s limSmeState %d (prev sme state %d) sysRole %d mlm state %d (prev mlm state %d)\n"),
107 limMsg->type, limMsgStr(limMsg->type), pMac->lim.gLimSmeState, pMac->lim.gLimPrevSmeState,
108 pMac->lim.gLimSystemRole, pMac->lim.gLimMlmState, pMac->lim.gLimPrevMlmState);)
109 limLogSessionStates(pMac);
110 limHandleDeferMsgError(pMac, limMsg);
111 }
112 return true;
113 }
114
115 //When defer is requested then defer all the messages except HAL responses.
116 if((!limIsSystemInScanState(pMac)) && (true != GET_LIM_PROCESS_DEFD_MESGS(pMac)) &&
117 !pMac->lim.gLimSystemInScanLearnMode)
118 {
119 if((limMsg->type != WDA_ADD_BSS_RSP) &&
120 (limMsg->type != WDA_DELETE_BSS_RSP) &&
121 (limMsg->type != WDA_ADD_STA_RSP) &&
122 (limMsg->type != WDA_ADD_STA_SELF_RSP) &&
123 (limMsg->type != WDA_DEL_STA_SELF_RSP) &&
124 (limMsg->type != WDA_DELETE_STA_RSP)&&
125 (limMsg->type != WDA_SET_BSSKEY_RSP)&&
126 (limMsg->type != WDA_SET_STAKEY_RSP)&&
127 (limMsg->type != WDA_SET_STA_BCASTKEY_RSP) &&
Jeff Johnson295189b2012-06-20 16:38:30 -0700128 (limMsg->type != eWNI_SME_START_REQ) &&
129 (limMsg->type != WDA_AGGR_QOS_RSP) &&
130 (limMsg->type != WDA_REMOVE_BSSKEY_RSP) &&
131 (limMsg->type != WDA_REMOVE_STAKEY_RSP) &&
132 (limMsg->type != WDA_SET_MIMOPS_RSP)&&
133 (limMsg->type != WDA_ADDBA_RSP) &&
134 (limMsg->type != WDA_ENTER_BMPS_RSP) &&
135 (limMsg->type != WDA_EXIT_BMPS_RSP) &&
136 (limMsg->type != WDA_ENTER_IMPS_RSP) &&
137 (limMsg->type != WDA_EXIT_IMPS_RSP) &&
138 (limMsg->type != WDA_ENTER_UAPSD_RSP) &&
139 (limMsg->type != WDA_EXIT_UAPSD_RSP) &&
140 (limMsg->type != WDA_WOWL_ENTER_RSP) &&
141 (limMsg->type != WDA_WOWL_EXIT_RSP) &&
142 (limMsg->type != WDA_SWITCH_CHANNEL_RSP) &&
143#ifdef WLAN_FEATURE_P2P
144 (limMsg->type != WDA_P2P_NOA_ATTR_IND) &&
145#endif
Jeff Johnsone7245742012-09-05 17:12:55 -0700146#ifdef FEATURE_OEM_DATA_SUPPORT
147 (limMsg->type != WDA_START_OEM_DATA_RSP) &&
148#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700149 (limMsg->type != WDA_ADD_TS_RSP))
150 {
151 PELOG1(limLog(pMac, LOG1, FL("Defer the current message %s , gLimProcessDefdMsgs is false and system is not in scan/learn mode\n"),
152 limMsgStr(limMsg->type));)
153
154 // Defer processsing this message
155 if (limDeferMsg(pMac, limMsg) != TX_SUCCESS)
156 {
157 PELOGE(limLog(pMac, LOGE, FL("Unable to Defer message(0x%X) %s limSmeState %d (prev sme state %d) sysRole %d mlm state %d (prev mlm state %d)\n"),
158 limMsg->type, limMsgStr(limMsg->type), pMac->lim.gLimSmeState, pMac->lim.gLimPrevSmeState,
159 pMac->lim.gLimSystemRole, pMac->lim.gLimMlmState, pMac->lim.gLimPrevMlmState);)
160 limLogSessionStates(pMac);
161 limHandleDeferMsgError(pMac, limMsg);
162
163 }
164 return true;
165 }
166 }
167 return false;
168}
169
170/*
171* Beacon Handling Cases:
172* during scanning, when no session is active:
173* handled by limHandleFramesInScanState before __limHandleBeacon call is invoked.
174* during scanning, when any session is active, but beacon/Pr does not belong to that session, psessionEntry will be null.
175* handled by limHandleFramesInScanState before __limHandleBeacon call is invoked.
176* during scanning, when any session is active, and beacon/Pr belongs to one of the session, psessionEntry will not be null.
177* handled by limHandleFramesInScanState before __limHandleBeacon call is invoked.
178* Not scanning, no session:
179* there should not be any beacon coming, if coming, should be dropped.
180* Not Scanning,
181*/
182static void
183__limHandleBeacon(tpAniSirGlobal pMac, tpSirMsgQ pMsg, tpPESession psessionEntry)
184{
185 /* checking for global SME state...*/
186 tANI_U8 *pRxPacketInfo;
187 limGetBDfromRxPacket(pMac, pMsg->bodyptr, (tANI_U32 **)&pRxPacketInfo);
188
189 //This function should not be called if beacon is received in scan state.
190 //So not doing any checks for the global state.
191
192 if(psessionEntry == NULL)
193 {
194 schBeaconProcess(pMac, pRxPacketInfo, NULL);
195 }
196 else if( (psessionEntry->limSmeState == eLIM_SME_LINK_EST_STATE) ||
197 (psessionEntry->limSmeState == eLIM_SME_NORMAL_STATE))
198 {
199 schBeaconProcess(pMac, pRxPacketInfo, psessionEntry);
200 }
201 else
202 limProcessBeaconFrame(pMac, pRxPacketInfo, psessionEntry);
203
204 return;
205}
206
207
208//Fucntion prototype
209void limProcessNormalHddMsg(tpAniSirGlobal pMac, tSirMsgQ *pLimMsg, tANI_U8 fRspReqd);
210
211/**
212 * limProcessMessageQueue
213 *
214 *FUNCTION:
215 * This function is called by LIM thread entry function. This
216 * function fetches messages posted to the message queue
217 * limMsgQ.
218 *
219 *LOGIC:
220 *
221 *ASSUMPTIONS:
222 * NA
223 *
224 *NOTE:
225 * NA
226 *
227 * @param pMac - Pointer to Global MAC structure
228 * @return None
229 */
230
231void
232limProcessMessageQueue(tpAniSirGlobal pMac)
233{
234 tSirMsgQ limMsg = { 0, 0, 0 };
235
236 if(pMac->gDriverType == eDRIVER_TYPE_MFG)
237 {
238 return;
239 }
240
241#if defined(ANI_OS_TYPE_RTAI_LINUX)
242 ULONG param;
243 while(get_timer_event(LIM_TIMER_EXPIRY_LIST,&param))
244 {
245 limMsg.type = (tANI_U16) param;
246 limMsg.bodyval = 0;
247 limMsg.bodyptr = NULL;
248 limMessageProcessor(pMac, &limMsg);
249 }
250#endif
251
252 if (tx_queue_receive( &pMac->sys.gSirLimMsgQ, (void *) &limMsg, TX_WAIT_FOREVER)
253 == TX_SUCCESS)
254 {
255 PELOG3(limLog(pMac, LOG3, FL("LIM Received message %s\n"), limMsgStr(limMsg.type));)
256 limPrintMsgInfo(pMac, LOG3, &limMsg);
257 limMessageProcessor(pMac, &limMsg);
258 } // if (tx_queue_receive)
259
260} /*** end limProcessMessageQueue() ***/
261
262
263
264/**
265 * limDeferMsg()
266 *
267 *FUNCTION:
268 * This function is called to defer the messages received
269 * during Learn mode
270 *
271 *LOGIC:
272 * NA
273 *
274 *ASSUMPTIONS:
275 * NA
276 *
277 *NOTE:
278 * NA
279 *
280 * @param pMac - Pointer to Global MAC structure
281 * @param pMsg of type tSirMsgQ - Pointer to the message structure
282 * @return None
283 */
284
285tANI_U32
286limDeferMsg(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
287{
288 tANI_U32 retCode = TX_SUCCESS;
289#if defined(ANI_OS_TYPE_LINUX) || defined(ANI_OS_TYPE_OSX)
290 PELOG3(limLog(pMac, LOG3, FL("Deferring message %X in Learn mode\n"),
291 pMsg->type);
292 limPrintMsgName(pMac, LOG3, pMsg->type);)
293 retCode = tx_queue_send(&pMac->sys.gSirLimDeferredMsgQ,
294 pMsg,
295 TX_NO_WAIT);
296 if (retCode == TX_SUCCESS)
297 pMac->lim.gLimNumDeferredMsgs++;
298#else
299
300 retCode = limWriteDeferredMsgQ(pMac, pMsg);
301
302#endif
303 if(retCode == TX_SUCCESS)
304 {
Jeff Johnsone7245742012-09-05 17:12:55 -0700305 MTRACE(macTraceMsgRx(pMac, NO_SESSION, LIM_TRACE_MAKE_RXMSG(pMsg->type, LIM_MSG_DEFERRED));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700306 }
307 else
308 {
Jeff Johnsone7245742012-09-05 17:12:55 -0700309 MTRACE(macTraceMsgRx(pMac, NO_SESSION, LIM_TRACE_MAKE_RXMSG(pMsg->type, LIM_MSG_DROPPED));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700310 }
311
312
313 return retCode;
314} /*** end limDeferMsg() ***/
315
316
317
318/**
319 * limHandleFramesInScanState()
320 *
321 *FUNCTION:
322 * This function is called to process 802.11 frames
323 * received by LIM in scan state.
324 *
325 *LOGIC:
326 * NA
327 *
328 *ASSUMPTIONS:
329 * NA
330 *
331 *NOTE:
332 * NA
333 *
334 * @param pMac - Pointer to Global MAC structure
335 * @param limMsg - Received message
336 * @param pRxPacketInfo - Pointer to Rx packet info structure
337 * @param deferMsg - Indicates whether the frame shall be deferred
338 * @return None
339 */
340
341static void
342limHandleFramesInScanState(tpAniSirGlobal pMac, tpSirMsgQ limMsg, tANI_U8 *pRxPacketInfo, tANI_U8 *deferMsg, tpPESession psessionEntry)
343{
344 tSirMacFrameCtl fc;
345 tpSirMacMgmtHdr pHdr;
346#if (WNI_POLARIS_FW_PACKAGE == ADVANCED) && defined(ANI_PRODUCT_TYPE_AP)
347 tANI_U32 ignore = 0;
348 tSirMacAddr bssIdRcv;
349#endif
350
351 *deferMsg = false;
352 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
353 fc = pHdr->fc;
354 limLog( pMac, LOG2, FL("ProtVersion %d, Type %d, Subtype %d\n"),
355 fc.protVer, fc.type, fc.subType );
356
357#if (WNI_POLARIS_FW_PACKAGE == ADVANCED) && defined(ANI_PRODUCT_TYPE_AP)
358 // System is in DFS (Learn) mode
359 pMac->lim.numLearn++;
360
361 // Process all BDs and extract PHY stats
362 limGetBssidFromBD(pMac, (tpHalBufDesc) pRxPacketInfo, bssIdRcv, &ignore);
363
364 if ((psessionEntry->limSystemRole == eLIM_AP_ROLE) &&
365 palEqualMemory( pMac->hHdd,bssIdRcv, psessionEntry->bssId, sizeof(tSirMacAddr)))
366 {
367 /**
368 * Frame from current BSS. Defer processing of
369 * Disassociation/Deauthentication from
370 * STAs that are currently associated.
371 * Collect stats for other received frames.
372 */
373 if ((fc.subType == SIR_MAC_MGMT_DISASSOC) ||
374 (fc.subType == SIR_MAC_MGMT_DEAUTH))
375 {
376 if (limDeferMsg(pMac, limMsg) != TX_SUCCESS)
377 {
378 PELOGE(limLog(pMac, LOGE, FL("Unable to Defer message(0x%X) limSmeState %d (prev sme state %d) sysRole %d mlm state %d (prev mlm state %d)\n"),
379 limMsg->type, pMac->lim.gLimSmeState, pMac->lim.gLimPrevSmeState,
380 pMac->lim.gLimSystemRole, pMac->lim.gLimMlmState, pMac->lim.gLimPrevMlmState);)
381 limLogSessionStates(pMac);
382 limPrintMsgName(pMac, LOGE, limMsg->type);
383 limPktFree(pMac, HAL_TXRX_FRM_802_11_MGMT, NULL, limMsg->bodyptr);
384 }
385 return;
386 }
387 pMac->lim.numLearnIgnore++;
388 }
389 else
390 {
391 // Frame received from other BSS
392 if (fc.type == SIR_MAC_DATA_FRAME && psessionEntry->limSystemRole == eLIM_AP_ROLE)
393 {
394 /**
395 * Data Frame from neighbor BSS.
396 * Extract neighbor BSS info as much as possible.
397 */
398 limCollectMeasurementData(pMac, pRxPacketInfo, NULL);
399 }
400 else if ((fc.type == SIR_MAC_MGMT_FRAME) && (fc.subType == SIR_MAC_MGMT_BEACON))
401 {
402 if (psessionEntry == NULL)
403 limProcessBeaconFrameNoSession(pMac, pRxPacketInfo);
404 else
405 limProcessBeaconFrame(pMac, pRxPacketInfo,psessionEntry);
406 }
407 else if ((fc.type == SIR_MAC_MGMT_FRAME) && (fc.subType == SIR_MAC_MGMT_PROBE_RSP))
408 {
409 if (psessionEntry == NULL)
410 limProcessProbeRspFrameNoSession(pMac, pRxPacketInfo);
411 else
412 limProcessProbeRspFrame(pMac, pRxPacketInfo,psessionEntry);
413 }
414 }
415
416#else
417 // defer all message in scan state except for Beacons and Probe Response
418 if ((fc.type == SIR_MAC_MGMT_FRAME) && (fc.subType == SIR_MAC_MGMT_BEACON))
419 {
420 if (psessionEntry == NULL)
421 limProcessBeaconFrameNoSession(pMac, pRxPacketInfo);
422 else
423 limProcessBeaconFrame(pMac, pRxPacketInfo,psessionEntry);
424 }
425 else if ((fc.type == SIR_MAC_MGMT_FRAME) && (fc.subType == SIR_MAC_MGMT_PROBE_RSP))
426 {
427 if (psessionEntry == NULL)
428 limProcessProbeRspFrameNoSession(pMac, pRxPacketInfo);
429 else
430 limProcessProbeRspFrame(pMac, pRxPacketInfo,psessionEntry);
431 }
432 else if ((fc.type == SIR_MAC_MGMT_FRAME) && (fc.subType == SIR_MAC_MGMT_PROBE_REQ))
433 {
434 limProcessProbeReqFrame_multiple_BSS(pMac, pRxPacketInfo, psessionEntry);
435 }
436#if defined WLAN_FEATURE_P2P
437 else if ((fc.type == SIR_MAC_MGMT_FRAME) && (fc.subType == SIR_MAC_MGMT_ACTION))
438 {
439 limProcessActionFrameNoSession( pMac, pRxPacketInfo);
440 }
441#endif
442 else
443 {
444 *deferMsg = true;
445 return;
446 }
447
448#endif
449 limPktFree(pMac, HAL_TXRX_FRM_802_11_MGMT, pRxPacketInfo, (void *) limMsg->bodyptr);
450 return;
451
452} /*** end limHandleFramesInScanState() ***/
453
454/** ------------------------------------------------------------
455\brief This function handles Unknown Unicast (A2 Index)
456\ packets.
457\param tpAniSirGlobal pMac Global Mac data structure
458\param void *pRxPacketInfo Pointer to Buffer Descriptor
459\return none
460\
461\ -------------------------------------------------------------- */
462static void limHandleUnknownA2IndexFrames(tpAniSirGlobal pMac, void *pRxPacketInfo,tpPESession psessionEntry)
463{
464#ifndef ANI_CHIPSET_VOLANS
465 tpSirMacDataHdr3a pMacHdr;
466
467 /** This prevents from disassoc/deauth being sent in a burst,
468 and gLimDisassocFrameCredit is reset for every 10 seconds.*/
469 if (pMac->lim.gLimDisassocFrameCredit > pMac->lim.gLimDisassocFrameThreshold)
470 return;
471
472 pMac->lim.gLimDisassocFrameCredit++;
473
474 pMacHdr = WDA_GET_RX_MPDUHEADER3A(pRxPacketInfo);
475
476 if (limIsGroupAddr(pMacHdr->addr2))
477 {
478 PELOG2(limLog(pMac, LOG2, FL("Ignoring A2 Invalid Packet received for MC/BC:\n"));
479 limPrintMacAddr(pMac, pMacHdr->addr2, LOG2);)
480
481 return;
482 }
483
484 if (((psessionEntry->limSystemRole == eLIM_AP_ROLE) || (psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE) )&&
485 (psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE))
486 {
487 switch (pMacHdr->fc.type)
488 {
489 case SIR_MAC_MGMT_FRAME:
490 switch (pMacHdr->fc.subType)
491 {
492 case SIR_MAC_MGMT_ACTION:
493 // Send Disassociation frame to
494 // sender if role is AP
495 PELOG1(limLog(pMac, LOG1, FL("Send Disassoc Frame due to Invalid Addr2 packet"));
496 limPrintMacAddr(pMac, pMacHdr->addr2, LOG1);)
497 limSendDisassocMgmtFrame(pMac,
498 eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON, pMacHdr->addr2,psessionEntry);
499 break;
500
501 default:
502 break;
503
504 }
505 break;
506
507 case SIR_MAC_CTRL_FRAME:
508 switch (pMacHdr->fc.subType)
509 {
510 case SIR_MAC_CTRL_PS_POLL:
511 case SIR_MAC_CTRL_BAR:
512 // Send Disassociation frame to
513 // sender if role is AP
514 PELOG1(limLog(pMac, LOG1, FL("Send Disassoc Frame due to Invalid Addr2 packet"));
515 limPrintMacAddr(pMac, pMacHdr->addr2, LOG1);)
516 limSendDisassocMgmtFrame(pMac,
517 eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON, pMacHdr->addr2,psessionEntry);
518 break;
519
520 default:
521 break;
522 }
523 break;
524
525 case SIR_MAC_DATA_FRAME:
526 switch (pMacHdr->fc.subType)
527 {
528 case SIR_MAC_DATA_NULL:
529 case SIR_MAC_DATA_QOS_NULL:
530 // Send Disassociation frame to
531 // sender if role is AP
532 PELOG1(limLog(pMac, LOG1, FL("Send Disassoc Frame due to Invalid Addr2 packet"));
533 limPrintMacAddr(pMac, pMacHdr->addr2, LOG1);)
534 limSendDisassocMgmtFrame(pMac,
535 eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON, pMacHdr->addr2,psessionEntry);
536 break;
537
538 default:
539 // Send Deauthentication frame to
540 // sender if role is AP
541 PELOG1(limLog(pMac, LOG1, FL("Sending Deauth frame due to Invalid Addr2 packet"));
542 limPrintMacAddr(pMac, pMacHdr->addr2, LOG1);)
543 limSendDeauthMgmtFrame(pMac,
544 eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON, pMacHdr->addr2,psessionEntry);
545 break;
546 }
547 break;
548 }
549 }
550#else
551 /* addr2 mismatch interrupt occurred this means previous
552 disassociation was not successful
553 In Volans pRxPacketInfo only contains pointer 48-bit address2 field */
554 /*Send disassociation message again*/
555 //Dinesh need one more arguement.
556 //limSendDisassocMgmtFrame(pMac, eSIR_MAC_CLASS3_FRAME_FROM_NON_ASSOC_STA_REASON,(tANI_U8 *) pRxPacketInfo);
557#if defined WLAN_FEATURE_P2P
558 //This could be a public action frame.
559 if( psessionEntry->limSystemRole == eLIM_P2P_DEVICE_ROLE )
560 limProcessActionFrameNoSession(pMac, (tANI_U8 *) pRxPacketInfo);
561#endif
562#endif
563
564 return;
565}
566
567#ifdef WLAN_FEATURE_P2P
568/**
569 * limCheckMgmtRegisteredFrames()
570 *
571 *FUNCTION:
572 * This function is called to process to check if received frame match with
573 * any of the registered frame from HDD. If yes pass this frame to SME.
574 *
575 *LOGIC:
576 *
577 *ASSUMPTIONS:
578 *
579 *NOTE:
580 *
581 * @param pMac Pointer to Global MAC structure
582 * @param *pBd Pointer to the received Buffer Descriptor+payload
583 * @param *psessionEntry Pointer to session on which packet is received
584 * @return None
585 */
586static tANI_BOOLEAN
587limCheckMgmtRegisteredFrames(tpAniSirGlobal pMac, tANI_U8 *pBd,
588 tpPESession psessionEntry)
589{
590 tSirMacFrameCtl fc;
591 tpSirMacMgmtHdr pHdr;
592 tANI_U8 *pBody;
593 tpLimMgmtFrameRegistration pLimMgmtRegistration = NULL, pNext = NULL;
594 tANI_U16 frameType;
595 tANI_U16 framelen;
596 tANI_U8 type,subType;
597 tANI_BOOLEAN match = VOS_FALSE;
598 VOS_STATUS vosStatus;
599
600 pHdr = WDA_GET_RX_MAC_HEADER(pBd);
601 fc = pHdr->fc;
602 frameType = (fc.type << 2 ) | (fc.subType << 4);
603 pBody = WDA_GET_RX_MPDU_DATA(pBd);
604 framelen = WDA_GET_RX_PAYLOAD_LEN(pBd);
605
606 vos_list_peek_front(&pMac->lim.gLimMgmtFrameRegistratinQueue,
607 (vos_list_node_t**)&pLimMgmtRegistration);
608
609 while(pLimMgmtRegistration != NULL)
610 {
611 type = (pLimMgmtRegistration->frameType >> 2) & 0x03;
612 subType = (pLimMgmtRegistration->frameType >> 4) & 0x0f;
613 if ( (type == SIR_MAC_MGMT_FRAME) && (fc.type == SIR_MAC_MGMT_FRAME)
614 && (subType == SIR_MAC_MGMT_RESERVED15) )
615 {
616 limLog( pMac, LOG3,
617 FL("rcvd frame match with SIR_MAC_MGMT_RESERVED15\n"));
618 match = VOS_TRUE;
619 break;
620 }
621
622 if (pLimMgmtRegistration->frameType == frameType)
623 {
624 if (pLimMgmtRegistration->matchLen > 0)
625 {
626 if (pLimMgmtRegistration->matchLen <= framelen)
627 {
628 if (palEqualMemory(pMac, pLimMgmtRegistration->matchData,
629 pBody, pLimMgmtRegistration->matchLen))
630 {
631 /* found match! */
632 match = VOS_TRUE;
633 break;
634 }
635 }
636 }
637 else
638 {
639 /* found match! */
640 match = VOS_TRUE;
641 break;
642 }
643 }
644
645 vosStatus =
646 vos_list_peek_next ( &pMac->lim.gLimMgmtFrameRegistratinQueue,
647 (vos_list_node_t*) pLimMgmtRegistration,
648 (vos_list_node_t**) &pNext );
649 pLimMgmtRegistration = pNext;
650 pNext = NULL;
651 }
652
653 if (match)
654 {
655 limLog( pMac, LOG1,
656 FL("rcvd frame match with registered frame params\n"));
657
658 /* Indicate this to SME */
659 limSendSmeMgmtFrameInd( pMac, pHdr->fc.subType, (tANI_U8*)pHdr,
660 WDA_GET_RX_PAYLOAD_LEN(pBd) + sizeof(tSirMacMgmtHdr),
661 pLimMgmtRegistration->sessionId,
Jeff Johnsone7245742012-09-05 17:12:55 -0700662 WDA_GET_RX_CH(pBd), psessionEntry );
Jeff Johnson295189b2012-06-20 16:38:30 -0700663
664 if ( (type == SIR_MAC_MGMT_FRAME) && (fc.type == SIR_MAC_MGMT_FRAME)
665 && (subType == SIR_MAC_MGMT_RESERVED15) )
666 {
667 // These packets needs to be processed by PE/SME as well as HDD.
668 // If it returns TRUE here, the packet is forwarded to HDD only.
669 match = VOS_FALSE;
670 }
671 }
672
673 return match;
674} /*** end limCheckMgmtRegisteredFrames() ***/
675#endif /* WLAN_FEATURE_P2P */
676
677
678/**
679 * limHandle80211Frames()
680 *
681 *FUNCTION:
682 * This function is called to process 802.11 frames
683 * received by LIM.
684 *
685 *LOGIC:
686 * NA
687 *
688 *ASSUMPTIONS:
689 * NA
690 *
691 *NOTE:
692 * NA
693 *
694 * @param pMac - Pointer to Global MAC structure
695 * @param pMsg of type tSirMsgQ - Pointer to the message structure
696 * @return None
697 */
698
699static void
700limHandle80211Frames(tpAniSirGlobal pMac, tpSirMsgQ limMsg, tANI_U8 *pDeferMsg)
701{
702 tANI_U8 *pRxPacketInfo = NULL;
703 tSirMacFrameCtl fc;
704 tpSirMacMgmtHdr pHdr=NULL;
705 tpPESession psessionEntry=NULL;
706 tANI_U8 sessionId;
707 tAniBool isFrmFt = FALSE;
708 tANI_U16 fcOffset = WLANHAL_RX_BD_HEADER_SIZE;
709
710 *pDeferMsg= false;
711 limGetBDfromRxPacket(pMac, limMsg->bodyptr, (tANI_U32 **)&pRxPacketInfo);
712
713 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
714 isFrmFt = WDA_GET_RX_FT_DONE(pRxPacketInfo);
715 fcOffset = (v_U8_t)WDA_GET_RX_MPDU_HEADER_OFFSET(pRxPacketInfo);
716 fc = pHdr->fc;
717
718 limLog( pMac, LOG1, FL("ProtVersion %d, Type %d, Subtype %d rateIndex=%d\n"),
719 fc.protVer, fc.type, fc.subType, WDA_GET_RX_MAC_RATE_IDX(pRxPacketInfo));
720
721
722#ifdef FEATURE_WLAN_CCX
723 if (fc.type == SIR_MAC_DATA_FRAME && isFrmFt)
724 {
725#if 0 // CCX TBD Need to PORT
726 tpSirMacDot3Hdr pDataFrmHdr;
727
728 pDataFrmHdr = (tpSirMacDot3Hdr)((tANI_U8 *)pBD+ WLANHAL_RX_BD_GET_MPDU_H_OFFSET(pBD));
729 if((psessionEntry = peFindSessionByBssid(pMac,pDataFrmHdr->sa,&sessionId))== NULL)
730 {
731 limLog( pMac, LOGE, FL("Session not found for Frm type %d, subtype %d, SA: "), fc.type, fc.subType);
732 limPrintMacAddr(pMac, pDataFrmHdr->sa, LOGE);
733 limPktFree(pMac, HAL_TXRX_FRM_802_11_MGMT, pBD, limMsg->bodyptr);
734 return;
735 }
736
737 if (!psessionEntry->isCCXconnection)
738 {
739 limLog( pMac, LOGE, FL("LIM received Type %d, Subtype %d in Non CCX connection\n"),
740 fc.type, fc.subType);
741 limPktFree(pMac, HAL_TXRX_FRM_802_11_MGMT, pBD, limMsg->bodyptr);
742 return;
743 }
744 limLog( pMac, LOGE, FL("Processing IAPP Frm from SA:"));
745 limPrintMacAddr(pMac, pDataFrmHdr->sa, LOGE);
746#else
747 printk("%s: Need to port handling of IAPP frames to PRIMA for CCX\n", __func__);
748#endif
749
750
751 } else
752#endif
753 /* Added For BT-AMP Support */
754 if((psessionEntry = peFindSessionByBssid(pMac,pHdr->bssId,&sessionId))== NULL)
755 {
756#ifdef WLAN_FEATURE_VOWIFI_11R
757 if (fc.subType == SIR_MAC_MGMT_AUTH)
758 {
759#ifdef WLAN_FEATURE_VOWIFI_11R_DEBUG
760 limLog( pMac, LOGE, FL("ProtVersion %d, Type %d, Subtype %d rateIndex=%d\n"),
761 fc.protVer, fc.type, fc.subType, WDA_GET_RX_MAC_RATE_IDX(pRxPacketInfo));
762 limPrintMacAddr(pMac, pHdr->bssId, LOGE);
763#endif
764 if (limProcessAuthFrameNoSession(pMac, pRxPacketInfo, limMsg->bodyptr) == eSIR_SUCCESS)
765 {
766 limPktFree(pMac, HAL_TXRX_FRM_802_11_MGMT, pRxPacketInfo, limMsg->bodyptr);
767 return;
768 }
769 }
770#endif
771 if((fc.subType != SIR_MAC_MGMT_PROBE_RSP )&&
772 (fc.subType != SIR_MAC_MGMT_BEACON)&&
773 (fc.subType != SIR_MAC_MGMT_PROBE_REQ)
774#if defined WLAN_FEATURE_P2P
775 && (fc.subType != SIR_MAC_MGMT_ACTION ) //Public action frame can be received from non-associated stations.
776#endif
777 )
778 {
779
780 if((psessionEntry = peFindSessionByPeerSta(pMac,pHdr->sa,&sessionId))== NULL)
781 {
782 limLog(pMac, LOG1, FL("session does not exist for given bssId\n"));
783 limPktFree(pMac, HAL_TXRX_FRM_802_11_MGMT, pRxPacketInfo, limMsg->bodyptr);
784 return;
785 }
786 }
787 }
788
789
790#ifdef WLAN_FEATURE_P2P
791 /* Check if frame is registered by HDD */
792 if(limCheckMgmtRegisteredFrames(pMac, pRxPacketInfo, psessionEntry))
793 {
794 limLog( pMac, LOG1, FL("Received frame is passed to SME\n"));
795 limPktFree(pMac, HAL_TXRX_FRM_802_11_MGMT, pRxPacketInfo, limMsg->bodyptr);
796 return;
797 }
798#endif
799
800
801#ifdef ANI_PRODUCT_TYPE_AP
802 if ((psessionEntry->limSystemRole == eLIM_AP_ROLE) && (LIM_IS_RADAR_DETECTED(pMac)))
803 {
804 PELOGW(limLog(pMac, LOGW, FL("Droping the received packets as radar is detected\n"));)
805 limPktFree(pMac, HAL_TXRX_FRM_802_11_MGMT, pRxPacketInfo, (void *) limMsg->bodyptr);
806 return;
807 }
808#endif
809
810 if (fc.protVer != SIR_MAC_PROTOCOL_VERSION)
811 { // Received Frame with non-zero Protocol Version
812 limLog(pMac, LOGE, FL("Unexpected frame with protVersion %d received\n"),
813 fc.protVer);
814 limPktFree(pMac, HAL_TXRX_FRM_802_11_MGMT, pRxPacketInfo, (void *) limMsg->bodyptr);
815#ifdef WLAN_DEBUG
816 pMac->lim.numProtErr++;
817#endif
818 return;
819 }
820
821
822 if (limIsSystemInScanState(pMac))
823 {
824 limHandleFramesInScanState(pMac, limMsg, pRxPacketInfo, pDeferMsg, psessionEntry);
825 return;
826 }
827
828/* Chance of crashing : to be done BT-AMP ........happens when broadcast probe req is received */
829
830#if 0
831 if (psessionEntry->limSystemRole == eLIM_UNKNOWN_ROLE) {
832 limLog( pMac, LOGW, FL( "gLimSystemRole is %d. Exiting...\n" ),psessionEntry->limSystemRole );
833 limPktFree(pMac, HAL_TXRX_FRM_802_11_MGMT, pRxPacketInfo, (void *) limMsg->bodyptr);
834
835#ifdef WLAN_DEBUG
836 pMac->lim.numProtErr++;
837#endif
838 return;
839 }
840 #endif //HACK to continue scanning
841
842
843#ifdef WLAN_DEBUG
844 pMac->lim.numMAC[fc.type][fc.subType]++;
845#endif
846
847 switch (fc.type)
848 {
849 case SIR_MAC_MGMT_FRAME:
850 {
851 #if 0 //TBD-RAJESH fix this
852 if (limIsReassocInProgress( pMac,psessionEntry) && (fc.subType != SIR_MAC_MGMT_DISASSOC) &&
853 (fc.subType != SIR_MAC_MGMT_DEAUTH) && (fc.subType != SIR_MAC_MGMT_REASSOC_RSP))
854 {
855 limLog(pMac, LOGE, FL("Frame with Type - %d, Subtype - %d received in ReAssoc Wait state, dropping...\n"),
856 fc.type, fc.subType);
857 return;
858 }
859 #endif //HACK to continue scanning
860 // Received Management frame
861 switch (fc.subType)
862 {
863 case SIR_MAC_MGMT_ASSOC_REQ:
864 // Make sure the role supports Association
865 if ((psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE)
866#ifdef WLAN_SOFTAP_FEATURE
867 || (psessionEntry->limSystemRole == eLIM_AP_ROLE)
868#endif
869 )
870 limProcessAssocReqFrame(pMac, pRxPacketInfo, LIM_ASSOC, psessionEntry);
871
872 else
873 {
874 // Unwanted messages - Log error
875 limLog(pMac, LOGE, FL("unexpected message received %X\n"),limMsg->type);
876 limPrintMsgName(pMac, LOGE, limMsg->type);
877 }
878 break;
879
880 case SIR_MAC_MGMT_ASSOC_RSP:
881 limProcessAssocRspFrame(pMac, pRxPacketInfo, LIM_ASSOC,psessionEntry);
882 break;
883
884 case SIR_MAC_MGMT_REASSOC_REQ:
885 // Make sure the role supports Reassociation
886 if ((psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE)
887#ifdef WLAN_SOFTAP_FEATURE
888 || (psessionEntry->limSystemRole == eLIM_AP_ROLE)
889#endif
890 ){
891 limProcessAssocReqFrame(pMac, pRxPacketInfo, LIM_REASSOC, psessionEntry);
892 }
893 else
894 {
895 // Unwanted messages - Log error
896 limLog(pMac, LOGE, FL("unexpected message received %X\n"),limMsg->type);
897 limPrintMsgName(pMac, LOGE, limMsg->type);
898 }
899 break;
900
901 case SIR_MAC_MGMT_REASSOC_RSP:
902 limProcessAssocRspFrame(pMac, pRxPacketInfo, LIM_REASSOC,psessionEntry);
903 break;
904
905 case SIR_MAC_MGMT_PROBE_REQ:
906 limProcessProbeReqFrame_multiple_BSS(pMac, pRxPacketInfo,psessionEntry);
907 break;
908
909 case SIR_MAC_MGMT_PROBE_RSP:
910 if(psessionEntry == NULL)
911 limProcessProbeRspFrameNoSession(pMac, pRxPacketInfo);
912 else
913 limProcessProbeRspFrame(pMac, pRxPacketInfo, psessionEntry);
914 break;
915
916 case SIR_MAC_MGMT_BEACON:
917 __limHandleBeacon(pMac, limMsg,psessionEntry);
918 break;
919
920 case SIR_MAC_MGMT_DISASSOC:
921 limProcessDisassocFrame(pMac, pRxPacketInfo,psessionEntry);
922 break;
923
924 case SIR_MAC_MGMT_AUTH:
925 limProcessAuthFrame(pMac, pRxPacketInfo,psessionEntry);
926 break;
927
928 case SIR_MAC_MGMT_DEAUTH:
929 limProcessDeauthFrame(pMac, pRxPacketInfo,psessionEntry);
930 break;
931
932 case SIR_MAC_MGMT_ACTION:
933#if defined WLAN_FEATURE_P2P
934 if(psessionEntry == NULL)
935 limProcessActionFrameNoSession(pMac, pRxPacketInfo);
936 else
937 {
938#endif
939 if (WDA_GET_RX_UNKNOWN_UCAST(pRxPacketInfo))
940 limHandleUnknownA2IndexFrames(pMac, pRxPacketInfo,psessionEntry);
941 else
942 limProcessActionFrame(pMac, pRxPacketInfo,psessionEntry);
943#if defined WLAN_FEATURE_P2P
944 }
945#endif
946 break;
947 default:
948 // Received Management frame of 'reserved' subtype
949 break;
950 } // switch (fc.subType)
951
952 }
953 break;
954#ifdef FEATURE_WLAN_CCX
955 case SIR_MAC_DATA_FRAME:
956 {
957 /* We accept data frame (IAPP frame) only if Session is
958 * present and ccx connection is established on that
959 * session
960 */
961 if (psessionEntry && psessionEntry->isCCXconnection) {
962 limProcessIappFrame(pMac, pRxPacketInfo, psessionEntry);
963 }
964 }
965 break;
966#endif
967 default:
968 // Received frame of type 'reserved'
969 break;
970
971 } // switch (fc.type)
972
973 limPktFree(pMac, HAL_TXRX_FRM_802_11_MGMT, pRxPacketInfo, (void *) limMsg->bodyptr) ;
974 return;
975} /*** end limHandle80211Frames() ***/
976
977
978/**
979 * limProcessAbortScanInd()
980 *
981 *FUNCTION:
982 * This function is called from HDD to abort the scan which is presently being run
983 *
984 *
985 *NOTE:
986 *
987 * @param pMac Pointer to Global MAC structure
988 * @param *pMsgBuf A pointer to the SME message buffer
989 * @return None
990 */
991void
992limProcessAbortScanInd(tpAniSirGlobal pMac)
993{
994#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT
995 limDiagEventReport(pMac, WLAN_PE_DIAG_SCAN_ABORT_IND_EVENT, NULL, 0, 0);
996#endif //FEATURE_WLAN_DIAG_SUPPORT
997
998 /* Deactivate the gLimBackgroundScanTimer as part of the abort scan.
999 * SME should send WNI_CFG_BACKGROUND_SCAN_PERIOD indication
1000 * to start the background scan again
1001 */
1002 PELOGE(limLog(pMac, LOGE, FL("Processing AbortScan Ind\n"));)
1003
1004 limAbortBackgroundScan(pMac);
1005
1006 /* Abort the scan if its running, else just return */
1007 if(limIsSystemInScanState(pMac))
1008 {
1009 if( (eLIM_HAL_INIT_SCAN_WAIT_STATE == pMac->lim.gLimHalScanState ) ||
1010 (eLIM_HAL_START_SCAN_WAIT_STATE == pMac->lim.gLimHalScanState ) ||
1011 (eLIM_HAL_END_SCAN_WAIT_STATE == pMac->lim.gLimHalScanState ) ||
1012 (eLIM_HAL_FINISH_SCAN_WAIT_STATE == pMac->lim.gLimHalScanState) )
1013 {
1014 //Simply signal we need to abort
1015 limLog( pMac, LOGW, FL(" waiting for HAL, simply signal abort gLimHalScanState = %d\n"), pMac->lim.gLimHalScanState );
1016 pMac->lim.abortScan = 1;
1017 }
1018 else
1019 {
1020 //Force abort
1021 limLog( pMac, LOGW, FL(" Force aborting scan\n") );
1022 pMac->lim.abortScan = 0;
1023 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1024 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1025 //Set the resume channel to Any valid channel (invalid).
1026 //This will instruct HAL to set it to any previous valid channel.
1027 peSetResumeChannel(pMac, 0, 0);
1028 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
1029 }
1030 }
1031 return;
1032}
1033
1034/**
1035 * limMessageProcessor
1036 *
1037 *FUNCTION:
1038 * Wrapper function for limProcessMessages when handling messages received by LIM.
1039 * Could either defer messages or process them.
1040 * @param pMac Pointer to Global MAC structure
1041 * @param limMsg Received LIM message
1042 * @return None
1043 */
1044
1045void limMessageProcessor(tpAniSirGlobal pMac, tpSirMsgQ limMsg)
1046{
1047 if (eLIM_MLM_OFFLINE_STATE == pMac->lim.gLimMlmState)
1048 {
1049 peFreeMsg(pMac, limMsg);
1050 return;
1051 }
1052
1053 if (!defMsgDecision(pMac, limMsg))
1054 {
1055 limProcessMessages(pMac, limMsg);
1056#ifdef ANI_PRODUCT_TYPE_CLIENT
1057 // process deferred message queue if allowed
1058 {
1059 if ( (! (pMac->lim.gLimAddtsSent))
1060 &&
1061 (! (limIsSystemInScanState(pMac)))
1062 )
1063 {
1064 if (true == GET_LIM_PROCESS_DEFD_MESGS(pMac))
1065 limProcessDeferredMessageQueue(pMac);
1066 }
1067 }
1068#else
1069 {
1070 // process deferred message queue if allowed
1071 if (! (pMac->lim.gLimSystemInScanLearnMode))
1072 {
1073#if defined(ANI_AP_CLIENT_SDK)
1074 if (pMac->lim.gLimSystemRole != eLIM_AP_ROLE && (pMac->lim.gLimAddtsSent))
1075 return;
1076#endif
1077
1078 if (true == GET_LIM_PROCESS_DEFD_MESGS(pMac))
1079 limProcessDeferredMessageQueue(pMac);
1080 }
1081 }
1082#endif
1083 }
1084}
1085
Jeff Johnsone7245742012-09-05 17:12:55 -07001086#ifdef FEATURE_OEM_DATA_SUPPORT
1087
1088void limOemDataRspHandleResumeLinkRsp(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* mlmOemDataRsp)
1089{
1090 if(status != eHAL_STATUS_SUCCESS)
1091 {
1092 limLog(pMac, LOGE, FL("OEM Data Rsp failed to get the response for resume link\n"));
1093 }
1094
1095 if(NULL != pMac->lim.gpLimMlmOemDataReq)
1096 {
1097 palFreeMemory(pMac->hHdd, pMac->lim.gpLimMlmOemDataReq);
1098 pMac->lim.gpLimMlmOemDataReq = NULL;
1099 }
1100
1101 //"Failure" status doesn't mean that Oem Data Rsp did not happen
1102 //and hence we need to respond to upper layers. Only Resume link is failed, but
1103 //we got the oem data response already.
1104 //Post the meessage to MLM
1105 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)(mlmOemDataRsp));
1106
1107 return;
1108}
1109
1110void limProcessOemDataRsp(tpAniSirGlobal pMac, tANI_U32* body)
1111{
1112 eHalStatus status = eHAL_STATUS_SUCCESS;
1113 tpLimMlmOemDataRsp mlmOemDataRsp = NULL;
1114 tpStartOemDataRsp oemDataRsp = NULL;
1115
1116 //Process all the messages for the lim queue
1117 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
1118
1119 oemDataRsp = (tpStartOemDataRsp)(body);
1120
1121 status = palAllocateMemory(pMac->hHdd, (void**)(&mlmOemDataRsp), sizeof(tLimMlmOemDataRsp));
1122 if(status != eHAL_STATUS_SUCCESS)
1123 {
1124 limLog(pMac, LOGP, FL("could not allocate memory for mlmOemDataRsp\n"));
1125 return;
1126 }
1127
1128 //copy the memory into tLimMlmOemDataRsp and free the tStartOemDataRsp
1129 //the structures tStartOemDataRsp and tLimMlmOemDataRsp have the same structure
1130 palCopyMemory(pMac->hHdd, (void*)(mlmOemDataRsp), (void*)(oemDataRsp), sizeof(tLimMlmOemDataRsp));
1131
1132 //Now free the incoming memory
1133 palFreeMemory(pMac->hHdd, (void*)(oemDataRsp));
1134
1135 limResumeLink(pMac, limOemDataRspHandleResumeLinkRsp, (tANI_U32*)mlmOemDataRsp);
1136
1137 return;
1138}
1139
1140#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001141
1142
1143/**
1144 * limProcessMessages
1145 *
1146 *FUNCTION:
1147 * This function is called by limProcessMessageQueue function. This
1148 * function processes messages received by LIM.
1149 *
1150 *LOGIC:
1151 * Depending on the message type, corresponding function will be
1152 * called, for example limProcessSmeMessages() will be called to
1153 * process SME messages received from HDD/Upper layer software module.
1154 *
1155 *ASSUMPTIONS:
1156 * NA
1157 *
1158 *NOTE:
1159 * NA
1160 *
1161 * @param pMac Pointer to Global MAC structure
1162 * @param limMsg Received LIM message
1163 * @return None
1164 */
1165
1166void
1167limProcessMessages(tpAniSirGlobal pMac, tpSirMsgQ limMsg)
1168{
1169 tANI_U8 deferMsg = false;
1170 tLinkStateParams *linkStateParams;
1171#if defined WLAN_FEATURE_VOWIFI_11R
1172 tpPESession pSession;
1173#endif
1174#if defined(ANI_DVT_DEBUG)
1175 tSirMsgQ msgQ;
1176#endif
1177 if(pMac->gDriverType == eDRIVER_TYPE_MFG)
1178 {
Jeff Johnsone7245742012-09-05 17:12:55 -07001179 palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
1180 limMsg->bodyptr = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001181 return;
1182 }
1183#ifdef WLAN_DEBUG
1184 pMac->lim.numTot++;
1185#endif
1186
1187
1188 PELOG3(limLog(pMac, LOG3, FL("rcvd msgType = %s, sme state = %s, mlm state = %s\n"),
1189 limMsgStr(limMsg->type), limSmeStateStr(pMac->lim.gLimSmeState),
1190 limMlmStateStr(pMac->lim.gLimMlmState));)
1191
Jeff Johnsone7245742012-09-05 17:12:55 -07001192 MTRACE(macTraceMsgRx(pMac, NO_SESSION, LIM_TRACE_MAKE_RXMSG(limMsg->type, LIM_MSG_PROCESSED));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001193
1194 switch (limMsg->type)
1195 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001196
1197 case SIR_LIM_UPDATE_BEACON:
1198 limUpdateBeacon(pMac);
1199 break;
1200
Jeff Johnson295189b2012-06-20 16:38:30 -07001201 case SIR_CFG_PARAM_UPDATE_IND:
1202 /// CFG parameter updated
1203 if (limIsSystemInScanState(pMac))
1204 {
1205 // System is in DFS (Learn) mode
1206 // Defer processsing this message
1207 if (limDeferMsg(pMac, limMsg) != TX_SUCCESS)
1208 {
1209 PELOGE(limLog(pMac, LOGE, FL("Unable to Defer message(0x%X) limSmeState %d (prev sme state %d) sysRole %d mlm state %d (prev mlm state %d)\n"),
1210 limMsg->type, pMac->lim.gLimSmeState, pMac->lim.gLimPrevSmeState,
1211 pMac->lim.gLimSystemRole, pMac->lim.gLimMlmState, pMac->lim.gLimPrevMlmState);)
1212 limLogSessionStates(pMac);
1213 limPrintMsgName(pMac, LOGE, limMsg->type);
1214 }
1215 }
1216 else
1217 {
1218 limHandleCFGparamUpdate(pMac, limMsg->bodyval);
1219 }
1220
1221 break;
1222
1223 case WDA_INIT_SCAN_RSP:
1224 limProcessInitScanRsp(pMac, limMsg->bodyptr);
1225 break;
1226
1227 case WDA_START_SCAN_RSP:
1228 limProcessStartScanRsp(pMac, limMsg->bodyptr);
1229 break;
1230
1231 case WDA_END_SCAN_RSP:
1232 limProcessEndScanRsp(pMac, limMsg->bodyptr);
1233 break;
1234
1235 case WDA_FINISH_SCAN_RSP:
1236 limProcessFinishScanRsp(pMac, limMsg->bodyptr);
1237 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07001238#ifdef FEATURE_OEM_DATA_SUPPORT
1239 case WDA_START_OEM_DATA_RSP:
1240 limProcessOemDataRsp(pMac, limMsg->bodyptr);
1241 break;
1242#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001243
1244 case WDA_SWITCH_CHANNEL_RSP:
1245 limProcessSwitchChannelRsp(pMac, limMsg->bodyptr);
1246 break;
1247
1248#ifdef ANI_SIR_IBSS_PEER_CACHING
1249 case WDA_IBSS_STA_ADD:
1250 limIbssStaAdd(pMac, limMsg->bodyptr);
1251 break;
1252#endif
1253 case SIR_BB_XPORT_MGMT_MSG:
1254 // These messages are from Peer MAC entity.
1255#ifdef WLAN_DEBUG
1256 pMac->lim.numBbt++;
1257#endif
1258
1259#ifdef VOSS_ENABLED
1260 {
1261 v_U16_t pktLen = 0;
1262 vos_pkt_t *pVosPkt;
1263 VOS_STATUS vosStatus;
1264 tSirMsgQ limMsgNew;
1265
1266 /* The original limMsg which we were deferring have the
1267 * bodyPointer point to 'BD' instead of 'Vos pkt'. If we don't make a copy
1268 * of limMsg, then vos_pkt_peek_data will overwrite the limMsg->bodyPointer.
1269 * and next time when we try to process the msg, we will try to use 'BD' as
1270 * 'Vos Pkt' which will cause a crash
1271 */
1272 palCopyMemory(pMac, (tANI_U8*)&limMsgNew, (tANI_U8*)limMsg, sizeof(tSirMsgQ));
1273 pVosPkt = (vos_pkt_t *)limMsgNew.bodyptr;
1274 vos_pkt_get_packet_length(pVosPkt, &pktLen);
1275
1276 vosStatus = WDA_DS_PeekRxPacketInfo( pVosPkt, (v_PVOID_t *)&limMsgNew.bodyptr, VOS_FALSE );
1277
1278 if( !VOS_IS_STATUS_SUCCESS(vosStatus) )
1279 {
1280 vos_pkt_return_packet(pVosPkt);
1281 break;
1282
1283 }
1284 limHandle80211Frames(pMac, &limMsgNew, &deferMsg);
1285
1286 if ( deferMsg == true )
1287 {
1288 PELOG1(limLog(pMac, LOG1, FL("Defer message type=%X \n"), limMsg->type);)
1289 if (limDeferMsg(pMac, limMsg) != TX_SUCCESS)
1290 {
1291 PELOGE(limLog(pMac, LOGE, FL("Unable to Defer message(0x%X) limSmeState %d (prev sme state %d) sysRole %d mlm state %d (prev mlm state %d)\n"),
1292 limMsg->type, pMac->lim.gLimSmeState, pMac->lim.gLimPrevSmeState,
1293 pMac->lim.gLimSystemRole, pMac->lim.gLimMlmState, pMac->lim.gLimPrevMlmState);)
1294 limLogSessionStates(pMac);
1295 limPrintMsgName(pMac, LOGE, limMsg->type);
1296 vos_pkt_return_packet(pVosPkt);
1297 }
1298 }
1299 else
1300 {
1301 /* PE is not deferring this 802.11 frame so we need to call vos_pkt_return.
1302 * Asumption here is when Rx mgmt frame processing is done,
1303 * voss packet could be freed here.
1304 */
1305 vos_pkt_return_packet(pVosPkt);
1306 }
1307 }
1308#else
1309 limHandle80211Frames(pMac, limMsg);
1310#endif
1311 break;
1312
1313 case eWNI_SME_SCAN_REQ:
1314#ifdef WLAN_FEATURE_P2P
1315 case eWNI_SME_REMAIN_ON_CHANNEL_REQ:
1316#endif
1317 case eWNI_SME_DISASSOC_REQ:
1318 case eWNI_SME_DEAUTH_REQ:
1319 case eWNI_SME_STA_STAT_REQ:
1320 case eWNI_SME_AGGR_STAT_REQ:
1321 case eWNI_SME_GLOBAL_STAT_REQ:
1322 case eWNI_SME_STAT_SUMM_REQ:
1323 case eWNI_SME_GET_SCANNED_CHANNEL_REQ:
1324 case eWNI_SME_GET_STATISTICS_REQ:
Jeff Johnsone7245742012-09-05 17:12:55 -07001325#ifdef FEATURE_OEM_DATA_SUPPORT
1326 case eWNI_SME_OEM_DATA_REQ:
1327#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001328 // These messages are from HDD
1329 limProcessNormalHddMsg(pMac, limMsg, true); //need to response to hdd
1330 break;
1331
1332 case eWNI_SME_SCAN_ABORT_IND:
1333 vos_mem_free((v_VOID_t *)limMsg->bodyptr);
1334 limMsg->bodyptr = NULL;
1335 limProcessAbortScanInd(pMac);
1336 break;
1337
1338 case eWNI_SME_START_REQ:
1339 case eWNI_SME_SYS_READY_IND:
1340#ifndef WNI_ASKEY_NON_SUPPORT_FEATURE
1341 case eWNI_SME_JOIN_REQ:
1342#endif
1343 case eWNI_SME_AUTH_REQ:
1344 case eWNI_SME_REASSOC_REQ:
1345 case eWNI_SME_START_BSS_REQ:
1346 case eWNI_SME_STOP_BSS_REQ:
1347 case eWNI_SME_SWITCH_CHL_REQ:
1348 case eWNI_SME_SWITCH_CHL_CB_PRIMARY_REQ:
1349 case eWNI_SME_SWITCH_CHL_CB_SECONDARY_REQ:
1350 case eWNI_SME_SETCONTEXT_REQ:
1351 case eWNI_SME_REMOVEKEY_REQ:
1352#ifndef WNI_ASKEY_NON_SUPPORT_FEATURE
1353 case eWNI_SME_PROMISCUOUS_MODE_REQ:
1354#endif
1355 case eWNI_SME_DISASSOC_CNF:
1356 case eWNI_SME_DEAUTH_CNF:
1357 case eWNI_SME_ASSOC_CNF:
1358 case eWNI_SME_REASSOC_CNF:
1359 case eWNI_SME_ADDTS_REQ:
1360 case eWNI_SME_DELTS_REQ:
1361 case eWNI_SME_DEL_BA_PEER_IND:
1362 case eWNI_SME_SET_TX_POWER_REQ:
1363 case eWNI_SME_GET_TX_POWER_REQ:
1364 case eWNI_SME_GET_NOISE_REQ:
1365#ifdef WLAN_SOFTAP_FEATURE
1366 case eWNI_SME_GET_ASSOC_STAS_REQ:
1367 case eWNI_SME_TKIP_CNTR_MEAS_REQ:
1368 case eWNI_SME_UPDATE_APWPSIE_REQ:
1369 case eWNI_SME_HIDE_SSID_REQ:
1370 case eWNI_SME_GET_WPSPBC_SESSION_REQ:
1371 case eWNI_SME_SET_APWPARSNIEs_REQ:
1372#endif
1373#if defined WLAN_FEATURE_VOWIFI
1374 case eWNI_SME_NEIGHBOR_REPORT_REQ_IND:
1375 case eWNI_SME_BEACON_REPORT_RESP_XMIT_IND:
1376#endif
1377#if defined FEATURE_WLAN_CCX
1378 case eWNI_SME_CCX_ADJACENT_AP_REPORT:
1379#endif
1380#ifdef WLAN_FEATURE_VOWIFI_11R
1381 case eWNI_SME_FT_UPDATE_KEY:
1382 case eWNI_SME_FT_PRE_AUTH_REQ:
1383 case eWNI_SME_FT_AGGR_QOS_REQ:
1384#endif
1385 case eWNI_SME_ADD_STA_SELF_REQ:
1386 case eWNI_SME_DEL_STA_SELF_REQ:
1387#ifdef WLAN_FEATURE_P2P
1388 case eWNI_SME_REGISTER_MGMT_FRAME_REQ:
1389 case eWNI_SME_UPDATE_NOA:
1390#endif
1391 // These messages are from HDD
1392 limProcessNormalHddMsg(pMac, limMsg, false); //no need to response to hdd
1393 break;
1394
1395 //Power Save Messages From HDD
1396 case eWNI_PMC_PWR_SAVE_CFG:
1397 case eWNI_PMC_ENTER_BMPS_REQ:
1398 case eWNI_PMC_EXIT_BMPS_REQ:
1399 case eWNI_PMC_ENTER_IMPS_REQ:
1400 case eWNI_PMC_EXIT_IMPS_REQ:
1401 case eWNI_PMC_ENTER_UAPSD_REQ:
1402 case eWNI_PMC_EXIT_UAPSD_REQ:
1403 case eWNI_PMC_ENTER_WOWL_REQ:
1404 case eWNI_PMC_EXIT_WOWL_REQ:
1405 case eWNI_PMC_WOWL_ADD_BCAST_PTRN:
1406 case eWNI_PMC_WOWL_DEL_BCAST_PTRN:
1407 pmmProcessMessage(pMac, limMsg);
1408 break;
1409
1410 case eWNI_PMC_SMPS_STATE_IND :
1411 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001412 if(limMsg->bodyptr){
1413 palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
1414 limMsg->bodyptr = NULL;
1415 }
1416 }
1417 break;
1418#if defined WLAN_FEATURE_P2P
1419 case eWNI_SME_SEND_ACTION_FRAME_IND:
1420 limSendP2PActionFrame(pMac, limMsg);
1421 palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
1422 limMsg->bodyptr = NULL;
1423 break;
1424 case eWNI_SME_ABORT_REMAIN_ON_CHAN_IND:
1425 limAbortRemainOnChan(pMac);
1426 palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
1427 limMsg->bodyptr = NULL;
1428 break;
1429
1430 case SIR_HAL_P2P_NOA_ATTR_IND:
1431 {
1432 tpPESession psessionEntry = &pMac->lim.gpSession[0];
1433 tANI_U8 i;
1434
1435
1436 limLog(pMac, LOGW, FL("Received message Noa_ATTR %x\n"), limMsg->type);
1437 for(i=0; i < pMac->lim.maxBssId; i++)
1438 {
1439 if ( (psessionEntry != NULL) && (pMac->lim.gpSession[i].valid) &&
1440 (psessionEntry->pePersona == VOS_P2P_GO_MODE))
1441 { //Save P2P attributes for P2P Go persona
1442
1443 palCopyMemory(pMac->hHdd,&psessionEntry->p2pGoPsUpdate, limMsg->bodyptr,sizeof(tSirP2PNoaAttr));
1444
1445
1446 limLog(pMac, LOGE, FL(" &psessionEntry->bssId%02x:%02x:%02x:%02x:%02x:%02x ctWin=%d oppPsFlag=%d\n"),
1447 psessionEntry->bssId[0],
1448 psessionEntry->bssId[1],
1449 psessionEntry->bssId[2],
1450 psessionEntry->bssId[3],
1451 psessionEntry->bssId[4],
1452 psessionEntry->bssId[5],
1453 psessionEntry->p2pGoPsUpdate.ctWin,
1454 psessionEntry->p2pGoPsUpdate.oppPsFlag);
1455
1456 limLog(pMac, LOGE, FL(" uNoa1IntervalCnt=%d uNoa1Duration=%d uNoa1Interval=%d uNoa1StartTime=%d\n"),
1457 psessionEntry->p2pGoPsUpdate.uNoa1IntervalCnt,
1458 psessionEntry->p2pGoPsUpdate.uNoa1Duration,
1459 psessionEntry->p2pGoPsUpdate.uNoa1Interval,
1460 psessionEntry->p2pGoPsUpdate.uNoa1StartTime);
1461
1462
1463 break;
1464 }
1465 }
1466
1467 }
1468 palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
1469 limMsg->bodyptr = NULL;
1470
1471 break;
1472
1473
1474#endif
1475 /* eWNI_SME_PRE_CHANNEL_SWITCH_FULL_POWER Message comes after the
1476 * device comes out of full power for the full power request sent
1477 * because of channel switch with switch count as 0, so call the same
1478 * function used in timeout case(i.e SIR_LIM_CHANNEL_SWITCH_TIMEOUT)
1479 * for switching the channel*/
1480 case eWNI_SME_PRE_CHANNEL_SWITCH_FULL_POWER:
Jeff Johnsone7245742012-09-05 17:12:55 -07001481 if ( !tx_timer_running(&pMac->lim.limTimers.gLimChannelSwitchTimer) )
1482 {
1483 limProcessChannelSwitchTimeout(pMac);
1484 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001485 palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
1486 limMsg->bodyptr = NULL;
1487 break;
1488
1489 //Power Save Related Messages From HAL
1490 case WDA_ENTER_BMPS_RSP:
1491 case WDA_EXIT_BMPS_RSP:
1492 case WDA_EXIT_BMPS_IND:
1493 case WDA_ENTER_IMPS_RSP:
1494 case WDA_EXIT_IMPS_RSP:
1495 case WDA_ENTER_UAPSD_RSP:
1496 case WDA_EXIT_UAPSD_RSP:
1497 case WDA_WOWL_ENTER_RSP:
1498 case WDA_WOWL_EXIT_RSP:
1499 pmmProcessMessage(pMac, limMsg);
1500 break;
1501
1502 case WDA_LOW_RSSI_IND:
1503 //limHandleLowRssiInd(pMac);
1504 break;
1505
1506 case WDA_BMPS_STATUS_IND:
1507 limHandleBmpsStatusInd(pMac);
1508 break;
1509
1510 case WDA_MISSED_BEACON_IND:
1511 limHandleMissedBeaconInd(pMac);
1512 break;
1513 case WDA_MIC_FAILURE_IND:
1514 limMicFailureInd(pMac, limMsg);
1515 palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
1516 limMsg->bodyptr = NULL;
1517 break;
1518
1519
1520#if (WNI_POLARIS_FW_PACKAGE == ADVANCED) && defined(ANI_PRODUCT_TYPE_AP)
1521 case eWNI_SME_MEASUREMENT_REQ:
1522 case eWNI_SME_SET_WDS_INFO_REQ:
1523 // Message to support ANI feature set
1524 // These are handled by LMM sub module
1525 if (limIsSystemInScanState(pMac))
1526 {
1527 // System is in DFS (Learn) mode
1528 // Defer processsing this message
1529 if (limDeferMsg(pMac, limMsg) != TX_SUCCESS)
1530 {
1531 pMac->lim.numSme++;
1532 PELOGE(limLog(pMac, LOGE, FL("Unable to Defer message(0x%X) limSmeState %d (prev sme state %d) sysRole %d mlm state %d (prev mlm state %d)\n"),
1533 limMsg->type, pMac->lim.gLimSmeState, pMac->lim.gLimPrevSmeState,
1534 pMac->lim.gLimSystemRole, pMac->lim.gLimMlmState, pMac->lim.gLimPrevMlmState);)
1535 limLogSessionStates(pMac);
1536 limPrintMsgName(pMac, LOGE, limMsg->type);
1537 // Release body
1538 palFreeMemory( pMac->hHdd, (tANI_U8 *) limMsg->bodyptr);
1539 break;
1540 }
1541
1542 if (limMsg->type == eWNI_SME_MEASUREMENT_REQ)
1543 {
1544 if (GET_LIM_PROCESS_DEFD_MESGS(pMac))
1545 {
1546 //Set the resume channel to Any valid channel (invalid).
1547 //This will instruct HAL to set it to any previous valid channel.
1548 peSetResumeChannel(pMac, 0, 0);
1549 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_LEARN_WAIT_STATE);
1550 }
1551 }
1552 }
1553 else
1554 {
1555 pMac->lim.numSme++;
1556 limProcessLmmMessages(pMac,
1557 limMsg->type,
1558 (tANI_U32 *) limMsg->bodyptr);
1559
1560 // Release body
1561 palFreeMemory( pMac->hHdd, (tANI_U8 *) limMsg->bodyptr);
1562 }
1563 break;
1564
1565 case SIR_LIM_LEARN_INTERVAL_TIMEOUT:
1566 if ((pMac->lim.gLimSystemRole == eLIM_STA_ROLE) &&
1567 ((pMac->lim.gLimMlmState == eLIM_MLM_WT_DEL_STA_RSP_STATE) ||
1568 (pMac->lim.gLimMlmState == eLIM_MLM_WT_DEL_BSS_RSP_STATE)))
1569 {
1570 // BP is in the process of cleaning up
1571 // its state with previously assocaited AP.
1572 // Discard processsing this message.
1573 PELOG1(limLog(pMac, LOG1,
1574 FL("Discarding LEARN_INTERVAL_TO message\n"));)
1575 }
1576 else
1577 limProcessLmmMessages(pMac,
1578 limMsg->type,
1579 (tANI_U32 *) limMsg->bodyptr);
1580 break;
1581
1582 case SIR_LIM_MEASUREMENT_IND_TIMEOUT:
1583 case SIR_LIM_LEARN_DURATION_TIMEOUT:
1584 // These measurement related timeouts are
1585 // handled by LMM sub module.
1586 limProcessLmmMessages(pMac,
1587 limMsg->type,
1588 (tANI_U32 *) limMsg->bodyptr);
1589
1590 break;
1591
1592 case SIR_LIM_RADAR_DETECT_IND:
1593 limDetectRadar(pMac, (tANI_U32*)limMsg->bodyptr);
1594 palFreeMemory( pMac->hHdd, (tANI_U32*)limMsg->bodyptr);
1595 break;
1596
1597#endif
1598
1599 case SIR_LIM_ADDTS_RSP_TIMEOUT:
1600 limProcessSmeReqMessages(pMac,limMsg);
1601 break;
1602#ifdef FEATURE_WLAN_CCX
1603 case SIR_LIM_CCX_TSM_TIMEOUT:
1604 limProcessTsmTimeoutHandler(pMac,limMsg);
1605 break;
1606 case WDA_TSM_STATS_RSP:
1607 limProcessHalCcxTsmRsp(pMac, limMsg);
1608 break;
1609#endif
1610 case WDA_ADD_TS_RSP:
1611 limProcessHalAddTsRsp(pMac, limMsg);
1612 break;
1613
1614 case SIR_LIM_DEL_TS_IND:
1615 limProcessDelTsInd(pMac, limMsg);
1616 case SIR_LIM_ADD_BA_IND:
1617 limProcessAddBaInd(pMac, limMsg);
1618 break;
1619 case SIR_LIM_DEL_BA_ALL_IND:
1620 limDelAllBASessions(pMac); // refer notes and change
1621 break;
1622 case SIR_LIM_DEL_BA_IND:
1623 limProcessMlmHalBADeleteInd( pMac, limMsg );
1624 break;
1625
1626 case SIR_LIM_BEACON_GEN_IND: {
1627#ifdef ANI_PRODUCT_TYPE_AP
1628 if (pMac->lim.gLimSystemRole == eLIM_AP_ROLE)
1629 pmmUpdateTIM(pMac, (tpBeaconGenParams)limMsg->bodyptr);
1630#endif
1631
1632#ifdef WLAN_SOFTAP_FEATURE
1633 if( pMac->lim.gLimSystemRole != eLIM_AP_ROLE )
1634#endif
1635 schProcessPreBeaconInd(pMac, limMsg);
1636
1637 }
1638 break;
1639
1640 case SIR_LIM_DELETE_STA_CONTEXT_IND:
1641 limDeleteStaContext(pMac, limMsg);
1642 break;
1643
1644 case SIR_LIM_MIN_CHANNEL_TIMEOUT:
1645 case SIR_LIM_MAX_CHANNEL_TIMEOUT:
1646 case SIR_LIM_PERIODIC_PROBE_REQ_TIMEOUT:
1647 case SIR_LIM_JOIN_FAIL_TIMEOUT:
1648 case SIR_LIM_AUTH_FAIL_TIMEOUT:
1649 case SIR_LIM_AUTH_RSP_TIMEOUT:
1650 case SIR_LIM_ASSOC_FAIL_TIMEOUT:
1651 case SIR_LIM_REASSOC_FAIL_TIMEOUT:
1652#ifdef WLAN_FEATURE_VOWIFI_11R
1653 case SIR_LIM_FT_PREAUTH_RSP_TIMEOUT:
1654#endif
1655#ifdef WLAN_FEATURE_P2P
1656 case SIR_LIM_REMAIN_CHN_TIMEOUT:
1657#endif
1658 // These timeout messages are handled by MLM sub module
1659
1660 limProcessMlmReqMessages(pMac,
1661 limMsg);
1662
1663 break;
1664
1665 case SIR_LIM_HEART_BEAT_TIMEOUT:
1666 /** check if heart beat failed, even if one Beacon
1667 * is rcvd within the Heart Beat interval continue
1668 * normal processing
1669 */
1670
1671 #if 0
1672 PELOG1(limLog(pMac, LOG1, FL("Heartbeat timeout, SME %d, MLME %d, #bcn %d\n"),
1673 pMac->lim.gLimSmeState, pMac->lim.gLimMlmState,
1674 pMac->lim.gLimRxedBeaconCntDuringHB);)
1675
1676 if(pMac->lim.gLimSystemRole == eLIM_STA_IN_IBSS_ROLE)
1677 limIbssHeartBeatHandle(pMac); //HeartBeat for peers.
1678 else
1679 /**
1680 * Heartbeat failure occurred on STA
1681 * This is handled by LMM sub module.
1682 */
1683 limHandleHeartBeatFailure(pMac);
1684
1685 break;
1686 #endif //TO SUPPORT BT-AMP
1687
1688 limHandleHeartBeatTimeout(pMac);
1689 break;
1690
1691 case SIR_LIM_PROBE_HB_FAILURE_TIMEOUT:
1692 limHandleHeartBeatFailureTimeout(pMac);
1693 break;
1694
1695 case SIR_LIM_CHANNEL_SCAN_TIMEOUT:
1696#if defined(ANI_PRODUCT_TYPE_CLIENT) || defined(ANI_AP_CLIENT_SDK)
1697 /**
1698 * Background scan timeout occurred on STA.
1699 * This is handled by LMM sub module.
1700 */
1701 limDeactivateAndChangeTimer(pMac, eLIM_BACKGROUND_SCAN_TIMER);
1702
1703 //We will do background scan even in bcnps mode
1704 //if (pMac->sys.gSysEnableScanMode)
1705 pMac->lim.gLimReportBackgroundScanResults = FALSE;
1706 limTriggerBackgroundScan(pMac);
1707#endif
1708 break;
1709
1710#ifdef ANI_PRODUCT_TYPE_AP
1711 case SIR_LIM_PREAUTH_CLNUP_TIMEOUT:
1712 if (limIsSystemInScanState(pMac))
1713 {
1714 // System is in DFS (Learn) mode
1715 // Defer processsing this message
1716 if (limDeferMsg(pMac, limMsg) != TX_SUCCESS)
1717 {
1718 PELOGE(limLog(pMac, LOGE, FL("Unable to Defer message(0x%X) limSmeState %d (prev sme state %d) sysRole %d mlm state %d (prev mlm state %d)\n"),
1719 limMsg->type, pMac->lim.gLimSmeState, pMac->lim.gLimPrevSmeState,
1720 pMac->lim.gLimSystemRole, pMac->lim.gLimMlmState, pMac->lim.gLimPrevMlmState);)
1721 limLogSessionStates(pMac);
1722 }
1723 }
1724 else
1725 {
1726 // Pre-authentication context cleanup timeout message
1727 limPreAuthClnupHandler(pMac);
1728 }
1729
1730 break;
1731#endif
1732
1733 case SIR_LIM_HASH_MISS_THRES_TIMEOUT:
1734
1735 /*
1736 ** clear the credit to the send disassociate frame bucket
1737 **/
1738
1739 pMac->lim.gLimDisassocFrameCredit = 0;
1740 break;
1741
1742 case SIR_LIM_CNF_WAIT_TIMEOUT:
1743
1744 /*
1745 ** Does not receive CNF or dummy packet
1746 **/
1747 limHandleCnfWaitTimeout(pMac, (tANI_U16) limMsg->bodyval);
1748
1749 break;
1750
1751 case SIR_LIM_KEEPALIVE_TIMEOUT:
1752 limSendKeepAliveToPeer(pMac);
1753
1754 break;
1755
1756 case SIR_LIM_RETRY_INTERRUPT_MSG:
1757 // Message from ISR upon TFP's max retry limit interrupt
1758
1759 break;
1760
1761 case SIR_LIM_INV_KEY_INTERRUPT_MSG:
1762 // Message from ISR upon SP's Invalid session key interrupt
1763
1764 break;
1765
1766 case SIR_LIM_KEY_ID_INTERRUPT_MSG:
1767 // Message from ISR upon SP's Invalid key ID interrupt
1768
1769 break;
1770
1771 case SIR_LIM_REPLAY_THRES_INTERRUPT_MSG:
1772 // Message from ISR upon SP's Replay threshold interrupt
1773
1774 break;
1775
1776 case SIR_LIM_CHANNEL_SWITCH_TIMEOUT:
1777 limProcessChannelSwitchTimeout(pMac);
1778 break;
1779
1780 case SIR_LIM_QUIET_TIMEOUT:
1781 limProcessQuietTimeout(pMac);
1782 break;
1783
1784 case SIR_LIM_QUIET_BSS_TIMEOUT:
1785 limProcessQuietBssTimeout(pMac);
1786 break;
1787
1788#ifdef WLAN_SOFTAP_FEATURE
1789 case SIR_LIM_UPDATE_OLBC_CACHEL_TIMEOUT:
1790 limHandleUpdateOlbcCache(pMac);
1791 break;
1792#if 0
1793 case SIR_LIM_WPS_OVERLAP_TIMEOUT:
1794 limProcessWPSOverlapTimeout(pMac);
1795 break;
1796#endif
1797
1798#endif
1799
1800 case WDA_ADD_BSS_RSP:
1801 limProcessMlmAddBssRsp( pMac, limMsg );
1802 break;
1803
1804 case WDA_ADD_STA_RSP:
1805
1806 //call a wrapper by paasing bodyptr, their get sessionID and and call proper function from there.
1807 limProcessAddStaRsp(pMac,limMsg);
1808 break;
1809
1810 case WDA_DELETE_STA_RSP:
1811 limProcessMlmDelStaRsp(pMac, limMsg);
1812 break;
1813
1814 case WDA_ADD_STA_SELF_RSP:
1815 limProcessAddStaSelfRsp(pMac, limMsg);
1816 break;
1817 case WDA_DEL_STA_SELF_RSP:
1818 limProcessDelStaSelfRsp(pMac, limMsg);
1819 break;
1820
1821 case WDA_DELETE_BSS_RSP:
1822 limHandleDeleteBssRsp(pMac,limMsg); //wrapper routine to handle delete bss response
1823 break;
1824
1825 case WDA_SET_BSSKEY_RSP:
1826 case WDA_SET_STA_BCASTKEY_RSP:
1827 limProcessMlmSetBssKeyRsp( pMac, limMsg );
1828 break;
1829 case WDA_SET_STAKEY_RSP:
1830 limProcessMlmSetStaKeyRsp( pMac, limMsg );
1831 break;
1832 case WDA_REMOVE_BSSKEY_RSP:
1833 case WDA_REMOVE_STAKEY_RSP:
1834 limProcessMlmRemoveKeyRsp( pMac, limMsg );
1835 break;
1836 case WDA_ADDBA_RSP:
1837 limProcessMlmHalAddBARsp( pMac, limMsg );
1838 break;
1839
1840 case WDA_STA_STAT_RSP:
1841 case WDA_AGGR_STAT_RSP:
1842 case WDA_GLOBAL_STAT_RSP:
1843 case WDA_STAT_SUMM_RSP:
1844 limSendSmeStatsRsp ( pMac, limMsg->type, (void *)limMsg->bodyptr);
1845 break;
1846
1847 case WDA_GET_STATISTICS_RSP:
1848 limSendSmePEStatisticsRsp ( pMac, limMsg->type, (void *)limMsg->bodyptr);
1849 break;
1850
1851 case WDA_SET_MIMOPS_RSP: //limProcessSetMimoRsp(pMac, limMsg);
1852 case WDA_SET_TX_POWER_RSP: //limProcessSetTxPowerRsp(pMac, limMsg);
1853 case WDA_GET_TX_POWER_RSP: //limProcessGetTxPowerRsp(pMac, limMsg);
1854 case WDA_GET_NOISE_RSP:
1855 vos_mem_free((v_VOID_t*)limMsg->bodyptr);
1856 limMsg->bodyptr = NULL;
1857 //limProcessGetNoiseRsp(pMac, limMsg);
1858 break;
1859
1860 case WDA_SET_MAX_TX_POWER_RSP:
1861#if defined WLAN_FEATURE_VOWIFI
1862 rrmSetMaxTxPowerRsp( pMac, limMsg );
1863#endif
1864 if(limMsg->bodyptr != NULL)
1865 {
1866 vos_mem_free((v_VOID_t*)limMsg->bodyptr);
1867 limMsg->bodyptr = NULL;
1868 }
1869 break;
1870
1871#ifdef ANI_CHIPSET_VOLANS
1872 case SIR_LIM_ADDR2_MISS_IND:
1873 {
1874 limLog(pMac, LOGE,
1875 FL("Addr2 mismatch interrupt received %X\n"),
1876 limMsg->type);
1877 /*a message from HAL indicating addr2 mismatch interrupt occurred
1878 limMsg->bodyptr contains only pointer to 48-bit addr2 field*/
1879 //Dinesh fix this. the third parameter should be sessionentry.
1880 //limHandleUnknownA2IndexFrames(pMac, (void *)limMsg->bodyptr);
1881
1882 /*Free message body pointer*/
1883 vos_mem_free((v_VOID_t *)(limMsg->bodyptr));
1884 break;
1885 }
1886#endif
1887
1888#ifdef WLAN_FEATURE_VOWIFI_11R
1889 case WDA_AGGR_QOS_RSP:
1890 limProcessFTAggrQoSRsp( pMac, limMsg );
1891 break;
1892#endif
1893
1894 case WDA_SET_LINK_STATE_RSP:
1895 linkStateParams = (tLinkStateParams *)limMsg->bodyptr;
1896#if defined WLAN_FEATURE_VOWIFI_11R
1897 pSession = linkStateParams->session;
1898 if(linkStateParams->ft)
1899 {
1900 limSendReassocReqWithFTIEsMgmtFrame(pMac,
1901 pSession->pLimMlmReassocReq,
1902 pSession);
1903 }
1904#endif
1905 if( linkStateParams->callback )
1906 {
1907 linkStateParams->callback( pMac, linkStateParams->callbackArg );
1908 }
1909 vos_mem_free((v_VOID_t *)(limMsg->bodyptr));
1910 break;
1911
1912#ifdef WLAN_FEATURE_PACKET_FILTERING
1913 case WDA_PACKET_COALESCING_FILTER_MATCH_COUNT_RSP:
1914 pmmProcessMessage(pMac, limMsg);
1915 break;
1916#endif // WLAN_FEATURE_PACKET_FILTERING
1917
1918#ifdef WLAN_FEATURE_GTK_OFFLOAD
1919 case WDA_GTK_OFFLOAD_GETINFO_RSP:
1920 pmmProcessMessage(pMac, limMsg);
1921 break;
1922#endif // WLAN_FEATURE_GTK_OFFLOAD
1923
1924 default:
1925 vos_mem_free((v_VOID_t*)limMsg->bodyptr);
1926 limMsg->bodyptr = NULL;
1927 // Unwanted messages
1928 // Log error
1929 limLog(pMac, LOGE,
1930 FL("Discarding unexpected message received %X\n"),
1931 limMsg->type);
1932 limPrintMsgName(pMac, LOGE, limMsg->type);
1933 break;
1934
1935 } // switch (limMsg->type)
1936
1937 PELOG2(limLog(pMac, LOG2, FL("Done Processing msgType = %d, sme state = %s, mlm state = %s\n"),
1938 limMsg->type, limSmeStateStr(pMac->lim.gLimSmeState),
1939 limMlmStateStr(pMac->lim.gLimMlmState));)
1940
1941} /*** end limProcessMessages() ***/
1942
1943
1944
1945/**
1946 * limProcessDeferredMessageQueue
1947 *
1948 *FUNCTION:
1949 * This function is called by LIM while exiting from Learn
1950 * mode. This function fetches messages posted to the LIM
1951 * deferred message queue limDeferredMsgQ.
1952 *
1953 *LOGIC:
1954 *
1955 *ASSUMPTIONS:
1956 * NA
1957 *
1958 *NOTE:
1959 * NA
1960 *
1961 * @param pMac - Pointer to Global MAC structure
1962 * @return None
1963 */
1964
1965void
1966limProcessDeferredMessageQueue(tpAniSirGlobal pMac)
1967{
1968 tSirMsgQ limMsg = { 0, 0, 0 };
1969
1970#if defined(ANI_OS_TYPE_LINUX) || defined(ANI_OS_TYPE_OSX)
1971 while (TX_SUCCESS == tx_queue_receive(&pMac->sys.gSirLimDeferredMsgQ, (void *) &limMsg, TX_NO_WAIT))
1972 {
1973 PELOG3(limLog(pMac, LOG3, FL("Processing deferred message %X\n"), limMsg.type);)
1974 limPrintMsgName(pMac, LOG3, limMsg.type);
1975 pMac->lim.gLimNumDeferredMsgs--;
1976 limProcessMessages(pMac, &limMsg);
1977
1978 if(true != GET_LIM_PROCESS_DEFD_MESGS(pMac))
1979 break;
1980 }
1981#else
1982 tSirMsgQ *readMsg;
1983 tANI_U16 size;
1984
1985 /*
1986 ** check any deferred messages need to be processed
1987 **/
1988 size = pMac->lim.gLimDeferredMsgQ.size;
1989 if (size > 0)
1990 {
1991 while ((readMsg = limReadDeferredMsgQ(pMac)) != NULL)
1992 {
1993 palCopyMemory( pMac->hHdd, (tANI_U8*) &limMsg,
1994 (tANI_U8*) readMsg, sizeof(tSirMsgQ));
1995 size--;
1996 limProcessMessages(pMac, &limMsg);
1997
1998 if((limIsSystemInScanState(pMac)) || (true != GET_LIM_PROCESS_DEFD_MESGS(pMac)) ||
1999 (pMac->lim.gLimSystemInScanLearnMode))
2000 break;
2001 }
2002 }
2003#endif
2004} /*** end limProcessDeferredMessageQueue() ***/
2005
2006
2007/*
2008 * limProcessNormalHddMsg
2009 * Function: this function checks the current lim state and decide whether the message passed shall be deffered.
2010 * @param pMac - Pointer to Global MAC structure
2011 * pLimMsg -- the message need to be processed
2012 * fRspReqd -- whether return result to hdd
2013 * @return None
2014 */
2015void limProcessNormalHddMsg(tpAniSirGlobal pMac, tSirMsgQ *pLimMsg, tANI_U8 fRspReqd)
2016{
2017 tANI_BOOLEAN fDeferMsg = eANI_BOOLEAN_TRUE;
2018
2019 /* Added For BT-AMP Support */
2020 if ((pMac->lim.gLimSystemRole == eLIM_AP_ROLE) ||(pMac->lim.gLimSystemRole == eLIM_BT_AMP_AP_ROLE )
2021 ||(pMac->lim.gLimSystemRole == eLIM_BT_AMP_STA_ROLE)
2022 ||(pMac->lim.gLimSystemRole == eLIM_UNKNOWN_ROLE))
2023 {
2024 /** This check is required only for the AP and in 2 cases.
2025 * 1. If we are in learn mode and we receive any of these messages,
2026 * you have to come out of scan and process the message, hence dont
2027 * defer the message here. In handler, these message could be defered
2028 * till we actually come out of scan mode.
2029 * 2. If radar is detected, you might have to defer all of these
2030 * messages except Stop BSS request/ Switch channel request. This
2031 * decision is also made inside its handler.
2032 *
2033 * Please be careful while using the flag fDeferMsg. Possibly you
2034 * might end up in an infinite loop.
2035 **/
2036 if (((pLimMsg->type == eWNI_SME_START_BSS_REQ) ||
2037 (pLimMsg->type == eWNI_SME_STOP_BSS_REQ) ||
2038 (pLimMsg->type == eWNI_SME_SWITCH_CHL_REQ) ||
2039 (pLimMsg->type == eWNI_SME_SWITCH_CHL_CB_SECONDARY_REQ) ||
2040 (pLimMsg->type == eWNI_SME_SWITCH_CHL_CB_PRIMARY_REQ)))
2041 {
2042 fDeferMsg = eANI_BOOLEAN_FALSE;
2043 }
2044 }
2045
2046 /* limInsystemInscanState() refers the psessionEntry, how to get session Entry????*/
Jeff Johnsone7245742012-09-05 17:12:55 -07002047 if (((pMac->lim.gLimAddtsSent) || (limIsSystemInScanState(pMac)) /*||
2048 (LIM_IS_RADAR_DETECTED(pMac))*/) && fDeferMsg)
Jeff Johnson295189b2012-06-20 16:38:30 -07002049 {
2050 // System is in DFS (Learn) mode or awaiting addts response
2051 // or if radar is detected, Defer processsing this message
2052 if (limDeferMsg(pMac, pLimMsg) != TX_SUCCESS)
2053 {
2054#ifdef WLAN_DEBUG
2055 pMac->lim.numSme++;
2056#endif
2057 PELOGE(limLog(pMac, LOGE, FL("Unable to Defer message(0x%X) limSmeState %d (prev sme state %d) sysRole %d mlm state %d (prev mlm state %d)\n"),
2058 pLimMsg->type, pMac->lim.gLimSmeState, pMac->lim.gLimPrevSmeState,
2059 pMac->lim.gLimSystemRole, pMac->lim.gLimMlmState, pMac->lim.gLimPrevMlmState);)
2060 limLogSessionStates(pMac);
2061 limPrintMsgName(pMac, LOGE, pLimMsg->type);
2062 // Release body
2063 palFreeMemory( pMac->hHdd, (tANI_U8 *) pLimMsg->bodyptr);
2064 }
2065 }
2066 else
2067 {
2068 if(fRspReqd)
2069 {
2070 // These messages are from HDD
2071 // Since these requests may also be generated
2072 // internally within LIM module, need to
2073 // distinquish and send response to host
2074 pMac->lim.gLimRspReqd = eANI_BOOLEAN_TRUE;
2075 }
2076#ifdef WLAN_DEBUG
2077 pMac->lim.numSme++;
2078#endif
2079 if(limProcessSmeReqMessages(pMac, pLimMsg))
2080 {
2081 // Release body
2082 // limProcessSmeReqMessage consumed the buffer. We can free it.
2083 palFreeMemory( pMac->hHdd, (tANI_U8 *) pLimMsg->bodyptr);
2084 }
2085 }
2086}
2087
2088void
Jeff Johnsone7245742012-09-05 17:12:55 -07002089handleHTCapabilityandHTInfo(struct sAniSirGlobal *pMac, tpPESession psessionEntry)
Jeff Johnson295189b2012-06-20 16:38:30 -07002090{
2091 tSirMacHTCapabilityInfo macHTCapabilityInfo;
2092 tSirMacHTParametersInfo macHTParametersInfo;
2093 tSirMacHTInfoField1 macHTInfoField1;
2094 tSirMacHTInfoField2 macHTInfoField2;
2095 tSirMacHTInfoField3 macHTInfoField3;
2096 tANI_U32 cfgValue;
2097 tANI_U8 *ptr;
Jeff Johnson295189b2012-06-20 16:38:30 -07002098
Jeff Johnson295189b2012-06-20 16:38:30 -07002099 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &cfgValue) != eSIR_SUCCESS)
2100 {
2101 limLog(pMac, LOGP, FL("Fail to retrieve WNI_CFG_HT_CAP_INFO value\n"));
2102 return ;
2103 }
2104 ptr = (tANI_U8 *) &macHTCapabilityInfo;
2105 *((tANI_U16 *)ptr) = (tANI_U16) (cfgValue & 0xffff);
2106 pMac->lim.gHTLsigTXOPProtection = (tANI_U8)macHTCapabilityInfo.lsigTXOPProtection;
2107 pMac->lim.gHTMIMOPSState = (tSirMacHTMIMOPowerSaveState) macHTCapabilityInfo.mimoPowerSave;
2108 pMac->lim.gHTGreenfield = (tANI_U8)macHTCapabilityInfo.greenField;
2109 pMac->lim.gHTMaxAmsduLength = (tANI_U8)macHTCapabilityInfo.maximalAMSDUsize;
2110 pMac->lim.gHTShortGI20Mhz = (tANI_U8)macHTCapabilityInfo.shortGI20MHz;
2111 pMac->lim.gHTShortGI40Mhz = (tANI_U8)macHTCapabilityInfo.shortGI40MHz;
Jeff Johnson295189b2012-06-20 16:38:30 -07002112 pMac->lim.gHTPSMPSupport = (tANI_U8)macHTCapabilityInfo.psmp;
2113 pMac->lim.gHTDsssCckRate40MHzSupport = (tANI_U8)macHTCapabilityInfo.dsssCckMode40MHz;
2114
2115 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_AMPDU_PARAMS, &cfgValue) != eSIR_SUCCESS)
2116 {
2117 limLog(pMac, LOGP, FL("Fail to retrieve WNI_CFG_HT_PARAM_INFO value\n"));
2118 return ;
2119 }
2120 ptr = (tANI_U8 *) &macHTParametersInfo;
2121 *ptr = (tANI_U8) (cfgValue & 0xff);
2122 pMac->lim.gHTAMpduDensity = (tANI_U8)macHTParametersInfo.mpduDensity;
2123 pMac->lim.gHTMaxRxAMpduFactor = (tANI_U8)macHTParametersInfo.maxRxAMPDUFactor;
2124
2125 // Get HT IE Info
2126 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_INFO_FIELD1, &cfgValue) != eSIR_SUCCESS)
2127 {
2128 limLog(pMac, LOGP, FL("Fail to retrieve WNI_CFG_HT_INFO_FIELD1 value\n"));
2129 return ;
2130 }
2131 ptr = (tANI_U8 *) &macHTInfoField1;
2132 *((tANI_U8 *)ptr) = (tANI_U8) (cfgValue & 0xff);
2133 pMac->lim.gHTServiceIntervalGranularity = (tANI_U8)macHTInfoField1.serviceIntervalGranularity;
2134 pMac->lim.gHTControlledAccessOnly = (tANI_U8)macHTInfoField1.controlledAccessOnly;
2135 pMac->lim.gHTRifsMode = (tANI_U8)macHTInfoField1.rifsMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07002136
2137 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_INFO_FIELD2, &cfgValue) != eSIR_SUCCESS)
2138 {
2139 limLog(pMac, LOGP, FL("Fail to retrieve WNI_CFG_HT_INFO_FIELD2 value\n"));
2140 return ;
2141 }
2142 ptr = (tANI_U8 *) &macHTInfoField2;
2143 *((tANI_U16 *)ptr) = (tANI_U16) (cfgValue & 0xffff);
2144 pMac->lim.gHTOperMode = (tSirMacHTOperatingMode) macHTInfoField2.opMode;
2145
2146 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_INFO_FIELD3, &cfgValue) != eSIR_SUCCESS)
2147 {
2148 limLog(pMac, LOGP, FL("Fail to retrieve WNI_CFG_HT_INFO_FIELD3 value\n"));
2149 return ;
2150 }
2151 ptr = (tANI_U8 *) &macHTInfoField3;
2152 *((tANI_U16 *)ptr) = (tANI_U16) (cfgValue & 0xffff);
2153 pMac->lim.gHTPCOActive = (tANI_U8)macHTInfoField3.pcoActive;
2154 pMac->lim.gHTPCOPhase = (tANI_U8)macHTInfoField3.pcoPhase;
Jeff Johnson295189b2012-06-20 16:38:30 -07002155 pMac->lim.gHTSecondaryBeacon = (tANI_U8)macHTInfoField3.secondaryBeacon;
2156 pMac->lim.gHTDualCTSProtection = (tANI_U8)macHTInfoField3.dualCTSProtection;
2157 pMac->lim.gHTSTBCBasicMCS = (tANI_U8)macHTInfoField3.basicSTBCMCS;
Jeff Johnsone7245742012-09-05 17:12:55 -07002158
2159 /* The lim globals for channelwidth and secondary chnl have been removed and should not be used during no session;
2160 * instead direct cfg is read and used when no session for transmission of mgmt frames (same as old);
2161 * For now, we might come here during init and join with sessionEntry = NULL; in that case just fill the globals which exist
2162 * Sessionized entries values will be filled in join or add bss req. The ones which are missed in join are filled below
2163 */
2164 if (psessionEntry != NULL)
2165 {
2166 psessionEntry->htCapability = IS_DOT11_MODE_HT(psessionEntry->dot11mode);
2167 psessionEntry->beaconParams.fLsigTXOPProtectionFullSupport = (tANI_U8)macHTInfoField3.lsigTXOPProtectionFullSupport;
2168 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002169}
2170
2171void limLogSessionStates(tpAniSirGlobal pMac)
2172{
2173#ifdef WLAN_DEBUG
2174 int i;
2175
2176 for(i = 0; i < pMac->lim.maxBssId; i++)
2177 {
2178 if(pMac->lim.gpSession[i].valid)
2179 {
2180 PELOGE(limLog(pMac, LOGE, FL("Session[%d] sysRole(%d) limSmeState %d (prev sme state %d) mlm state %d (prev mlm state %d)\n"),
2181 i, pMac->lim.gpSession[i].limSystemRole, pMac->lim.gpSession[i].limSmeState,
2182 pMac->lim.gpSession[i].limPrevSmeState, pMac->lim.gpSession[i].limMlmState,
2183 pMac->lim.gpSession[i].limPrevMlmState);)
2184 }
2185 }
2186#endif //ifdef WLAN_DEBUG
2187}