blob: 857710d04c07f69189dc333d7bbbea5315068995 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Jeff Johnson32d95a32012-09-10 13:15:23 -07002 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Jeff Johnson295189b2012-06-20 16:38:30 -07003 *
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 limProcessMlmMessages.cc contains the code
25 * for processing MLM request messages.
26 * Author: Chandra Modumudi
27 * Date: 02/12/02
28 * History:-
29 * Date Modified by Modification Information
30 * --------------------------------------------------------------------
31 *
32 */
33#include "palTypes.h"
34#ifdef ANI_PRODUCT_TYPE_AP
35#include "wniCfgAp.h"
36#else
37#include "wniCfgSta.h"
38#endif
39#include "aniGlobal.h"
40#include "sirApi.h"
41#include "sirParams.h"
42#include "cfgApi.h"
43
44#include "schApi.h"
45#include "utilsApi.h"
46#include "limUtils.h"
47#include "limAssocUtils.h"
48#include "limPropExtsUtils.h"
49#include "limSecurityUtils.h"
50#include "limSendMessages.h"
51#include "pmmApi.h"
52#include "limSendMessages.h"
53//#include "limSessionUtils.h"
54#include "limSessionUtils.h"
55#ifdef WLAN_FEATURE_VOWIFI_11R
56#include <limFT.h>
57#endif
58
59
60
61// MLM REQ processing function templates
62static void limProcessMlmStartReq(tpAniSirGlobal, tANI_U32 *);
63static void limProcessMlmScanReq(tpAniSirGlobal, tANI_U32 *);
Jeff Johnsone7245742012-09-05 17:12:55 -070064#ifdef FEATURE_OEM_DATA_SUPPORT
65static void limProcessMlmOemDataReq(tpAniSirGlobal, tANI_U32 *);
66#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070067static void limProcessMlmJoinReq(tpAniSirGlobal, tANI_U32 *);
68static void limProcessMlmAuthReq(tpAniSirGlobal, tANI_U32 *);
69static void limProcessMlmAssocReq(tpAniSirGlobal, tANI_U32 *);
70static void limProcessMlmReassocReq(tpAniSirGlobal, tANI_U32 *);
71static void limProcessMlmDisassocReq(tpAniSirGlobal, tANI_U32 *);
72static void limProcessMlmDeauthReq(tpAniSirGlobal, tANI_U32 *);
73static void limProcessMlmSetKeysReq(tpAniSirGlobal, tANI_U32 *);
74
75static void limProcessMlmAddBAReq( tpAniSirGlobal, tANI_U32 * );
76static void limProcessMlmAddBARsp( tpAniSirGlobal, tANI_U32 * );
77static void limProcessMlmDelBAReq( tpAniSirGlobal, tANI_U32 * );
78
79// MLM Timeout event handler templates
80static void limProcessMinChannelTimeout(tpAniSirGlobal);
81static void limProcessMaxChannelTimeout(tpAniSirGlobal);
82static void limProcessPeriodicProbeReqTimer(tpAniSirGlobal pMac);
83static void limProcessJoinFailureTimeout(tpAniSirGlobal);
84static void limProcessAuthFailureTimeout(tpAniSirGlobal);
85static void limProcessAuthRspTimeout(tpAniSirGlobal, tANI_U32);
86static void limProcessAssocFailureTimeout(tpAniSirGlobal, tANI_U32);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -080087static void limProcessPeriodicJoinProbeReqTimer(tpAniSirGlobal);
Jeff Johnson295189b2012-06-20 16:38:30 -070088
89static void limProcessMlmRemoveKeyReq(tpAniSirGlobal pMac, tANI_U32 * pMsgBuf);
90void
Jeff Johnsone7245742012-09-05 17:12:55 -070091limSetChannel(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 secChannelOffset, tPowerdBm maxTxPower, tANI_U8 peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -070092#define IS_MLM_SCAN_REQ_BACKGROUND_SCAN_AGGRESSIVE(pMac) (pMac->lim.gpLimMlmScanReq->backgroundScanMode == eSIR_AGGRESSIVE_BACKGROUND_SCAN)
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -070093#define IS_MLM_SCAN_REQ_BACKGROUND_SCAN_NORMAL(pMac) (pMac->lim.gpLimMlmScanReq->backgroundScanMode == eSIR_NORMAL_BACKGROUND_SCAN)
Jeff Johnson295189b2012-06-20 16:38:30 -070094
95/**
96 * limProcessMlmReqMessages()
97 *
98 *FUNCTION:
99 * This function is called by limPostMlmMessage(). This
100 * function handles MLM primitives invoked by SME.
101 *
102 *LOGIC:
103 * Depending on the message type, corresponding function will be
104 * called.
105 *
106 *ASSUMPTIONS:
107 * 1. Upon receiving Beacon in WT_JOIN_STATE, MLM module invokes
108 * APIs exposed by Beacon Processing module for setting parameters
109 * at MAC hardware.
110 * 2. If attempt to Reassociate with an AP fails, link with current
111 * AP is restored back.
112 *
113 *NOTE:
114 *
115 * @param pMac Pointer to Global MAC structure
116 * @param msgType Indicates the MLM primitive message type
117 * @param *pMsgBuf A pointer to the MLM message buffer
118 *
119 * @return None
120 */
121
122void
123limProcessMlmReqMessages(tpAniSirGlobal pMac, tpSirMsgQ Msg)
124{
125 switch (Msg->type)
126 {
127 case LIM_MLM_START_REQ: limProcessMlmStartReq(pMac, Msg->bodyptr); break;
128 case LIM_MLM_SCAN_REQ: limProcessMlmScanReq(pMac, Msg->bodyptr); break;
Jeff Johnsone7245742012-09-05 17:12:55 -0700129#ifdef FEATURE_OEM_DATA_SUPPORT
130 case LIM_MLM_OEM_DATA_REQ: limProcessMlmOemDataReq(pMac, Msg->bodyptr); break;
131#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700132 case LIM_MLM_JOIN_REQ: limProcessMlmJoinReq(pMac, Msg->bodyptr); break;
133 case LIM_MLM_AUTH_REQ: limProcessMlmAuthReq(pMac, Msg->bodyptr); break;
134 case LIM_MLM_ASSOC_REQ: limProcessMlmAssocReq(pMac, Msg->bodyptr); break;
135 case LIM_MLM_REASSOC_REQ: limProcessMlmReassocReq(pMac, Msg->bodyptr); break;
136 case LIM_MLM_DISASSOC_REQ: limProcessMlmDisassocReq(pMac, Msg->bodyptr); break;
137 case LIM_MLM_DEAUTH_REQ: limProcessMlmDeauthReq(pMac, Msg->bodyptr); break;
138 case LIM_MLM_SETKEYS_REQ: limProcessMlmSetKeysReq(pMac, Msg->bodyptr); break;
139 case LIM_MLM_REMOVEKEY_REQ: limProcessMlmRemoveKeyReq(pMac, Msg->bodyptr); break;
140 case SIR_LIM_MIN_CHANNEL_TIMEOUT: limProcessMinChannelTimeout(pMac); break;
141 case SIR_LIM_MAX_CHANNEL_TIMEOUT: limProcessMaxChannelTimeout(pMac); break;
142 case SIR_LIM_PERIODIC_PROBE_REQ_TIMEOUT:
143 limProcessPeriodicProbeReqTimer(pMac); break;
144 case SIR_LIM_JOIN_FAIL_TIMEOUT: limProcessJoinFailureTimeout(pMac); break;
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -0800145 case SIR_LIM_PERIODIC_JOIN_PROBE_REQ_TIMEOUT:
146 limProcessPeriodicJoinProbeReqTimer(pMac); break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700147 case SIR_LIM_AUTH_FAIL_TIMEOUT: limProcessAuthFailureTimeout(pMac); break;
148 case SIR_LIM_AUTH_RSP_TIMEOUT: limProcessAuthRspTimeout(pMac, Msg->bodyval); break;
149 case SIR_LIM_ASSOC_FAIL_TIMEOUT: limProcessAssocFailureTimeout(pMac, Msg->bodyval); break;
150#ifdef WLAN_FEATURE_VOWIFI_11R
151 case SIR_LIM_FT_PREAUTH_RSP_TIMEOUT:limProcessFTPreauthRspTimeout(pMac); break;
152#endif
153#ifdef WLAN_FEATURE_P2P
154 case SIR_LIM_REMAIN_CHN_TIMEOUT: limProcessRemainOnChnTimeout(pMac); break;
155#endif
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -0800156 case SIR_LIM_DISASSOC_ACK_TIMEOUT: limProcessDisassocAckTimeout(pMac); break;
157 case SIR_LIM_DEAUTH_ACK_TIMEOUT: limProcessDeauthAckTimeout(pMac); break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700158 case LIM_MLM_ADDBA_REQ: limProcessMlmAddBAReq( pMac, Msg->bodyptr ); break;
159 case LIM_MLM_ADDBA_RSP: limProcessMlmAddBARsp( pMac, Msg->bodyptr ); break;
160 case LIM_MLM_DELBA_REQ: limProcessMlmDelBAReq( pMac, Msg->bodyptr ); break;
161 case LIM_MLM_TSPEC_REQ:
162 default:
163 break;
164 } // switch (msgType)
165} /*** end limProcessMlmReqMessages() ***/
166
167
168/**
169 * limSetScanMode()
170 *
171 *FUNCTION:
172 * This function is called to setup system into Scan mode
173 *
174 *LOGIC:
175 * NA
176 *
177 *ASSUMPTIONS:
178 * NA
179 *
180 *NOTE:
181 *
182 * @param pMac - Pointer to Global MAC structure
183 * @return None
184 */
185
186void
187limSetScanMode(tpAniSirGlobal pMac)
188{
189 tSirLinkTrafficCheck checkTraffic;
190
191 /// Set current scan channel id to the first in the channel list
192 pMac->lim.gLimCurrentScanChannelId = 0;
193
194#ifdef ANI_PRODUCT_TYPE_CLIENT
195 if ( IS_MLM_SCAN_REQ_BACKGROUND_SCAN_AGGRESSIVE(pMac) )
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700196 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700197 checkTraffic = eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN;
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700198 }
199 else if (IS_MLM_SCAN_REQ_BACKGROUND_SCAN_NORMAL(pMac))
200 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700201 checkTraffic = eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN;
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700202 }
203 else
204 checkTraffic = eSIR_CHECK_ROAMING_SCAN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700205#else
206 /* Currently checking the traffic before scan for Linux station. This is because MLM
207 * scan request is not filled as scan is received via Measurement req in Linux. This
208 * should be made as common code for Windows/Linux station once the scan requests are
209 * enabled in Linux
210 * TODO */
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700211 if ( IS_MLM_SCAN_REQ_BACKGROUND_SCAN_AGGRESSIVE(pMac) ||
212 IS_MLM_SCAN_REQ_BACKGROUND_SCAN_NORMAL(pMac))
213 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700214 checkTraffic = eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN;
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700215 }
216 else
217 checkTraffic = eSIR_CHECK_ROAMING_SCAN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700218#endif
219
220 PELOG1(limLog(pMac, LOG1, FL("Calling limSendHalInitScanReq\n"));)
221 limSendHalInitScanReq(pMac, eLIM_HAL_INIT_SCAN_WAIT_STATE, checkTraffic);
222
223 return ;
224} /*** end limSetScanMode() ***/
225
226//WLAN_SUSPEND_LINK Related
227
228/* limIsLinkSuspended()
229 *
230 *FUNCTION:
231 * This function returns is link is suspended or not.
232 *
233 *LOGIC:
234 * Since Suspen link uses init scan, it just returns
235 * gLimSystemInScanLearnMode flag.
236 *
237 *ASSUMPTIONS:
238 * NA
239 *
240 *NOTE:
241 *
242 * @param pMac - Pointer to Global MAC structure
243 * @return None
244 */
245tANI_U8
246limIsLinkSuspended(tpAniSirGlobal pMac)
247{
248 return pMac->lim.gLimSystemInScanLearnMode;
249}
250/**
251 * limSuspendLink()
252 *
253 *FUNCTION:
254 * This function is called to suspend traffic. Internally this function uses WDA_INIT_SCAN_REQ.
255 *
256 *LOGIC:
257 * NA
258 *
259 *ASSUMPTIONS:
260 * NA
261 *
262 *NOTE:
263 *
264 * @param pMac - Pointer to Global MAC structure
265 * @param trafficCheck - Takes value from enum tSirLinkTrafficCheck.
266 * @param callback - Callback function to be called after suspending the link.
267 * @param data - Pointer to any buffer that will be passed to callback.
268 * @return None
269 */
270void
271limSuspendLink(tpAniSirGlobal pMac, tSirLinkTrafficCheck trafficCheck, SUSPEND_RESUME_LINK_CALLBACK callback, tANI_U32 *data)
272{
273 if( NULL == callback )
274 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700275 limLog( pMac, LOGE, "%s:%d: Invalid parameters\n", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700276 return;
277 }
278
279 if( pMac->lim.gpLimSuspendCallback )
280 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700281 limLog( pMac, LOGE, "%s:%d: gLimSuspendLink callback is not NULL...something is wrong\n", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700282 callback( pMac, eHAL_STATUS_FAILURE, data );
283 return;
284 }
285
286 pMac->lim.gLimSystemInScanLearnMode = 1;
287 pMac->lim.gpLimSuspendCallback = callback;
288 pMac->lim.gpLimSuspendData = data;
289 limSendHalInitScanReq(pMac, eLIM_HAL_SUSPEND_LINK_WAIT_STATE, trafficCheck );
290}
291
292/**
293 * limResumeLink()
294 *
295 *FUNCTION:
296 * This function is called to Resume traffic after a suspend. Internally this function uses WDA_FINISH_SCAN_REQ.
297 *
298 *LOGIC:
299 * NA
300 *
301 *ASSUMPTIONS:
302 * NA
303 *
304 *NOTE:
305 *
306 * @param pMac - Pointer to Global MAC structure
307 * @param callback - Callback function to be called after Resuming the link.
308 * @param data - Pointer to any buffer that will be passed to callback.
309 * @return None
310 */
311void
312limResumeLink(tpAniSirGlobal pMac, SUSPEND_RESUME_LINK_CALLBACK callback, tANI_U32 *data)
313{
314 if( NULL == callback )
315 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700316 limLog( pMac, LOGE, "%s:%d: Invalid parameters\n", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700317 return;
318 }
319
320 if( pMac->lim.gpLimResumeCallback )
321 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700322 limLog( pMac, LOGE, "%s:%d: gLimResumeLink callback is not NULL...something is wrong\n", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700323 callback( pMac, eHAL_STATUS_FAILURE, data );
324 return;
325 }
326
327 pMac->lim.gpLimResumeCallback = callback;
328 pMac->lim.gpLimResumeData = data;
329 limSendHalFinishScanReq(pMac, eLIM_HAL_RESUME_LINK_WAIT_STATE );
330}
331//end WLAN_SUSPEND_LINK Related
332
333
334/**
335 *
336 * limChangeChannelWithCallback()
337 *
338 * FUNCTION:
339 * This function is called to change channel and perform off channel operation
340 * if required. The caller registers a callback to be called at the end of the
341 * channel change.
342 *
343 */
344void
345limChangeChannelWithCallback(tpAniSirGlobal pMac, tANI_U8 newChannel,
346 CHANGE_CHANNEL_CALLBACK callback,
347 tANI_U32 *cbdata, tpPESession psessionEntry)
348{
349 // Sanity checks for the current and new channel
350#if defined WLAN_VOWIFI_DEBUG
351 PELOGE(limLog( pMac, LOGE, "Switching channel to %d\n", newChannel);)
352#endif
353 psessionEntry->channelChangeReasonCode=LIM_SWITCH_CHANNEL_OPERATION;
354
355 pMac->lim.gpchangeChannelCallback = callback;
356 pMac->lim.gpchangeChannelData = cbdata;
357
358 limSendSwitchChnlParams(pMac, newChannel,
Jeff Johnsone7245742012-09-05 17:12:55 -0700359 PHY_SINGLE_CHANNEL_CENTERED,
Jeff Johnson295189b2012-06-20 16:38:30 -0700360 psessionEntry->maxTxPower, psessionEntry->peSessionId);
361
362 return;
363}
364
365
366/**
367 * limContinuePostChannelScan()
368 *
369 *FUNCTION:
370 * This function is called to scan the current channel.
371 *
372 *LOGIC:
373 *
374 *ASSUMPTIONS:
375 * NA
376 *
377 *NOTE:
378 * NA
379 *
380 * @param pMac - Pointer to Global MAC structure
381 *
382 * @return None
383 */
384
385void limContinuePostChannelScan(tpAniSirGlobal pMac)
386{
387 tANI_U8 channelNum;
388 tANI_U8 handleError = 0;
389 tANI_U8 i = 0;
390 tSirRetStatus status = eSIR_SUCCESS;
391
392 if( pMac->lim.abortScan || (NULL == pMac->lim.gpLimMlmScanReq ) ||
393 (pMac->lim.gLimCurrentScanChannelId >
394 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1)))
395 {
396 pMac->lim.abortScan = 0;
397 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
398 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
399 //Set the resume channel to Any valid channel (invalid).
400 //This will instruct HAL to set it to any previous valid channel.
401 peSetResumeChannel(pMac, 0, 0);
402
403 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
404 return;
405 }
406
407 channelNum = limGetCurrentScanChannel(pMac);
408 if ((pMac->lim.gpLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN) &&
409 (limActiveScanAllowed(pMac, channelNum)))
410 {
411 TX_TIMER *periodicScanTimer;
412 PELOG2(limLog(pMac, LOG2, FL("ACTIVE Scan chan %d, sending probe\n"), channelNum);)
413
414 do
415 {
416 /* Prepare and send Probe Request frame for all the SSIDs present in the saved MLM
417 */
418
419 PELOGE(limLog(pMac, LOG1, FL("sending ProbeReq number %d, for SSID %s on channel: %d\n"),
420 i, pMac->lim.gpLimMlmScanReq->ssId[i].ssId, channelNum);)
421 // include additional IE if there is
422 status = limSendProbeReqMgmtFrame( pMac, &pMac->lim.gpLimMlmScanReq->ssId[i],
423 pMac->lim.gpLimMlmScanReq->bssId, channelNum, pMac->lim.gSelfMacAddr,
424 pMac->lim.gpLimMlmScanReq->dot11mode,
425 pMac->lim.gpLimMlmScanReq->uIEFieldLen,
426 (tANI_U8 *)(pMac->lim.gpLimMlmScanReq)+pMac->lim.gpLimMlmScanReq->uIEFieldOffset);
427
428 if ( status != eSIR_SUCCESS)
429 {
430 PELOGE(limLog(pMac, LOGE, FL("send ProbeReq failed for SSID %s on channel: %d\n"),
431 pMac->lim.gpLimMlmScanReq->ssId[i].ssId, channelNum);)
432 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
433 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
434 return;
435 }
436 i++;
437 } while (i < pMac->lim.gpLimMlmScanReq->numSsid);
438
439 {
440#if defined WLAN_FEATURE_VOWIFI
441 //If minChannelTime is set to zero, SME is requesting scan to not use min channel timer.
442 //This is used in 11k to request for beacon measurement request with a fixed duration in
443 //max channel time.
444 if( pMac->lim.gpLimMlmScanReq->minChannelTime != 0 )
445 {
446#endif
447 /// TXP has sent Probe Request
448 /// Activate minChannelTimer
449 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
450
451#ifdef GEN6_TODO
452 /* revisit this piece of code to assign the appropriate sessionId below
453 * priority - LOW/might not be needed
454 */
455 pMac->lim.limTimers.gLimMinChannelTimer.sessionId = sessionId;
456#endif
457
Jeff Johnsone7245742012-09-05 17:12:55 -0700458 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_MIN_CHANNEL_TIMER));
Jeff Johnson295189b2012-06-20 16:38:30 -0700459
460 if (tx_timer_activate(&pMac->lim.limTimers.gLimMinChannelTimer) != TX_SUCCESS)
461 {
462 limLog(pMac, LOGP, FL("could not start min channel timer\n"));
463 return;
464 }
465
466 // Initialize max timer too
467 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
468#if defined WLAN_FEATURE_VOWIFI
469 }
470 else
471 {
472#if defined WLAN_VOWIFI_DEBUG
473 PELOGE(limLog( pMac, LOGE, "Min channel time == 0, Use only max chan timer\n" );)
474#endif
475 //No Need to start Min channel timer. Start Max Channel timer.
476 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
477 if (tx_timer_activate(&pMac->lim.limTimers.gLimMaxChannelTimer)
478 == TX_TIMER_ERROR)
479 {
480 /// Could not activate max channel timer.
481 // Log error
482 limLog(pMac,LOGP, FL("could not start max channel timer\n"));
483 return;
484 }
485
486 }
487#endif
488 }
489 /* Start peridic timer which will trigger probe req based on min/max
490 channel timer */
491 periodicScanTimer = &pMac->lim.limTimers.gLimPeriodicProbeReqTimer;
492 if (tx_timer_activate(periodicScanTimer) != TX_SUCCESS)
493 {
494 limLog(pMac, LOGP, FL("could not start periodic probe req "
495 "timer\n"));
496 return;
497 }
498 periodicScanTimer->sessionId = channelNum;
499 }
500 else
501 {
502 tANI_U32 val;
503 PELOG2(limLog(pMac, LOG2, FL("START PASSIVE Scan chan %d\n"), channelNum);)
504
505 /// Passive Scanning. Activate maxChannelTimer
Jeff Johnsone7245742012-09-05 17:12:55 -0700506 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, NO_SESSION, eLIM_MAX_CHANNEL_TIMER));
Jeff Johnson295189b2012-06-20 16:38:30 -0700507 if (tx_timer_deactivate(&pMac->lim.limTimers.gLimMaxChannelTimer)
508 != TX_SUCCESS)
509 {
510 // Could not deactivate max channel timer.
511 // Log error
512 limLog(pMac, LOGP, FL("Unable to deactivate max channel timer\n"));
513 return;
514 }
515 else
516 {
517 if (wlan_cfgGetInt(pMac, WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME,
518 &val) != eSIR_SUCCESS)
519 {
520 /**
521 * Could not get max channel value
522 * from CFG. Log error.
523 */
524 limLog(pMac, LOGP, FL("could not retrieve passive max channel value\n"));
525 return;
526 }
527 else
528 {
529 tANI_U32 val1 = 0;
530
531 val = SYS_MS_TO_TICKS(val);
Jeff Johnsone7245742012-09-05 17:12:55 -0700532 //TODO: consider sessions.
533#if 0
Jeff Johnson295189b2012-06-20 16:38:30 -0700534#ifdef ANI_PRODUCT_TYPE_CLIENT
535 // If a background was triggered via Quiet BSS,
536 // then we need to adjust the MIN and MAX channel
537 // timer's accordingly to the Quiet duration that
538 // was specified
539 if( eLIM_QUIET_RUNNING == pMac->lim.gLimSpecMgmt.quietState &&
540 pMac->lim.gLimTriggerBackgroundScanDuringQuietBss )
541 {
542 // gLimQuietDuration is already cached in units of
543 // system ticks. No conversion is reqd...
544 val1 = pMac->lim.gLimSpecMgmt.quietDuration;
545 }
546 else
547 {
548 val1 = SYS_MS_TO_TICKS(pMac->lim.gpLimMlmScanReq->maxChannelTime);
549 }
550#endif
Jeff Johnsone7245742012-09-05 17:12:55 -0700551#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700552 //Pick the longer stay time
553 val = (val > val1) ? val : val1;
Jeff Johnsone7245742012-09-05 17:12:55 -0700554 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_MAX_CHANNEL_TIMER));
Jeff Johnson295189b2012-06-20 16:38:30 -0700555 if (tx_timer_change(&pMac->lim.limTimers.gLimMaxChannelTimer,
556 val, 0) != TX_SUCCESS)
557 {
558 // Could not change max channel timer.
559 // Log error
560 limLog(pMac, LOGP, FL("Unable to change max channel timer\n"));
561 return;
562 }
563 else if (tx_timer_activate(&pMac->lim.limTimers.gLimMaxChannelTimer) != TX_SUCCESS)
564 {
565 limLog(pMac, LOGP, FL("could not start max channel timer\n"));
566 return;
567 }
568
569 }
570 }
571 // Wait for Beacons to arrive
572 } // if (pMac->lim.gLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN)
573
574 if( handleError )
575 {
576 //
577 // FIXME - With this, LIM/SoftMAC will try and recover
578 // state, but eWNI_SME_SCAN_CNF maybe reporting an
579 // incorrect status back to the SME. Some of the possible
580 // errors are:
581 // eSIR_SME_HAL_SCAN_INIT_FAILED
582 // eSIR_SME_RESOURCES_UNAVAILABLE
583 //
584 //Set the resume channel to Any valid channel (invalid).
585 //This will instruct HAL to set it to any previous valid channel.
586 peSetResumeChannel(pMac, 0, 0);
587 limSendHalFinishScanReq( pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE );
588 //limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_INIT_FAILED);
589 }
590 else
591 {
592 limAddScanChannelInfo(pMac, channelNum);
593 }
594
595 return;
596}
597
598
599
600
601/*
602* Creates a Raw frame to be sent before every Scan, if required.
603* If only infra link is active (mlmState = Link Estb), then send Data Null
604* If only BT-AMP-AP link is active(mlmState = BSS_STARTED), then send CTS2Self frame.
605* If only BT-AMP-STA link is active(mlmState = BSS_STARTED or Link Est) then send CTS2Self
606* If Only IBSS link is active, then send CTS2Self
607* for concurrent scenario: Infra+BT or Infra+IBSS, always send CTS2Self, no need to send Data Null
608*
609*/
610static void __limCreateInitScanRawFrame(tpAniSirGlobal pMac,
611 tpInitScanParams pInitScanParam)
612{
613 tANI_U8 i;
614 pInitScanParam->scanEntry.activeBSScnt = 0;
615
616 /* Don't send CTS to self as we have issue with BTQM queues where BTQM can
617 * not handle transmition of CTS2self frames. Sending CTS 2 self at this
618 * juncture also doesn't serve much purpose as probe request frames go out
619 * immediately, No need to notify BSS in IBSS case.
620 * */
621
622 for(i =0; i < pMac->lim.maxBssId; i++)
623 {
624 if(pMac->lim.gpSession[i].valid == TRUE)
625 {
626 if(pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)
627 {
628 if ((pMac->lim.gpSession[i].limSystemRole != eLIM_BT_AMP_STA_ROLE) &&
629 (pInitScanParam->scanEntry.activeBSScnt < HAL_NUM_BSSID))
630 {
631 pInitScanParam->scanEntry.bssIdx[pInitScanParam->scanEntry.activeBSScnt]
632 = pMac->lim.gpSession[i].bssIdx;
633 pInitScanParam->scanEntry.activeBSScnt++;
634
635 }
636 }
637#ifdef WLAN_FEATURE_P2P
638 else if( (eLIM_AP_ROLE == pMac->lim.gpSession[i].limSystemRole )
639 && ( VOS_P2P_GO_MODE == pMac->lim.gpSession[i].pePersona )
640 )
641 {
642 pInitScanParam->useNoA = TRUE;
643 }
644#endif
645 }
646 }
647 if (pInitScanParam->scanEntry.activeBSScnt)
648 {
649 pInitScanParam->notifyBss = TRUE;
650 pInitScanParam->frameType = SIR_MAC_DATA_FRAME;
651 pInitScanParam->frameLength = 0;
652 }
653}
654
655/*
656* Creates a Raw frame to be sent during finish scan, if required.
657* Send data null frame, only when there is just one session active and that session is
658* in 'link Estb' state.
659* if more than one session is active, don't send any frame.
660* for concurrent scenario: Infra+BT or Infra+IBSS, no need to send Data Null
661*
662*/
663static void __limCreateFinishScanRawFrame(tpAniSirGlobal pMac,
664 tpFinishScanParams pFinishScanParam)
665{
666 tANI_U8 i;
667 pFinishScanParam->scanEntry.activeBSScnt = 0;
668
669 for(i =0; i < pMac->lim.maxBssId; i++)
670 {
671 if(pMac->lim.gpSession[i].valid == TRUE)
672 {
673 if(pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)
674 {
675 //BT-STA can either be in LINK-ESTB state or BSS_STARTED State
676 //for BT, need to send CTS2Self
677 if ((pMac->lim.gpSession[i].limSystemRole != eLIM_BT_AMP_STA_ROLE) &&
678 (pFinishScanParam->scanEntry.activeBSScnt < HAL_NUM_BSSID))
679 {
680 pFinishScanParam->scanEntry.bssIdx[pFinishScanParam->scanEntry.activeBSScnt]
681 = pMac->lim.gpSession[i].bssIdx;
682 pFinishScanParam->scanEntry.activeBSScnt++;
683 }
684 }
685 }
686 }
687
688 if (pFinishScanParam->scanEntry.activeBSScnt)
689 {
690 pFinishScanParam->notifyBss = TRUE;
691 pFinishScanParam->frameType = SIR_MAC_DATA_FRAME;
692 pFinishScanParam->frameLength = 0;
693 }
694}
695
696void
697limSendHalInitScanReq(tpAniSirGlobal pMac, tLimLimHalScanState nextState, tSirLinkTrafficCheck trafficCheck)
698{
699
700
701 tSirMsgQ msg;
702 tpInitScanParams pInitScanParam;
703 tSirRetStatus rc = eSIR_SUCCESS;
704
705 if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pInitScanParam,
706 sizeof(*pInitScanParam)))
707 {
708 PELOGW(limLog(pMac, LOGW, FL("palAllocateMemory() failed\n"));)
709 goto error;
710 }
711
712 /*Initialize the pInitScanParam with 0*/
713 palZeroMemory( pMac->hHdd, (tANI_U8 *)pInitScanParam, sizeof(*pInitScanParam));
714
715 msg.type = WDA_INIT_SCAN_REQ;
716 msg.bodyptr = pInitScanParam;
717 msg.bodyval = 0;
718
719 palZeroMemory( pMac->hHdd, (tANI_U8 *)&pInitScanParam->macMgmtHdr, sizeof(tSirMacMgmtHdr));
720 if (nextState == eLIM_HAL_INIT_LEARN_WAIT_STATE)
721 {
722 pInitScanParam->notifyBss = TRUE;
723 pInitScanParam->notifyHost = FALSE;
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700724 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
725 {
726 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SCAN;
727 }
728 else
729 {
730 pInitScanParam->scanMode = eHAL_SYS_MODE_LEARN;
731 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700732
Jeff Johnsone7245742012-09-05 17:12:55 -0700733 pInitScanParam->frameType = SIR_MAC_CTRL_CTS;
734 __limCreateInitScanRawFrame(pMac, pInitScanParam);
735 pInitScanParam->checkLinkTraffic = trafficCheck;
Jeff Johnson295189b2012-06-20 16:38:30 -0700736 }
737 else
738 {
739 if(nextState == eLIM_HAL_SUSPEND_LINK_WAIT_STATE)
740 {
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700741 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
742 {
743 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SUSPEND_LINK;
744 }
745 else
746 {
747 pInitScanParam->scanMode = eHAL_SYS_MODE_SUSPEND_LINK;
748 }
749
Jeff Johnson295189b2012-06-20 16:38:30 -0700750 }
751 else
752 {
Madan Mohan Koyyalamudi94d111d2012-11-19 20:11:26 -0800753 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
754 {
755 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SCAN;
756 }
757 else
758 {
759 pInitScanParam->scanMode = eHAL_SYS_MODE_SCAN;
760 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700761 }
762 __limCreateInitScanRawFrame(pMac, pInitScanParam);
763#ifdef WLAN_FEATURE_P2P
764 if (pInitScanParam->useNoA)
765 {
766 pInitScanParam->scanDuration = pMac->lim.gTotalScanDuration;
767 }
768#endif
769 /* Inform HAL whether it should check for traffic on the link
770 * prior to performing a background scan
771 */
772 pInitScanParam->checkLinkTraffic = trafficCheck;
773 }
774
775 pMac->lim.gLimHalScanState = nextState;
776 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -0700777 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -0700778
779 rc = wdaPostCtrlMsg(pMac, &msg);
780 if (rc == eSIR_SUCCESS) {
781 PELOG3(limLog(pMac, LOG3, FL("wdaPostCtrlMsg() return eSIR_SUCCESS pMac=%x nextState=%d\n"),
782 pMac, pMac->lim.gLimHalScanState);)
783 return;
784 }
785
786 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
787 palFreeMemory(pMac->hHdd, (void *)pInitScanParam);
788 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d\n"), rc);)
789
790error:
791 switch(nextState)
792 {
793 case eLIM_HAL_START_SCAN_WAIT_STATE:
794 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_INIT_FAILED);
795 break;
796
797#if defined(ANI_PRODUCT_TYPE_AP) && (WNI_POLARIS_FW_PACKAGE == ADVANCED)
798 case eLIM_HAL_START_LEARN_WAIT_STATE:
799 // if (pMac->lim.gLimSystemRole == eLIM_AP_ROLE)
800 {
801 limRestorePreLearnState(pMac);
802 limReEnableLearnMode(pMac);
803 }
804 break;
805
806#endif
807
808 //WLAN_SUSPEND_LINK Related
809 case eLIM_HAL_SUSPEND_LINK_WAIT_STATE:
810 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
811 if( pMac->lim.gpLimSuspendCallback )
812 {
813 pMac->lim.gpLimSuspendCallback( pMac, rc, pMac->lim.gpLimSuspendData );
814 pMac->lim.gpLimSuspendCallback = NULL;
815 pMac->lim.gpLimSuspendData = NULL;
816 }
817 pMac->lim.gLimSystemInScanLearnMode = 0;
818 break;
819 //end WLAN_SUSPEND_LINK Related
820 default:
821 break;
822 }
823 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
824
825 return ;
826}
827
828void
829limSendHalStartScanReq(tpAniSirGlobal pMac, tANI_U8 channelNum, tLimLimHalScanState nextState)
830{
831 tSirMsgQ msg;
832 tpStartScanParams pStartScanParam;
833 tSirRetStatus rc = eSIR_SUCCESS;
834
835 /**
836 * The Start scan request to be sent only if Start Scan is not already requested
837 */
838 if(pMac->lim.gLimHalScanState != eLIM_HAL_START_SCAN_WAIT_STATE)
839 {
840
841 if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
842 (void **)&pStartScanParam,
843 sizeof(*pStartScanParam)))
844 {
845 PELOGW(limLog(pMac, LOGW, FL("palAllocateMemory() failed\n"));)
846 goto error;
847 }
848
849 msg.type = WDA_START_SCAN_REQ;
850 msg.bodyptr = pStartScanParam;
851 msg.bodyval = 0;
852 pStartScanParam->status = eHAL_STATUS_SUCCESS;
853 pStartScanParam->scanChannel = (tANI_U8)channelNum;
854
855 pMac->lim.gLimHalScanState = nextState;
856 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
857
Jeff Johnsone7245742012-09-05 17:12:55 -0700858 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Mohit Khanna23863762012-09-11 17:40:09 -0700859 limLog(pMac, LOG1, FL("Channel %d\n"), channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -0700860
861 rc = wdaPostCtrlMsg(pMac, &msg);
862 if (rc == eSIR_SUCCESS) {
863 return;
864 }
865
866 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
867 palFreeMemory(pMac->hHdd, (void *)pStartScanParam);
868 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d\n"), rc);)
869
870error:
871 switch(nextState)
872 {
873 case eLIM_HAL_START_SCAN_WAIT_STATE:
874 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_INIT_FAILED);
875 break;
876
877#if defined(ANI_PRODUCT_TYPE_AP) && (WNI_POLARIS_FW_PACKAGE == ADVANCED)
878 case eLIM_HAL_START_LEARN_WAIT_STATE:
879 //if (pMac->lim.gLimSystemRole == eLIM_AP_ROLE)
880 {
881 limRestorePreLearnState(pMac);
882 limReEnableLearnMode(pMac);
883 }
884 break;
885
886#endif
887
888 default:
889 break;
890 }
891 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
892
893 }
894 else
895 {
896 PELOGW(limLog(pMac, LOGW, FL("Invalid state for START_SCAN_REQ message=%d\n"), pMac->lim.gLimHalScanState);)
897 }
898
899 return;
900}
901
902void limSendHalEndScanReq(tpAniSirGlobal pMac, tANI_U8 channelNum, tLimLimHalScanState nextState)
903{
904 tSirMsgQ msg;
905 tpEndScanParams pEndScanParam;
906 tSirRetStatus rc = eSIR_SUCCESS;
907
908 /**
909 * The End scan request to be sent only if End Scan is not already requested or
910 * Start scan is not already requestd
911 */
912 if((pMac->lim.gLimHalScanState != eLIM_HAL_END_SCAN_WAIT_STATE) &&
913 (pMac->lim.gLimHalScanState != eLIM_HAL_START_SCAN_WAIT_STATE))
914 {
915
916 if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pEndScanParam,
917 sizeof(*pEndScanParam)))
918 {
919 PELOGW(limLog(pMac, LOGW, FL("palAllocateMemory() failed\n"));)
920 goto error;
921 }
922
923 msg.type = WDA_END_SCAN_REQ;
924 msg.bodyptr = pEndScanParam;
925 msg.bodyval = 0;
926 pEndScanParam->status = eHAL_STATUS_SUCCESS;
927 pEndScanParam->scanChannel = (tANI_U8)channelNum;
928
929 pMac->lim.gLimHalScanState = nextState;
930 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -0700931 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -0700932
933 rc = wdaPostCtrlMsg(pMac, &msg);
934 if (rc == eSIR_SUCCESS) {
935 return;
936 }
937
938 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
939 palFreeMemory(pMac->hHdd, (void *)pEndScanParam);
940 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d\n"), rc);)
941
942 error:
943 switch(nextState)
944 {
945 case eLIM_HAL_END_SCAN_WAIT_STATE:
946 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_END_FAILED);
947 break;
948
949#if defined(ANI_PRODUCT_TYPE_AP) && (WNI_POLARIS_FW_PACKAGE == ADVANCED)
950 case eLIM_HAL_END_LEARN_WAIT_STATE:
951 // if (pMac->lim.gLimSystemRole == eLIM_AP_ROLE)
952 {
953 limRestorePreLearnState(pMac);
954 limReEnableLearnMode(pMac);
955 }
956 break;
957#endif
958
959 default:
960 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg Rcvd invalid nextState %d\n"), nextState);)
961 break;
962 }
963 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
964 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d\n"), rc);)
965 }
966 else
967 {
968 PELOGW(limLog(pMac, LOGW, FL("Invalid state for END_SCAN_REQ message=%d\n"), pMac->lim.gLimHalScanState);)
969 }
970
971
972 return;
973}
974
975/**
976 * limSendHalFinishScanReq()
977 *
978 *FUNCTION:
979 * This function is called to finish scan/learn request..
980 *
981 *LOGIC:
982 *
983 *ASSUMPTIONS:
984 * NA
985 *
986 *NOTE:
987 * NA
988 *
989 * @param pMac - Pointer to Global MAC structure
990 * @param nextState - this parameters determines whether this call is for scan or learn
991 *
992 * @return None
993 */
994void limSendHalFinishScanReq(tpAniSirGlobal pMac, tLimLimHalScanState nextState)
995{
996
997 tSirMsgQ msg;
998 tpFinishScanParams pFinishScanParam;
999 tSirRetStatus rc = eSIR_SUCCESS;
1000
1001 if(pMac->lim.gLimHalScanState == nextState)
1002 {
1003 /*
1004 * PE may receive multiple probe responses, while waiting for HAL to send 'FINISH_SCAN_RSP' message
1005 * PE was sending multiple finish scan req messages to HAL
1006 * this check will avoid that.
1007 * If PE is already waiting for the 'finish_scan_rsp' message from HAL, it will ignore this request.
1008 */
1009 PELOGW(limLog(pMac, LOGW, FL("Next Scan State is same as the current state: %d \n"), nextState);)
1010 return;
1011 }
1012
1013
1014 if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pFinishScanParam,
1015 sizeof(*pFinishScanParam)))
1016 {
1017 PELOGW(limLog(pMac, LOGW, FL("palAllocateMemory() failed\n"));)
1018 goto error;
1019 }
1020
1021 msg.type = WDA_FINISH_SCAN_REQ;
1022 msg.bodyptr = pFinishScanParam;
1023 msg.bodyval = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001024
1025 peGetResumeChannel(pMac, &pFinishScanParam->currentOperChannel, &pFinishScanParam->cbState);
1026
Jeff Johnson295189b2012-06-20 16:38:30 -07001027 palZeroMemory( pMac->hHdd, (tANI_U8 *)&pFinishScanParam->macMgmtHdr, sizeof(tSirMacMgmtHdr));
1028
1029 if (nextState == eLIM_HAL_FINISH_LEARN_WAIT_STATE)
1030 {
1031 //AP - No pkt need to be transmitted
1032 pFinishScanParam->scanMode = eHAL_SYS_MODE_LEARN;
1033 pFinishScanParam->notifyBss = FALSE;
1034 pFinishScanParam->notifyHost = FALSE;
1035 pFinishScanParam->frameType = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001036
Jeff Johnson295189b2012-06-20 16:38:30 -07001037 pFinishScanParam->frameLength = 0;
1038 pMac->lim.gLimHalScanState = nextState;
1039 }
1040 else
1041 {
1042 /* If STA is associated with an AP (ie. STA is in
1043 * LINK_ESTABLISHED state), then STA need to inform
1044 * the AP via either DATA-NULL
1045 */
1046 if (nextState == eLIM_HAL_RESUME_LINK_WAIT_STATE)
1047 {
1048 pFinishScanParam->scanMode = eHAL_SYS_MODE_SUSPEND_LINK;
1049 }
1050 else
1051 {
1052 pFinishScanParam->scanMode = eHAL_SYS_MODE_SCAN;
1053 }
1054 pFinishScanParam->notifyHost = FALSE;
1055 __limCreateFinishScanRawFrame(pMac, pFinishScanParam);
1056 //WLAN_SUSPEND_LINK Related
1057 pMac->lim.gLimHalScanState = nextState;
1058 //end WLAN_SUSPEND_LINK Related
1059 }
1060
1061 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -07001062 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001063
1064 rc = wdaPostCtrlMsg(pMac, &msg);
1065 if (rc == eSIR_SUCCESS) {
1066 return;
1067 }
1068 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
1069 palFreeMemory(pMac->hHdd, (void *)pFinishScanParam);
1070 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d\n"), rc);)
1071
1072 error:
1073 if(nextState == eLIM_HAL_FINISH_SCAN_WAIT_STATE)
1074 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_FINISH_FAILED);
1075 //WLAN_SUSPEND_LINK Related
1076 else if ( nextState == eLIM_HAL_RESUME_LINK_WAIT_STATE )
1077 {
1078 if( pMac->lim.gpLimResumeCallback )
1079 {
1080 pMac->lim.gpLimResumeCallback( pMac, rc, pMac->lim.gpLimResumeData );
1081 pMac->lim.gpLimResumeCallback = NULL;
1082 pMac->lim.gpLimResumeData = NULL;
1083 pMac->lim.gLimSystemInScanLearnMode = 0;
1084 }
1085 }
1086 //end WLAN_SUSPEND_LINK Related
1087 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
1088 return;
1089}
1090
1091/**
1092 * limContinueChannelScan()
1093 *
1094 *FUNCTION:
1095 * This function is called by limPerformChannelScan().
1096 * This function is called to continue channel scanning when
1097 * Beacon/Probe Response frame are received.
1098 *
1099 *LOGIC:
1100 * Scan criteria stored in pMac->lim.gLimMlmScanReq is used
1101 * to perform channel scan. In this function MLM sub module
1102 * makes channel switch, sends PROBE REQUEST frame in case of
1103 * ACTIVE SCANNING, starts min/max channel timers, programs
1104 * NAV to probeDelay timer and waits for Beacon/Probe Response.
1105 * Once all required channels are scanned, LIM_MLM_SCAN_CNF
1106 * primitive is used to send Scan results to SME sub module.
1107 *
1108 *ASSUMPTIONS:
1109 * 1. In case of Active scanning, start MAX channel time iff
1110 * MIN channel timer expired and activity is observed on
1111 * the channel.
1112 *
1113 *NOTE:
1114 * NA
1115 *
1116 * @param pMac Pointer to Global MAC structure
1117 * @return None
1118 */
1119void
1120limContinueChannelScan(tpAniSirGlobal pMac)
1121{
1122 tANI_U8 channelNum;
1123
1124 PELOG1(limLog(pMac, LOG1, FL("Continue SCAN : chan %d tot %d\n"),
1125 pMac->lim.gLimCurrentScanChannelId,
1126 pMac->lim.gpLimMlmScanReq->channelList.numChannels);)
1127
1128 if (pMac->lim.gLimCurrentScanChannelId >
1129 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1)
1130 || pMac->lim.abortScan)
1131 {
1132#ifndef ANI_SNIFFER
1133 pMac->lim.abortScan = 0;
1134 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1135 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1136
1137 //Set the resume channel to Any valid channel (invalid).
1138 //This will instruct HAL to set it to any previous valid channel.
1139 peSetResumeChannel(pMac, 0, 0);
1140
1141 /// Done scanning all required channels
1142 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
1143#endif
1144 return;
1145 }
1146
1147 /// Atleast one more channel is to be scanned
1148
1149 if ((pMac->lim.gLimReturnAfterFirstMatch & 0x40) ||
1150 (pMac->lim.gLimReturnAfterFirstMatch & 0x80))
1151 {
1152 while (pMac->lim.gLimCurrentScanChannelId <=
1153 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
1154 {
1155 if (((limGetCurrentScanChannel(pMac) <= 14) &&
1156 pMac->lim.gLim24Band11dScanDone) ||
1157 ((limGetCurrentScanChannel(pMac) > 14) &&
1158 pMac->lim.gLim50Band11dScanDone))
1159 {
1160 limLog(pMac, LOGW, FL("skipping chan %d\n"),
1161 limGetCurrentScanChannel(pMac));
1162 pMac->lim.gLimCurrentScanChannelId++;
1163 }
1164 else
1165 break;
1166 }
1167
1168 if (pMac->lim.gLimCurrentScanChannelId >
1169 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
1170 {
1171 pMac->lim.abortScan = 0;
1172 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1173 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1174 /// Done scanning all required channels
1175 //Set the resume channel to Any valid channel (invalid).
1176 //This will instruct HAL to set it to any previous valid channel.
1177 peSetResumeChannel(pMac, 0, 0);
1178 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
1179 return;
1180 }
1181 }
1182
1183 channelNum = limGetCurrentScanChannel(pMac);
1184 PELOG2(limLog(pMac, LOG2, FL("Current Channel to be scanned is %d\n"),
1185 channelNum);)
1186
1187 limSendHalStartScanReq(pMac, channelNum, eLIM_HAL_START_SCAN_WAIT_STATE);
1188 return;
1189} /*** end limContinueChannelScan() ***/
1190
1191
1192
1193/**
1194 * limRestorePreScanState()
1195 *
1196 *FUNCTION:
1197 * This function is called by limContinueChannelScan()
1198 * to restore HW state prior to entering 'scan state'
1199 *
1200 *LOGIC
1201 *
1202 *ASSUMPTIONS:
1203 *
1204 *NOTE:
1205 * NA
1206 *
1207 * @param pMac Pointer to Global MAC structure
1208 * @return None
1209 */
1210void
1211limRestorePreScanState(tpAniSirGlobal pMac)
1212{
1213 int i;
1214
1215 /// Deactivate MIN/MAX channel timers if running
1216 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1217 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1218
1219 /* Re-activate Heartbeat timers for connected sessions as scan
Madan Mohan Koyyalamudi70bb4cb2012-10-18 19:31:25 -07001220 * is done if the DUT is in active mode
1221 * AND it is not a ROAMING ("background") scan */
1222 if(((ePMM_STATE_BMPS_WAKEUP == pMac->pmm.gPmmState) ||
Jeff Johnson295189b2012-06-20 16:38:30 -07001223 (ePMM_STATE_READY == pMac->pmm.gPmmState))
Madan Mohan Koyyalamudi70bb4cb2012-10-18 19:31:25 -07001224 && (pMac->lim.gLimBackgroundScanMode != eSIR_ROAMING_SCAN ))
Jeff Johnson295189b2012-06-20 16:38:30 -07001225 {
1226 for(i=0;i<pMac->lim.maxBssId;i++)
1227 {
Jeff Johnson32d95a32012-09-10 13:15:23 -07001228 if((peFindSessionBySessionId(pMac,i) != NULL) &&
1229 (pMac->lim.gpSession[i].valid == TRUE) &&
1230 (eLIM_MLM_LINK_ESTABLISHED_STATE == pMac->lim.gpSession[i].limMlmState))
Jeff Johnson295189b2012-06-20 16:38:30 -07001231 {
1232 limReactivateHeartBeatTimer(pMac, peFindSessionBySessionId(pMac,i));
1233 }
1234 }
1235 }
1236
1237 /**
1238 * clean up message queue.
1239 * If SME messages, redirect to deferred queue.
1240 * The rest will be discarded.
1241 */
1242 //limCleanupMsgQ(pMac);
1243
1244 pMac->lim.gLimSystemInScanLearnMode = 0;
1245 PELOG1(limLog(pMac, LOG1, FL("Scan ended, took %d tu\n"), (tx_time_get() - pMac->lim.scanStartTime));)
1246} /*** limRestorePreScanState() ***/
1247
Jeff Johnsone7245742012-09-05 17:12:55 -07001248#ifdef FEATURE_OEM_DATA_SUPPORT
1249
1250void limSendHalOemDataReq(tpAniSirGlobal pMac)
1251{
1252 tSirMsgQ msg;
1253 tpStartOemDataReq pStartOemDataReq = NULL;
1254 tSirRetStatus rc = eSIR_SUCCESS;
1255 tpLimMlmOemDataRsp pMlmOemDataRsp;
1256 tANI_U32 reqLen = 0;
1257 if(NULL == pMac->lim.gpLimMlmOemDataReq)
1258 {
1259 PELOGE(limLog(pMac, LOGE, FL("Null pointer\n"));)
1260 goto error;
1261 }
1262
1263 reqLen = sizeof(tStartOemDataReq);
1264
1265 if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd, (void**)&pStartOemDataReq, reqLen))
1266 {
1267 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: Could not allocate memory for pStartOemDataReq\n"));)
1268 goto error;
1269 }
1270
1271 palZeroMemory(pMac->hHdd, (tANI_U8*)(pStartOemDataReq), reqLen);
1272
1273 //Now copy over the information to the OEM DATA REQ to HAL
1274 palCopyMemory(pMac->hHdd, pStartOemDataReq->selfMacAddr, pMac->lim.gpLimMlmOemDataReq->selfMacAddr, sizeof(tSirMacAddr));
1275
1276 palCopyMemory(pMac->hHdd, pStartOemDataReq->oemDataReq, pMac->lim.gpLimMlmOemDataReq->oemDataReq, OEM_DATA_REQ_SIZE);
1277
1278 //Create the message to be passed to HAL
1279 msg.type = WDA_START_OEM_DATA_REQ;
1280 msg.bodyptr = pStartOemDataReq;
1281 msg.bodyval = 0;
1282
1283 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
1284 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
1285
1286 rc = wdaPostCtrlMsg(pMac, &msg);
1287 if(rc == eSIR_SUCCESS)
1288 {
1289 return;
1290 }
1291
1292 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
1293 palFreeMemory(pMac->hHdd, (void*)pStartOemDataReq);
1294 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: posting WDA_START_OEM_DATA_REQ to HAL failed\n"));)
1295
1296error:
1297 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
1298
1299 if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd, (void**)(&pMlmOemDataRsp), sizeof(tLimMlmOemDataRsp)))
1300 {
1301 limLog(pMac->hHdd, LOGP, FL("OEM_DATA: memory allocation for pMlmOemDataRsp failed under suspend link failure\n"));
1302 return;
1303 }
1304
1305 if(NULL != pMac->lim.gpLimMlmOemDataReq)
1306 {
1307 palFreeMemory(pMac->hHdd, pMac->lim.gpLimMlmOemDataReq);
1308 pMac->lim.gpLimMlmOemDataReq = NULL;
1309 }
1310
1311 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
1312
1313 return;
1314}
1315/**
1316 * limSetOemDataReqModeFailed()
1317 *
1318 * FUNCTION:
1319 * This function is used as callback to resume link after the suspend fails while
1320 * starting oem data req mode.
1321 * LOGIC:
1322 * NA
1323 *
1324 * ASSUMPTIONS:
1325 * NA
1326 *
1327 * NOTE:
1328 *
1329 * @param pMac - Pointer to Global MAC structure
1330 * @return None
1331 */
1332
1333void limSetOemDataReqModeFailed(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data)
1334{
1335 tpLimMlmOemDataRsp pMlmOemDataRsp;
1336
1337 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
1338
1339 if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd, (void**)(&pMlmOemDataRsp), sizeof(tLimMlmOemDataRsp)))
1340 {
1341 limLog(pMac->hHdd, LOGP, FL("OEM_DATA: memory allocation for pMlmOemDataRsp failed under suspend link failure\n"));
1342 return;
1343 }
1344
1345 if(NULL != pMac->lim.gpLimMlmOemDataReq)
1346 {
1347 palFreeMemory(pMac->hHdd, pMac->lim.gpLimMlmOemDataReq);
1348 pMac->lim.gpLimMlmOemDataReq = NULL;
1349 }
1350
1351 palZeroMemory(pMac->hHdd, pMlmOemDataRsp, sizeof(tLimMlmOemDataRsp));
1352
1353 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
1354
1355 return;
1356}
1357
1358/**
1359 * limSetOemDataReqMode()
1360 *
1361 *FUNCTION:
1362 * This function is called to setup system into OEM DATA REQ mode
1363 *
1364 *LOGIC:
1365 * NA
1366 *
1367 *ASSUMPTIONS:
1368 * NA
1369 *
1370 *NOTE:
1371 *
1372 * @param pMac - Pointer to Global MAC structure
1373 * @return None
1374 */
1375
1376void limSetOemDataReqMode(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data)
1377{
1378 if(status != eHAL_STATUS_SUCCESS)
1379 {
1380 limLog(pMac, LOGE, FL("OEM_DATA: failed in suspend link\n"));
1381 goto error;
1382 }
1383 else
1384 {
1385 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: Calling limSendHalOemDataReq\n"));)
1386 limSendHalOemDataReq(pMac);
1387 return;
1388 }
1389
1390error:
1391 limResumeLink(pMac, limSetOemDataReqModeFailed, NULL);
1392 return ;
1393} /*** end limSendHalOemDataReq() ***/
1394
1395#endif //FEATURE_OEM_DATA_SUPPORT
Jeff Johnson295189b2012-06-20 16:38:30 -07001396
1397static void
1398mlm_add_sta(
1399 tpAniSirGlobal pMac,
1400 tpAddStaParams pSta,
1401 tANI_U8 *pBssid,
1402 tANI_U8 htCapable,
1403 tpPESession psessionEntry) //psessionEntry may required in future
1404{
1405 tANI_U32 val;
1406 int i;
1407
1408
1409 pSta->staType = STA_ENTRY_SELF; // Identifying self
1410
1411 palCopyMemory( pMac->hHdd, pSta->bssId, pBssid, sizeof( tSirMacAddr ));
1412 palCopyMemory( pMac->hHdd, pSta->staMac, psessionEntry->selfMacAddr, sizeof(tSirMacAddr));
1413
1414 /* Configuration related parameters to be changed to support BT-AMP */
1415
1416 if( eSIR_SUCCESS != wlan_cfgGetInt( pMac, WNI_CFG_LISTEN_INTERVAL, &val ))
1417 limLog(pMac, LOGP, FL("Couldn't get LISTEN_INTERVAL\n"));
1418
1419 pSta->listenInterval = (tANI_U16) val;
1420
1421 if (eSIR_SUCCESS != wlan_cfgGetInt(pMac, WNI_CFG_SHORT_PREAMBLE, &val) )
1422 limLog(pMac, LOGP, FL("Couldn't get SHORT_PREAMBLE\n"));
1423 pSta->shortPreambleSupported = (tANI_U8)val;
1424
1425 pSta->assocId = 0; // Is SMAC OK with this?
1426 pSta->wmmEnabled = 0;
1427 pSta->uAPSD = 0;
1428 pSta->maxSPLen = 0;
1429 pSta->us32MaxAmpduDuration = 0;
1430 pSta->maxAmpduSize = 0; // 0: 8k, 1: 16k,2: 32k,3: 64k
1431
1432
1433 if(IS_DOT11_MODE_HT(psessionEntry->dot11mode))
1434 {
1435 pSta->htCapable = htCapable;
1436#ifdef WLAN_SOFTAP_FEATURE
1437 pSta->greenFieldCapable = limGetHTCapability( pMac, eHT_GREENFIELD, psessionEntry);
1438 pSta->txChannelWidthSet = limGetHTCapability( pMac, eHT_SUPPORTED_CHANNEL_WIDTH_SET, psessionEntry );
1439 pSta->mimoPS = (tSirMacHTMIMOPowerSaveState)limGetHTCapability( pMac, eHT_MIMO_POWER_SAVE, psessionEntry );
1440 pSta->rifsMode = limGetHTCapability( pMac, eHT_RIFS_MODE, psessionEntry );
1441 pSta->lsigTxopProtection = limGetHTCapability( pMac, eHT_LSIG_TXOP_PROTECTION, psessionEntry );
1442 pSta->delBASupport = limGetHTCapability( pMac, eHT_DELAYED_BA, psessionEntry );
1443 pSta->maxAmpduDensity = limGetHTCapability( pMac, eHT_MPDU_DENSITY, psessionEntry );
1444 pSta->maxAmsduSize = limGetHTCapability( pMac, eHT_MAX_AMSDU_LENGTH, psessionEntry );
1445 pSta->fDsssCckMode40Mhz = limGetHTCapability( pMac, eHT_DSSS_CCK_MODE_40MHZ, psessionEntry);
1446 pSta->fShortGI20Mhz = limGetHTCapability( pMac, eHT_SHORT_GI_20MHZ, psessionEntry);
1447 pSta->fShortGI40Mhz = limGetHTCapability( pMac, eHT_SHORT_GI_40MHZ, psessionEntry);
1448#else
1449 pSta->greenFieldCapable = limGetHTCapability( pMac, eHT_GREENFIELD );
1450 pSta->txChannelWidthSet = limGetHTCapability( pMac, eHT_SUPPORTED_CHANNEL_WIDTH_SET );
1451 pSta->mimoPS = (tSirMacHTMIMOPowerSaveState)limGetHTCapability( pMac, eHT_MIMO_POWER_SAVE );
1452 pSta->rifsMode = limGetHTCapability( pMac, eHT_RIFS_MODE );
1453 pSta->lsigTxopProtection = limGetHTCapability( pMac, eHT_LSIG_TXOP_PROTECTION );
1454 pSta->delBASupport = limGetHTCapability( pMac, eHT_DELAYED_BA );
1455 pSta->maxAmpduDensity = limGetHTCapability( pMac, eHT_MPDU_DENSITY );
1456 pSta->maxAmsduSize = limGetHTCapability( pMac, eHT_MAX_AMSDU_LENGTH );
1457 pSta->fDsssCckMode40Mhz = limGetHTCapability( pMac, eHT_DSSS_CCK_MODE_40MHZ);
1458 pSta->fShortGI20Mhz = limGetHTCapability( pMac, eHT_SHORT_GI_20MHZ);
1459 pSta->fShortGI40Mhz = limGetHTCapability( pMac, eHT_SHORT_GI_40MHZ);
1460
1461#endif
1462 }
Jeff Johnsone7245742012-09-05 17:12:55 -07001463#ifdef WLAN_FEATURE_11AC
1464 if (psessionEntry->vhtCapability)
1465 {
1466 pSta->vhtCapable = VOS_TRUE;
1467 }
1468#endif
1469#ifdef WLAN_FEATURE_11AC
1470 limPopulateOwnRateSet(pMac, &pSta->supportedRates, NULL, false,psessionEntry,NULL);
1471#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001472 limPopulateOwnRateSet(pMac, &pSta->supportedRates, NULL, false,psessionEntry);
Jeff Johnsone7245742012-09-05 17:12:55 -07001473#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001474 limFillSupportedRatesInfo(pMac, NULL, &pSta->supportedRates,psessionEntry);
1475
1476 limLog( pMac, LOGE, FL( "GF: %d, ChnlWidth: %d, MimoPS: %d, lsigTXOP: %d, dsssCCK: %d, SGI20: %d, SGI40%d\n") ,
1477 pSta->greenFieldCapable, pSta->txChannelWidthSet, pSta->mimoPS, pSta->lsigTxopProtection,
1478 pSta->fDsssCckMode40Mhz,pSta->fShortGI20Mhz, pSta->fShortGI40Mhz);
1479
1480#ifdef WLAN_FEATURE_P2P
1481 if (VOS_P2P_GO_MODE == psessionEntry->pePersona)
1482 {
1483 pSta->p2pCapableSta = 1;
1484 }
1485#endif
1486
1487 //Disable BA. It will be set as part of ADDBA negotiation.
1488 for( i = 0; i < STACFG_MAX_TC; i++ )
1489 {
1490 pSta->staTCParams[i].txUseBA = eBA_DISABLE;
1491 pSta->staTCParams[i].rxUseBA = eBA_DISABLE;
1492 }
1493
1494}
1495
1496//
1497// New HAL interface - WDA_ADD_BSS_REQ
1498// Package WDA_ADD_BSS_REQ to HAL, in order to start a BSS
1499//
1500tSirResultCodes
1501limMlmAddBss (
1502 tpAniSirGlobal pMac,
1503 tLimMlmStartReq *pMlmStartReq,
1504 tpPESession psessionEntry)
1505{
1506 tSirMsgQ msgQ;
1507 tpAddBssParams pAddBssParams = NULL;
1508 tANI_U32 retCode;
1509
Jeff Johnson295189b2012-06-20 16:38:30 -07001510 // Package WDA_ADD_BSS_REQ message parameters
1511
1512 if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
1513 (void **) &pAddBssParams, sizeof( tAddBssParams )))
1514 {
1515 limLog( pMac, LOGE, FL( "Unable to PAL allocate memory during ADD_BSS\n" ));
1516 // Respond to SME with LIM_MLM_START_CNF
1517 return eSIR_SME_HAL_SEND_MESSAGE_FAIL;
1518 }
1519
1520 palZeroMemory(pMac->hHdd, pAddBssParams, sizeof(tAddBssParams));
1521
1522 // Fill in tAddBssParams members
1523 palCopyMemory( pMac->hHdd, pAddBssParams->bssId, pMlmStartReq->bssId,
1524 sizeof( tSirMacAddr ));
1525
1526 // Fill in tAddBssParams selfMacAddr
1527 palCopyMemory ( pMac->hHdd, pAddBssParams->selfMacAddr,
1528 psessionEntry->selfMacAddr,
1529 sizeof( tSirMacAddr ));
1530
1531 pAddBssParams->bssType = pMlmStartReq->bssType;
1532 if ((pMlmStartReq->bssType == eSIR_IBSS_MODE) ||
1533 (pMlmStartReq->bssType == eSIR_BTAMP_AP_MODE)||
1534 (pMlmStartReq->bssType == eSIR_BTAMP_STA_MODE)) {
1535 pAddBssParams->operMode = BSS_OPERATIONAL_MODE_STA;
1536 }
1537#ifdef WLAN_SOFTAP_FEATURE
1538 else if (pMlmStartReq->bssType == eSIR_INFRA_AP_MODE){
1539#else
1540 else{
1541#endif
1542 pAddBssParams->operMode = BSS_OPERATIONAL_MODE_AP;
1543 }
1544
1545#ifdef WLAN_SOFTAP_FEATURE
Jeff Johnsone7245742012-09-05 17:12:55 -07001546 pAddBssParams->shortSlotTimeSupported = psessionEntry->shortSlotTimeSupported;
Jeff Johnson295189b2012-06-20 16:38:30 -07001547#endif
1548
Jeff Johnson295189b2012-06-20 16:38:30 -07001549 pAddBssParams->beaconInterval = pMlmStartReq->beaconPeriod;
1550 pAddBssParams->dtimPeriod = pMlmStartReq->dtimPeriod;
1551 pAddBssParams->cfParamSet.cfpCount = pMlmStartReq->cfParamSet.cfpCount;
1552 pAddBssParams->cfParamSet.cfpPeriod = pMlmStartReq->cfParamSet.cfpPeriod;
1553 pAddBssParams->cfParamSet.cfpMaxDuration = pMlmStartReq->cfParamSet.cfpMaxDuration;
1554 pAddBssParams->cfParamSet.cfpDurRemaining = pMlmStartReq->cfParamSet.cfpDurRemaining;
1555
1556 pAddBssParams->rateSet.numRates = pMlmStartReq->rateSet.numRates;
1557 palCopyMemory( pMac->hHdd, pAddBssParams->rateSet.rate,
1558 pMlmStartReq->rateSet.rate, pMlmStartReq->rateSet.numRates );
1559
1560 pAddBssParams->nwType = pMlmStartReq->nwType;
1561
1562 pAddBssParams->htCapable = pMlmStartReq->htCapable;
Jeff Johnsone7245742012-09-05 17:12:55 -07001563#ifdef WLAN_FEATURE_11AC
1564 pAddBssParams->vhtCapable = psessionEntry->vhtCapability;
1565 pAddBssParams->vhtTxChannelWidthSet = psessionEntry->vhtTxChannelWidthSet;
1566#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001567 pAddBssParams->htOperMode = pMlmStartReq->htOperMode;
1568 pAddBssParams->dualCTSProtection = pMlmStartReq->dualCTSProtection;
1569 pAddBssParams->txChannelWidthSet = pMlmStartReq->txChannelWidthSet;
1570
1571 pAddBssParams->currentOperChannel = pMlmStartReq->channelNumber;
Jeff Johnsone7245742012-09-05 17:12:55 -07001572 pAddBssParams->currentExtChannel = pMlmStartReq->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07001573
1574 /* Update PE sessionId*/
1575 pAddBssParams->sessionId = pMlmStartReq->sessionId;
1576
1577 //Send the SSID to HAL to enable SSID matching for IBSS
1578 palCopyMemory( pMac->hHdd, &(pAddBssParams->ssId.ssId),
1579 pMlmStartReq->ssId.ssId,
1580 pMlmStartReq->ssId.length);
1581 pAddBssParams->ssId.length = pMlmStartReq->ssId.length;
1582#ifdef WLAN_SOFTAP_FEATURE
1583 pAddBssParams->bHiddenSSIDEn = pMlmStartReq->ssidHidden;
1584 limLog( pMac, LOGE, FL( "TRYING TO HIDE SSID %d\n" ),pAddBssParams->bHiddenSSIDEn);
1585 // CR309183. Disable Proxy Probe Rsp. Host handles Probe Requests. Until FW fixed.
1586 pAddBssParams->bProxyProbeRespEn = 0;
1587 pAddBssParams->obssProtEnabled = pMlmStartReq->obssProtEnabled;
1588
1589#endif
1590#if defined WLAN_FEATURE_VOWIFI
1591 pAddBssParams->maxTxPower = psessionEntry->maxTxPower;
1592#endif
1593 mlm_add_sta(pMac, &pAddBssParams->staContext,
1594 pAddBssParams->bssId, pAddBssParams->htCapable,psessionEntry);
1595
1596 pAddBssParams->status = eHAL_STATUS_SUCCESS;
1597 pAddBssParams->respReqd = 1;
1598
1599 // Set a new state for MLME
1600 psessionEntry->limMlmState = eLIM_MLM_WT_ADD_BSS_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07001601 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07001602
1603 pAddBssParams->halPersona=psessionEntry->pePersona; //pass on the session persona to hal
1604
1605 pAddBssParams->bSpectrumMgtEnabled = psessionEntry->spectrumMgtEnabled;
1606
1607#if defined WLAN_FEATURE_VOWIFI_11R
1608 pAddBssParams->extSetStaKeyParamValid = 0;
1609#endif
1610
1611 //
1612 // FIXME_GEN4
1613 // A global counter (dialog token) is required to keep track of
1614 // all PE <-> HAL communication(s)
1615 //
1616 msgQ.type = WDA_ADD_BSS_REQ;
1617 msgQ.reserved = 0;
1618 msgQ.bodyptr = pAddBssParams;
1619 msgQ.bodyval = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001620 MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001621
1622 limLog( pMac, LOGW, FL( "Sending WDA_ADD_BSS_REQ...\n" ));
1623 if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
1624 {
1625 limLog( pMac, LOGE, FL("Posting ADD_BSS_REQ to HAL failed, reason=%X\n"), retCode );
1626 palFreeMemory(pMac->hHdd,(void *)pAddBssParams);
1627 return eSIR_SME_HAL_SEND_MESSAGE_FAIL;
1628 }
1629
1630 return eSIR_SME_SUCCESS;
1631}
1632
1633
1634/**
1635 * limProcessMlmStartReq()
1636 *
1637 *FUNCTION:
1638 * This function is called to process MLM_START_REQ message
1639 * from SME
1640 *
1641 *LOGIC:
1642 * 1) MLME receives LIM_MLM_START_REQ from LIM
1643 * 2) MLME sends WDA_ADD_BSS_REQ to HAL
1644 * 3) MLME changes state to eLIM_MLM_WT_ADD_BSS_RSP_STATE
1645 * MLME now waits for HAL to send WDA_ADD_BSS_RSP
1646 *
1647 *ASSUMPTIONS:
1648 *
1649 *NOTE:
1650 *
1651 * @param pMac Pointer to Global MAC structure
1652 * @param *pMsgBuf A pointer to the MLM message buffer
1653 * @return None
1654 */
1655
1656static void
1657limProcessMlmStartReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
1658{
1659 tLimMlmStartReq *pMlmStartReq;
1660 tLimMlmStartCnf mlmStartCnf;
1661 tpPESession psessionEntry = NULL;
1662
1663 if(pMsgBuf == NULL)
1664 {
1665 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
1666 return;
1667 }
1668
1669 pMlmStartReq = (tLimMlmStartReq *) pMsgBuf;
1670 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmStartReq->sessionId))==NULL)
1671 {
1672 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
1673 mlmStartCnf.resultCode = eSIR_SME_REFUSED;
1674 goto end;
1675 }
1676
1677 if (psessionEntry->limMlmState != eLIM_MLM_IDLE_STATE)
1678 {
1679 /**
1680 * Should not have received Start req in states other than idle.
1681 * Return Start confirm with failure code.
1682 */
1683 PELOGE(limLog(pMac, LOGE, FL("received unexpected MLM_START_REQ in state %X\n"),psessionEntry->limMlmState);)
1684 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
1685 mlmStartCnf.resultCode = eSIR_SME_BSS_ALREADY_STARTED_OR_JOINED;
1686 goto end;
1687 }
1688
1689 #if 0
1690 if (cfgSetInt(pMac, WNI_CFG_CURRENT_CHANNEL, pMlmStartReq->channelNumber)!= eSIR_SUCCESS)
1691 limLog(pMac, LOGP, FL("could not set CURRENT_CHANNEL at CFG\n"));
1692
1693 pMac->lim.gLimCurrentChannelId = pMlmStartReq->channelNumber;
1694 #endif //TO SUPPORT BT-AMP
1695
1696
1697 // Update BSSID & SSID at CFG database
1698 #if 0 //We are not using the BSSID and SSID from the config file, instead we are reading form the session table
1699 if (cfgSetStr(pMac, WNI_CFG_BSSID, (tANI_U8 *) pMlmStartReq->bssId, sizeof(tSirMacAddr))
1700 != eSIR_SUCCESS)
1701 limLog(pMac, LOGP, FL("could not update BSSID at CFG\n"));
1702
1703
1704
1705 palCopyMemory( pMac->hHdd, pMac->lim.gLimCurrentBssId,
1706 pMlmStartReq->bssId,
1707 sizeof(tSirMacAddr));
1708 #endif //TO SUPPORT BT-AMP
1709
1710 #if 0
1711 if (cfgSetStr(pMac, WNI_CFG_SSID, (tANI_U8 *) &pMlmStartReq->ssId.ssId, pMlmStartReq->ssId.length)
1712 != eSIR_SUCCESS)
1713 limLog(pMac, LOGP, FL("could not update SSID at CFG\n"));
1714 #endif //To SUPPORT BT-AMP
1715
1716
1717 // pMac->lim.gLimCurrentSSID.length = pMlmStartReq->ssId.length;
1718
1719 #if 0
1720 if (cfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET,
1721 (tANI_U8 *) &pMac->lim.gpLimStartBssReq->operationalRateSet.rate,
1722 pMac->lim.gpLimStartBssReq->operationalRateSet.numRates)
1723 != eSIR_SUCCESS)
1724 limLog(pMac, LOGP, FL("could not update Operational Rateset at CFG\n"));
1725 #endif //TO SUPPORT BT-AMP
1726
1727
1728#if defined(ANI_PRODUCT_TYPE_AP) && (WNI_POLARIS_FW_PACKAGE == ADVANCED)
1729 if (cfgSetInt(pMac, WNI_CFG_CURRENT_TX_POWER_LEVEL, pMac->lim.gpLimStartBssReq->powerLevel)
1730 != eSIR_SUCCESS)
1731 limLog(pMac, LOGP, FL("could not set WNI_CFG_CURRENT_TX_POWER_LEVEL at CFG\n"));
1732#endif
1733
1734#ifdef WLAN_SOFTAP_FEATURE
1735#if 0 // Periodic timer for remove WPS PBC proble response entry in PE is disbaled now.
1736 if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
1737 {
1738 if(pMac->lim.limTimers.gLimWPSOverlapTimerObj.isTimerCreated == eANI_BOOLEAN_FALSE)
1739 {
1740 if (tx_timer_create(&pMac->lim.limTimers.gLimWPSOverlapTimerObj.gLimWPSOverlapTimer,
1741 "PS OVERLAP Timer",
1742 limWPSOverlapTimerHandler,
1743 SIR_LIM_WPS_OVERLAP_TIMEOUT, // expiration_input
1744 SYS_MS_TO_TICKS(LIM_WPS_OVERLAP_TIMER_MS), // initial_ticks
1745 SYS_MS_TO_TICKS(LIM_WPS_OVERLAP_TIMER_MS), // reschedule_ticks
1746 TX_AUTO_ACTIVATE /* TX_NO_ACTIVATE*/) != TX_SUCCESS)
1747 {
1748 limLog(pMac, LOGP, FL("failed to create WPS overlap Timer\n"));
1749 }
1750
1751 pMac->lim.limTimers.gLimWPSOverlapTimerObj.sessionId = pMlmStartReq->sessionId;
1752 pMac->lim.limTimers.gLimWPSOverlapTimerObj.isTimerCreated = eANI_BOOLEAN_TRUE;
1753 limLog(pMac, LOGE, FL("Create WPS overlap Timer, session=%d\n"), pMlmStartReq->sessionId);
1754
1755 if (tx_timer_activate(&pMac->lim.limTimers.gLimWPSOverlapTimerObj.gLimWPSOverlapTimer) != TX_SUCCESS)
1756 {
1757 limLog(pMac, LOGP, FL("tx_timer_activate failed\n"));
1758 }
1759 }
1760 }
1761#endif
1762#endif
1763
1764
1765
1766 mlmStartCnf.resultCode = limMlmAddBss(pMac, pMlmStartReq,psessionEntry);
1767
1768end:
1769 /* Update PE session Id */
1770 mlmStartCnf.sessionId = pMlmStartReq->sessionId;
1771
1772 /// Free up buffer allocated for LimMlmScanReq
1773 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf);
1774
1775 //
1776 // Respond immediately to LIM, only if MLME has not been
1777 // successfully able to send WDA_ADD_BSS_REQ to HAL.
1778 // Else, LIM_MLM_START_CNF will be sent after receiving
1779 // WDA_ADD_BSS_RSP from HAL
1780 //
1781 if( eSIR_SME_SUCCESS != mlmStartCnf.resultCode )
1782 limPostSmeMessage(pMac, LIM_MLM_START_CNF, (tANI_U32 *) &mlmStartCnf);
1783} /*** limProcessMlmStartReq() ***/
1784
1785
1786/*
1787* This function checks if Scan is allowed or not.
1788* It checks each session and if any session is not in the normal state,
1789* it will return false.
1790* Note: BTAMP_STA can be in LINK_EST as well as BSS_STARTED State, so
1791* both cases are handled below.
1792*/
1793
1794static tANI_U8 __limMlmScanAllowed(tpAniSirGlobal pMac)
1795{
1796 int i;
1797
Jeff Johnson43971f52012-07-17 12:26:56 -07001798 if(pMac->lim.gLimMlmState != eLIM_MLM_IDLE_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07001799 {
1800 return FALSE;
1801 }
1802 for(i =0; i < pMac->lim.maxBssId; i++)
1803 {
1804 if(pMac->lim.gpSession[i].valid == TRUE)
1805 {
1806 if(!( ( ( (pMac->lim.gpSession[i].bssType == eSIR_INFRASTRUCTURE_MODE) ||
1807 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_STA_ROLE))&&
1808 (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE) )||
1809
1810 ( ( (pMac->lim.gpSession[i].bssType == eSIR_IBSS_MODE)||
1811 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_AP_ROLE)||
1812 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_STA_ROLE) )&&
1813 (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_BSS_STARTED_STATE) )
1814#ifdef WLAN_FEATURE_P2P
1815 || ( ( ( (pMac->lim.gpSession[i].bssType == eSIR_INFRA_AP_MODE)
1816 && ( pMac->lim.gpSession[i].pePersona == VOS_P2P_GO_MODE) )
1817 || (pMac->lim.gpSession[i].limSystemRole == eLIM_AP_ROLE) )
1818 && (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_BSS_STARTED_STATE) )
1819#endif
1820 ))
1821 {
1822 return FALSE;
1823
1824 }
1825 }
1826 }
1827
1828 return TRUE;
1829}
1830
1831
1832
1833/**
1834 * limProcessMlmScanReq()
1835 *
1836 *FUNCTION:
1837 * This function is called to process MLM_SCAN_REQ message
1838 * from SME
1839 *
1840 *LOGIC:
1841 *
1842 *ASSUMPTIONS:
1843 *
1844 *NOTE:
1845 *
1846 * @param pMac Pointer to Global MAC structure
1847 * @param *pMsgBuf A pointer to the MLM message buffer
1848 * @return None
1849 */
1850
1851static void
1852limProcessMlmScanReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
1853{
1854 tLimMlmScanCnf mlmScanCnf;
1855
1856 if (pMac->lim.gLimSystemInScanLearnMode)
1857 {
1858 PELOGE(limLog(pMac, LOGE,
1859 FL("Sending START_SCAN from LIM while one req is pending\n"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001860 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf);
Madan Mohan Koyyalamudid4b301b2012-10-11 14:15:54 -07001861 /*Send back a failure*/
1862 mlmScanCnf.resultCode = eSIR_SME_SCAN_FAILED;
1863 mlmScanCnf.scanResultLength = 0;
1864 limPostSmeMessage(pMac,
1865 LIM_MLM_SCAN_CNF,
1866 (tANI_U32 *) &mlmScanCnf);
Jeff Johnson295189b2012-06-20 16:38:30 -07001867 return;
1868 }
1869
1870 if(__limMlmScanAllowed(pMac) &&
1871 (((tLimMlmScanReq *) pMsgBuf)->channelList.numChannels != 0))
1872
1873 {
1874 /// Hold onto SCAN REQ criteria
1875 pMac->lim.gpLimMlmScanReq = (tLimMlmScanReq *) pMsgBuf;
1876
1877 PELOG3(limLog(pMac, LOG3, FL("Number of channels to scan are %d \n"),
1878 pMac->lim.gpLimMlmScanReq->channelList.numChannels);)
1879
1880 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
1881
1882 if (pMac->lim.gpLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN)
1883 pMac->lim.gLimMlmState = eLIM_MLM_WT_PROBE_RESP_STATE;
1884 else // eSIR_PASSIVE_SCAN
1885 pMac->lim.gLimMlmState = eLIM_MLM_PASSIVE_SCAN_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07001886 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07001887
1888 pMac->lim.gLimSystemInScanLearnMode = 1;
1889
1890#ifdef WLAN_FEATURE_P2P
Madan Mohan Koyyalamudi551984f2012-11-28 15:37:40 -08001891 /* Use min + max channel time to calculate the total duration of scan.
1892 * Adding an overhead of 5ms to account for the scan messaging delays */
Jeff Johnson295189b2012-06-20 16:38:30 -07001893 pMac->lim.gTotalScanDuration =
Madan Mohan Koyyalamudi551984f2012-11-28 15:37:40 -08001894 (pMac->lim.gpLimMlmScanReq->minChannelTime + pMac->lim.gpLimMlmScanReq->maxChannelTime + 5)*
Jeff Johnson295189b2012-06-20 16:38:30 -07001895 pMac->lim.gpLimMlmScanReq->channelList.numChannels;
1896#endif
1897 limSetScanMode(pMac);
1898 }
1899 else
1900 {
1901 /**
1902 * Should not have received SCAN req in other states
1903 * OR should not have received LIM_MLM_SCAN_REQ with
1904 * zero number of channels
1905 * Log error
1906 */
1907 limLog(pMac, LOGW,
1908 FL("received unexpected MLM_SCAN_REQ in state %X OR zero number of channels: %X\n"),
1909 pMac->lim.gLimMlmState, ((tLimMlmScanReq *) pMsgBuf)->channelList.numChannels);
1910 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
1911
1912 /// Free up buffer allocated for
1913 /// pMac->lim.gLimMlmScanReq
1914 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf);
1915
1916 /// Return Scan confirm with INVALID_PARAMETERS
1917
1918 mlmScanCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
1919 mlmScanCnf.scanResultLength = 0;
1920 limPostSmeMessage(pMac,
1921 LIM_MLM_SCAN_CNF,
1922 (tANI_U32 *) &mlmScanCnf);
1923 }
1924} /*** limProcessMlmScanReq() ***/
1925
Jeff Johnsone7245742012-09-05 17:12:55 -07001926#ifdef FEATURE_OEM_DATA_SUPPORT
1927static void limProcessMlmOemDataReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
1928{
1929 tLimMlmOemDataRsp* pMlmOemDataRsp;
1930
1931 if (((pMac->lim.gLimMlmState == eLIM_MLM_IDLE_STATE) ||
1932 (pMac->lim.gLimMlmState == eLIM_MLM_JOINED_STATE) ||
1933 (pMac->lim.gLimMlmState == eLIM_MLM_AUTHENTICATED_STATE) ||
1934 (pMac->lim.gLimMlmState == eLIM_MLM_BSS_STARTED_STATE) ||
1935 (pMac->lim.gLimMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)))
1936 {
1937 //Hold onto the oem data request criteria
1938 pMac->lim.gpLimMlmOemDataReq = (tLimMlmOemDataReq*)pMsgBuf;
1939
1940 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
1941
1942 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
1943
1944 //Now request for link suspension
1945 limSuspendLink(pMac, eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN, limSetOemDataReqMode, NULL);
1946 }
1947 else
1948 {
1949 /**
1950 * Should not have received oem data req in other states
1951 * Log error
1952 */
1953
1954 PELOGW(limLog(pMac, LOGW, FL("OEM_DATA: unexpected LIM_MLM_OEM_DATA_REQ in invalid state %X\n"),pMac->lim.gLimMlmState);)
1955
1956 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
1957
1958 /// Free up buffer allocated
1959 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf);
1960
1961 /// Return Meas confirm with INVALID_PARAMETERS
1962 if(eHAL_STATUS_SUCCESS == palAllocateMemory(pMac->hHdd, (void**)&pMlmOemDataRsp, sizeof(tLimMlmOemDataRsp)))
1963 {
1964 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
1965 palFreeMemory(pMac->hHdd, pMlmOemDataRsp);
1966 }
1967 else
1968 {
1969 limLog(pMac, LOGP, FL("Could not allocate memory for pMlmOemDataRsp\n"));
1970 return;
1971 }
1972 }
1973
1974 return;
1975}
1976#endif //FEATURE_OEM_DATA_SUPPORT
Jeff Johnson295189b2012-06-20 16:38:30 -07001977
1978
1979/**
1980 * limProcessMlmPostJoinSuspendLink()
1981 *
1982 *FUNCTION:
1983 * This function is called after the suspend link while joining
1984 * off channel.
1985 *
1986 *LOGIC:
1987 * Check for suspend state.
1988 * If success, proceed with setting link state to recieve the
1989 * probe response/beacon from intended AP.
1990 * Switch to the APs channel.
1991 * On an error case, send the MLM_JOIN_CNF with error status.
1992 *
1993 *ASSUMPTIONS:
1994 *
1995 *NOTE:
1996 *
1997 * @param pMac Pointer to Global MAC structure
1998 * @param status status of suspend link.
1999 * @param ctx passed while calling suspend link(psessionEntry)
2000 * @return None
2001 */
2002static void
2003limProcessMlmPostJoinSuspendLink(tpAniSirGlobal pMac, eHalStatus status, tANI_U32 *ctx)
2004{
Jeff Johnsone7245742012-09-05 17:12:55 -07002005 tANI_U8 chanNum, secChanOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002006 tLimMlmJoinCnf mlmJoinCnf;
2007 tpPESession psessionEntry = (tpPESession)ctx;
2008 tSirLinkState linkState;
2009
2010 if( eHAL_STATUS_SUCCESS != status )
2011 {
2012 limLog(pMac, LOGP, FL("Suspend link failed. Not proceeding with join\n"));
2013 goto error;
2014 }
2015 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2016 psessionEntry->limMlmState = eLIM_MLM_WT_JOIN_BEACON_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002017 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002018
2019 limDeactivateAndChangeTimer(pMac, eLIM_JOIN_FAIL_TIMER);
2020
2021 //assign appropriate sessionId to the timer object
2022 pMac->lim.limTimers.gLimJoinFailureTimer.sessionId = psessionEntry->peSessionId;
2023
2024 linkState = ((psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE) ? eSIR_LINK_BTAMP_PREASSOC_STATE : eSIR_LINK_PREASSOC_STATE);
2025 limLog(pMac, LOG1, FL("[limProcessMlmJoinReq]: linkState:%d\n"),linkState);
2026
2027 if (limSetLinkState(pMac, linkState,
2028 psessionEntry->pLimMlmJoinReq->bssDescription.bssId,
2029 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS )
2030 {
2031 limLog(pMac, LOGE, FL("limSetLinkState to eSIR_LINK_PREASSOC_STATE Failed!!\n"));
2032 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002033 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
2034 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002035 goto error;
2036 }
2037
2038 /** Derive channel from BSS description and store it in the CFG */
2039 // chanNum = pMac->lim.gpLimMlmJoinReq->bssDescription.channelId;
2040
2041 chanNum = psessionEntry->currentOperChannel;
Jeff Johnsone7245742012-09-05 17:12:55 -07002042 secChanOffset = psessionEntry->htSecondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002043 //store the channel switch sessionEntry in the lim global var
2044 psessionEntry->channelChangeReasonCode = LIM_SWITCH_CHANNEL_JOIN;
Madan Mohan Koyyalamudi61bc5662012-11-02 14:33:10 -07002045#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
2046 psessionEntry->pLimMlmReassocRetryReq = NULL;
2047#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002048
Jeff Johnsone7245742012-09-05 17:12:55 -07002049 limSetChannel(pMac, chanNum, secChanOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002050
2051 return;
2052error:
2053 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2054 mlmJoinCnf.sessionId = psessionEntry->peSessionId;
2055 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2056 limPostSmeMessage(pMac, LIM_MLM_JOIN_CNF, (tANI_U32 *) &mlmJoinCnf);
2057
2058}
2059
2060
2061
2062/**
2063 * limProcessMlmJoinReq()
2064 *
2065 *FUNCTION:
2066 * This function is called to process MLM_JOIN_REQ message
2067 * from SME
2068 *
2069 *LOGIC:
2070 * 1) Initialize LIM, HAL, DPH
2071 * 2) Configure the BSS for which the JOIN REQ was received
2072 * a) Send WDA_ADD_BSS_REQ to HAL -
2073 * This will identify the BSS that we are interested in
2074 * --AND--
2075 * Add a STA entry for the AP (in a STA context)
2076 * b) Wait for WDA_ADD_BSS_RSP
2077 * c) Send WDA_ADD_STA_REQ to HAL
2078 * This will add the "local STA" entry to the STA table
2079 * 3) Continue as before, i.e,
2080 * a) Send a PROBE REQ
2081 * b) Wait for PROBE RSP/BEACON containing the SSID that
2082 * we are interested in
2083 * c) Then start an AUTH seq
2084 * d) Followed by the ASSOC seq
2085 *
2086 *ASSUMPTIONS:
2087 *
2088 *NOTE:
2089 *
2090 * @param pMac Pointer to Global MAC structure
2091 * @param *pMsgBuf A pointer to the MLM message buffer
2092 * @return None
2093 */
2094
2095static void
2096limProcessMlmJoinReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2097{
2098 tLimMlmJoinCnf mlmJoinCnf;
2099 tANI_U8 sessionId;
2100 tpPESession psessionEntry;
2101
2102 sessionId = ((tpLimMlmJoinReq)pMsgBuf)->sessionId;
2103
2104 if((psessionEntry = peFindSessionBySessionId(pMac,sessionId))== NULL)
2105 {
2106 limLog(pMac, LOGP, FL("session does not exist for given sessionId\n"));
2107
2108 goto error;
2109 }
2110
2111 if (( (psessionEntry->limSystemRole != eLIM_AP_ROLE ) && (psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE )) &&
2112 ( (psessionEntry->limMlmState == eLIM_MLM_IDLE_STATE) ||
2113 (psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE)) &&
2114 (SIR_MAC_GET_ESS( ((tpLimMlmJoinReq) pMsgBuf)->bssDescription.capabilityInfo) !=
2115 SIR_MAC_GET_IBSS( ((tpLimMlmJoinReq) pMsgBuf)->bssDescription.capabilityInfo)))
2116 {
2117 #if 0
2118 if (pMac->lim.gpLimMlmJoinReq)
2119 palFreeMemory( pMac->hHdd, pMac->lim.gpLimMlmJoinReq);
2120 #endif //TO SUPPORT BT-AMP , review 23sep
2121
2122 /// Hold onto Join request parameters
2123
2124 psessionEntry->pLimMlmJoinReq =(tpLimMlmJoinReq) pMsgBuf;
2125
2126 if( isLimSessionOffChannel(pMac, sessionId) )
2127 {
2128 //suspend link
2129 limSuspendLink(pMac, eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN,
2130 limProcessMlmPostJoinSuspendLink, (tANI_U32*)psessionEntry );
2131 }
2132 else
2133 {
2134 //No need to suspend link.
2135 limProcessMlmPostJoinSuspendLink( pMac, eHAL_STATUS_SUCCESS,
2136 (tANI_U32*) psessionEntry );
2137 }
2138
2139 return;
2140 }
2141 else
2142 {
2143 /**
2144 * Should not have received JOIN req in states other than
2145 * Idle state or on AP.
2146 * Return join confirm with invalid parameters code.
2147 */
2148 PELOGE(limLog(pMac, LOGE,
2149 FL("Unexpected Join request for role %d state %X\n"),
2150 psessionEntry->limSystemRole,
2151 psessionEntry->limMlmState);)
2152 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
2153
2154 limLog(pMac, LOGE, FL("Unexpected Join request for role %d state %X\n"),
Jeff Johnsone7245742012-09-05 17:12:55 -07002155 psessionEntry->limSystemRole, psessionEntry->limMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002156 }
2157
2158error:
2159
2160
2161 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2162 mlmJoinCnf.sessionId = sessionId;
2163 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2164 limPostSmeMessage(pMac, LIM_MLM_JOIN_CNF, (tANI_U32 *) &mlmJoinCnf);
2165
2166
2167} /*** limProcessMlmJoinReq() ***/
2168
2169
2170
2171/**
2172 * limProcessMlmAuthReq()
2173 *
2174 *FUNCTION:
2175 * This function is called to process MLM_AUTH_REQ message
2176 * from SME
2177 *
2178 *LOGIC:
2179 *
2180 *ASSUMPTIONS:
2181 *
2182 *NOTE:
2183 *
2184 * @param pMac Pointer to Global MAC structure
2185 * @param *pMsgBuf A pointer to the MLM message buffer
2186 * @return None
2187 */
2188
2189static void
2190limProcessMlmAuthReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2191{
2192 tANI_U32 numPreAuthContexts;
2193 tSirMacAddr currentBssId;
2194 tSirMacAuthFrameBody authFrameBody;
2195 tLimMlmAuthCnf mlmAuthCnf;
2196 struct tLimPreAuthNode *preAuthNode;
2197 tpDphHashNode pStaDs;
2198 tANI_U8 sessionId;
2199 tpPESession psessionEntry;
2200
2201 if(pMsgBuf == NULL)
2202 {
2203 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
2204 return;
2205 }
2206
2207 pMac->lim.gpLimMlmAuthReq = (tLimMlmAuthReq *) pMsgBuf;
2208 sessionId = pMac->lim.gpLimMlmAuthReq->sessionId;
2209 if((psessionEntry= peFindSessionBySessionId(pMac,sessionId) )== NULL)
2210 {
2211 limLog(pMac, LOGP, FL("Session Does not exist for given sessionId\n"));
2212 return;
2213 }
2214
2215 /**
2216 * Expect Auth request only when:
2217 * 1. STA joined/associated with a BSS or
2218 * 2. STA is in IBSS mode
2219 * and STA is going to authenticate with a unicast
2220 * adress and requested authentication algorithm is
2221 * supported.
2222 */
2223 #if 0
2224 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2225 eSIR_SUCCESS)
2226 {
2227 /// Could not get BSSID from CFG. Log error.
2228 limLog(pMac, LOGP, FL("could not retrieve BSSID\n"));
2229 }
2230 #endif //To SuppoRT BT-AMP
2231
2232 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2233
2234 if (((((psessionEntry->limSystemRole== eLIM_STA_ROLE) || (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)) &&
2235 ((psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE) ||
2236 (psessionEntry->limMlmState ==
2237 eLIM_MLM_LINK_ESTABLISHED_STATE))) ||
2238 ((psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE) &&
2239 (psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE))) &&
2240 (limIsGroupAddr(pMac->lim.gpLimMlmAuthReq->peerMacAddr)
2241 == false) &&
2242#ifdef WLAN_SOFTAP_FEATURE
2243 (limIsAuthAlgoSupported(
2244 pMac,
2245 pMac->lim.gpLimMlmAuthReq->authType,
2246 psessionEntry) == true)
2247#else
2248 (limIsAuthAlgoSupported(
2249 pMac,
2250 pMac->lim.gpLimMlmAuthReq->authType) == true)
2251#endif
2252 )
2253 {
2254 /**
2255 * This is a request for pre-authentication.
2256 * Check if there exists context already for
2257 * the requsted peer OR
2258 * if this request is for the AP we're currently
2259 * associated with.
2260 * If yes, return auth confirm immediately when
2261 * requested auth type is same as the one used before.
2262 */
2263 if ((((psessionEntry->limSystemRole == eLIM_STA_ROLE) ||(psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE) )&&
2264 (psessionEntry->limMlmState ==
2265 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
2266 (((pStaDs = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable)) != NULL) &&
2267 (pMac->lim.gpLimMlmAuthReq->authType ==
2268 pStaDs->mlmStaContext.authType)) &&
2269 (palEqualMemory( pMac->hHdd,pMac->lim.gpLimMlmAuthReq->peerMacAddr,
2270 currentBssId,
2271 sizeof(tSirMacAddr)) )) ||
2272 (((preAuthNode =
2273 limSearchPreAuthList(
2274 pMac,
2275 pMac->lim.gpLimMlmAuthReq->peerMacAddr)) != NULL) &&
2276 (preAuthNode->authType ==
2277 pMac->lim.gpLimMlmAuthReq->authType)))
2278 {
2279 PELOG2(limLog(pMac, LOG2,
2280 FL("Already have pre-auth context with peer\n"));
2281 limPrintMacAddr(pMac, pMac->lim.gpLimMlmAuthReq->peerMacAddr,
2282 LOG2);)
2283
2284 mlmAuthCnf.resultCode = (tSirResultCodes)
2285 eSIR_MAC_SUCCESS_STATUS;
2286
2287
2288 goto end;
2289 }
2290 else
2291 {
2292 if (wlan_cfgGetInt(pMac, WNI_CFG_MAX_NUM_PRE_AUTH,
2293 (tANI_U32 *) &numPreAuthContexts) != eSIR_SUCCESS)
2294 {
2295 limLog(pMac, LOGP,
2296 FL("Could not retrieve NumPreAuthLimit from CFG\n"));
2297 }
2298#ifdef ANI_AP_SDK_OPT
2299 if(numPreAuthContexts > SIR_SDK_OPT_MAX_NUM_PRE_AUTH)
2300 numPreAuthContexts = SIR_SDK_OPT_MAX_NUM_PRE_AUTH;
2301#endif // ANI_AP_SDK_OPT
2302
2303 if (pMac->lim.gLimNumPreAuthContexts == numPreAuthContexts)
2304 {
2305 PELOGW(limLog(pMac, LOGW,
2306 FL("Number of pre-auth reached max limit\n"));)
2307
2308 /// Return Auth confirm with reject code
2309 mlmAuthCnf.resultCode =
2310 eSIR_SME_MAX_NUM_OF_PRE_AUTH_REACHED;
2311
2312 goto end;
2313 }
2314 }
2315
2316 // Delete pre-auth node if exists
2317 if (preAuthNode)
2318 limDeletePreAuthNode(pMac,
2319 pMac->lim.gpLimMlmAuthReq->peerMacAddr);
2320
Jeff Johnson295189b2012-06-20 16:38:30 -07002321 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2322 psessionEntry->limMlmState = eLIM_MLM_WT_AUTH_FRAME2_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002323 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002324
2325 /// Prepare & send Authentication frame
2326 authFrameBody.authAlgoNumber =
2327 (tANI_U8) pMac->lim.gpLimMlmAuthReq->authType;
2328 authFrameBody.authTransactionSeqNumber = SIR_MAC_AUTH_FRAME_1;
2329 authFrameBody.authStatusCode = 0;
2330 limSendAuthMgmtFrame(pMac,
2331 &authFrameBody,
2332 pMac->lim.gpLimMlmAuthReq->peerMacAddr,
2333 LIM_NO_WEP_IN_FC,psessionEntry);
2334
Jeff Johnsone7245742012-09-05 17:12:55 -07002335 //assign appropriate sessionId to the timer object
2336 pMac->lim.limTimers.gLimAuthFailureTimer.sessionId = sessionId;
2337
2338 // Activate Auth failure timer
2339 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_AUTH_FAIL_TIMER));
2340 if (tx_timer_activate(&pMac->lim.limTimers.gLimAuthFailureTimer)
2341 != TX_SUCCESS)
2342 {
2343 /// Could not start Auth failure timer.
2344 // Log error
2345 limLog(pMac, LOGP,
2346 FL("could not start Auth failure timer\n"));
2347 // Cleanup as if auth timer expired
2348 limProcessAuthFailureTimeout(pMac);
2349 }
2350
Jeff Johnson295189b2012-06-20 16:38:30 -07002351 return;
2352 }
2353 else
2354 {
2355 /**
2356 * Unexpected auth request.
2357 * Return Auth confirm with Invalid parameters code.
2358 */
2359 mlmAuthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2360
2361 goto end;
2362 }
2363
2364end:
2365 palCopyMemory( pMac->hHdd, (tANI_U8 *) &mlmAuthCnf.peerMacAddr,
2366 (tANI_U8 *) &pMac->lim.gpLimMlmAuthReq->peerMacAddr,
2367 sizeof(tSirMacAddr));
2368
2369 mlmAuthCnf.authType = pMac->lim.gpLimMlmAuthReq->authType;
2370 mlmAuthCnf.sessionId = sessionId;
2371
2372 /// Free up buffer allocated
2373 /// for pMac->lim.gLimMlmAuthReq
2374 palFreeMemory( pMac->hHdd, pMac->lim.gpLimMlmAuthReq);
2375 pMac->lim.gpLimMlmAuthReq = NULL;
2376 limPostSmeMessage(pMac, LIM_MLM_AUTH_CNF, (tANI_U32 *) &mlmAuthCnf);
2377} /*** limProcessMlmAuthReq() ***/
2378
2379
2380
2381/**
2382 * limProcessMlmAssocReq()
2383 *
2384 *FUNCTION:
2385 * This function is called to process MLM_ASSOC_REQ message
2386 * from SME
2387 *
2388 *LOGIC:
2389 *
2390 *ASSUMPTIONS:
2391 *
2392 *NOTE:
2393 *
2394 * @param pMac Pointer to Global MAC structure
2395 * @param *pMsgBuf A pointer to the MLM message buffer
2396 * @return None
2397 */
2398
2399static void
2400limProcessMlmAssocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2401{
2402 tSirMacAddr currentBssId;
2403 tLimMlmAssocReq *pMlmAssocReq;
2404 tLimMlmAssocCnf mlmAssocCnf;
2405 tpPESession psessionEntry;
2406 // tANI_U8 sessionId;
2407
2408 if(pMsgBuf == NULL)
2409 {
2410 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
2411 return;
2412 }
2413 pMlmAssocReq = (tLimMlmAssocReq *) pMsgBuf;
2414
2415 if( (psessionEntry = peFindSessionBySessionId(pMac,pMlmAssocReq->sessionId) )== NULL)
2416 {
2417 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002418 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmAssocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002419 return;
2420 }
2421
2422 #if 0
2423 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2424 eSIR_SUCCESS)
2425 {
2426 /// Could not get BSSID from CFG. Log error.
2427 limLog(pMac, LOGP, FL("could not retrieve BSSID\n"));
2428 }
2429 #endif //TO SUPPORT BT-AMP
2430 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2431
2432 if ( (psessionEntry->limSystemRole != eLIM_AP_ROLE && psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE) &&
2433 (psessionEntry->limMlmState == eLIM_MLM_AUTHENTICATED_STATE || psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE) &&
2434 (palEqualMemory(pMac->hHdd,pMlmAssocReq->peerMacAddr, currentBssId, sizeof(tSirMacAddr))) )
2435 {
Jeff Johnsone7245742012-09-05 17:12:55 -07002436
Jeff Johnson295189b2012-06-20 16:38:30 -07002437 /// map the session entry pointer to the AssocFailureTimer
2438 pMac->lim.limTimers.gLimAssocFailureTimer.sessionId = pMlmAssocReq->sessionId;
2439
Jeff Johnson295189b2012-06-20 16:38:30 -07002440 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2441 psessionEntry->limMlmState = eLIM_MLM_WT_ASSOC_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002442 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002443
2444 /// Prepare and send Association request frame
2445 limSendAssocReqMgmtFrame(pMac, pMlmAssocReq,psessionEntry);
2446
2447 //Set the link state to postAssoc, so HW can start receiving frames from AP.
2448 if ((psessionEntry->bssType == eSIR_BTAMP_STA_MODE)||
2449 ((psessionEntry->bssType == eSIR_BTAMP_AP_MODE) && (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)))
2450 {
2451 if(limSetLinkState(pMac, eSIR_LINK_BTAMP_POSTASSOC_STATE, currentBssId,
2452 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
2453 PELOGE(limLog(pMac, LOGE, FL("Failed to set the LinkState\n"));)
2454 } else {
2455 if(limSetLinkState(pMac, eSIR_LINK_POSTASSOC_STATE, currentBssId,
2456 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
2457 PELOGE(limLog(pMac, LOGE, FL("Failed to set the LinkState\n"));)
2458 }
Jeff Johnsone7245742012-09-05 17:12:55 -07002459 /// Start association failure timer
2460 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_ASSOC_FAIL_TIMER));
2461 if (tx_timer_activate(&pMac->lim.limTimers.gLimAssocFailureTimer)
2462 != TX_SUCCESS)
2463 {
2464 /// Could not start Assoc failure timer.
2465 // Log error
2466 limLog(pMac, LOGP,
2467 FL("could not start Association failure timer\n"));
2468 // Cleanup as if assoc timer expired
2469 limProcessAssocFailureTimeout(pMac,LIM_ASSOC );
2470
2471 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002472
2473 return;
2474 }
2475 else
2476 {
2477 /**
2478 * Received Association request either in invalid state
2479 * or to a peer MAC entity whose address is different
2480 * from one that STA is currently joined with or on AP.
2481 * Return Assoc confirm with Invalid parameters code.
2482 */
2483
2484 // Log error
2485 PELOGW(limLog(pMac, LOGW,
2486 FL("received unexpected MLM_ASSOC_CNF in state %X for role=%d, MAC addr= "),
2487 psessionEntry->limMlmState,
2488 psessionEntry->limSystemRole);)
2489 limPrintMacAddr(pMac, pMlmAssocReq->peerMacAddr, LOGW);
2490 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
2491
2492 mlmAssocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2493 mlmAssocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2494
2495 goto end;
2496 }
2497
2498end:
2499 /* Update PE session Id*/
2500 mlmAssocCnf.sessionId = pMlmAssocReq->sessionId;
2501
2502 /// Free up buffer allocated for assocReq
2503 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmAssocReq);
2504
2505 limPostSmeMessage(pMac, LIM_MLM_ASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
2506} /*** limProcessMlmAssocReq() ***/
2507
2508
2509
2510/**
2511 * limProcessMlmReassocReq()
2512 *
2513 *FUNCTION:
2514 * This function is called to process MLM_REASSOC_REQ message
2515 * from SME
2516 *
2517 *LOGIC:
2518 *
2519 *ASSUMPTIONS:
2520 *
2521 *NOTE:
2522 *
2523 * @param pMac Pointer to Global MAC structure
2524 * @param *pMsgBuf A pointer to the MLM message buffer
2525 * @return None
2526 */
2527
2528static void
2529limProcessMlmReassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2530{
Jeff Johnsone7245742012-09-05 17:12:55 -07002531 tANI_U8 chanNum, secChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002532 struct tLimPreAuthNode *pAuthNode;
2533 tLimMlmReassocReq *pMlmReassocReq;
2534 tLimMlmReassocCnf mlmReassocCnf;
2535 tpPESession psessionEntry;
2536
2537 if(pMsgBuf == NULL)
2538 {
2539 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
2540 return;
2541 }
2542
2543 pMlmReassocReq = (tLimMlmReassocReq *) pMsgBuf;
2544
2545 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmReassocReq->sessionId)) == NULL)
2546 {
2547 PELOGE(limLog(pMac, LOGE,FL("Session Does not exist for given sessionId\n"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07002548 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002549 return;
2550 }
2551
2552 if (((psessionEntry->limSystemRole != eLIM_AP_ROLE) && (psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE)) &&
2553 (psessionEntry->limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE))
2554 {
2555 if (psessionEntry->pLimMlmReassocReq)
2556 palFreeMemory( pMac->hHdd, psessionEntry->pLimMlmReassocReq);
2557
2558 /* Hold Re-Assoc request as part of Session, knock-out pMac */
2559 /// Hold onto Reassoc request parameters
2560 psessionEntry->pLimMlmReassocReq = pMlmReassocReq;
2561
2562 // See if we have pre-auth context with new AP
2563 pAuthNode = limSearchPreAuthList(pMac, psessionEntry->limReAssocbssId);
2564
2565 if (!pAuthNode &&
2566 (!palEqualMemory( pMac->hHdd,pMlmReassocReq->peerMacAddr,
2567 psessionEntry->bssId,
2568 sizeof(tSirMacAddr)) ))
2569 {
2570 // Either pre-auth context does not exist AND
2571 // we are not reassociating with currently
2572 // associated AP.
2573 // Return Reassoc confirm with not authenticated
2574 mlmReassocCnf.resultCode = eSIR_SME_STA_NOT_AUTHENTICATED;
2575 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2576
2577 goto end;
2578 }
2579
2580 //assign the sessionId to the timer object
2581 pMac->lim.limTimers.gLimReassocFailureTimer.sessionId = pMlmReassocReq->sessionId;
2582
2583 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2584 psessionEntry->limMlmState = eLIM_MLM_WT_REASSOC_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002585 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002586
2587#if 0
2588 // Update BSSID at CFG database
2589 if (wlan_cfgSetStr(pMac, WNI_CFG_BSSID,
2590 pMac->lim.gLimReassocBssId,
2591 sizeof(tSirMacAddr)) != eSIR_SUCCESS)
2592 {
2593 /// Could not update BSSID at CFG. Log error.
2594 limLog(pMac, LOGP, FL("could not update BSSID at CFG\n"));
2595 }
2596#endif //TO SUPPORT BT-AMP
2597
2598 /* Copy Global Reassoc ID*/
2599 // sirCopyMacAddr(psessionEntry->reassocbssId,pMac->lim.gLimReAssocBssId);
2600
2601 /**
2602 * Derive channel from BSS description and
2603 * store it at CFG.
2604 */
2605
2606 chanNum = psessionEntry->limReassocChannelId;
Jeff Johnsone7245742012-09-05 17:12:55 -07002607 secChannelOffset = psessionEntry->reAssocHtSecondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002608
2609 /* To Support BT-AMP .. read channel number from psessionEntry*/
2610 //chanNum = psessionEntry->currentOperChannel;
2611
2612 // Apply previously set configuration at HW
2613 limApplyConfiguration(pMac,psessionEntry);
2614
2615 //store the channel switch sessionEntry in the lim global var
2616 /* We have already saved the ReAssocreq Pointer abobe */
2617 //psessionEntry->pLimReAssocReq = (void *)pMlmReassocReq;
2618 psessionEntry->channelChangeReasonCode = LIM_SWITCH_CHANNEL_REASSOC;
2619
Jeff Johnsone7245742012-09-05 17:12:55 -07002620 /** Switch channel to the new Operating channel for Reassoc*/
2621 limSetChannel(pMac, chanNum, secChannelOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002622
2623 return;
2624 }
2625 else
2626 {
2627 /**
2628 * Received Reassoc request in invalid state or
2629 * in AP role.Return Reassoc confirm with Invalid
2630 * parameters code.
2631 */
2632
2633 // Log error
2634 PELOGW(limLog(pMac, LOGW,
2635 FL("received unexpected MLM_REASSOC_CNF in state %X for role=%d, MAC addr= "),
2636 psessionEntry->limMlmState,
2637 psessionEntry->limSystemRole);)
2638 limPrintMacAddr(pMac, pMlmReassocReq->peerMacAddr,
2639 LOGW);
2640 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
2641
2642 mlmReassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2643 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2644
2645 goto end;
2646 }
2647
2648end:
2649 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2650 /* Update PE sessio Id*/
2651 mlmReassocCnf.sessionId = pMlmReassocReq->sessionId;
2652 /// Free up buffer allocated for reassocReq
2653 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmReassocReq);
2654 psessionEntry->pLimReAssocReq = NULL;
2655
2656 limPostSmeMessage(pMac, LIM_MLM_REASSOC_CNF, (tANI_U32 *) &mlmReassocCnf);
2657} /*** limProcessMlmReassocReq() ***/
2658
2659
2660static void
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08002661limProcessMlmDisassocReqNtf(tpAniSirGlobal pMac, eHalStatus suspendStatus, tANI_U32 *pMsgBuf)
Jeff Johnson295189b2012-06-20 16:38:30 -07002662{
2663 tANI_U16 aid;
2664 tSirMacAddr currentBssId;
2665 tpDphHashNode pStaDs;
2666 tLimMlmDisassocReq *pMlmDisassocReq;
2667 tLimMlmDisassocCnf mlmDisassocCnf;
2668 tpPESession psessionEntry;
2669 extern tANI_BOOLEAN sendDisassocFrame;
2670
2671 if(eHAL_STATUS_SUCCESS != suspendStatus)
2672 {
2673 PELOGE(limLog(pMac, LOGE,FL("Suspend Status is not success %X\n"), suspendStatus);)
2674#if 0
2675 //It can ignore the status and proceed with the disassoc processing.
2676 mlmDisassocCnf.resultCode = eSIR_SME_REFUSED;
2677 goto end;
2678#endif
2679 }
2680
2681 pMlmDisassocReq = (tLimMlmDisassocReq *) pMsgBuf;
2682
2683
2684 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDisassocReq->sessionId))== NULL)
2685 {
2686
2687 PELOGE(limLog(pMac, LOGE,
2688 FL("session does not exist for given sessionId\n"));)
2689 mlmDisassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2690 goto end;
2691 }
2692 #if 0
2693 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2694 eSIR_SUCCESS)
2695 {
2696 /// Could not get BSSID from CFG. Log error.
2697 limLog(pMac, LOGP, FL("could not retrieve BSSID\n"));
2698 }
2699 #endif //BT-AMP Support
2700 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2701
2702 switch (psessionEntry->limSystemRole)
2703 {
2704 case eLIM_STA_ROLE:
2705 case eLIM_BT_AMP_STA_ROLE:
2706 if ( !palEqualMemory( pMac->hHdd,pMlmDisassocReq->peerMacAddr,
2707 currentBssId,
2708 sizeof(tSirMacAddr)) )
2709 {
2710 PELOGW(limLog(pMac, LOGW,
2711 FL("received MLM_DISASSOC_REQ with invalid BSS id "));)
2712 limPrintMacAddr(pMac, pMlmDisassocReq->peerMacAddr, LOGW);
2713
2714 /// Prepare and Send LIM_MLM_DISASSOC_CNF
2715
2716 mlmDisassocCnf.resultCode =
2717 eSIR_SME_INVALID_PARAMETERS;
2718
2719 goto end;
2720 }
2721
2722 break;
2723
2724 case eLIM_STA_IN_IBSS_ROLE:
2725
2726 break;
2727
2728 default: // eLIM_AP_ROLE
2729
2730 // Fall through
2731 break;
2732
2733 } // end switch (psessionEntry->limSystemRole)
2734
2735 /**
2736 * Check if there exists a context for the peer entity
2737 * to be disassociated with.
2738 */
2739 pStaDs = dphLookupHashEntry(pMac, pMlmDisassocReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable);
2740 if ((pStaDs == NULL) ||
2741 (pStaDs &&
2742 ((pStaDs->mlmStaContext.mlmState !=
2743 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
2744 (pStaDs->mlmStaContext.mlmState !=
2745 eLIM_MLM_WT_ASSOC_CNF_STATE) &&
2746 (pStaDs->mlmStaContext.mlmState !=
2747 eLIM_MLM_ASSOCIATED_STATE))))
2748 {
2749 /**
2750 * Received LIM_MLM_DISASSOC_REQ for STA that does not
2751 * have context or in some transit state.
2752 * Log error
2753 */
2754 PELOGW(limLog(pMac, LOGW,
2755 FL("received MLM_DISASSOC_REQ for STA that either has no context or in some transit state, Addr= "));)
2756 limPrintMacAddr(pMac, pMlmDisassocReq->peerMacAddr, LOGW);
2757
2758 /// Prepare and Send LIM_MLM_DISASSOC_CNF
2759
2760 mlmDisassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2761
2762 goto end;
2763 }
2764
2765 //pStaDs->mlmStaContext.rxPurgeReq = 1;
2766 pStaDs->mlmStaContext.disassocReason = (tSirMacReasonCodes)
2767 pMlmDisassocReq->reasonCode;
2768 pStaDs->mlmStaContext.cleanupTrigger = pMlmDisassocReq->disassocTrigger;
2769
2770 /// Send Disassociate frame to peer entity
Jeff Johnsone7245742012-09-05 17:12:55 -07002771 if (sendDisassocFrame && (pMlmDisassocReq->reasonCode != eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON))
Jeff Johnson295189b2012-06-20 16:38:30 -07002772 {
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08002773 pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq = pMlmDisassocReq;
Madan Mohan Koyyalamudicdcb58f2012-11-28 01:40:44 +05302774 /* Set state to mlm State to eLIM_MLM_WT_DEL_STA_RSP_STATE
2775 * This is to address the issue of race condition between
2776 * disconnect request from the HDD and deauth from AP
2777 */
2778 pStaDs->mlmStaContext.mlmState = eLIM_MLM_WT_DEL_STA_RSP_STATE;
2779
2780 limSendDisassocMgmtFrame(pMac,
2781 pMlmDisassocReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08002782 pMlmDisassocReq->peerMacAddr,
2783 psessionEntry, TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002784 }
2785 else
2786 {
Madan Mohan Koyyalamudib6af0612012-11-19 13:45:45 -08002787 /* Disassoc frame is not sent OTA */
2788 sendDisassocFrame = 1;
2789 // Receive path cleanup with dummy packet
2790 if(eSIR_SUCCESS != limCleanupRxPath(pMac, pStaDs,psessionEntry))
2791 {
2792 mlmDisassocCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2793 goto end;
2794 }
2795 // Free up buffer allocated for mlmDisassocReq
2796 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmDisassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002797 }
2798
Jeff Johnson295189b2012-06-20 16:38:30 -07002799 return;
2800
2801end:
2802 palCopyMemory( pMac->hHdd, (tANI_U8 *) &mlmDisassocCnf.peerMacAddr,
2803 (tANI_U8 *) pMlmDisassocReq->peerMacAddr,
2804 sizeof(tSirMacAddr));
2805 mlmDisassocCnf.aid = pMlmDisassocReq->aid;
2806 mlmDisassocCnf.disassocTrigger = pMlmDisassocReq->disassocTrigger;
2807
2808 /* Update PE session ID*/
2809 mlmDisassocCnf.sessionId = pMlmDisassocReq->sessionId;
2810
2811 /// Free up buffer allocated for mlmDisassocReq
2812 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmDisassocReq);
2813
2814 limPostSmeMessage(pMac,
2815 LIM_MLM_DISASSOC_CNF,
2816 (tANI_U32 *) &mlmDisassocCnf);
2817}
2818
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08002819void limCleanUpDisassocDeauthReq(tpAniSirGlobal pMac,
2820 tANI_U8 *staMac,
2821 tANI_BOOLEAN cleanRxPath)
2822{
2823 tLimMlmDisassocReq *pMlmDisassocReq;
2824 tLimMlmDeauthReq *pMlmDeauthReq;
2825 pMlmDisassocReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq;
2826 if (pMlmDisassocReq &&
2827 (palEqualMemory( pMac->hHdd,(tANI_U8 *) staMac,
2828 (tANI_U8 *) &pMlmDisassocReq->peerMacAddr,
2829 sizeof(tSirMacAddr))))
2830 {
2831 if (cleanRxPath)
2832 {
2833 limProcessDisassocAckTimeout(pMac);
2834 }
2835 else
2836 {
2837 if (tx_timer_running(&pMac->lim.limTimers.gLimDisassocAckTimer))
2838 {
2839 limDeactivateAndChangeTimer(pMac, eLIM_DISASSOC_ACK_TIMER);
2840 }
2841 palFreeMemory(pMac->hHdd, (tANI_U8 *) pMlmDisassocReq);
2842 pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq = NULL;
2843 }
2844 }
2845
2846 pMlmDeauthReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq;
2847 if (pMlmDeauthReq &&
2848 (palEqualMemory( pMac->hHdd,(tANI_U8 *) staMac,
2849 (tANI_U8 *) &pMlmDeauthReq->peerMacAddr,
2850 sizeof(tSirMacAddr))))
2851 {
2852 if (cleanRxPath)
2853 {
2854 limProcessDeauthAckTimeout(pMac);
2855 }
2856 else
2857 {
2858 if (tx_timer_running(&pMac->lim.limTimers.gLimDeauthAckTimer))
2859 {
2860 limDeactivateAndChangeTimer(pMac, eLIM_DEAUTH_ACK_TIMER);
2861 }
2862 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmDeauthReq);
2863 pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = NULL;
2864 }
2865 }
2866}
2867
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08002868void limProcessDisassocAckTimeout(tpAniSirGlobal pMac)
2869{
2870 limSendDisassocCnf(pMac);
2871}
2872
Jeff Johnson295189b2012-06-20 16:38:30 -07002873/**
2874 * limProcessMlmDisassocReq()
2875 *
2876 *FUNCTION:
2877 * This function is called to process MLM_DISASSOC_REQ message
2878 * from SME
2879 *
2880 *LOGIC:
2881 *
2882 *ASSUMPTIONS:
2883 *
2884 *NOTE:
2885 *
2886 * @param pMac Pointer to Global MAC structure
2887 * @param *pMsgBuf A pointer to the MLM message buffer
2888 * @return None
2889 */
2890
2891static void
2892limProcessMlmDisassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2893{
2894// tANI_U16 aid;
2895// tSirMacAddr currentBssId;
2896// tpDphHashNode pStaDs;
2897 tLimMlmDisassocReq *pMlmDisassocReq;
2898// tLimMlmDisassocCnf mlmDisassocCnf;
2899 tpPESession psessionEntry;
2900// extern tANI_BOOLEAN sendDisassocFrame;
2901
2902 if(pMsgBuf == NULL)
2903 {
2904 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
2905 return;
2906 }
2907
2908 pMlmDisassocReq = (tLimMlmDisassocReq *) pMsgBuf;
2909
2910 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDisassocReq->sessionId))== NULL)
2911 {
2912
2913 PELOGE(limLog(pMac, LOGE,
2914 FL("session does not exist for given sessionId\n"));)
2915 return;
2916 }
2917
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08002918 limProcessMlmDisassocReqNtf( pMac, eHAL_STATUS_SUCCESS, (tANI_U32*) pMsgBuf );
Madan Mohan Koyyalamudib6af0612012-11-19 13:45:45 -08002919
Jeff Johnson295189b2012-06-20 16:38:30 -07002920} /*** limProcessMlmDisassocReq() ***/
2921
2922static void
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08002923limProcessMlmDeauthReqNtf(tpAniSirGlobal pMac, eHalStatus suspendStatus, tANI_U32 *pMsgBuf)
Jeff Johnson295189b2012-06-20 16:38:30 -07002924{
2925 tANI_U16 aid;
2926 tSirMacAddr currentBssId;
2927 tpDphHashNode pStaDs;
2928 struct tLimPreAuthNode *pAuthNode;
2929 tLimMlmDeauthReq *pMlmDeauthReq;
2930 tLimMlmDeauthCnf mlmDeauthCnf;
2931 tpPESession psessionEntry;
2932
2933
2934 if(eHAL_STATUS_SUCCESS != suspendStatus)
2935 {
2936 PELOGE(limLog(pMac, LOGE,FL("Suspend Status is not success %X\n"), suspendStatus);)
2937#if 0
2938 //It can ignore the status and proceed with the disassoc processing.
2939 mlmDisassocCnf.resultCode = eSIR_SME_REFUSED;
2940 goto end;
2941#endif
2942 }
2943
2944 pMlmDeauthReq = (tLimMlmDeauthReq *) pMsgBuf;
2945
2946 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDeauthReq->sessionId))== NULL)
2947 {
2948
2949 PELOGE(limLog(pMac, LOGE, FL("session does not exist for given sessionId\n"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07002950 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002951 return;
2952 }
2953 #if 0
2954 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2955 eSIR_SUCCESS)
2956 {
2957 /// Could not get BSSID from CFG. Log error.
2958 limLog(pMac, LOGP, FL("could not retrieve BSSID\n"));
2959 }
2960 #endif //SUPPORT BT-AMP
2961 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2962
2963 switch (psessionEntry->limSystemRole)
2964 {
2965 case eLIM_STA_ROLE:
2966 case eLIM_BT_AMP_STA_ROLE:
2967 switch (psessionEntry->limMlmState)
2968 {
2969 case eLIM_MLM_IDLE_STATE:
2970 // Attempting to Deauthenticate
2971 // with a pre-authenticated peer.
2972 // Deauthetiate with peer if there
2973 // exists a pre-auth context below.
2974 break;
2975
2976 case eLIM_MLM_AUTHENTICATED_STATE:
2977 case eLIM_MLM_WT_ASSOC_RSP_STATE:
2978 case eLIM_MLM_LINK_ESTABLISHED_STATE:
2979 if (!palEqualMemory( pMac->hHdd,pMlmDeauthReq->peerMacAddr,
2980 currentBssId,
2981 sizeof(tSirMacAddr)) )
2982 {
2983 PELOGW(limLog(pMac, LOGW,
2984 FL("received MLM_DEAUTH_REQ with invalid BSS id "));)
2985 PELOGE(limLog(pMac, LOGE, FL("Peer MAC Addr : "));)
2986 limPrintMacAddr(pMac, pMlmDeauthReq->peerMacAddr,LOGE);
2987
2988 PELOGE(limLog(pMac, LOGE, FL("\n CFG BSSID Addr : "));)
2989 limPrintMacAddr(pMac, currentBssId,LOGE);
2990
2991 /// Prepare and Send LIM_MLM_DEAUTH_CNF
2992
2993 mlmDeauthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2994
2995 goto end;
2996 }
2997
2998 if ((psessionEntry->limMlmState ==
2999 eLIM_MLM_AUTHENTICATED_STATE) ||
3000 (psessionEntry->limMlmState ==
3001 eLIM_MLM_WT_ASSOC_RSP_STATE))
3002 {
3003 // Send Deauthentication frame
3004 // to peer entity
3005 limSendDeauthMgmtFrame(
3006 pMac,
3007 pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003008 pMlmDeauthReq->peerMacAddr,
3009 psessionEntry, FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003010
3011 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3012 mlmDeauthCnf.resultCode = eSIR_SME_SUCCESS;
3013 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003014 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003015 goto end;
3016 }
3017 else
3018 {
3019 // LINK_ESTABLISED_STATE
3020 // Cleanup RX & TX paths
3021 // below
3022 }
3023
3024 break;
3025
3026 default:
3027
3028 PELOGW(limLog(pMac, LOGW,
3029 FL("received MLM_DEAUTH_REQ with in state %d for peer "),
3030 psessionEntry->limMlmState);)
3031 limPrintMacAddr(pMac, pMlmDeauthReq->peerMacAddr, LOGW);
3032 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
3033
3034 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3035 mlmDeauthCnf.resultCode =
3036 eSIR_SME_STA_NOT_AUTHENTICATED;
3037
3038 goto end;
3039 }
3040
3041 break;
3042
3043 case eLIM_STA_IN_IBSS_ROLE:
Jeff Johnsone7245742012-09-05 17:12:55 -07003044 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003045
3046 return;
3047
3048 default: // eLIM_AP_ROLE
3049 break;
3050
3051 } // end switch (psessionEntry->limSystemRole)
3052
3053 /**
3054 * Check if there exists a context for the peer entity
3055 * to be deauthenticated with.
3056 */
3057 pStaDs = dphLookupHashEntry(pMac, pMlmDeauthReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable);
3058
3059 if (pStaDs == NULL)
3060 {
3061 /// Check if there exists pre-auth context for this STA
3062 pAuthNode = limSearchPreAuthList(pMac,
3063 pMlmDeauthReq->peerMacAddr);
3064
3065 if (pAuthNode == NULL)
3066 {
3067 /**
3068 * Received DEAUTH REQ for a STA that is neither
3069 * Associated nor Pre-authenticated. Log error,
3070 * Prepare and Send LIM_MLM_DEAUTH_CNF
3071 */
3072 PELOGW(limLog(pMac, LOGW,
3073 FL("received MLM_DEAUTH_REQ for STA that does not have context, Addr="));)
3074 limPrintMacAddr(pMac, pMlmDeauthReq->peerMacAddr, LOGW);
3075
3076 mlmDeauthCnf.resultCode =
3077 eSIR_SME_STA_NOT_AUTHENTICATED;
3078 }
3079 else
3080 {
3081 mlmDeauthCnf.resultCode = eSIR_SME_SUCCESS;
3082
3083 /// Delete STA from pre-auth STA list
3084 limDeletePreAuthNode(pMac, pMlmDeauthReq->peerMacAddr);
3085
3086 /// Send Deauthentication frame to peer entity
3087 limSendDeauthMgmtFrame(pMac,
3088 pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003089 pMlmDeauthReq->peerMacAddr,
3090 psessionEntry, FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003091 }
3092
3093 goto end;
3094 }
3095 else if ((pStaDs->mlmStaContext.mlmState !=
3096 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
3097 (pStaDs->mlmStaContext.mlmState !=
3098 eLIM_MLM_WT_ASSOC_CNF_STATE))
3099 {
3100 /**
3101 * Received LIM_MLM_DEAUTH_REQ for STA that is n
3102 * some transit state. Log error.
3103 */
3104 PELOGW(limLog(pMac, LOGW,
3105 FL("received MLM_DEAUTH_REQ for STA that either has no context or in some transit state, Addr="));)
3106 limPrintMacAddr(pMac, pMlmDeauthReq->peerMacAddr, LOGW);
3107
3108 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3109
3110 mlmDeauthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3111
3112 goto end;
3113 }
3114
3115 //pStaDs->mlmStaContext.rxPurgeReq = 1;
3116 pStaDs->mlmStaContext.disassocReason = (tSirMacReasonCodes)
3117 pMlmDeauthReq->reasonCode;
3118 pStaDs->mlmStaContext.cleanupTrigger = pMlmDeauthReq->deauthTrigger;
3119
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003120 pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = pMlmDeauthReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07003121 /// Send Deauthentication frame to peer entity
3122 limSendDeauthMgmtFrame(pMac, pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003123 pMlmDeauthReq->peerMacAddr,
3124 psessionEntry, TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003125
3126 return;
3127
3128end:
3129 palCopyMemory( pMac->hHdd, (tANI_U8 *) &mlmDeauthCnf.peerMacAddr,
3130 (tANI_U8 *) pMlmDeauthReq->peerMacAddr,
3131 sizeof(tSirMacAddr));
3132 mlmDeauthCnf.deauthTrigger = pMlmDeauthReq->deauthTrigger;
3133 mlmDeauthCnf.aid = pMlmDeauthReq->aid;
3134 mlmDeauthCnf.sessionId = pMlmDeauthReq->sessionId;
3135
3136 // Free up buffer allocated
3137 // for mlmDeauthReq
3138 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMlmDeauthReq);
3139
3140 limPostSmeMessage(pMac,
3141 LIM_MLM_DEAUTH_CNF,
3142 (tANI_U32 *) &mlmDeauthCnf);
3143
3144}
3145
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003146
3147void limProcessDeauthAckTimeout(tpAniSirGlobal pMac)
3148{
3149 limSendDeauthCnf(pMac);
3150}
3151
Jeff Johnson295189b2012-06-20 16:38:30 -07003152/**
3153 * limProcessMlmDeauthReq()
3154 *
3155 *FUNCTION:
3156 * This function is called to process MLM_DEAUTH_REQ message
3157 * from SME
3158 *
3159 *LOGIC:
3160 *
3161 *ASSUMPTIONS:
3162 *
3163 *NOTE:
3164 *
3165 * @param pMac Pointer to Global MAC structure
3166 * @param *pMsgBuf A pointer to the MLM message buffer
3167 * @return None
3168 */
3169
3170static void
3171limProcessMlmDeauthReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3172{
3173// tANI_U16 aid;
3174// tSirMacAddr currentBssId;
3175// tpDphHashNode pStaDs;
3176// struct tLimPreAuthNode *pAuthNode;
3177 tLimMlmDeauthReq *pMlmDeauthReq;
3178// tLimMlmDeauthCnf mlmDeauthCnf;
3179 tpPESession psessionEntry;
3180
3181 if(pMsgBuf == NULL)
3182 {
3183 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
3184 return;
3185 }
3186
3187 pMlmDeauthReq = (tLimMlmDeauthReq *) pMsgBuf;
3188
3189 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDeauthReq->sessionId))== NULL)
3190 {
3191
3192 PELOGE(limLog(pMac, LOGE, FL("session does not exist for given sessionId\n"));)
3193 return;
3194 }
3195
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003196 limProcessMlmDeauthReqNtf( pMac, eHAL_STATUS_SUCCESS, (tANI_U32*) pMsgBuf );
3197
Jeff Johnson295189b2012-06-20 16:38:30 -07003198} /*** limProcessMlmDeauthReq() ***/
3199
3200
3201
3202/**
3203 * @function : limProcessMlmSetKeysReq()
3204 *
3205 * @brief : This function is called to process MLM_SETKEYS_REQ message
3206 * from SME
3207 *
3208 *LOGIC:
3209 *
3210 *ASSUMPTIONS:
3211 *
3212 *NOTE:
3213 *
3214 * @param pMac Pointer to Global MAC structure
3215 * @param *pMsgBuf A pointer to the MLM message buffer
3216 * @return None
3217 */
3218
3219static void
3220limProcessMlmSetKeysReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3221{
3222tANI_U16 aid;
3223tANI_U16 staIdx = 0;
3224tANI_U32 defaultKeyId = 0;
3225tSirMacAddr currentBssId;
3226tpDphHashNode pStaDs;
3227tLimMlmSetKeysReq *pMlmSetKeysReq;
3228tLimMlmSetKeysCnf mlmSetKeysCnf;
3229tpPESession psessionEntry;
3230
3231 if(pMsgBuf == NULL)
3232 {
3233 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
3234 return;
3235 }
3236
3237
3238 pMlmSetKeysReq = (tLimMlmSetKeysReq *) pMsgBuf;
3239 // Hold onto the SetKeys request parameters
3240 pMac->lim.gpLimMlmSetKeysReq = (void *) pMlmSetKeysReq;
3241
3242 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmSetKeysReq->sessionId))== NULL)
3243 {
3244 PELOGE(limLog(pMac, LOGE,FL("session does not exist for given sessionId\n"));)
3245 return;
3246 }
3247
3248 limLog( pMac, LOGW,
3249 FL( "Received MLM_SETKEYS_REQ with parameters:\n"
3250 "AID [%d], ED Type [%d], # Keys [%d] & Peer MAC Addr - "),
3251 pMlmSetKeysReq->aid,
3252 pMlmSetKeysReq->edType,
3253 pMlmSetKeysReq->numKeys );
3254 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3255
3256 #if 0
3257 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac, WNI_CFG_BSSID, currentBssId, &cfg )) {
3258 limLog( pMac, LOGP, FL("Could not retrieve BSSID\n"));
3259 return;
3260 }
3261 #endif //TO SUPPORT BT-AMP
3262 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3263
3264 switch( psessionEntry->limSystemRole ) {
3265 case eLIM_STA_ROLE:
3266 case eLIM_BT_AMP_STA_ROLE:
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003267 //In case of TDLS, peerMac address need not be BssId. Skip this check
3268 //if TDLS is enabled.
3269#ifndef FEATURE_WLAN_TDLS
Jeff Johnson295189b2012-06-20 16:38:30 -07003270 if((!limIsAddrBC( pMlmSetKeysReq->peerMacAddr ) ) &&
3271 (!palEqualMemory( pMac->hHdd,pMlmSetKeysReq->peerMacAddr,
3272 currentBssId, sizeof(tSirMacAddr))) ){
3273 limLog( pMac, LOGW, FL("Received MLM_SETKEYS_REQ with invalid BSSID\n"));
3274 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3275
3276 // Prepare and Send LIM_MLM_SETKEYS_CNF with error code
3277 mlmSetKeysCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3278 goto end;
3279 }
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003280#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003281 // Fall thru' & 'Plumb' keys below
3282 break;
3283 case eLIM_STA_IN_IBSS_ROLE:
3284 default: // others
3285 // Fall thru...
3286 break;
3287 }
3288
3289 /**
3290 * Use the "unicast" parameter to determine if the "Group Keys"
3291 * are being set.
3292 * pMlmSetKeysReq->key.unicast = 0 -> Multicast/broadcast
3293 * pMlmSetKeysReq->key.unicast - 1 -> Unicast keys are being set
3294 */
3295 if( limIsAddrBC( pMlmSetKeysReq->peerMacAddr )) {
3296 limLog( pMac, LOG1, FL("Trying to set Group Keys...%d \n"), pMlmSetKeysReq->sessionId);
3297 /** When trying to set Group Keys for any
3298 * security mode other than WEP, use the
3299 * STA Index corresponding to the AP...
3300 */
3301 switch( pMlmSetKeysReq->edType ) {
3302 case eSIR_ED_CCMP:
3303
3304#ifdef WLAN_FEATURE_11W
3305 case eSIR_ED_AES_128_CMAC:
3306#endif
3307 staIdx = psessionEntry->staId;
3308 break;
3309
3310 default:
3311 break;
3312 }
3313 }else {
3314 limLog( pMac, LOG1, FL("Trying to set Unicast Keys...\n"));
3315 /**
3316 * Check if there exists a context for the
3317 * peer entity for which keys need to be set.
3318 */
3319
3320
3321 pStaDs = dphLookupHashEntry( pMac, pMlmSetKeysReq->peerMacAddr, &aid , &psessionEntry->dph.dphHashTable);
3322
3323#ifdef WLAN_SOFTAP_FEATURE
3324 if ((pStaDs == NULL) ||
3325 ((pStaDs->mlmStaContext.mlmState != eLIM_MLM_LINK_ESTABLISHED_STATE) && (psessionEntry->limSystemRole != eLIM_AP_ROLE))) {
3326#else
3327 if ((pStaDs == NULL) ||
3328 ((pStaDs->mlmStaContext.mlmState != eLIM_MLM_LINK_ESTABLISHED_STATE) )) {
3329#endif
3330 /**
3331 * Received LIM_MLM_SETKEYS_REQ for STA
3332 * that does not have context or in some
3333 * transit state. Log error.
3334 */
3335 limLog( pMac, LOG1,
3336 FL("Received MLM_SETKEYS_REQ for STA that either has no context or in some transit state, Addr = "));
3337 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3338
3339 // Prepare and Send LIM_MLM_SETKEYS_CNF
3340 mlmSetKeysCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3341 goto end;
3342 } else
3343 staIdx = pStaDs->staIndex;
3344 }
3345
3346 if ((pMlmSetKeysReq->numKeys == 0) && (pMlmSetKeysReq->edType != eSIR_ED_NONE)) {
Jeff Johnsone7245742012-09-05 17:12:55 -07003347 //
3348 // Broadcast/Multicast Keys (for WEP!!) are NOT sent
3349 // via this interface!!
3350 //
3351 // This indicates to HAL that the WEP Keys need to be
3352 // extracted from the CFG and applied to hardware
3353 defaultKeyId = 0xff;
3354 }else if(pMlmSetKeysReq->key[0].keyId &&
3355 ((pMlmSetKeysReq->edType == eSIR_ED_WEP40) ||
3356 (pMlmSetKeysReq->edType == eSIR_ED_WEP104))){
3357 /* If the Key Id is non zero and encryption mode is WEP,
3358 * the key index is coming from the upper layers so that key only
3359 * need to be used as the default tx key, This is being used only
3360 * in case of WEP mode in HAL */
3361 defaultKeyId = pMlmSetKeysReq->key[0].keyId;
3362 }else
3363 defaultKeyId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003364
3365 limLog( pMac, LOG1,
3366 FL( "Trying to set keys for STA Index [%d], using defaultKeyId [%d]\n" ),
3367 staIdx,
3368 defaultKeyId );
3369
3370 if(limIsAddrBC( pMlmSetKeysReq->peerMacAddr )) {
3371 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
3372 psessionEntry->limMlmState = eLIM_MLM_WT_SET_BSS_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003373 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003374 limLog( pMac, LOG1, FL("Trying to set Group Keys...%d \n"),
3375 psessionEntry->peSessionId);
3376
3377 // Package WDA_SET_BSSKEY_REQ message parameters
3378 limSendSetBssKeyReq(pMac, pMlmSetKeysReq,psessionEntry);
3379 return;
3380 }else {
3381 // Package WDA_SET_STAKEY_REQ / WDA_SET_STA_BCASTKEY_REQ message parameters
3382 limSendSetStaKeyReq(pMac, pMlmSetKeysReq, staIdx, (tANI_U8) defaultKeyId,psessionEntry);
3383 return;
3384 }
3385
3386end:
3387 mlmSetKeysCnf.sessionId= pMlmSetKeysReq->sessionId;
3388 limPostSmeSetKeysCnf( pMac, pMlmSetKeysReq, &mlmSetKeysCnf );
3389
3390} /*** limProcessMlmSetKeysReq() ***/
3391
3392/**
3393 * limProcessMlmRemoveKeyReq()
3394 *
3395 *FUNCTION:
3396 * This function is called to process MLM_REMOVEKEY_REQ message
3397 * from SME
3398 *
3399 *LOGIC:
3400 *
3401 *ASSUMPTIONS:
3402 *
3403 *NOTE:
3404 *
3405 * @param pMac Pointer to Global MAC structure
3406 * @param *pMsgBuf A pointer to the MLM message buffer
3407 * @return None
3408 */
3409
3410static void
3411limProcessMlmRemoveKeyReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3412{
3413tANI_U16 aid;
3414tANI_U16 staIdx = 0;
3415tSirMacAddr currentBssId;
3416tpDphHashNode pStaDs;
3417tLimMlmRemoveKeyReq *pMlmRemoveKeyReq;
3418tLimMlmRemoveKeyCnf mlmRemoveKeyCnf;
3419 tpPESession psessionEntry;
3420
3421 if(pMsgBuf == NULL)
3422 {
3423 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
3424 return;
3425 }
3426
3427 pMlmRemoveKeyReq = (tLimMlmRemoveKeyReq *) pMsgBuf;
3428
3429
3430 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmRemoveKeyReq->sessionId))== NULL)
3431 {
3432 PELOGE(limLog(pMac, LOGE,
3433 FL("session does not exist for given sessionId\n"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07003434 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf );
Jeff Johnson295189b2012-06-20 16:38:30 -07003435 return;
3436 }
3437
3438
3439 if( pMac->lim.gpLimMlmRemoveKeyReq != NULL )
3440 {
3441 // Free any previous requests.
3442 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMac->lim.gpLimMlmRemoveKeyReq);
3443 pMac->lim.gpLimMlmRemoveKeyReq = NULL;
3444 }
3445 // Hold onto the RemoveKeys request parameters
3446 pMac->lim.gpLimMlmRemoveKeyReq = (void *) pMlmRemoveKeyReq;
3447
3448 #if 0
3449 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac,
3450 WNI_CFG_BSSID,
3451 currentBssId,
3452 &cfg ))
3453 limLog( pMac, LOGP, FL("Could not retrieve BSSID\n"));
3454 #endif //TO-SUPPORT BT-AMP
3455 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3456
3457 switch( psessionEntry->limSystemRole )
3458 {
3459 case eLIM_STA_ROLE:
3460 case eLIM_BT_AMP_STA_ROLE:
3461 if(( limIsAddrBC( pMlmRemoveKeyReq->peerMacAddr ) != true ) &&
3462 (!palEqualMemory( pMac->hHdd,pMlmRemoveKeyReq->peerMacAddr,
3463 currentBssId,
3464 sizeof(tSirMacAddr))))
3465 {
3466 limLog( pMac, LOGW,
3467 FL("Received MLM_REMOVEKEY_REQ with invalid BSSID\n"));
3468 limPrintMacAddr( pMac, pMlmRemoveKeyReq->peerMacAddr, LOGW );
3469
3470 // Prepare and Send LIM_MLM_REMOVEKEY_CNF with error code
3471 mlmRemoveKeyCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3472 goto end;
3473 }
3474 break;
3475
3476 case eLIM_STA_IN_IBSS_ROLE:
3477 default: // eLIM_AP_ROLE
3478 // Fall thru...
3479 break;
3480 }
3481
3482
3483 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
3484 if(limIsAddrBC( pMlmRemoveKeyReq->peerMacAddr )) //Second condition for IBSS or AP role.
3485 {
3486 psessionEntry->limMlmState = eLIM_MLM_WT_REMOVE_BSS_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003487 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003488 // Package WDA_REMOVE_BSSKEY_REQ message parameters
3489 limSendRemoveBssKeyReq( pMac,pMlmRemoveKeyReq,psessionEntry);
3490 return;
3491 }
3492
3493 /**
3494 * Check if there exists a context for the
3495 * peer entity for which keys need to be removed.
3496 */
3497 pStaDs = dphLookupHashEntry( pMac, pMlmRemoveKeyReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable );
3498 if ((pStaDs == NULL) ||
3499 (pStaDs &&
3500 (pStaDs->mlmStaContext.mlmState !=
3501 eLIM_MLM_LINK_ESTABLISHED_STATE)))
3502 {
3503 /**
3504 * Received LIM_MLM_REMOVEKEY_REQ for STA
3505 * that does not have context or in some
3506 * transit state. Log error.
3507 */
3508 limLog( pMac, LOGW,
3509 FL("Received MLM_REMOVEKEYS_REQ for STA that either has no context or in some transit state, Addr = "));
3510 limPrintMacAddr( pMac, pMlmRemoveKeyReq->peerMacAddr, LOGW );
3511
3512 // Prepare and Send LIM_MLM_REMOVEKEY_CNF
3513 mlmRemoveKeyCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3514 mlmRemoveKeyCnf.sessionId = pMlmRemoveKeyReq->sessionId;
3515
3516
3517 goto end;
3518 }
3519 else
3520 staIdx = pStaDs->staIndex;
3521
3522
3523
3524 psessionEntry->limMlmState = eLIM_MLM_WT_REMOVE_STA_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003525 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003526
3527 // Package WDA_REMOVE_STAKEY_REQ message parameters
3528 limSendRemoveStaKeyReq( pMac,pMlmRemoveKeyReq,staIdx,psessionEntry);
3529 return;
3530
3531end:
3532 limPostSmeRemoveKeyCnf( pMac,
Jeff Johnsone7245742012-09-05 17:12:55 -07003533 psessionEntry,
Jeff Johnson295189b2012-06-20 16:38:30 -07003534 pMlmRemoveKeyReq,
3535 &mlmRemoveKeyCnf );
3536
3537} /*** limProcessMlmRemoveKeyReq() ***/
3538
3539
3540/**
3541 * limProcessMinChannelTimeout()
3542 *
3543 *FUNCTION:
3544 * This function is called to process Min Channel Timeout
3545 * during channel scan.
3546 *
3547 *LOGIC:
3548 *
3549 *ASSUMPTIONS:
3550 *
3551 *NOTE:
3552 *
3553 * @param pMac Pointer to Global MAC structure
3554 * @return None
3555 */
3556
3557static void
3558limProcessMinChannelTimeout(tpAniSirGlobal pMac)
3559{
3560 tANI_U8 channelNum;
3561
3562#ifdef GEN6_TODO
3563 //if the min Channel is maintained per session, then use the below seesionEntry
3564 //priority - LOW/might not be needed
3565
3566 //TBD-RAJESH HOW TO GET sessionEntry?????
3567 tpPESession psessionEntry;
3568
3569 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimMinChannelTimer.sessionId))== NULL)
3570 {
3571 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
3572 return;
3573 }
3574#endif
3575
3576
3577 if (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE)
3578 {
3579 PELOG1(limLog(pMac, LOG1, FL("Scanning : min channel timeout occurred\n"));)
3580
3581 /// Min channel timer timed out
3582 pMac->lim.limTimers.gLimPeriodicProbeReqTimer.sessionId = 0xff;
3583 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
3584 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
3585 if (pMac->lim.gLimCurrentScanChannelId <=
3586 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
3587 {
3588 channelNum = (tANI_U8)limGetCurrentScanChannel(pMac);
3589 }
3590 else
3591 {
3592 // This shouldn't be the case, but when this happens, this timeout should be for the last channelId.
3593 // Get the channelNum as close to correct as possible.
3594 if(pMac->lim.gpLimMlmScanReq->channelList.channelNumber)
3595 {
3596 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1];
3597 }
3598 else
3599 {
3600 channelNum = 1;
3601 }
3602 }
3603
3604 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
3605 }
3606 else
3607 {
3608 /**
3609 * MIN channel timer should not have timed out
3610 * in states other than wait_probe_response.
3611 * Log error.
3612 */
3613 limLog(pMac, LOGW,
3614 FL("received unexpected MIN channel timeout in state %X\n"),
3615 pMac->lim.gLimMlmState);
3616 limPrintMlmState(pMac, LOGE, pMac->lim.gLimMlmState);
3617 }
3618} /*** limProcessMinChannelTimeout() ***/
3619
3620
3621
3622/**
3623 * limProcessMaxChannelTimeout()
3624 *
3625 *FUNCTION:
3626 * This function is called to process Max Channel Timeout
3627 * during channel scan.
3628 *
3629 *LOGIC:
3630 *
3631 *ASSUMPTIONS:
3632 *
3633 *NOTE:
3634 *
3635 * @param pMac Pointer to Global MAC structure
3636 * @return None
3637 */
3638
3639static void
3640limProcessMaxChannelTimeout(tpAniSirGlobal pMac)
3641{
3642 tANI_U8 channelNum;
3643
3644
3645 if (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE ||
3646 pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE)
3647 {
3648 PELOG1(limLog(pMac, LOG1, FL("Scanning : Max channel timed out\n"));)
3649 /**
3650 * MAX channel timer timed out
3651 * Continue channel scan.
3652 */
3653 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
3654 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
3655 pMac->lim.limTimers.gLimPeriodicProbeReqTimer.sessionId = 0xff;
3656 if (pMac->lim.gLimCurrentScanChannelId <=
3657 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
3658 {
3659 channelNum = limGetCurrentScanChannel(pMac);
3660 }
3661 else
3662 {
3663 if(pMac->lim.gpLimMlmScanReq->channelList.channelNumber)
3664 {
3665 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1];
3666 }
3667 else
3668 {
3669 channelNum = 1;
3670 }
3671 }
3672 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
3673 }
3674 else
3675 {
3676 /**
3677 * MAX channel timer should not have timed out
3678 * in states other than wait_scan.
3679 * Log error.
3680 */
3681 limLog(pMac, LOGW,
3682 FL("received unexpected MAX channel timeout in state %X\n"),
3683 pMac->lim.gLimMlmState);
3684 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
3685 }
3686} /*** limProcessMaxChannelTimeout() ***/
3687
3688/**
3689 * limProcessPeriodicProbeReqTimer()
3690 *
3691 *FUNCTION:
3692 * This function is called to process periodic probe request
3693 * to send during scan.
3694 *
3695 *LOGIC:
3696 *
3697 *ASSUMPTIONS:
3698 *
3699 *NOTE:
3700 *
3701 * @param pMac Pointer to Global MAC structure
3702 * @return None
3703 */
3704
3705static void
3706limProcessPeriodicProbeReqTimer(tpAniSirGlobal pMac)
3707{
3708 tANI_U8 channelNum;
3709 tANI_U8 i = 0;
3710 tSirRetStatus status = eSIR_SUCCESS;
3711 TX_TIMER *pPeriodicProbeReqTimer;
3712 pPeriodicProbeReqTimer = &pMac->lim.limTimers.gLimPeriodicProbeReqTimer;
3713
3714 if(vos_timer_getCurrentState(&pPeriodicProbeReqTimer->vosTimer)
3715 != VOS_TIMER_STATE_STOPPED)
3716 {
3717 PELOG1(limLog(pMac, LOG1, FL("Invalid state of timer\n"));)
3718 return;
3719 }
3720
3721 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) &&
3722 (pPeriodicProbeReqTimer->sessionId != 0xff))
3723 {
3724 tLimMlmScanReq *pLimMlmScanReq = pMac->lim.gpLimMlmScanReq;
3725 PELOG1(limLog(pMac, LOG1, FL("Scanning : Periodic scanning\n"));)
3726 /**
3727 * Periodic channel timer timed out
3728 * to send probe request.
3729 */
3730 channelNum = limGetCurrentScanChannel(pMac);
3731 do
3732 {
3733 /* Prepare and send Probe Request frame for all the SSIDs
3734 * present in the saved MLM
3735 */
3736
3737 /*
3738 * PELOGE(limLog(pMac, LOGW, FL("sending ProbeReq number %d,"
3739 * " for SSID %s on channel: %d\n"),
3740 * i, pLimMlmScanReq->ssId[i].ssId,
3741 * channelNum);)
3742 */
3743 status = limSendProbeReqMgmtFrame( pMac, &pLimMlmScanReq->ssId[i],
3744 pLimMlmScanReq->bssId, channelNum, pMac->lim.gSelfMacAddr,
3745 pLimMlmScanReq->dot11mode, pLimMlmScanReq->uIEFieldLen,
3746 (tANI_U8 *)(pLimMlmScanReq) + pLimMlmScanReq->uIEFieldOffset);
3747
3748
3749 if ( status != eSIR_SUCCESS)
3750 {
3751 PELOGE(limLog(pMac, LOGE, FL("send ProbeReq failed for SSID "
3752 "%s on channel: %d\n"),
3753 pLimMlmScanReq->ssId[i].ssId,
3754 channelNum);)
3755 return;
3756 }
3757 i++;
3758 } while (i < pLimMlmScanReq->numSsid);
3759
3760 /* Activate timer again */
3761 if (tx_timer_activate(pPeriodicProbeReqTimer) != TX_SUCCESS)
3762 {
3763 limLog(pMac, LOGP, FL("could not start periodic probe"
3764 " req timer\n"));
3765 return;
3766 }
3767 }
3768 else
3769 {
3770 /**
3771 * Periodic scan is timeout is happening in
3772 * in states other than wait_scan.
3773 * Log error.
3774 */
Mohit Khanna23863762012-09-11 17:40:09 -07003775 limLog(pMac, LOG1,
Jeff Johnson295189b2012-06-20 16:38:30 -07003776 FL("received unexpected Periodic scan timeout in state %X\n"),
3777 pMac->lim.gLimMlmState);
3778 }
3779} /*** limProcessPeriodicProbeReqTimer() ***/
3780
3781/**
3782 * limProcessJoinFailureTimeout()
3783 *
3784 *FUNCTION:
3785 * This function is called to process JoinFailureTimeout
3786 *
3787 *LOGIC:
3788 *
3789 *ASSUMPTIONS:
3790 *
3791 *NOTE:
3792 *
3793 * @param pMac Pointer to Global MAC structure
3794 * @return None
3795 */
3796
3797static void
3798limProcessJoinFailureTimeout(tpAniSirGlobal pMac)
3799{
3800 tLimMlmJoinCnf mlmJoinCnf;
3801 tSirMacAddr bssid;
3802 tANI_U32 len;
3803
3804 //fetch the sessionEntry based on the sessionId
3805 tpPESession psessionEntry;
3806
3807 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimJoinFailureTimer.sessionId))== NULL)
3808 {
3809 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
3810 return;
3811 }
3812
3813 if (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE)
3814 {
3815 len = sizeof(tSirMacAddr);
3816
3817 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, bssid, &len) !=
3818 eSIR_SUCCESS)
3819 {
3820 /// Could not get BSSID from CFG. Log error.
3821 limLog(pMac, LOGP, FL("could not retrieve BSSID\n"));
3822 return;
3823 }
3824
3825 // 'Change' timer for future activations
3826 limDeactivateAndChangeTimer(pMac, eLIM_JOIN_FAIL_TIMER);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08003827 // Change Periodic probe req timer for future activation
3828 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_JOIN_PROBE_REQ_TIMER);
Jeff Johnson295189b2012-06-20 16:38:30 -07003829 /**
3830 * Issue MLM join confirm with timeout reason code
3831 */
3832 PELOGE(limLog(pMac, LOGE, FL(" Join Failure Timeout occurred.\n"));)
3833
3834 mlmJoinCnf.resultCode = eSIR_SME_JOIN_TIMEOUT_RESULT_CODE;
3835 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
3836
3837 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003838 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003839 if(limSetLinkState(pMac, eSIR_LINK_IDLE_STATE, psessionEntry->bssId,
3840 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
3841 PELOGE(limLog(pMac, LOGE, FL("Failed to set the LinkState\n"));)
3842 /* Update PE session Id */
3843 mlmJoinCnf.sessionId = psessionEntry->peSessionId;
3844
3845
3846 // Freeup buffer allocated to join request
3847 if (psessionEntry->pLimMlmJoinReq)
3848 {
3849 palFreeMemory( pMac->hHdd, psessionEntry->pLimMlmJoinReq);
3850 psessionEntry->pLimMlmJoinReq = NULL;
3851 }
3852
3853 limPostSmeMessage(pMac,
3854 LIM_MLM_JOIN_CNF,
3855 (tANI_U32 *) &mlmJoinCnf);
3856
3857 return;
3858 }
3859 else
3860 {
3861 /**
3862 * Join failure timer should not have timed out
3863 * in states other than wait_join_beacon state.
3864 * Log error.
3865 */
3866 limLog(pMac, LOGW,
3867 FL("received unexpected JOIN failure timeout in state %X\n"),psessionEntry->limMlmState);
3868 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
3869 }
3870} /*** limProcessJoinFailureTimeout() ***/
3871
3872
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08003873/**
3874 * limProcessPeriodicJoinProbeReqTimer()
3875 *
3876 *FUNCTION:
3877 * This function is called to process periodic probe request
3878 * send during joining process.
3879 *
3880 *LOGIC:
3881 *
3882 *ASSUMPTIONS:
3883 *
3884 *NOTE:
3885 *
3886 * @param pMac Pointer to Global MAC structure
3887 * @return None
3888 */
3889
3890static void limProcessPeriodicJoinProbeReqTimer(tpAniSirGlobal pMac)
3891{
3892 tpPESession psessionEntry;
3893 tSirMacSSid ssId;
3894
3895 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer.sessionId))== NULL)
3896 {
3897 limLog(pMac, LOGE,FL("session does not exist for given SessionId\n"));
3898 return;
3899 }
3900
3901 if((VOS_TRUE == tx_timer_running(&pMac->lim.limTimers.gLimJoinFailureTimer)) &&
3902 (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE))
3903 {
3904 palCopyMemory( pMac->hHdd, ssId.ssId,
3905 psessionEntry->ssId.ssId,
3906 psessionEntry->ssId.length);
3907 ssId.length = psessionEntry->ssId.length;
3908
3909 limSendProbeReqMgmtFrame( pMac, &ssId,
3910 psessionEntry->pLimMlmJoinReq->bssDescription.bssId, psessionEntry->currentOperChannel/*chanNum*/,
3911 psessionEntry->selfMacAddr, psessionEntry->dot11mode,
3912 psessionEntry->pLimJoinReq->addIEScan.length, psessionEntry->pLimJoinReq->addIEScan.addIEdata);
3913
3914 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_JOIN_PROBE_REQ_TIMER);
3915
3916 // Activate Join Periodic Probe Req timer
3917 if (tx_timer_activate(&pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer) != TX_SUCCESS)
3918 {
3919 limLog(pMac, LOGP, FL("could not activate Periodic Join req failure timer\n"));
3920 return;
3921 }
3922 }
3923 return;
3924} /*** limProcessPeriodicJoinProbeReqTimer() ***/
3925
Jeff Johnson295189b2012-06-20 16:38:30 -07003926
3927/**
3928 * limProcessAuthFailureTimeout()
3929 *
3930 *FUNCTION:
3931 * This function is called to process Min Channel Timeout
3932 * during channel scan.
3933 *
3934 *LOGIC:
3935 *
3936 *ASSUMPTIONS:
3937 *
3938 *NOTE:
3939 *
3940 * @param pMac Pointer to Global MAC structure
3941 * @return None
3942 */
3943
3944static void
3945limProcessAuthFailureTimeout(tpAniSirGlobal pMac)
3946{
3947 //fetch the sessionEntry based on the sessionId
3948 tpPESession psessionEntry;
3949
3950 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimAuthFailureTimer.sessionId))== NULL)
3951 {
3952 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
3953 return;
3954 }
3955
3956 switch (psessionEntry->limMlmState)
3957 {
3958 case eLIM_MLM_WT_AUTH_FRAME2_STATE:
3959 case eLIM_MLM_WT_AUTH_FRAME4_STATE:
3960 /**
3961 * Requesting STA did not receive next auth frame
3962 * before Auth Failure timeout.
3963 * Issue MLM auth confirm with timeout reason code
3964 */
Madan Mohan Koyyalamudi666d33a2012-11-29 11:32:59 -08003965#ifdef WLAN_FEATURE_P2P
3966 //Restore default failure timeout
3967 if (VOS_P2P_CLIENT_MODE == psessionEntry->pePersona && psessionEntry->defaultAuthFailureTimeout)
3968 {
3969 ccmCfgSetInt(pMac,WNI_CFG_AUTHENTICATE_FAILURE_TIMEOUT ,
3970 psessionEntry->defaultAuthFailureTimeout, NULL, eANI_BOOLEAN_FALSE);
3971 }
3972#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003973 limRestoreFromAuthState(pMac,eSIR_SME_AUTH_TIMEOUT_RESULT_CODE,eSIR_MAC_UNSPEC_FAILURE_REASON,psessionEntry);
3974 break;
3975
3976 default:
3977 /**
3978 * Auth failure timer should not have timed out
3979 * in states other than wt_auth_frame2/4
3980 * Log error.
3981 */
3982 PELOGE(limLog(pMac, LOGE, FL("received unexpected AUTH failure timeout in state %X\n"), psessionEntry->limMlmState);)
3983 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
3984
3985 break;
3986 }
3987} /*** limProcessAuthFailureTimeout() ***/
3988
3989
3990
3991/**
3992 * limProcessAuthRspTimeout()
3993 *
3994 *FUNCTION:
3995 * This function is called to process Min Channel Timeout
3996 * during channel scan.
3997 *
3998 *LOGIC:
3999 *
4000 *ASSUMPTIONS:
4001 *
4002 *NOTE:
4003 *
4004 * @param pMac Pointer to Global MAC structure
4005 * @return None
4006 */
4007
4008static void
4009limProcessAuthRspTimeout(tpAniSirGlobal pMac, tANI_U32 authIndex)
4010{
4011 struct tLimPreAuthNode *pAuthNode;
4012 tpPESession psessionEntry;
4013 tANI_U8 sessionId;
4014
4015 pAuthNode = limGetPreAuthNodeFromIndex(pMac, &pMac->lim.gLimPreAuthTimerTable, authIndex);
4016
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304017 if (NULL == pAuthNode)
4018 {
4019 limLog(pMac, LOGW, FL("Invalid auth node\n"));
4020 return;
4021 }
4022
4023 if ((psessionEntry = peFindSessionByBssid(pMac, pAuthNode->peerMacAddr, &sessionId)) == NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -07004024 {
4025 limLog(pMac, LOGW, FL("session does not exist for given BSSID \n"));
4026 return;
4027 }
4028
4029 if (psessionEntry->limSystemRole == eLIM_AP_ROLE ||
4030 psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE)
4031 {
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304032 if (pAuthNode->mlmState != eLIM_MLM_WT_AUTH_FRAME3_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004033 {
4034 /**
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304035 * Authentication response timer timedout
4036 * in unexpected state. Log error
Jeff Johnson295189b2012-06-20 16:38:30 -07004037 */
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304038 PELOGE(limLog(pMac, LOGE,
4039 FL("received unexpected AUTH rsp timeout for MAC address "));
4040 limPrintMacAddr(pMac, pAuthNode->peerMacAddr, LOGE);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004041 }
4042 else
4043 {
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304044 // Authentication response timer
4045 // timedout for an STA.
4046 pAuthNode->mlmState = eLIM_MLM_AUTH_RSP_TIMEOUT_STATE;
4047 pAuthNode->fTimerStarted = 0;
4048 PELOG1( limLog(pMac, LOG1,
4049 FL("AUTH rsp timedout for MAC address "));
4050 limPrintMacAddr(pMac, pAuthNode->peerMacAddr, LOG1);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004051
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304052 // Change timer to reactivate it in future
4053 limDeactivateAndChangePerStaIdTimer(pMac,
4054 eLIM_AUTH_RSP_TIMER,
4055 pAuthNode->authNodeIdx);
Jeff Johnson295189b2012-06-20 16:38:30 -07004056
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304057 limDeletePreAuthNode(pMac, pAuthNode->peerMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -07004058 }
4059 }
4060} /*** limProcessAuthRspTimeout() ***/
4061
4062
4063/**
4064 * limProcessAssocFailureTimeout()
4065 *
4066 *FUNCTION:
4067 * This function is called to process Min Channel Timeout
4068 * during channel scan.
4069 *
4070 *LOGIC:
4071 *
4072 *ASSUMPTIONS:
4073 *
4074 *NOTE:
4075 *
4076 * @param pMac Pointer to Global MAC structure
4077 * @return None
4078 */
4079
4080static void
4081limProcessAssocFailureTimeout(tpAniSirGlobal pMac, tANI_U32 MsgType)
4082{
4083
4084 tLimMlmAssocCnf mlmAssocCnf;
4085 tpPESession psessionEntry;
4086
4087 //to fetch the lim/mlm state based on the sessionId, use the below sessionEntry
4088 tANI_U8 sessionId;
4089
4090 if(MsgType == LIM_ASSOC)
4091 {
4092 sessionId = pMac->lim.limTimers.gLimAssocFailureTimer.sessionId;
4093 }
4094 else
4095 {
4096 sessionId = pMac->lim.limTimers.gLimReassocFailureTimer.sessionId;
4097 }
4098
4099 if((psessionEntry = peFindSessionBySessionId(pMac, sessionId))== NULL)
4100 {
4101 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID\n"));
4102 return;
4103 }
4104
4105 /**
4106 * Expected Re/Association Response frame
4107 * not received within Re/Association Failure Timeout.
4108 */
4109
4110
4111
4112
4113 /* CR: vos packet memory is leaked when assoc rsp timeouted/failed. */
4114 /* notify TL that association is failed so that TL can flush the cached frame */
4115 WLANTL_AssocFailed (psessionEntry->staId);
4116
4117 // Log error
4118 PELOG1(limLog(pMac, LOG1,
4119 FL("Re/Association Response not received before timeout \n"));)
4120
4121 if (( (psessionEntry->limSystemRole == eLIM_AP_ROLE) || (psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE) )||
4122 ( (psessionEntry->limMlmState != eLIM_MLM_WT_ASSOC_RSP_STATE) &&
4123 (psessionEntry->limMlmState != eLIM_MLM_WT_REASSOC_RSP_STATE) &&
4124 (psessionEntry->limMlmState != eLIM_MLM_WT_FT_REASSOC_RSP_STATE)))
4125 {
4126 /**
4127 * Re/Assoc failure timer should not have timedout on AP
4128 * or in a state other than wt_re/assoc_response.
4129 */
4130
4131 // Log error
4132 limLog(pMac, LOGW,
4133 FL("received unexpected REASSOC failure timeout in state %X for role %d\n"),
4134 psessionEntry->limMlmState, psessionEntry->limSystemRole);
4135 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
4136 }
4137 else
4138 {
4139
4140 if ((MsgType == LIM_ASSOC) ||
4141 ((MsgType == LIM_REASSOC) && (psessionEntry->limMlmState == eLIM_MLM_WT_FT_REASSOC_RSP_STATE)))
4142 {
4143 PELOGE(limLog(pMac, LOGE, FL("(Re)Assoc Failure Timeout occurred.\n"));)
4144
4145 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07004146 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
4147
Jeff Johnson295189b2012-06-20 16:38:30 -07004148 // 'Change' timer for future activations
4149 limDeactivateAndChangeTimer(pMac, eLIM_ASSOC_FAIL_TIMER);
4150
4151 // Free up buffer allocated for JoinReq held by
4152 // MLM state machine
4153 if (psessionEntry->pLimMlmJoinReq)
4154 {
4155 palFreeMemory( pMac->hHdd, psessionEntry->pLimMlmJoinReq);
4156 psessionEntry->pLimMlmJoinReq = NULL;
4157 }
4158
4159#if defined(ANI_PRODUCT_TYPE_CLIENT)
4160 //To remove the preauth node in case of fail to associate
4161 if (limSearchPreAuthList(pMac, psessionEntry->bssId))
4162 {
4163 PELOG1(limLog(pMac, LOG1, FL(" delete pre auth node for %02X-%02X-%02X-%02X-%02X-%02X\n"),
4164 psessionEntry->bssId[0], psessionEntry->bssId[1], psessionEntry->bssId[2],
4165 psessionEntry->bssId[3], psessionEntry->bssId[4], psessionEntry->bssId[5]);)
4166 limDeletePreAuthNode(pMac, psessionEntry->bssId);
4167 }
4168#endif
4169
4170 mlmAssocCnf.resultCode =
4171 eSIR_SME_ASSOC_TIMEOUT_RESULT_CODE;
4172 mlmAssocCnf.protStatusCode =
4173 eSIR_MAC_UNSPEC_FAILURE_STATUS;
4174
4175 /* Update PE session Id*/
4176 mlmAssocCnf.sessionId = psessionEntry->peSessionId;
4177 if (MsgType == LIM_ASSOC)
4178 limPostSmeMessage(pMac, LIM_MLM_ASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
4179 else
4180 {
4181 /* Will come here only in case of 11r, CCx FT when reassoc rsp
4182 is not received and we receive a reassoc - timesout */
4183 mlmAssocCnf.resultCode = eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE;
4184 limPostSmeMessage(pMac, LIM_MLM_REASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
4185 }
4186 }
4187 else
4188 {
4189 /**
4190 * Restore pre-reassoc req state.
4191 * Set BSSID to currently associated AP address.
4192 */
4193 psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004194 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004195
4196 limRestorePreReassocState(pMac,
4197 eSIR_SME_REASSOC_TIMEOUT_RESULT_CODE, eSIR_MAC_UNSPEC_FAILURE_STATUS,psessionEntry);
4198 }
4199 }
4200} /*** limProcessAssocFailureTimeout() ***/
4201
4202
4203
4204/**
4205 * limCompleteMlmScan()
4206 *
4207 *FUNCTION:
4208 * This function is called to send MLM_SCAN_CNF message
4209 * to SME state machine.
4210 *
4211 *LOGIC:
4212 *
4213 *ASSUMPTIONS:
4214 *
4215 *NOTE:
4216 *
4217 * @param pMac Pointer to Global MAC structure
4218 * @param retCode Result code to be sent
4219 * @return None
4220 */
4221
4222void
4223limCompleteMlmScan(tpAniSirGlobal pMac, tSirResultCodes retCode)
4224{
4225 tLimMlmScanCnf mlmScanCnf;
4226
4227 /// Restore previous MLM state
4228 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004229 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004230 limRestorePreScanState(pMac);
4231
4232 // Free up pMac->lim.gLimMlmScanReq
4233 if( NULL != pMac->lim.gpLimMlmScanReq )
4234 {
4235 palFreeMemory( pMac->hHdd, pMac->lim.gpLimMlmScanReq);
4236 pMac->lim.gpLimMlmScanReq = NULL;
4237 }
4238
4239 mlmScanCnf.resultCode = retCode;
4240 mlmScanCnf.scanResultLength = pMac->lim.gLimMlmScanResultLength;
4241
4242 limPostSmeMessage(pMac, LIM_MLM_SCAN_CNF, (tANI_U32 *) &mlmScanCnf);
4243
4244} /*** limCompleteMlmScan() ***/
4245
4246/**
4247 * \brief Setup an A-MPDU/BA session
4248 *
4249 * \sa limProcessMlmAddBAReq
4250 *
4251 * \param pMac The global tpAniSirGlobal object
4252 *
4253 * \param pMsgBuf The MLME ADDBA Req message buffer
4254 *
4255 * \return none
4256 */
4257void limProcessMlmAddBAReq( tpAniSirGlobal pMac,
4258 tANI_U32 *pMsgBuf )
4259{
4260tSirRetStatus status = eSIR_SUCCESS;
4261tpLimMlmAddBAReq pMlmAddBAReq;
4262tpLimMlmAddBACnf pMlmAddBACnf;
4263 tpPESession psessionEntry;
4264
4265 if(pMsgBuf == NULL)
4266 {
4267 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
4268 return;
4269 }
4270
4271 pMlmAddBAReq = (tpLimMlmAddBAReq) pMsgBuf;
4272 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmAddBAReq->sessionId))== NULL)
4273 {
4274 PELOGE(limLog(pMac, LOGE,
4275 FL("session does not exist for given sessionId\n"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07004276 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf );
Jeff Johnson295189b2012-06-20 16:38:30 -07004277 return;
4278 }
4279
4280
4281 // Send ADDBA Req over the air
4282 status = limSendAddBAReq( pMac, pMlmAddBAReq,psessionEntry);
4283
4284 //
4285 // Respond immediately to LIM, only if MLME has not been
4286 // successfully able to send WDA_ADDBA_REQ to HAL.
4287 // Else, LIM_MLM_ADDBA_CNF will be sent after receiving
4288 // ADDBA Rsp from peer entity
4289 //
4290 if( eSIR_SUCCESS != status )
4291 {
4292 // Allocate for LIM_MLM_ADDBA_CNF
4293 if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
4294 (void **) &pMlmAddBACnf,
4295 sizeof( tLimMlmAddBACnf )))
4296 {
4297 limLog( pMac, LOGP,
4298 FL("palAllocateMemory failed with error code %d\n"));
4299 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf );
4300 return;
4301 }
4302 else
4303 {
4304 palZeroMemory( pMac->hHdd, (void *) pMlmAddBACnf, sizeof( tLimMlmAddBACnf ));
4305 palCopyMemory( pMac->hHdd,
4306 (void *) pMlmAddBACnf->peerMacAddr,
4307 (void *) pMlmAddBAReq->peerMacAddr,
4308 sizeof( tSirMacAddr ));
4309
4310 pMlmAddBACnf->baDialogToken = pMlmAddBAReq->baDialogToken;
4311 pMlmAddBACnf->baTID = pMlmAddBAReq->baTID;
4312 pMlmAddBACnf->baPolicy = pMlmAddBAReq->baPolicy;
4313 pMlmAddBACnf->baBufferSize = pMlmAddBAReq->baBufferSize;
4314 pMlmAddBACnf->baTimeout = pMlmAddBAReq->baTimeout;
4315 pMlmAddBACnf->sessionId = pMlmAddBAReq->sessionId;
4316
4317 // Update the result code
4318 pMlmAddBACnf->addBAResultCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
4319
4320 limPostSmeMessage( pMac,
4321 LIM_MLM_ADDBA_CNF,
4322 (tANI_U32 *) pMlmAddBACnf );
4323 }
4324
4325 // Restore MLME state
4326 psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004327 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004328
4329 }
4330
4331 // Free the buffer allocated for tLimMlmAddBAReq
4332 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf );
4333
4334}
4335
4336/**
4337 * \brief Send an ADDBA Rsp to peer STA in response
4338 * to an ADDBA Req received earlier
4339 *
4340 * \sa limProcessMlmAddBARsp
4341 *
4342 * \param pMac The global tpAniSirGlobal object
4343 *
4344 * \param pMsgBuf The MLME ADDBA Rsp message buffer
4345 *
4346 * \return none
4347 */
4348void limProcessMlmAddBARsp( tpAniSirGlobal pMac,
4349 tANI_U32 *pMsgBuf )
4350{
4351tpLimMlmAddBARsp pMlmAddBARsp;
4352 tANI_U16 aid;
4353 tpDphHashNode pSta;
4354 tpPESession psessionEntry;
4355
4356
4357 if(pMsgBuf == NULL)
4358 {
4359 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
4360 return;
4361 }
4362
4363 pMlmAddBARsp = (tpLimMlmAddBARsp) pMsgBuf;
4364
4365 if(( psessionEntry = peFindSessionBySessionId(pMac,pMlmAddBARsp->sessionId))== NULL)
4366 {
4367 PELOGE(limLog(pMac, LOGE,
4368 FL("session does not exist for given session ID\n"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07004369 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf );
Jeff Johnson295189b2012-06-20 16:38:30 -07004370 return;
4371 }
4372
4373
4374 // Send ADDBA Rsp over the air
4375 if( eSIR_SUCCESS != limSendAddBARsp( pMac,pMlmAddBARsp,psessionEntry))
4376 {
4377 limLog( pMac, LOGE,
4378 FL("Failed to send ADDBA Rsp to peer \n"));
4379 limPrintMacAddr( pMac, pMlmAddBARsp->peerMacAddr, LOGE );
4380 /* Clean the BA context maintained by HAL and TL on failure */
4381 pSta = dphLookupHashEntry( pMac, pMlmAddBARsp->peerMacAddr, &aid,
4382 &psessionEntry->dph.dphHashTable);
4383 if( NULL != pSta )
4384 {
4385 limPostMsgDelBAInd( pMac, pSta, pMlmAddBARsp->baTID, eBA_RECIPIENT,
4386 psessionEntry);
4387 }
4388 }
4389
4390 // Time to post a WDA_DELBA_IND to HAL in order
4391 // to cleanup the HAL and SoftMAC entries
4392
4393
4394 // Free the buffer allocated for tLimMlmAddBARsp
4395 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf );
4396
4397}
4398
4399/**
4400 * \brief Setup an A-MPDU/BA session
4401 *
4402 * \sa limProcessMlmDelBAReq
4403 *
4404 * \param pMac The global tpAniSirGlobal object
4405 *
4406 * \param pMsgBuf The MLME DELBA Req message buffer
4407 *
4408 * \return none
4409 */
4410void limProcessMlmDelBAReq( tpAniSirGlobal pMac,
4411 tANI_U32 *pMsgBuf )
4412{
4413 tSirRetStatus status = eSIR_SUCCESS;
4414 tpLimMlmDelBAReq pMlmDelBAReq;
4415 tpLimMlmDelBACnf pMlmDelBACnf;
4416 tpPESession psessionEntry;
4417
4418
4419 if(pMsgBuf == NULL)
4420 {
4421 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL\n"));)
4422 return;
4423 }
4424
4425 // TODO - Need to validate MLME state
4426 pMlmDelBAReq = (tpLimMlmDelBAReq) pMsgBuf;
4427
4428 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDelBAReq->sessionId))== NULL)
4429 {
4430 PELOGE(limLog(pMac, LOGE,FL("session does not exist for given bssId\n"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07004431 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf );
Jeff Johnson295189b2012-06-20 16:38:30 -07004432 return;
4433 }
4434
4435 // Send DELBA Ind over the air
4436 if( eSIR_SUCCESS !=
4437 (status = limSendDelBAInd( pMac, pMlmDelBAReq,psessionEntry)))
4438 status = eSIR_SME_HAL_SEND_MESSAGE_FAIL;
4439 else
4440 {
4441 tANI_U16 aid;
4442 tpDphHashNode pSta;
4443
4444 // Time to post a WDA_DELBA_IND to HAL in order
4445 // to cleanup the HAL and SoftMAC entries
4446 pSta = dphLookupHashEntry( pMac, pMlmDelBAReq->peerMacAddr, &aid , &psessionEntry->dph.dphHashTable);
4447 if( NULL != pSta )
4448 {
4449 status = limPostMsgDelBAInd( pMac,
4450 pSta,
4451 pMlmDelBAReq->baTID,
4452 pMlmDelBAReq->baDirection,psessionEntry);
4453
4454 }
4455 }
4456
4457 //
4458 // Respond immediately to SME with DELBA CNF using
4459 // LIM_MLM_DELBA_CNF with appropriate status
4460 //
4461
4462 // Allocate for LIM_MLM_DELBA_CNF
4463 if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd,
4464 (void **) &pMlmDelBACnf,
4465 sizeof( tLimMlmDelBACnf )))
4466 {
4467 limLog( pMac, LOGP, FL("palAllocateMemory failed\n"));
4468 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf );
4469 return;
4470 }
4471 else
4472 {
4473 palZeroMemory( pMac->hHdd, (void *) pMlmDelBACnf, sizeof( tLimMlmDelBACnf ));
4474
4475 palCopyMemory( pMac->hHdd,
4476 (void *) pMlmDelBACnf,
4477 (void *) pMlmDelBAReq,
4478 sizeof( tLimMlmDelBAReq ));
4479
4480 // Update DELBA result code
4481 pMlmDelBACnf->delBAReasonCode = pMlmDelBAReq->delBAReasonCode;
4482
4483 /* Update PE session Id*/
4484 pMlmDelBACnf->sessionId = pMlmDelBAReq->sessionId;
4485
4486 limPostSmeMessage( pMac,
4487 LIM_MLM_DELBA_CNF,
4488 (tANI_U32 *) pMlmDelBACnf );
4489 }
4490
4491 // Free the buffer allocated for tLimMlmDelBAReq
4492 palFreeMemory( pMac->hHdd, (tANI_U8 *) pMsgBuf );
4493
4494}
4495
4496/**
4497 * @function : limSMPowerSaveStateInd( )
4498 *
4499 * @brief : This function is called upon receiving the PMC Indication to update the STA's MimoPs State.
4500 *
4501 * LOGIC:
4502 *
4503 * ASSUMPTIONS:
4504 * NA
4505 *
4506 * NOTE:
4507 * NA
4508 *
4509 * @param pMac - Pointer to Global MAC structure
4510 * @param limMsg - Lim Message structure object with the MimoPSparam in body
4511 * @return None
4512 */
4513
4514tSirRetStatus
4515limSMPowerSaveStateInd(tpAniSirGlobal pMac, tSirMacHTMIMOPowerSaveState state)
4516{
4517#if 0
4518 tSirRetStatus retStatus = eSIR_SUCCESS;
4519#if 0
4520 tANI_U32 cfgVal1;
4521 tANI_U16 cfgVal2;
4522 tSirMacHTCapabilityInfo *pHTCapabilityInfo;
4523 tpDphHashNode pSta = NULL;
4524
4525 tpPESession psessionEntry = &pMac->lim.gpSession[0]; //TBD-RAJESH HOW TO GET sessionEntry?????
4526 /** Verify the Mode of operation */
4527 if (pMac->lim.gLimSystemRole != eSYSTEM_STA_ROLE) {
4528 PELOGE(limLog(pMac, LOGE, FL("Got PMC indication when System not in the STA Role\n"));)
4529 return eSIR_FAILURE;
4530 }
4531
4532 if ((pMac->lim.gHTMIMOPSState == state) || (state == eSIR_HT_MIMO_PS_NA )) {
4533 PELOGE(limLog(pMac, LOGE, FL("Got Indication when already in the same mode or State passed is NA:%d \n"), state);)
4534 return eSIR_FAILURE;
4535 }
4536
4537 if (!pMac->lim.htCapability){
4538 PELOGW(limLog(pMac, LOGW, FL(" Not in 11n or HT capable mode\n"));)
4539 return eSIR_FAILURE;
4540 }
4541
4542 /** Update the CFG about the default MimoPS State */
4543 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &cfgVal1) != eSIR_SUCCESS) {
4544 limLog(pMac, LOGP, FL("could not retrieve HT Cap CFG \n"));
4545 return eSIR_FAILURE;
4546 }
4547
4548 cfgVal2 = (tANI_U16)cfgVal1;
4549 pHTCapabilityInfo = (tSirMacHTCapabilityInfo *) &cfgVal2;
4550 pHTCapabilityInfo->mimoPowerSave = state;
4551
4552 if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo) != eSIR_SUCCESS) {
4553 limLog(pMac, LOGP, FL("could not update HT Cap Info CFG\n"));
4554 return eSIR_FAILURE;
4555 }
4556
4557 PELOG2(limLog(pMac, LOG2, FL(" The HT Capability for Mimo Pwr is updated to State: %u \n"),state);)
4558 if (pMac->lim.gLimSmeState != eLIM_SME_LINK_EST_STATE) {
4559 PELOG2(limLog(pMac, LOG2,FL(" The STA is not in the Connected/Link Est Sme_State: %d \n"), pMac->lim.gLimSmeState);)
4560 /** Update in the LIM the MIMO PS state of the SELF */
4561 pMac->lim.gHTMIMOPSState = state;
4562 return eSIR_SUCCESS;
4563 }
4564
4565 pSta = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable);
4566 if (!pSta->mlmStaContext.htCapability) {
4567 limLog( pMac, LOGE,FL( "limSendSMPowerState: Peer is not HT Capable \n" ));
4568 return eSIR_FAILURE;
4569 }
4570
4571 if (isEnteringMimoPS(pMac->lim.gHTMIMOPSState, state)) {
4572 tSirMacAddr macAddr;
4573 /** Obtain the AP's Mac Address */
4574 palCopyMemory(pMac ->hHdd, (tANI_U8 *)macAddr, psessionEntry->bssId, sizeof(tSirMacAddr));
4575 /** Send Action Frame with the corresponding mode */
4576 retStatus = limSendSMPowerStateFrame(pMac, macAddr, state);
4577 if (retStatus != eSIR_SUCCESS) {
4578 PELOGE(limLog(pMac, LOGE, "Update SM POWER: Sending Action Frame has failed\n");)
4579 return retStatus;
4580 }
4581 }
4582
4583 /** Update MlmState about the SetMimoPS State */
4584 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
4585 pMac->lim.gLimMlmState = eLIM_MLM_WT_SET_MIMOPS_STATE;
4586 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
4587
4588 /** Update the HAL and s/w mac about the mode to be set */
4589 retStatus = limPostSMStateUpdate( pMac,psessionEntry->staId, state);
4590
4591 PELOG2(limLog(pMac, LOG2, " Updated the New SMPS State");)
4592 /** Update in the LIM the MIMO PS state of the SELF */
4593 pMac->lim.gHTMIMOPSState = state;
4594#endif
4595 return retStatus;
4596#endif
4597return eSIR_SUCCESS;
4598}
4599
Jeff Johnsone7245742012-09-05 17:12:55 -07004600#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004601ePhyChanBondState limGet11ACPhyCBState(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 htSecondaryChannelOffset,tANI_U8 peerCenterChan, tpPESession psessionEntry)
Jeff Johnsone7245742012-09-05 17:12:55 -07004602{
4603 ePhyChanBondState cbState = PHY_SINGLE_CHANNEL_CENTERED;
4604
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004605 if(!psessionEntry->apChanWidth)
Jeff Johnsone7245742012-09-05 17:12:55 -07004606 {
4607 return htSecondaryChannelOffset;
4608 }
4609
4610 if ( (htSecondaryChannelOffset
4611 == PHY_DOUBLE_CHANNEL_LOW_PRIMARY)
4612 )
4613 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004614 if ((channel + 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004615 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004616 else if ((channel + 6 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004617 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004618 else if ((channel - 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004619 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
4620 else
4621 limLog (pMac, LOGP,
4622 FL("Invalid Channel Number = %d Center Chan = %d \n"),
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004623 channel, peerCenterChan);
Jeff Johnsone7245742012-09-05 17:12:55 -07004624 }
4625 if ( (htSecondaryChannelOffset
4626 == PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
4627 )
4628 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004629 if ((channel - 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004630 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004631 else if ((channel + 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004632 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004633 else if ((channel - 6 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004634 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
4635 else
4636 limLog (pMac, LOGP,
4637 FL("Invalid Channel Number = %d Center Chan = %d \n"),
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004638 channel, peerCenterChan);
Jeff Johnsone7245742012-09-05 17:12:55 -07004639 }
4640 return cbState;
4641}
4642
4643#endif
4644
Jeff Johnson295189b2012-06-20 16:38:30 -07004645void
Jeff Johnsone7245742012-09-05 17:12:55 -07004646limSetChannel(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 secChannelOffset, tPowerdBm maxTxPower, tANI_U8 peSessionId)
Jeff Johnson295189b2012-06-20 16:38:30 -07004647{
4648#if !defined WLAN_FEATURE_VOWIFI
4649 tANI_U32 localPwrConstraint;
4650#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07004651 tpPESession peSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07004652
Jeff Johnsone7245742012-09-05 17:12:55 -07004653 peSession = peFindSessionBySessionId (pMac, peSessionId);
4654
4655 if ( NULL == peSession)
4656 {
4657 limLog (pMac, LOGP, FL("Invalid PE session = %d\n"), peSessionId);
4658 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07004659 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004660#if defined WLAN_FEATURE_VOWIFI
Jeff Johnsone7245742012-09-05 17:12:55 -07004661#ifdef WLAN_FEATURE_11AC
4662 if ( peSession->vhtCapability )
4663 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004664 limSendSwitchChnlParams( pMac, channel, limGet11ACPhyCBState( pMac,channel,secChannelOffset,peSession->apCenterChan, peSession), maxTxPower, peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07004665 }
4666 else
4667#endif
4668 {
4669 limSendSwitchChnlParams( pMac, channel, secChannelOffset, maxTxPower, peSessionId);
4670 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004671#else
4672 if (wlan_cfgGetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, &localPwrConstraint) != eSIR_SUCCESS) {
4673 limLog(pMac, LOGP, FL("could not read WNI_CFG_LOCAL_POWER_CONSTRAINT from CFG\n"));
4674 return;
4675 }
4676 // Send WDA_CHNL_SWITCH_IND to HAL
Jeff Johnsone7245742012-09-05 17:12:55 -07004677#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004678 if ( peSession->vhtCapability && peSession->vhtCapabilityPresentInBeacon)
Jeff Johnsone7245742012-09-05 17:12:55 -07004679 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004680 limSendSwitchChnlParams( pMac, channel, limGet11ACPhyCBState( pMac,channel,secChannelOffset,peSession->apCenterChan, peSession), maxTxPower, peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07004681 }
4682 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004683#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07004684 {
4685 limSendSwitchChnlParams( pMac, channel, secChannelOffset, (tPowerdBm)localPwrConstraint, peSessionId);
4686 }
4687#endif
4688
Jeff Johnson295189b2012-06-20 16:38:30 -07004689 }