blob: a7449897e3da97f41d6b0118f5da7fd8d44fec34 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Gopichand Nakkala92f07d82013-01-08 21:16:34 -08002 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21/*
Jeff Johnson32d95a32012-09-10 13:15:23 -070022 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Jeff Johnson295189b2012-06-20 16:38:30 -070023 *
24 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
25 *
26 *
27 * Permission to use, copy, modify, and/or distribute this software for
28 * any purpose with or without fee is hereby granted, provided that the
29 * above copyright notice and this permission notice appear in all
30 * copies.
31 *
32 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
33 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
34 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
35 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
36 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
37 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
38 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
39 * PERFORMANCE OF THIS SOFTWARE.
40 */
41
42/*
43 * Airgo Networks, Inc proprietary. All rights reserved.
44 * This file limProcessMlmMessages.cc contains the code
45 * for processing MLM request messages.
46 * Author: Chandra Modumudi
47 * Date: 02/12/02
48 * History:-
49 * Date Modified by Modification Information
50 * --------------------------------------------------------------------
51 *
52 */
53#include "palTypes.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070054#include "wniCfgSta.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070055#include "aniGlobal.h"
56#include "sirApi.h"
57#include "sirParams.h"
58#include "cfgApi.h"
59
60#include "schApi.h"
61#include "utilsApi.h"
62#include "limUtils.h"
63#include "limAssocUtils.h"
64#include "limPropExtsUtils.h"
65#include "limSecurityUtils.h"
66#include "limSendMessages.h"
67#include "pmmApi.h"
68#include "limSendMessages.h"
69//#include "limSessionUtils.h"
70#include "limSessionUtils.h"
71#ifdef WLAN_FEATURE_VOWIFI_11R
72#include <limFT.h>
73#endif
krunal soni8d13b092013-07-19 13:23:29 -070074#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM
75#include "vos_diag_core_log.h"
76#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070077
78
79// MLM REQ processing function templates
80static void limProcessMlmStartReq(tpAniSirGlobal, tANI_U32 *);
81static void limProcessMlmScanReq(tpAniSirGlobal, tANI_U32 *);
Jeff Johnsone7245742012-09-05 17:12:55 -070082#ifdef FEATURE_OEM_DATA_SUPPORT
83static void limProcessMlmOemDataReq(tpAniSirGlobal, tANI_U32 *);
84#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070085static void limProcessMlmJoinReq(tpAniSirGlobal, tANI_U32 *);
86static void limProcessMlmAuthReq(tpAniSirGlobal, tANI_U32 *);
87static void limProcessMlmAssocReq(tpAniSirGlobal, tANI_U32 *);
88static void limProcessMlmReassocReq(tpAniSirGlobal, tANI_U32 *);
89static void limProcessMlmDisassocReq(tpAniSirGlobal, tANI_U32 *);
90static void limProcessMlmDeauthReq(tpAniSirGlobal, tANI_U32 *);
91static void limProcessMlmSetKeysReq(tpAniSirGlobal, tANI_U32 *);
92
93static void limProcessMlmAddBAReq( tpAniSirGlobal, tANI_U32 * );
94static void limProcessMlmAddBARsp( tpAniSirGlobal, tANI_U32 * );
95static void limProcessMlmDelBAReq( tpAniSirGlobal, tANI_U32 * );
96
97// MLM Timeout event handler templates
98static void limProcessMinChannelTimeout(tpAniSirGlobal);
99static void limProcessMaxChannelTimeout(tpAniSirGlobal);
100static void limProcessPeriodicProbeReqTimer(tpAniSirGlobal pMac);
101static void limProcessJoinFailureTimeout(tpAniSirGlobal);
102static void limProcessAuthFailureTimeout(tpAniSirGlobal);
103static void limProcessAuthRspTimeout(tpAniSirGlobal, tANI_U32);
104static void limProcessAssocFailureTimeout(tpAniSirGlobal, tANI_U32);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -0800105static void limProcessPeriodicJoinProbeReqTimer(tpAniSirGlobal);
Jeff Johnson295189b2012-06-20 16:38:30 -0700106
107static void limProcessMlmRemoveKeyReq(tpAniSirGlobal pMac, tANI_U32 * pMsgBuf);
108void
Jeff Johnsone7245742012-09-05 17:12:55 -0700109limSetChannel(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 secChannelOffset, tPowerdBm maxTxPower, tANI_U8 peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -0700110#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 -0700111#define IS_MLM_SCAN_REQ_BACKGROUND_SCAN_NORMAL(pMac) (pMac->lim.gpLimMlmScanReq->backgroundScanMode == eSIR_NORMAL_BACKGROUND_SCAN)
Jeff Johnson295189b2012-06-20 16:38:30 -0700112
113/**
114 * limProcessMlmReqMessages()
115 *
116 *FUNCTION:
117 * This function is called by limPostMlmMessage(). This
118 * function handles MLM primitives invoked by SME.
119 *
120 *LOGIC:
121 * Depending on the message type, corresponding function will be
122 * called.
123 *
124 *ASSUMPTIONS:
125 * 1. Upon receiving Beacon in WT_JOIN_STATE, MLM module invokes
126 * APIs exposed by Beacon Processing module for setting parameters
127 * at MAC hardware.
128 * 2. If attempt to Reassociate with an AP fails, link with current
129 * AP is restored back.
130 *
131 *NOTE:
132 *
133 * @param pMac Pointer to Global MAC structure
134 * @param msgType Indicates the MLM primitive message type
135 * @param *pMsgBuf A pointer to the MLM message buffer
136 *
137 * @return None
138 */
139
140void
141limProcessMlmReqMessages(tpAniSirGlobal pMac, tpSirMsgQ Msg)
142{
143 switch (Msg->type)
144 {
145 case LIM_MLM_START_REQ: limProcessMlmStartReq(pMac, Msg->bodyptr); break;
146 case LIM_MLM_SCAN_REQ: limProcessMlmScanReq(pMac, Msg->bodyptr); break;
Jeff Johnsone7245742012-09-05 17:12:55 -0700147#ifdef FEATURE_OEM_DATA_SUPPORT
148 case LIM_MLM_OEM_DATA_REQ: limProcessMlmOemDataReq(pMac, Msg->bodyptr); break;
149#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700150 case LIM_MLM_JOIN_REQ: limProcessMlmJoinReq(pMac, Msg->bodyptr); break;
151 case LIM_MLM_AUTH_REQ: limProcessMlmAuthReq(pMac, Msg->bodyptr); break;
152 case LIM_MLM_ASSOC_REQ: limProcessMlmAssocReq(pMac, Msg->bodyptr); break;
153 case LIM_MLM_REASSOC_REQ: limProcessMlmReassocReq(pMac, Msg->bodyptr); break;
154 case LIM_MLM_DISASSOC_REQ: limProcessMlmDisassocReq(pMac, Msg->bodyptr); break;
155 case LIM_MLM_DEAUTH_REQ: limProcessMlmDeauthReq(pMac, Msg->bodyptr); break;
156 case LIM_MLM_SETKEYS_REQ: limProcessMlmSetKeysReq(pMac, Msg->bodyptr); break;
157 case LIM_MLM_REMOVEKEY_REQ: limProcessMlmRemoveKeyReq(pMac, Msg->bodyptr); break;
158 case SIR_LIM_MIN_CHANNEL_TIMEOUT: limProcessMinChannelTimeout(pMac); break;
159 case SIR_LIM_MAX_CHANNEL_TIMEOUT: limProcessMaxChannelTimeout(pMac); break;
160 case SIR_LIM_PERIODIC_PROBE_REQ_TIMEOUT:
161 limProcessPeriodicProbeReqTimer(pMac); break;
162 case SIR_LIM_JOIN_FAIL_TIMEOUT: limProcessJoinFailureTimeout(pMac); break;
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -0800163 case SIR_LIM_PERIODIC_JOIN_PROBE_REQ_TIMEOUT:
164 limProcessPeriodicJoinProbeReqTimer(pMac); break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700165 case SIR_LIM_AUTH_FAIL_TIMEOUT: limProcessAuthFailureTimeout(pMac); break;
166 case SIR_LIM_AUTH_RSP_TIMEOUT: limProcessAuthRspTimeout(pMac, Msg->bodyval); break;
167 case SIR_LIM_ASSOC_FAIL_TIMEOUT: limProcessAssocFailureTimeout(pMac, Msg->bodyval); break;
168#ifdef WLAN_FEATURE_VOWIFI_11R
169 case SIR_LIM_FT_PREAUTH_RSP_TIMEOUT:limProcessFTPreauthRspTimeout(pMac); break;
170#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700171 case SIR_LIM_REMAIN_CHN_TIMEOUT: limProcessRemainOnChnTimeout(pMac); break;
Gopichand Nakkala4261ea52012-12-31 16:43:00 -0800172 case SIR_LIM_INSERT_SINGLESHOT_NOA_TIMEOUT:
173 limProcessInsertSingleShotNOATimeout(pMac); break;
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530174 case SIR_LIM_CONVERT_ACTIVE_CHANNEL_TO_PASSIVE:
175 limConvertActiveChannelToPassiveChannel(pMac); break;
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -0800176 case SIR_LIM_DISASSOC_ACK_TIMEOUT: limProcessDisassocAckTimeout(pMac); break;
177 case SIR_LIM_DEAUTH_ACK_TIMEOUT: limProcessDeauthAckTimeout(pMac); break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700178 case LIM_MLM_ADDBA_REQ: limProcessMlmAddBAReq( pMac, Msg->bodyptr ); break;
179 case LIM_MLM_ADDBA_RSP: limProcessMlmAddBARsp( pMac, Msg->bodyptr ); break;
180 case LIM_MLM_DELBA_REQ: limProcessMlmDelBAReq( pMac, Msg->bodyptr ); break;
181 case LIM_MLM_TSPEC_REQ:
182 default:
183 break;
184 } // switch (msgType)
185} /*** end limProcessMlmReqMessages() ***/
186
187
188/**
189 * limSetScanMode()
190 *
191 *FUNCTION:
192 * This function is called to setup system into Scan mode
193 *
194 *LOGIC:
195 * NA
196 *
197 *ASSUMPTIONS:
198 * NA
199 *
200 *NOTE:
201 *
202 * @param pMac - Pointer to Global MAC structure
203 * @return None
204 */
205
206void
207limSetScanMode(tpAniSirGlobal pMac)
208{
209 tSirLinkTrafficCheck checkTraffic;
210
211 /// Set current scan channel id to the first in the channel list
212 pMac->lim.gLimCurrentScanChannelId = 0;
213
Jeff Johnson62c27982013-02-27 17:53:55 -0800214 if ( IS_MLM_SCAN_REQ_BACKGROUND_SCAN_AGGRESSIVE(pMac) )
215 {
216 checkTraffic = eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN;
217 }
218 else if (IS_MLM_SCAN_REQ_BACKGROUND_SCAN_NORMAL(pMac))
219 {
220 checkTraffic = eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN;
221 }
222 else
223 checkTraffic = eSIR_CHECK_ROAMING_SCAN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700224
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700225 PELOG1(limLog(pMac, LOG1, FL("Calling limSendHalInitScanReq"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700226 limSendHalInitScanReq(pMac, eLIM_HAL_INIT_SCAN_WAIT_STATE, checkTraffic);
227
228 return ;
229} /*** end limSetScanMode() ***/
230
231//WLAN_SUSPEND_LINK Related
232
233/* limIsLinkSuspended()
234 *
235 *FUNCTION:
236 * This function returns is link is suspended or not.
237 *
238 *LOGIC:
Jeff Johnson62c27982013-02-27 17:53:55 -0800239 * Since Suspend link uses init scan, it just returns
240 * gLimSystemInScanLearnMode flag.
Jeff Johnson295189b2012-06-20 16:38:30 -0700241 *
242 *ASSUMPTIONS:
243 * NA
244 *
245 *NOTE:
246 *
247 * @param pMac - Pointer to Global MAC structure
248 * @return None
249 */
250tANI_U8
251limIsLinkSuspended(tpAniSirGlobal pMac)
252{
253 return pMac->lim.gLimSystemInScanLearnMode;
254}
255/**
256 * limSuspendLink()
257 *
258 *FUNCTION:
259 * This function is called to suspend traffic. Internally this function uses WDA_INIT_SCAN_REQ.
260 *
261 *LOGIC:
262 * NA
263 *
264 *ASSUMPTIONS:
265 * NA
266 *
267 *NOTE:
268 *
269 * @param pMac - Pointer to Global MAC structure
Jeff Johnson62c27982013-02-27 17:53:55 -0800270 * @param trafficCheck - Takes value from enum tSirLinkTrafficCheck.
Jeff Johnson295189b2012-06-20 16:38:30 -0700271 * @param callback - Callback function to be called after suspending the link.
272 * @param data - Pointer to any buffer that will be passed to callback.
273 * @return None
274 */
275void
276limSuspendLink(tpAniSirGlobal pMac, tSirLinkTrafficCheck trafficCheck, SUSPEND_RESUME_LINK_CALLBACK callback, tANI_U32 *data)
277{
278 if( NULL == callback )
279 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700280 limLog( pMac, LOGE, "%s:%d: Invalid parameters", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700281 return;
282 }
283
284 if( pMac->lim.gpLimSuspendCallback )
285 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700286 limLog( pMac, LOGE, "%s:%d: gLimSuspendLink callback is not NULL...something is wrong", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700287 callback( pMac, eHAL_STATUS_FAILURE, data );
288 return;
289 }
290
291 pMac->lim.gLimSystemInScanLearnMode = 1;
292 pMac->lim.gpLimSuspendCallback = callback;
293 pMac->lim.gpLimSuspendData = data;
294 limSendHalInitScanReq(pMac, eLIM_HAL_SUSPEND_LINK_WAIT_STATE, trafficCheck );
Madan Mohan Koyyalamudi01cba042013-01-10 21:56:05 -0800295
296 WDA_TrafficStatsTimerActivate(FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700297}
298
299/**
300 * limResumeLink()
301 *
302 *FUNCTION:
303 * This function is called to Resume traffic after a suspend. Internally this function uses WDA_FINISH_SCAN_REQ.
304 *
305 *LOGIC:
306 * NA
307 *
308 *ASSUMPTIONS:
309 * NA
310 *
311 *NOTE:
312 *
313 * @param pMac - Pointer to Global MAC structure
314 * @param callback - Callback function to be called after Resuming the link.
315 * @param data - Pointer to any buffer that will be passed to callback.
316 * @return None
317 */
318void
319limResumeLink(tpAniSirGlobal pMac, SUSPEND_RESUME_LINK_CALLBACK callback, tANI_U32 *data)
320{
321 if( NULL == callback )
322 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700323 limLog( pMac, LOGE, "%s:%d: Invalid parameters", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700324 return;
325 }
326
327 if( pMac->lim.gpLimResumeCallback )
328 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700329 limLog( pMac, LOGE, "%s:%d: gLimResumeLink callback is not NULL...something is wrong", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700330 callback( pMac, eHAL_STATUS_FAILURE, data );
331 return;
332 }
333
334 pMac->lim.gpLimResumeCallback = callback;
335 pMac->lim.gpLimResumeData = data;
336 limSendHalFinishScanReq(pMac, eLIM_HAL_RESUME_LINK_WAIT_STATE );
Madan Mohan Koyyalamudi01cba042013-01-10 21:56:05 -0800337
338 if(limIsInMCC(pMac))
339 {
340 WDA_TrafficStatsTimerActivate(TRUE);
341 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700342}
343//end WLAN_SUSPEND_LINK Related
344
345
346/**
347 *
348 * limChangeChannelWithCallback()
349 *
350 * FUNCTION:
351 * This function is called to change channel and perform off channel operation
352 * if required. The caller registers a callback to be called at the end of the
Jeff Johnson62c27982013-02-27 17:53:55 -0800353 * channel change.
Jeff Johnson295189b2012-06-20 16:38:30 -0700354 *
355 */
356void
357limChangeChannelWithCallback(tpAniSirGlobal pMac, tANI_U8 newChannel,
358 CHANGE_CHANNEL_CALLBACK callback,
359 tANI_U32 *cbdata, tpPESession psessionEntry)
360{
361 // Sanity checks for the current and new channel
362#if defined WLAN_VOWIFI_DEBUG
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700363 PELOGE(limLog( pMac, LOGE, "Switching channel to %d", newChannel);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700364#endif
365 psessionEntry->channelChangeReasonCode=LIM_SWITCH_CHANNEL_OPERATION;
366
367 pMac->lim.gpchangeChannelCallback = callback;
368 pMac->lim.gpchangeChannelData = cbdata;
369
370 limSendSwitchChnlParams(pMac, newChannel,
Jeff Johnsone7245742012-09-05 17:12:55 -0700371 PHY_SINGLE_CHANNEL_CENTERED,
Jeff Johnson295189b2012-06-20 16:38:30 -0700372 psessionEntry->maxTxPower, psessionEntry->peSessionId);
373
374 return;
375}
376
377
378/**
379 * limContinuePostChannelScan()
380 *
381 *FUNCTION:
382 * This function is called to scan the current channel.
383 *
384 *LOGIC:
385 *
386 *ASSUMPTIONS:
387 * NA
388 *
389 *NOTE:
390 * NA
391 *
392 * @param pMac - Pointer to Global MAC structure
393 *
394 * @return None
395 */
396
397void limContinuePostChannelScan(tpAniSirGlobal pMac)
398{
399 tANI_U8 channelNum;
400 tANI_U8 handleError = 0;
401 tANI_U8 i = 0;
402 tSirRetStatus status = eSIR_SUCCESS;
403
404 if( pMac->lim.abortScan || (NULL == pMac->lim.gpLimMlmScanReq ) ||
405 (pMac->lim.gLimCurrentScanChannelId >
406 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1)))
407 {
408 pMac->lim.abortScan = 0;
409 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
410 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
411 //Set the resume channel to Any valid channel (invalid).
412 //This will instruct HAL to set it to any previous valid channel.
413 peSetResumeChannel(pMac, 0, 0);
414
415 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
416 return;
417 }
418
419 channelNum = limGetCurrentScanChannel(pMac);
420 if ((pMac->lim.gpLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN) &&
421 (limActiveScanAllowed(pMac, channelNum)))
422 {
423 TX_TIMER *periodicScanTimer;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700424 PELOG2(limLog(pMac, LOG2, FL("ACTIVE Scan chan %d, sending probe"), channelNum);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700425
426 do
427 {
428 /* Prepare and send Probe Request frame for all the SSIDs present in the saved MLM
429 */
430
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700431 PELOGE(limLog(pMac, LOG1, FL("sending ProbeReq number %d, for SSID %s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700432 i, pMac->lim.gpLimMlmScanReq->ssId[i].ssId, channelNum);)
433 // include additional IE if there is
434 status = limSendProbeReqMgmtFrame( pMac, &pMac->lim.gpLimMlmScanReq->ssId[i],
435 pMac->lim.gpLimMlmScanReq->bssId, channelNum, pMac->lim.gSelfMacAddr,
436 pMac->lim.gpLimMlmScanReq->dot11mode,
437 pMac->lim.gpLimMlmScanReq->uIEFieldLen,
438 (tANI_U8 *)(pMac->lim.gpLimMlmScanReq)+pMac->lim.gpLimMlmScanReq->uIEFieldOffset);
439
440 if ( status != eSIR_SUCCESS)
441 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700442 PELOGE(limLog(pMac, LOGE, FL("send ProbeReq failed for SSID %s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700443 pMac->lim.gpLimMlmScanReq->ssId[i].ssId, channelNum);)
444 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
445 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
446 return;
447 }
448 i++;
449 } while (i < pMac->lim.gpLimMlmScanReq->numSsid);
450
451 {
452#if defined WLAN_FEATURE_VOWIFI
453 //If minChannelTime is set to zero, SME is requesting scan to not use min channel timer.
454 //This is used in 11k to request for beacon measurement request with a fixed duration in
455 //max channel time.
456 if( pMac->lim.gpLimMlmScanReq->minChannelTime != 0 )
457 {
458#endif
459 /// TXP has sent Probe Request
460 /// Activate minChannelTimer
461 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
462
463#ifdef GEN6_TODO
464 /* revisit this piece of code to assign the appropriate sessionId below
465 * priority - LOW/might not be needed
466 */
467 pMac->lim.limTimers.gLimMinChannelTimer.sessionId = sessionId;
468#endif
469
Leela Venkata Kiran Kumar Reddy Chirala68a6abe2013-02-28 07:43:16 -0800470 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_MIN_CHANNEL_TIMER));
Jeff Johnson295189b2012-06-20 16:38:30 -0700471
472 if (tx_timer_activate(&pMac->lim.limTimers.gLimMinChannelTimer) != TX_SUCCESS)
473 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700474 limLog(pMac, LOGP, FL("could not start min channel timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700475 return;
476 }
477
478 // Initialize max timer too
479 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
480#if defined WLAN_FEATURE_VOWIFI
481 }
482 else
483 {
484#if defined WLAN_VOWIFI_DEBUG
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700485 PELOGE(limLog( pMac, LOGE, "Min channel time == 0, Use only max chan timer" );)
Jeff Johnson295189b2012-06-20 16:38:30 -0700486#endif
487 //No Need to start Min channel timer. Start Max Channel timer.
488 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
Varun Reddy Yeturue3bbf6e2013-02-08 18:50:55 -0800489 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, pMac->lim.limTimers.gLimMaxChannelTimer.sessionId, eLIM_MAX_CHANNEL_TIMER));
Jeff Johnson295189b2012-06-20 16:38:30 -0700490 if (tx_timer_activate(&pMac->lim.limTimers.gLimMaxChannelTimer)
491 == TX_TIMER_ERROR)
492 {
493 /// Could not activate max channel timer.
494 // Log error
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700495 limLog(pMac,LOGP, FL("could not start max channel timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700496 return;
497 }
498
499 }
500#endif
501 }
502 /* Start peridic timer which will trigger probe req based on min/max
503 channel timer */
504 periodicScanTimer = &pMac->lim.limTimers.gLimPeriodicProbeReqTimer;
505 if (tx_timer_activate(periodicScanTimer) != TX_SUCCESS)
506 {
507 limLog(pMac, LOGP, FL("could not start periodic probe req "
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700508 "timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700509 return;
510 }
511 periodicScanTimer->sessionId = channelNum;
Varun Reddy Yeturue3bbf6e2013-02-08 18:50:55 -0800512 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, periodicScanTimer->sessionId, eLIM_PERIODIC_PROBE_REQ_TIMER));
Jeff Johnson295189b2012-06-20 16:38:30 -0700513 }
514 else
515 {
516 tANI_U32 val;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700517 PELOG2(limLog(pMac, LOG2, FL("START PASSIVE Scan chan %d"), channelNum);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700518
519 /// Passive Scanning. Activate maxChannelTimer
Leela Venkata Kiran Kumar Reddy Chirala68a6abe2013-02-28 07:43:16 -0800520 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, NO_SESSION, eLIM_MAX_CHANNEL_TIMER));
Jeff Johnson295189b2012-06-20 16:38:30 -0700521 if (tx_timer_deactivate(&pMac->lim.limTimers.gLimMaxChannelTimer)
522 != TX_SUCCESS)
523 {
524 // Could not deactivate max channel timer.
525 // Log error
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700526 limLog(pMac, LOGP, FL("Unable to deactivate max channel timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700527 return;
528 }
529 else
530 {
531 if (wlan_cfgGetInt(pMac, WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME,
532 &val) != eSIR_SUCCESS)
533 {
534 /**
535 * Could not get max channel value
536 * from CFG. Log error.
537 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700538 limLog(pMac, LOGP, FL("could not retrieve passive max channel value"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700539 return;
540 }
541 else
542 {
543 tANI_U32 val1 = 0;
544
545 val = SYS_MS_TO_TICKS(val);
Jeff Johnsone7245742012-09-05 17:12:55 -0700546 //TODO: consider sessions.
547#if 0
Jeff Johnson295189b2012-06-20 16:38:30 -0700548 // If a background was triggered via Quiet BSS,
549 // then we need to adjust the MIN and MAX channel
550 // timer's accordingly to the Quiet duration that
551 // was specified
552 if( eLIM_QUIET_RUNNING == pMac->lim.gLimSpecMgmt.quietState &&
553 pMac->lim.gLimTriggerBackgroundScanDuringQuietBss )
554 {
555 // gLimQuietDuration is already cached in units of
556 // system ticks. No conversion is reqd...
557 val1 = pMac->lim.gLimSpecMgmt.quietDuration;
558 }
559 else
560 {
561 val1 = SYS_MS_TO_TICKS(pMac->lim.gpLimMlmScanReq->maxChannelTime);
562 }
563#endif
564 //Pick the longer stay time
565 val = (val > val1) ? val : val1;
Leela Venkata Kiran Kumar Reddy Chirala68a6abe2013-02-28 07:43:16 -0800566 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, NO_SESSION, eLIM_MAX_CHANNEL_TIMER));
Jeff Johnson295189b2012-06-20 16:38:30 -0700567 if (tx_timer_change(&pMac->lim.limTimers.gLimMaxChannelTimer,
568 val, 0) != TX_SUCCESS)
569 {
570 // Could not change max channel timer.
571 // Log error
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700572 limLog(pMac, LOGP, FL("Unable to change max channel timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700573 return;
574 }
575 else if (tx_timer_activate(&pMac->lim.limTimers.gLimMaxChannelTimer) != TX_SUCCESS)
576 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700577 limLog(pMac, LOGP, FL("could not start max channel timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700578 return;
579 }
580
581 }
582 }
583 // Wait for Beacons to arrive
584 } // if (pMac->lim.gLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN)
585
586 if( handleError )
587 {
588 //
589 // FIXME - With this, LIM/SoftMAC will try and recover
590 // state, but eWNI_SME_SCAN_CNF maybe reporting an
591 // incorrect status back to the SME. Some of the possible
592 // errors are:
593 // eSIR_SME_HAL_SCAN_INIT_FAILED
594 // eSIR_SME_RESOURCES_UNAVAILABLE
595 //
596 //Set the resume channel to Any valid channel (invalid).
597 //This will instruct HAL to set it to any previous valid channel.
598 peSetResumeChannel(pMac, 0, 0);
599 limSendHalFinishScanReq( pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE );
600 //limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_INIT_FAILED);
601 }
602 else
603 {
604 limAddScanChannelInfo(pMac, channelNum);
605 }
606
607 return;
608}
609
610
611
612
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530613
614/* limCovertChannelScanType()
615 *
616 *FUNCTION:
617 * This function is called to get the list, change the channel type and set again.
618 *
619 *LOGIC:
620 *
621 *ASSUMPTIONS:
622 * NA
623 *
624 *NOTE: If a channel is ACTIVE, this function will make it as PASSIVE
625 * If a channel is PASSIVE, this fucntion will make it as ACTIVE
626 * NA
627 *
628 * @param pMac - Pointer to Global MAC structure
629 * channelNum - Channel which need to be convert
630 PassiveToActive - Boolean flag to convert channel
631 *
632 * @return None
633 */
634
635
636void limCovertChannelScanType(tpAniSirGlobal pMac,tANI_U8 channelNum, tANI_BOOLEAN passiveToActive)
637{
638
639 tANI_U32 i;
640 tANI_U8 channelPair[WNI_CFG_SCAN_CONTROL_LIST_LEN];
641 tANI_U32 len = WNI_CFG_SCAN_CONTROL_LIST_LEN;
642 if (wlan_cfgGetStr(pMac, WNI_CFG_SCAN_CONTROL_LIST, channelPair, &len)
643 != eSIR_SUCCESS)
644 {
645 PELOGE(limLog(pMac, LOGE, FL("Unable to get scan control list"));)
646 return ;
647 }
648 if (len > WNI_CFG_SCAN_CONTROL_LIST_LEN)
649 {
650 limLog(pMac, LOGE, FL("Invalid scan control list length:%d"), len);
651 return ;
652 }
653 for (i=0; (i+1) < len; i+=2)
654 {
655 if (channelPair[i] == channelNum)
656 {
657 if ((eSIR_PASSIVE_SCAN == channelPair[i+1]) && TRUE == passiveToActive)
658 {
659 PELOG1(limLog(pMac, LOG1, FL("Channel %d changed from Passive to Active"),
660 channelNum);)
661 channelPair[i+1] = eSIR_ACTIVE_SCAN;
662 break ;
663 }
664 if ((eSIR_ACTIVE_SCAN == channelPair[i+1]) && FALSE == passiveToActive)
665 {
666 PELOG1(limLog(pMac, LOG1, FL("Channel %d changed from Active to Passive"),
667 channelNum);)
668 channelPair[i+1] = eSIR_PASSIVE_SCAN;
669 break ;
670 }
671 }
672 }
673
674 cfgSetStrNotify(pMac, WNI_CFG_SCAN_CONTROL_LIST, (tANI_U8 *)channelPair, len, FALSE);
675 return ;
676}
677
678
679
680
681/* limSetDFSChannelList()
682 *
683 *FUNCTION:
684 * This function is called to convert DFS channel list to active channel list when any
685 * beacon is present on that channel. This function store time for passive channels
686 * which help to know that for how much time channel has been passive.
687 *
688 *LOGIC:
689 *
690 *ASSUMPTIONS:
691 * NA
692 *
693 *NOTE: If a channel is ACTIVE, it won't store any time
694 * If a channel is PAssive, it will store time as timestamp
695 * NA
696 *
697 * @param pMac - Pointer to Global MAC structure
698 * dfsChannelList - DFS channel list.
699 * @return None
700 */
701
702void limSetDFSChannelList(tpAniSirGlobal pMac,tANI_U8 channelNum, tSirDFSChannelList *dfsChannelList)
703{
704
705 tANI_BOOLEAN passiveToActive = TRUE;
706 if ((1 <= channelNum) && (165 >= channelNum))
707 {
708 if (eANI_BOOLEAN_TRUE == limIsconnectedOnDFSChannel(channelNum))
709 {
710 if (dfsChannelList->timeStamp[channelNum] == 0)
711 {
712 //Received first beacon; Convert DFS channel to Active channel.
713 PELOG1(limLog(pMac, LOG1, FL("Received first beacon on DFS channel: %d"), channelNum);)
714 limCovertChannelScanType(pMac,channelNum, passiveToActive);
715 }
716 dfsChannelList->timeStamp[channelNum] = vos_timer_get_system_time();
717 }
718 else
719 {
720 PELOG1(limLog(pMac, LOG1, FL("Channel %d is Active"), channelNum);)
721 return;
722 }
723 if (!tx_timer_running(&pMac->lim.limTimers.gLimActiveToPassiveChannelTimer))
724 {
725 tx_timer_activate(&pMac->lim.limTimers.gLimActiveToPassiveChannelTimer);
726 }
727 }
728 else
729 {
730 PELOGE(limLog(pMac, LOGE, FL("Invalid Channel: %d"), channelNum);)
731 return;
732 }
733
734 return;
735}
736
737
738
739
Jeff Johnson295189b2012-06-20 16:38:30 -0700740/*
741* Creates a Raw frame to be sent before every Scan, if required.
742* If only infra link is active (mlmState = Link Estb), then send Data Null
743* If only BT-AMP-AP link is active(mlmState = BSS_STARTED), then send CTS2Self frame.
744* If only BT-AMP-STA link is active(mlmState = BSS_STARTED or Link Est) then send CTS2Self
745* If Only IBSS link is active, then send CTS2Self
746* for concurrent scenario: Infra+BT or Infra+IBSS, always send CTS2Self, no need to send Data Null
747*
748*/
749static void __limCreateInitScanRawFrame(tpAniSirGlobal pMac,
750 tpInitScanParams pInitScanParam)
751{
752 tANI_U8 i;
753 pInitScanParam->scanEntry.activeBSScnt = 0;
754
755 /* Don't send CTS to self as we have issue with BTQM queues where BTQM can
756 * not handle transmition of CTS2self frames. Sending CTS 2 self at this
757 * juncture also doesn't serve much purpose as probe request frames go out
758 * immediately, No need to notify BSS in IBSS case.
759 * */
760
761 for(i =0; i < pMac->lim.maxBssId; i++)
762 {
763 if(pMac->lim.gpSession[i].valid == TRUE)
764 {
765 if(pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)
766 {
767 if ((pMac->lim.gpSession[i].limSystemRole != eLIM_BT_AMP_STA_ROLE) &&
768 (pInitScanParam->scanEntry.activeBSScnt < HAL_NUM_BSSID))
769 {
770 pInitScanParam->scanEntry.bssIdx[pInitScanParam->scanEntry.activeBSScnt]
771 = pMac->lim.gpSession[i].bssIdx;
772 pInitScanParam->scanEntry.activeBSScnt++;
773
774 }
775 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700776 else if( (eLIM_AP_ROLE == pMac->lim.gpSession[i].limSystemRole )
777 && ( VOS_P2P_GO_MODE == pMac->lim.gpSession[i].pePersona )
778 )
779 {
780 pInitScanParam->useNoA = TRUE;
781 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700782 }
783 }
784 if (pInitScanParam->scanEntry.activeBSScnt)
785 {
786 pInitScanParam->notifyBss = TRUE;
787 pInitScanParam->frameType = SIR_MAC_DATA_FRAME;
788 pInitScanParam->frameLength = 0;
789 }
790}
791
792/*
793* Creates a Raw frame to be sent during finish scan, if required.
794* Send data null frame, only when there is just one session active and that session is
795* in 'link Estb' state.
796* if more than one session is active, don't send any frame.
797* for concurrent scenario: Infra+BT or Infra+IBSS, no need to send Data Null
798*
799*/
800static void __limCreateFinishScanRawFrame(tpAniSirGlobal pMac,
801 tpFinishScanParams pFinishScanParam)
802{
803 tANI_U8 i;
804 pFinishScanParam->scanEntry.activeBSScnt = 0;
805
806 for(i =0; i < pMac->lim.maxBssId; i++)
807 {
808 if(pMac->lim.gpSession[i].valid == TRUE)
809 {
810 if(pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)
811 {
812 //BT-STA can either be in LINK-ESTB state or BSS_STARTED State
813 //for BT, need to send CTS2Self
814 if ((pMac->lim.gpSession[i].limSystemRole != eLIM_BT_AMP_STA_ROLE) &&
815 (pFinishScanParam->scanEntry.activeBSScnt < HAL_NUM_BSSID))
816 {
817 pFinishScanParam->scanEntry.bssIdx[pFinishScanParam->scanEntry.activeBSScnt]
818 = pMac->lim.gpSession[i].bssIdx;
819 pFinishScanParam->scanEntry.activeBSScnt++;
820 }
821 }
822 }
823 }
824
825 if (pFinishScanParam->scanEntry.activeBSScnt)
826 {
827 pFinishScanParam->notifyBss = TRUE;
828 pFinishScanParam->frameType = SIR_MAC_DATA_FRAME;
829 pFinishScanParam->frameLength = 0;
830 }
831}
832
833void
834limSendHalInitScanReq(tpAniSirGlobal pMac, tLimLimHalScanState nextState, tSirLinkTrafficCheck trafficCheck)
835{
836
837
838 tSirMsgQ msg;
839 tpInitScanParams pInitScanParam;
840 tSirRetStatus rc = eSIR_SUCCESS;
841
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530842 pInitScanParam = vos_mem_malloc(sizeof(*pInitScanParam));
843 if ( NULL == pInitScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -0700844 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530845 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700846 goto error;
847 }
848
849 /*Initialize the pInitScanParam with 0*/
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530850 vos_mem_set((tANI_U8 *)pInitScanParam, sizeof(*pInitScanParam), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700851
852 msg.type = WDA_INIT_SCAN_REQ;
853 msg.bodyptr = pInitScanParam;
854 msg.bodyval = 0;
855
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530856 vos_mem_set((tANI_U8 *)&pInitScanParam->macMgmtHdr, sizeof(tSirMacMgmtHdr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700857 if (nextState == eLIM_HAL_INIT_LEARN_WAIT_STATE)
858 {
859 pInitScanParam->notifyBss = TRUE;
860 pInitScanParam->notifyHost = FALSE;
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700861 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
862 {
863 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SCAN;
864 }
865 else
866 {
867 pInitScanParam->scanMode = eHAL_SYS_MODE_LEARN;
868 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700869
Jeff Johnsone7245742012-09-05 17:12:55 -0700870 pInitScanParam->frameType = SIR_MAC_CTRL_CTS;
871 __limCreateInitScanRawFrame(pMac, pInitScanParam);
872 pInitScanParam->checkLinkTraffic = trafficCheck;
Jeff Johnson295189b2012-06-20 16:38:30 -0700873 }
874 else
875 {
876 if(nextState == eLIM_HAL_SUSPEND_LINK_WAIT_STATE)
877 {
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700878 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
879 {
880 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SUSPEND_LINK;
881 }
882 else
883 {
884 pInitScanParam->scanMode = eHAL_SYS_MODE_SUSPEND_LINK;
885 }
886
Jeff Johnson295189b2012-06-20 16:38:30 -0700887 }
888 else
889 {
Madan Mohan Koyyalamudi94d111d2012-11-19 20:11:26 -0800890 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
891 {
892 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SCAN;
893 }
894 else
895 {
896 pInitScanParam->scanMode = eHAL_SYS_MODE_SCAN;
897 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700898 }
899 __limCreateInitScanRawFrame(pMac, pInitScanParam);
Jeff Johnson295189b2012-06-20 16:38:30 -0700900 if (pInitScanParam->useNoA)
901 {
902 pInitScanParam->scanDuration = pMac->lim.gTotalScanDuration;
903 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700904 /* Inform HAL whether it should check for traffic on the link
905 * prior to performing a background scan
906 */
907 pInitScanParam->checkLinkTraffic = trafficCheck;
908 }
909
910 pMac->lim.gLimHalScanState = nextState;
911 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -0700912 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -0700913
914 rc = wdaPostCtrlMsg(pMac, &msg);
915 if (rc == eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700916 PELOG3(limLog(pMac, LOG3, FL("wdaPostCtrlMsg() return eSIR_SUCCESS pMac=%x nextState=%d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700917 pMac, pMac->lim.gLimHalScanState);)
918 return;
919 }
920
921 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530922 vos_mem_free(pInitScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700923 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700924
925error:
926 switch(nextState)
927 {
928 case eLIM_HAL_START_SCAN_WAIT_STATE:
929 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_INIT_FAILED);
930 break;
931
Jeff Johnson295189b2012-06-20 16:38:30 -0700932
933 //WLAN_SUSPEND_LINK Related
934 case eLIM_HAL_SUSPEND_LINK_WAIT_STATE:
935 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
936 if( pMac->lim.gpLimSuspendCallback )
937 {
938 pMac->lim.gpLimSuspendCallback( pMac, rc, pMac->lim.gpLimSuspendData );
939 pMac->lim.gpLimSuspendCallback = NULL;
940 pMac->lim.gpLimSuspendData = NULL;
941 }
942 pMac->lim.gLimSystemInScanLearnMode = 0;
943 break;
944 //end WLAN_SUSPEND_LINK Related
945 default:
946 break;
947 }
948 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
949
950 return ;
951}
952
953void
954limSendHalStartScanReq(tpAniSirGlobal pMac, tANI_U8 channelNum, tLimLimHalScanState nextState)
955{
956 tSirMsgQ msg;
957 tpStartScanParams pStartScanParam;
958 tSirRetStatus rc = eSIR_SUCCESS;
959
960 /**
961 * The Start scan request to be sent only if Start Scan is not already requested
962 */
963 if(pMac->lim.gLimHalScanState != eLIM_HAL_START_SCAN_WAIT_STATE)
964 {
965
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530966 pStartScanParam = vos_mem_malloc(sizeof(*pStartScanParam));
967 if ( NULL == pStartScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -0700968 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530969 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700970 goto error;
971 }
972
973 msg.type = WDA_START_SCAN_REQ;
974 msg.bodyptr = pStartScanParam;
975 msg.bodyval = 0;
976 pStartScanParam->status = eHAL_STATUS_SUCCESS;
977 pStartScanParam->scanChannel = (tANI_U8)channelNum;
978
979 pMac->lim.gLimHalScanState = nextState;
980 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
981
Jeff Johnsone7245742012-09-05 17:12:55 -0700982 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700983 limLog(pMac, LOG1, FL("Channel %d"), channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -0700984
985 rc = wdaPostCtrlMsg(pMac, &msg);
986 if (rc == eSIR_SUCCESS) {
987 return;
988 }
989
990 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530991 vos_mem_free(pStartScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700992 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700993
994error:
995 switch(nextState)
996 {
997 case eLIM_HAL_START_SCAN_WAIT_STATE:
998 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_INIT_FAILED);
999 break;
1000
Jeff Johnson295189b2012-06-20 16:38:30 -07001001
1002 default:
1003 break;
1004 }
1005 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
1006
1007 }
1008 else
1009 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001010 PELOGW(limLog(pMac, LOGW, FL("Invalid state for START_SCAN_REQ message=%d"), pMac->lim.gLimHalScanState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001011 }
1012
1013 return;
1014}
1015
1016void limSendHalEndScanReq(tpAniSirGlobal pMac, tANI_U8 channelNum, tLimLimHalScanState nextState)
1017{
1018 tSirMsgQ msg;
1019 tpEndScanParams pEndScanParam;
1020 tSirRetStatus rc = eSIR_SUCCESS;
1021
1022 /**
1023 * The End scan request to be sent only if End Scan is not already requested or
1024 * Start scan is not already requestd
1025 */
1026 if((pMac->lim.gLimHalScanState != eLIM_HAL_END_SCAN_WAIT_STATE) &&
1027 (pMac->lim.gLimHalScanState != eLIM_HAL_START_SCAN_WAIT_STATE))
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301028 {
1029 pEndScanParam = vos_mem_malloc(sizeof(*pEndScanParam));
1030 if ( NULL == pEndScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -07001031 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301032 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001033 goto error;
1034 }
1035
1036 msg.type = WDA_END_SCAN_REQ;
1037 msg.bodyptr = pEndScanParam;
1038 msg.bodyval = 0;
1039 pEndScanParam->status = eHAL_STATUS_SUCCESS;
1040 pEndScanParam->scanChannel = (tANI_U8)channelNum;
1041
1042 pMac->lim.gLimHalScanState = nextState;
1043 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -07001044 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001045
1046 rc = wdaPostCtrlMsg(pMac, &msg);
1047 if (rc == eSIR_SUCCESS) {
1048 return;
1049 }
1050
1051 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301052 vos_mem_free(pEndScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001053 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001054
1055 error:
1056 switch(nextState)
1057 {
1058 case eLIM_HAL_END_SCAN_WAIT_STATE:
1059 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_END_FAILED);
1060 break;
1061
Jeff Johnson295189b2012-06-20 16:38:30 -07001062
1063 default:
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001064 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg Rcvd invalid nextState %d"), nextState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001065 break;
1066 }
1067 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001068 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001069 }
1070 else
1071 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001072 PELOGW(limLog(pMac, LOGW, FL("Invalid state for END_SCAN_REQ message=%d"), pMac->lim.gLimHalScanState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001073 }
1074
1075
1076 return;
1077}
1078
1079/**
1080 * limSendHalFinishScanReq()
1081 *
1082 *FUNCTION:
1083 * This function is called to finish scan/learn request..
1084 *
1085 *LOGIC:
1086 *
1087 *ASSUMPTIONS:
1088 * NA
1089 *
1090 *NOTE:
1091 * NA
1092 *
1093 * @param pMac - Pointer to Global MAC structure
1094 * @param nextState - this parameters determines whether this call is for scan or learn
1095 *
1096 * @return None
1097 */
1098void limSendHalFinishScanReq(tpAniSirGlobal pMac, tLimLimHalScanState nextState)
1099{
1100
1101 tSirMsgQ msg;
1102 tpFinishScanParams pFinishScanParam;
1103 tSirRetStatus rc = eSIR_SUCCESS;
1104
1105 if(pMac->lim.gLimHalScanState == nextState)
1106 {
1107 /*
1108 * PE may receive multiple probe responses, while waiting for HAL to send 'FINISH_SCAN_RSP' message
1109 * PE was sending multiple finish scan req messages to HAL
1110 * this check will avoid that.
1111 * If PE is already waiting for the 'finish_scan_rsp' message from HAL, it will ignore this request.
1112 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001113 PELOGW(limLog(pMac, LOGW, FL("Next Scan State is same as the current state: %d "), nextState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001114 return;
1115 }
1116
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301117 pFinishScanParam = vos_mem_malloc(sizeof(*pFinishScanParam));
1118 if ( NULL == pFinishScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -07001119 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301120 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001121 goto error;
1122 }
1123
1124 msg.type = WDA_FINISH_SCAN_REQ;
1125 msg.bodyptr = pFinishScanParam;
1126 msg.bodyval = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001127
1128 peGetResumeChannel(pMac, &pFinishScanParam->currentOperChannel, &pFinishScanParam->cbState);
1129
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301130 vos_mem_set((tANI_U8 *)&pFinishScanParam->macMgmtHdr, sizeof(tSirMacMgmtHdr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001131
1132 if (nextState == eLIM_HAL_FINISH_LEARN_WAIT_STATE)
1133 {
1134 //AP - No pkt need to be transmitted
1135 pFinishScanParam->scanMode = eHAL_SYS_MODE_LEARN;
1136 pFinishScanParam->notifyBss = FALSE;
1137 pFinishScanParam->notifyHost = FALSE;
1138 pFinishScanParam->frameType = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001139
Jeff Johnson295189b2012-06-20 16:38:30 -07001140 pFinishScanParam->frameLength = 0;
1141 pMac->lim.gLimHalScanState = nextState;
1142 }
1143 else
1144 {
1145 /* If STA is associated with an AP (ie. STA is in
1146 * LINK_ESTABLISHED state), then STA need to inform
1147 * the AP via either DATA-NULL
1148 */
1149 if (nextState == eLIM_HAL_RESUME_LINK_WAIT_STATE)
1150 {
1151 pFinishScanParam->scanMode = eHAL_SYS_MODE_SUSPEND_LINK;
1152 }
1153 else
1154 {
1155 pFinishScanParam->scanMode = eHAL_SYS_MODE_SCAN;
1156 }
1157 pFinishScanParam->notifyHost = FALSE;
1158 __limCreateFinishScanRawFrame(pMac, pFinishScanParam);
1159 //WLAN_SUSPEND_LINK Related
1160 pMac->lim.gLimHalScanState = nextState;
1161 //end WLAN_SUSPEND_LINK Related
1162 }
1163
1164 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -07001165 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001166
1167 rc = wdaPostCtrlMsg(pMac, &msg);
1168 if (rc == eSIR_SUCCESS) {
1169 return;
1170 }
1171 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301172 vos_mem_free(pFinishScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001173 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001174
1175 error:
1176 if(nextState == eLIM_HAL_FINISH_SCAN_WAIT_STATE)
1177 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_FINISH_FAILED);
1178 //WLAN_SUSPEND_LINK Related
1179 else if ( nextState == eLIM_HAL_RESUME_LINK_WAIT_STATE )
1180 {
1181 if( pMac->lim.gpLimResumeCallback )
1182 {
1183 pMac->lim.gpLimResumeCallback( pMac, rc, pMac->lim.gpLimResumeData );
1184 pMac->lim.gpLimResumeCallback = NULL;
1185 pMac->lim.gpLimResumeData = NULL;
1186 pMac->lim.gLimSystemInScanLearnMode = 0;
1187 }
1188 }
1189 //end WLAN_SUSPEND_LINK Related
1190 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
1191 return;
1192}
1193
1194/**
1195 * limContinueChannelScan()
1196 *
1197 *FUNCTION:
1198 * This function is called by limPerformChannelScan().
1199 * This function is called to continue channel scanning when
1200 * Beacon/Probe Response frame are received.
1201 *
1202 *LOGIC:
1203 * Scan criteria stored in pMac->lim.gLimMlmScanReq is used
1204 * to perform channel scan. In this function MLM sub module
1205 * makes channel switch, sends PROBE REQUEST frame in case of
1206 * ACTIVE SCANNING, starts min/max channel timers, programs
1207 * NAV to probeDelay timer and waits for Beacon/Probe Response.
1208 * Once all required channels are scanned, LIM_MLM_SCAN_CNF
1209 * primitive is used to send Scan results to SME sub module.
1210 *
1211 *ASSUMPTIONS:
1212 * 1. In case of Active scanning, start MAX channel time iff
1213 * MIN channel timer expired and activity is observed on
1214 * the channel.
1215 *
1216 *NOTE:
1217 * NA
1218 *
1219 * @param pMac Pointer to Global MAC structure
1220 * @return None
1221 */
1222void
1223limContinueChannelScan(tpAniSirGlobal pMac)
1224{
1225 tANI_U8 channelNum;
1226
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001227 PELOG1(limLog(pMac, LOG1, FL("Continue SCAN : chan %d tot %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001228 pMac->lim.gLimCurrentScanChannelId,
1229 pMac->lim.gpLimMlmScanReq->channelList.numChannels);)
1230
1231 if (pMac->lim.gLimCurrentScanChannelId >
1232 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1)
1233 || pMac->lim.abortScan)
1234 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001235 pMac->lim.abortScan = 0;
1236 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1237 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1238
1239 //Set the resume channel to Any valid channel (invalid).
1240 //This will instruct HAL to set it to any previous valid channel.
1241 peSetResumeChannel(pMac, 0, 0);
1242
1243 /// Done scanning all required channels
1244 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001245 return;
1246 }
1247
1248 /// Atleast one more channel is to be scanned
1249
1250 if ((pMac->lim.gLimReturnAfterFirstMatch & 0x40) ||
1251 (pMac->lim.gLimReturnAfterFirstMatch & 0x80))
1252 {
1253 while (pMac->lim.gLimCurrentScanChannelId <=
1254 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
1255 {
1256 if (((limGetCurrentScanChannel(pMac) <= 14) &&
1257 pMac->lim.gLim24Band11dScanDone) ||
1258 ((limGetCurrentScanChannel(pMac) > 14) &&
1259 pMac->lim.gLim50Band11dScanDone))
1260 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001261 limLog(pMac, LOGW, FL("skipping chan %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001262 limGetCurrentScanChannel(pMac));
1263 pMac->lim.gLimCurrentScanChannelId++;
1264 }
1265 else
1266 break;
1267 }
1268
1269 if (pMac->lim.gLimCurrentScanChannelId >
1270 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
1271 {
1272 pMac->lim.abortScan = 0;
1273 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1274 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1275 /// Done scanning all required channels
1276 //Set the resume channel to Any valid channel (invalid).
1277 //This will instruct HAL to set it to any previous valid channel.
1278 peSetResumeChannel(pMac, 0, 0);
1279 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
1280 return;
1281 }
1282 }
1283
1284 channelNum = limGetCurrentScanChannel(pMac);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001285 PELOG2(limLog(pMac, LOG2, FL("Current Channel to be scanned is %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001286 channelNum);)
1287
1288 limSendHalStartScanReq(pMac, channelNum, eLIM_HAL_START_SCAN_WAIT_STATE);
1289 return;
1290} /*** end limContinueChannelScan() ***/
1291
1292
1293
1294/**
1295 * limRestorePreScanState()
1296 *
1297 *FUNCTION:
1298 * This function is called by limContinueChannelScan()
1299 * to restore HW state prior to entering 'scan state'
1300 *
1301 *LOGIC
1302 *
1303 *ASSUMPTIONS:
1304 *
1305 *NOTE:
1306 * NA
1307 *
1308 * @param pMac Pointer to Global MAC structure
1309 * @return None
1310 */
1311void
1312limRestorePreScanState(tpAniSirGlobal pMac)
1313{
1314 int i;
1315
1316 /// Deactivate MIN/MAX channel timers if running
1317 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1318 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1319
1320 /* Re-activate Heartbeat timers for connected sessions as scan
Madan Mohan Koyyalamudi70bb4cb2012-10-18 19:31:25 -07001321 * is done if the DUT is in active mode
1322 * AND it is not a ROAMING ("background") scan */
1323 if(((ePMM_STATE_BMPS_WAKEUP == pMac->pmm.gPmmState) ||
Jeff Johnson295189b2012-06-20 16:38:30 -07001324 (ePMM_STATE_READY == pMac->pmm.gPmmState))
Madan Mohan Koyyalamudi70bb4cb2012-10-18 19:31:25 -07001325 && (pMac->lim.gLimBackgroundScanMode != eSIR_ROAMING_SCAN ))
Jeff Johnson295189b2012-06-20 16:38:30 -07001326 {
1327 for(i=0;i<pMac->lim.maxBssId;i++)
1328 {
Jeff Johnson32d95a32012-09-10 13:15:23 -07001329 if((peFindSessionBySessionId(pMac,i) != NULL) &&
1330 (pMac->lim.gpSession[i].valid == TRUE) &&
Yathish9f22e662012-12-10 14:21:35 -08001331 (eLIM_MLM_LINK_ESTABLISHED_STATE == pMac->lim.gpSession[i].limMlmState) &&
1332 (!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
Jeff Johnson295189b2012-06-20 16:38:30 -07001333 {
1334 limReactivateHeartBeatTimer(pMac, peFindSessionBySessionId(pMac,i));
1335 }
1336 }
1337 }
1338
1339 /**
1340 * clean up message queue.
1341 * If SME messages, redirect to deferred queue.
1342 * The rest will be discarded.
1343 */
1344 //limCleanupMsgQ(pMac);
1345
1346 pMac->lim.gLimSystemInScanLearnMode = 0;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001347 PELOG1(limLog(pMac, LOG1, FL("Scan ended, took %d tu"), (tx_time_get() - pMac->lim.scanStartTime));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001348} /*** limRestorePreScanState() ***/
1349
Jeff Johnsone7245742012-09-05 17:12:55 -07001350#ifdef FEATURE_OEM_DATA_SUPPORT
1351
1352void limSendHalOemDataReq(tpAniSirGlobal pMac)
1353{
1354 tSirMsgQ msg;
1355 tpStartOemDataReq pStartOemDataReq = NULL;
1356 tSirRetStatus rc = eSIR_SUCCESS;
1357 tpLimMlmOemDataRsp pMlmOemDataRsp;
1358 tANI_U32 reqLen = 0;
1359 if(NULL == pMac->lim.gpLimMlmOemDataReq)
1360 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001361 PELOGE(limLog(pMac, LOGE, FL("Null pointer"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001362 goto error;
1363 }
1364
1365 reqLen = sizeof(tStartOemDataReq);
1366
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301367 pStartOemDataReq = vos_mem_malloc(reqLen);
1368 if ( NULL == pStartOemDataReq )
Jeff Johnsone7245742012-09-05 17:12:55 -07001369 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001370 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: Could not allocate memory for pStartOemDataReq"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001371 goto error;
1372 }
1373
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301374 vos_mem_set((tANI_U8*)(pStartOemDataReq), reqLen, 0);
Jeff Johnsone7245742012-09-05 17:12:55 -07001375
1376 //Now copy over the information to the OEM DATA REQ to HAL
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301377 vos_mem_copy(pStartOemDataReq->selfMacAddr,
1378 pMac->lim.gpLimMlmOemDataReq->selfMacAddr,
1379 sizeof(tSirMacAddr));
Jeff Johnsone7245742012-09-05 17:12:55 -07001380
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301381 vos_mem_copy(pStartOemDataReq->oemDataReq,
1382 pMac->lim.gpLimMlmOemDataReq->oemDataReq,
1383 OEM_DATA_REQ_SIZE);
Jeff Johnsone7245742012-09-05 17:12:55 -07001384
1385 //Create the message to be passed to HAL
1386 msg.type = WDA_START_OEM_DATA_REQ;
1387 msg.bodyptr = pStartOemDataReq;
1388 msg.bodyval = 0;
1389
1390 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
1391 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
1392
1393 rc = wdaPostCtrlMsg(pMac, &msg);
1394 if(rc == eSIR_SUCCESS)
1395 {
1396 return;
1397 }
1398
1399 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301400 vos_mem_free(pStartOemDataReq);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001401 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: posting WDA_START_OEM_DATA_REQ to HAL failed"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001402
1403error:
1404 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Varun Reddy Yeturue3bbf6e2013-02-08 18:50:55 -08001405 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnsone7245742012-09-05 17:12:55 -07001406
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301407 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
1408 if ( NULL == pMlmOemDataRsp )
Jeff Johnsone7245742012-09-05 17:12:55 -07001409 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001410 limLog(pMac->hHdd, LOGP, FL("OEM_DATA: memory allocation for pMlmOemDataRsp failed under suspend link failure"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001411 return;
1412 }
1413
1414 if(NULL != pMac->lim.gpLimMlmOemDataReq)
1415 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301416 vos_mem_free(pMac->lim.gpLimMlmOemDataReq);
Jeff Johnsone7245742012-09-05 17:12:55 -07001417 pMac->lim.gpLimMlmOemDataReq = NULL;
1418 }
1419
1420 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
1421
1422 return;
1423}
1424/**
1425 * limSetOemDataReqModeFailed()
1426 *
1427 * FUNCTION:
1428 * This function is used as callback to resume link after the suspend fails while
1429 * starting oem data req mode.
1430 * LOGIC:
1431 * NA
1432 *
1433 * ASSUMPTIONS:
1434 * NA
1435 *
1436 * NOTE:
1437 *
1438 * @param pMac - Pointer to Global MAC structure
1439 * @return None
1440 */
1441
1442void limSetOemDataReqModeFailed(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data)
1443{
1444 tpLimMlmOemDataRsp pMlmOemDataRsp;
1445
1446 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Varun Reddy Yeturue3bbf6e2013-02-08 18:50:55 -08001447 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnsone7245742012-09-05 17:12:55 -07001448
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301449 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
1450 if ( NULL == pMlmOemDataRsp )
Jeff Johnsone7245742012-09-05 17:12:55 -07001451 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001452 limLog(pMac->hHdd, LOGP, FL("OEM_DATA: memory allocation for pMlmOemDataRsp failed under suspend link failure"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001453 return;
1454 }
1455
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301456 if (NULL != pMac->lim.gpLimMlmOemDataReq)
Jeff Johnsone7245742012-09-05 17:12:55 -07001457 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301458 vos_mem_free(pMac->lim.gpLimMlmOemDataReq);
Jeff Johnsone7245742012-09-05 17:12:55 -07001459 pMac->lim.gpLimMlmOemDataReq = NULL;
1460 }
1461
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301462 vos_mem_set(pMlmOemDataRsp, sizeof(tLimMlmOemDataRsp), 0);
Jeff Johnsone7245742012-09-05 17:12:55 -07001463
1464 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
1465
1466 return;
1467}
1468
1469/**
1470 * limSetOemDataReqMode()
1471 *
1472 *FUNCTION:
1473 * This function is called to setup system into OEM DATA REQ mode
1474 *
1475 *LOGIC:
1476 * NA
1477 *
1478 *ASSUMPTIONS:
1479 * NA
1480 *
1481 *NOTE:
1482 *
1483 * @param pMac - Pointer to Global MAC structure
1484 * @return None
1485 */
1486
1487void limSetOemDataReqMode(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data)
1488{
1489 if(status != eHAL_STATUS_SUCCESS)
1490 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001491 limLog(pMac, LOGE, FL("OEM_DATA: failed in suspend link"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001492 goto error;
1493 }
1494 else
1495 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001496 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: Calling limSendHalOemDataReq"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001497 limSendHalOemDataReq(pMac);
1498 return;
1499 }
1500
1501error:
1502 limResumeLink(pMac, limSetOemDataReqModeFailed, NULL);
1503 return ;
1504} /*** end limSendHalOemDataReq() ***/
1505
1506#endif //FEATURE_OEM_DATA_SUPPORT
Jeff Johnson295189b2012-06-20 16:38:30 -07001507
1508static void
1509mlm_add_sta(
1510 tpAniSirGlobal pMac,
1511 tpAddStaParams pSta,
1512 tANI_U8 *pBssid,
1513 tANI_U8 htCapable,
1514 tpPESession psessionEntry) //psessionEntry may required in future
1515{
1516 tANI_U32 val;
1517 int i;
1518
1519
1520 pSta->staType = STA_ENTRY_SELF; // Identifying self
1521
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301522 vos_mem_copy(pSta->bssId, pBssid, sizeof( tSirMacAddr ));
1523 vos_mem_copy(pSta->staMac, psessionEntry->selfMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001524
1525 /* Configuration related parameters to be changed to support BT-AMP */
1526
1527 if( eSIR_SUCCESS != wlan_cfgGetInt( pMac, WNI_CFG_LISTEN_INTERVAL, &val ))
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001528 limLog(pMac, LOGP, FL("Couldn't get LISTEN_INTERVAL"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001529
1530 pSta->listenInterval = (tANI_U16) val;
1531
1532 if (eSIR_SUCCESS != wlan_cfgGetInt(pMac, WNI_CFG_SHORT_PREAMBLE, &val) )
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001533 limLog(pMac, LOGP, FL("Couldn't get SHORT_PREAMBLE"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001534 pSta->shortPreambleSupported = (tANI_U8)val;
1535
1536 pSta->assocId = 0; // Is SMAC OK with this?
1537 pSta->wmmEnabled = 0;
1538 pSta->uAPSD = 0;
1539 pSta->maxSPLen = 0;
1540 pSta->us32MaxAmpduDuration = 0;
1541 pSta->maxAmpduSize = 0; // 0: 8k, 1: 16k,2: 32k,3: 64k
1542
1543
Gopichand Nakkalab2d2c312013-01-04 11:41:02 -08001544 /* For Self STA get the LDPC capability from config.ini*/
1545 pSta->htLdpcCapable =
1546 (psessionEntry->txLdpcIniFeatureEnabled & 0x01);
1547 pSta->vhtLdpcCapable =
1548 ((psessionEntry->txLdpcIniFeatureEnabled >> 1)& 0x01);
1549
Jeff Johnson295189b2012-06-20 16:38:30 -07001550 if(IS_DOT11_MODE_HT(psessionEntry->dot11mode))
1551 {
1552 pSta->htCapable = htCapable;
Jeff Johnson295189b2012-06-20 16:38:30 -07001553 pSta->greenFieldCapable = limGetHTCapability( pMac, eHT_GREENFIELD, psessionEntry);
1554 pSta->txChannelWidthSet = limGetHTCapability( pMac, eHT_SUPPORTED_CHANNEL_WIDTH_SET, psessionEntry );
1555 pSta->mimoPS = (tSirMacHTMIMOPowerSaveState)limGetHTCapability( pMac, eHT_MIMO_POWER_SAVE, psessionEntry );
1556 pSta->rifsMode = limGetHTCapability( pMac, eHT_RIFS_MODE, psessionEntry );
1557 pSta->lsigTxopProtection = limGetHTCapability( pMac, eHT_LSIG_TXOP_PROTECTION, psessionEntry );
1558 pSta->delBASupport = limGetHTCapability( pMac, eHT_DELAYED_BA, psessionEntry );
1559 pSta->maxAmpduDensity = limGetHTCapability( pMac, eHT_MPDU_DENSITY, psessionEntry );
1560 pSta->maxAmsduSize = limGetHTCapability( pMac, eHT_MAX_AMSDU_LENGTH, psessionEntry );
1561 pSta->fDsssCckMode40Mhz = limGetHTCapability( pMac, eHT_DSSS_CCK_MODE_40MHZ, psessionEntry);
1562 pSta->fShortGI20Mhz = limGetHTCapability( pMac, eHT_SHORT_GI_20MHZ, psessionEntry);
1563 pSta->fShortGI40Mhz = limGetHTCapability( pMac, eHT_SHORT_GI_40MHZ, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -07001564 }
Jeff Johnsone7245742012-09-05 17:12:55 -07001565#ifdef WLAN_FEATURE_11AC
1566 if (psessionEntry->vhtCapability)
1567 {
1568 pSta->vhtCapable = VOS_TRUE;
Shailender Karmuchi08f87c22013-01-17 12:51:24 -08001569 pSta->vhtTxBFCapable = psessionEntry->txBFIniFeatureEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07001570 }
1571#endif
1572#ifdef WLAN_FEATURE_11AC
1573 limPopulateOwnRateSet(pMac, &pSta->supportedRates, NULL, false,psessionEntry,NULL);
1574#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001575 limPopulateOwnRateSet(pMac, &pSta->supportedRates, NULL, false,psessionEntry);
Jeff Johnsone7245742012-09-05 17:12:55 -07001576#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001577 limFillSupportedRatesInfo(pMac, NULL, &pSta->supportedRates,psessionEntry);
1578
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001579 limLog( pMac, LOGE, FL( "GF: %d, ChnlWidth: %d, MimoPS: %d, lsigTXOP: %d, dsssCCK: %d, SGI20: %d, SGI40%d") ,
Jeff Johnson295189b2012-06-20 16:38:30 -07001580 pSta->greenFieldCapable, pSta->txChannelWidthSet, pSta->mimoPS, pSta->lsigTxopProtection,
1581 pSta->fDsssCckMode40Mhz,pSta->fShortGI20Mhz, pSta->fShortGI40Mhz);
1582
Jeff Johnson295189b2012-06-20 16:38:30 -07001583 if (VOS_P2P_GO_MODE == psessionEntry->pePersona)
1584 {
1585 pSta->p2pCapableSta = 1;
1586 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001587
1588 //Disable BA. It will be set as part of ADDBA negotiation.
1589 for( i = 0; i < STACFG_MAX_TC; i++ )
1590 {
1591 pSta->staTCParams[i].txUseBA = eBA_DISABLE;
1592 pSta->staTCParams[i].rxUseBA = eBA_DISABLE;
1593 }
1594
1595}
1596
1597//
1598// New HAL interface - WDA_ADD_BSS_REQ
1599// Package WDA_ADD_BSS_REQ to HAL, in order to start a BSS
1600//
1601tSirResultCodes
1602limMlmAddBss (
1603 tpAniSirGlobal pMac,
1604 tLimMlmStartReq *pMlmStartReq,
1605 tpPESession psessionEntry)
1606{
1607 tSirMsgQ msgQ;
1608 tpAddBssParams pAddBssParams = NULL;
1609 tANI_U32 retCode;
1610
Jeff Johnson295189b2012-06-20 16:38:30 -07001611 // Package WDA_ADD_BSS_REQ message parameters
1612
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301613 pAddBssParams = vos_mem_malloc(sizeof( tAddBssParams ));
1614 if ( NULL == pAddBssParams )
Jeff Johnson295189b2012-06-20 16:38:30 -07001615 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301616 limLog( pMac, LOGE, FL( "Unable to allocate memory during ADD_BSS" ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001617 // Respond to SME with LIM_MLM_START_CNF
1618 return eSIR_SME_HAL_SEND_MESSAGE_FAIL;
1619 }
1620
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301621 vos_mem_set(pAddBssParams, sizeof(tAddBssParams), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001622
1623 // Fill in tAddBssParams members
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301624 vos_mem_copy(pAddBssParams->bssId, pMlmStartReq->bssId,
Jeff Johnson295189b2012-06-20 16:38:30 -07001625 sizeof( tSirMacAddr ));
1626
1627 // Fill in tAddBssParams selfMacAddr
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301628 vos_mem_copy (pAddBssParams->selfMacAddr,
1629 psessionEntry->selfMacAddr,
1630 sizeof( tSirMacAddr ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001631
1632 pAddBssParams->bssType = pMlmStartReq->bssType;
1633 if ((pMlmStartReq->bssType == eSIR_IBSS_MODE) ||
1634 (pMlmStartReq->bssType == eSIR_BTAMP_AP_MODE)||
1635 (pMlmStartReq->bssType == eSIR_BTAMP_STA_MODE)) {
1636 pAddBssParams->operMode = BSS_OPERATIONAL_MODE_STA;
1637 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001638 else if (pMlmStartReq->bssType == eSIR_INFRA_AP_MODE){
Jeff Johnson295189b2012-06-20 16:38:30 -07001639 pAddBssParams->operMode = BSS_OPERATIONAL_MODE_AP;
1640 }
1641
Jeff Johnsone7245742012-09-05 17:12:55 -07001642 pAddBssParams->shortSlotTimeSupported = psessionEntry->shortSlotTimeSupported;
Jeff Johnson295189b2012-06-20 16:38:30 -07001643
Jeff Johnson295189b2012-06-20 16:38:30 -07001644 pAddBssParams->beaconInterval = pMlmStartReq->beaconPeriod;
1645 pAddBssParams->dtimPeriod = pMlmStartReq->dtimPeriod;
1646 pAddBssParams->cfParamSet.cfpCount = pMlmStartReq->cfParamSet.cfpCount;
1647 pAddBssParams->cfParamSet.cfpPeriod = pMlmStartReq->cfParamSet.cfpPeriod;
1648 pAddBssParams->cfParamSet.cfpMaxDuration = pMlmStartReq->cfParamSet.cfpMaxDuration;
1649 pAddBssParams->cfParamSet.cfpDurRemaining = pMlmStartReq->cfParamSet.cfpDurRemaining;
1650
1651 pAddBssParams->rateSet.numRates = pMlmStartReq->rateSet.numRates;
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301652 vos_mem_copy(pAddBssParams->rateSet.rate,
1653 pMlmStartReq->rateSet.rate, pMlmStartReq->rateSet.numRates);
Jeff Johnson295189b2012-06-20 16:38:30 -07001654
1655 pAddBssParams->nwType = pMlmStartReq->nwType;
1656
1657 pAddBssParams->htCapable = pMlmStartReq->htCapable;
Jeff Johnsone7245742012-09-05 17:12:55 -07001658#ifdef WLAN_FEATURE_11AC
1659 pAddBssParams->vhtCapable = psessionEntry->vhtCapability;
1660 pAddBssParams->vhtTxChannelWidthSet = psessionEntry->vhtTxChannelWidthSet;
1661#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001662 pAddBssParams->htOperMode = pMlmStartReq->htOperMode;
1663 pAddBssParams->dualCTSProtection = pMlmStartReq->dualCTSProtection;
1664 pAddBssParams->txChannelWidthSet = pMlmStartReq->txChannelWidthSet;
1665
1666 pAddBssParams->currentOperChannel = pMlmStartReq->channelNumber;
Jeff Johnsone7245742012-09-05 17:12:55 -07001667 pAddBssParams->currentExtChannel = pMlmStartReq->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07001668
1669 /* Update PE sessionId*/
1670 pAddBssParams->sessionId = pMlmStartReq->sessionId;
1671
1672 //Send the SSID to HAL to enable SSID matching for IBSS
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301673 vos_mem_copy(&(pAddBssParams->ssId.ssId),
1674 pMlmStartReq->ssId.ssId,
1675 pMlmStartReq->ssId.length);
Jeff Johnson295189b2012-06-20 16:38:30 -07001676 pAddBssParams->ssId.length = pMlmStartReq->ssId.length;
Jeff Johnson295189b2012-06-20 16:38:30 -07001677 pAddBssParams->bHiddenSSIDEn = pMlmStartReq->ssidHidden;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001678 limLog( pMac, LOGE, FL( "TRYING TO HIDE SSID %d" ),pAddBssParams->bHiddenSSIDEn);
Jeff Johnson295189b2012-06-20 16:38:30 -07001679 // CR309183. Disable Proxy Probe Rsp. Host handles Probe Requests. Until FW fixed.
1680 pAddBssParams->bProxyProbeRespEn = 0;
1681 pAddBssParams->obssProtEnabled = pMlmStartReq->obssProtEnabled;
1682
Jeff Johnson295189b2012-06-20 16:38:30 -07001683#if defined WLAN_FEATURE_VOWIFI
1684 pAddBssParams->maxTxPower = psessionEntry->maxTxPower;
1685#endif
1686 mlm_add_sta(pMac, &pAddBssParams->staContext,
1687 pAddBssParams->bssId, pAddBssParams->htCapable,psessionEntry);
1688
1689 pAddBssParams->status = eHAL_STATUS_SUCCESS;
1690 pAddBssParams->respReqd = 1;
1691
1692 // Set a new state for MLME
1693 psessionEntry->limMlmState = eLIM_MLM_WT_ADD_BSS_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07001694 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07001695
1696 pAddBssParams->halPersona=psessionEntry->pePersona; //pass on the session persona to hal
1697
1698 pAddBssParams->bSpectrumMgtEnabled = psessionEntry->spectrumMgtEnabled;
1699
1700#if defined WLAN_FEATURE_VOWIFI_11R
1701 pAddBssParams->extSetStaKeyParamValid = 0;
1702#endif
1703
Chet Lanctot4b9abd72013-06-27 11:14:56 -07001704#ifdef WLAN_FEATURE_11W
1705 pAddBssParams->rmfEnabled = (psessionEntry->gStartBssRSNIe.RSN_Cap[0] >> 7) & 0x1;
1706 limLog( pMac, LOG1, FL("PMF capable value for BSS is %d"), pAddBssParams->rmfEnabled);
1707#endif
1708
Jeff Johnson295189b2012-06-20 16:38:30 -07001709 //
1710 // FIXME_GEN4
1711 // A global counter (dialog token) is required to keep track of
1712 // all PE <-> HAL communication(s)
1713 //
1714 msgQ.type = WDA_ADD_BSS_REQ;
1715 msgQ.reserved = 0;
1716 msgQ.bodyptr = pAddBssParams;
1717 msgQ.bodyval = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001718 MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001719
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001720 limLog( pMac, LOGW, FL( "Sending WDA_ADD_BSS_REQ..." ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001721 if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
1722 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001723 limLog( pMac, LOGE, FL("Posting ADD_BSS_REQ to HAL failed, reason=%X"), retCode );
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301724 vos_mem_free(pAddBssParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07001725 return eSIR_SME_HAL_SEND_MESSAGE_FAIL;
1726 }
1727
1728 return eSIR_SME_SUCCESS;
1729}
1730
1731
1732/**
1733 * limProcessMlmStartReq()
1734 *
1735 *FUNCTION:
1736 * This function is called to process MLM_START_REQ message
1737 * from SME
1738 *
1739 *LOGIC:
1740 * 1) MLME receives LIM_MLM_START_REQ from LIM
1741 * 2) MLME sends WDA_ADD_BSS_REQ to HAL
1742 * 3) MLME changes state to eLIM_MLM_WT_ADD_BSS_RSP_STATE
1743 * MLME now waits for HAL to send WDA_ADD_BSS_RSP
1744 *
1745 *ASSUMPTIONS:
1746 *
1747 *NOTE:
1748 *
1749 * @param pMac Pointer to Global MAC structure
1750 * @param *pMsgBuf A pointer to the MLM message buffer
1751 * @return None
1752 */
1753
1754static void
1755limProcessMlmStartReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
1756{
1757 tLimMlmStartReq *pMlmStartReq;
1758 tLimMlmStartCnf mlmStartCnf;
1759 tpPESession psessionEntry = NULL;
1760
1761 if(pMsgBuf == NULL)
1762 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001763 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001764 return;
1765 }
1766
1767 pMlmStartReq = (tLimMlmStartReq *) pMsgBuf;
1768 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmStartReq->sessionId))==NULL)
1769 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001770 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001771 mlmStartCnf.resultCode = eSIR_SME_REFUSED;
1772 goto end;
1773 }
1774
1775 if (psessionEntry->limMlmState != eLIM_MLM_IDLE_STATE)
1776 {
1777 /**
1778 * Should not have received Start req in states other than idle.
1779 * Return Start confirm with failure code.
1780 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001781 PELOGE(limLog(pMac, LOGE, FL("received unexpected MLM_START_REQ in state %X"),psessionEntry->limMlmState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001782 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
1783 mlmStartCnf.resultCode = eSIR_SME_BSS_ALREADY_STARTED_OR_JOINED;
1784 goto end;
1785 }
1786
1787 #if 0
1788 if (cfgSetInt(pMac, WNI_CFG_CURRENT_CHANNEL, pMlmStartReq->channelNumber)!= eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001789 limLog(pMac, LOGP, FL("could not set CURRENT_CHANNEL at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001790
1791 pMac->lim.gLimCurrentChannelId = pMlmStartReq->channelNumber;
1792 #endif //TO SUPPORT BT-AMP
1793
1794
1795 // Update BSSID & SSID at CFG database
1796 #if 0 //We are not using the BSSID and SSID from the config file, instead we are reading form the session table
1797 if (cfgSetStr(pMac, WNI_CFG_BSSID, (tANI_U8 *) pMlmStartReq->bssId, sizeof(tSirMacAddr))
1798 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001799 limLog(pMac, LOGP, FL("could not update BSSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001800
1801
1802
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301803 vos_mem_copy( pMac->lim.gLimCurrentBssId,
Jeff Johnson295189b2012-06-20 16:38:30 -07001804 pMlmStartReq->bssId,
1805 sizeof(tSirMacAddr));
1806 #endif //TO SUPPORT BT-AMP
1807
1808 #if 0
1809 if (cfgSetStr(pMac, WNI_CFG_SSID, (tANI_U8 *) &pMlmStartReq->ssId.ssId, pMlmStartReq->ssId.length)
1810 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001811 limLog(pMac, LOGP, FL("could not update SSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001812 #endif //To SUPPORT BT-AMP
1813
1814
1815 // pMac->lim.gLimCurrentSSID.length = pMlmStartReq->ssId.length;
1816
1817 #if 0
1818 if (cfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET,
1819 (tANI_U8 *) &pMac->lim.gpLimStartBssReq->operationalRateSet.rate,
1820 pMac->lim.gpLimStartBssReq->operationalRateSet.numRates)
1821 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001822 limLog(pMac, LOGP, FL("could not update Operational Rateset at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001823 #endif //TO SUPPORT BT-AMP
1824
1825
Jeff Johnson295189b2012-06-20 16:38:30 -07001826
Jeff Johnson295189b2012-06-20 16:38:30 -07001827#if 0 // Periodic timer for remove WPS PBC proble response entry in PE is disbaled now.
1828 if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
1829 {
1830 if(pMac->lim.limTimers.gLimWPSOverlapTimerObj.isTimerCreated == eANI_BOOLEAN_FALSE)
1831 {
1832 if (tx_timer_create(&pMac->lim.limTimers.gLimWPSOverlapTimerObj.gLimWPSOverlapTimer,
1833 "PS OVERLAP Timer",
1834 limWPSOverlapTimerHandler,
1835 SIR_LIM_WPS_OVERLAP_TIMEOUT, // expiration_input
1836 SYS_MS_TO_TICKS(LIM_WPS_OVERLAP_TIMER_MS), // initial_ticks
1837 SYS_MS_TO_TICKS(LIM_WPS_OVERLAP_TIMER_MS), // reschedule_ticks
1838 TX_AUTO_ACTIVATE /* TX_NO_ACTIVATE*/) != TX_SUCCESS)
1839 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001840 limLog(pMac, LOGP, FL("failed to create WPS overlap Timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001841 }
1842
1843 pMac->lim.limTimers.gLimWPSOverlapTimerObj.sessionId = pMlmStartReq->sessionId;
1844 pMac->lim.limTimers.gLimWPSOverlapTimerObj.isTimerCreated = eANI_BOOLEAN_TRUE;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001845 limLog(pMac, LOGE, FL("Create WPS overlap Timer, session=%d"), pMlmStartReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07001846
1847 if (tx_timer_activate(&pMac->lim.limTimers.gLimWPSOverlapTimerObj.gLimWPSOverlapTimer) != TX_SUCCESS)
1848 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001849 limLog(pMac, LOGP, FL("tx_timer_activate failed"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001850 }
1851 }
1852 }
1853#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001854
1855
1856
1857 mlmStartCnf.resultCode = limMlmAddBss(pMac, pMlmStartReq,psessionEntry);
1858
1859end:
1860 /* Update PE session Id */
1861 mlmStartCnf.sessionId = pMlmStartReq->sessionId;
1862
1863 /// Free up buffer allocated for LimMlmScanReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301864 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07001865
1866 //
1867 // Respond immediately to LIM, only if MLME has not been
1868 // successfully able to send WDA_ADD_BSS_REQ to HAL.
1869 // Else, LIM_MLM_START_CNF will be sent after receiving
1870 // WDA_ADD_BSS_RSP from HAL
1871 //
1872 if( eSIR_SME_SUCCESS != mlmStartCnf.resultCode )
1873 limPostSmeMessage(pMac, LIM_MLM_START_CNF, (tANI_U32 *) &mlmStartCnf);
1874} /*** limProcessMlmStartReq() ***/
1875
1876
1877/*
1878* This function checks if Scan is allowed or not.
1879* It checks each session and if any session is not in the normal state,
1880* it will return false.
1881* Note: BTAMP_STA can be in LINK_EST as well as BSS_STARTED State, so
1882* both cases are handled below.
1883*/
1884
1885static tANI_U8 __limMlmScanAllowed(tpAniSirGlobal pMac)
1886{
1887 int i;
1888
Jeff Johnson43971f52012-07-17 12:26:56 -07001889 if(pMac->lim.gLimMlmState != eLIM_MLM_IDLE_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07001890 {
1891 return FALSE;
1892 }
1893 for(i =0; i < pMac->lim.maxBssId; i++)
1894 {
1895 if(pMac->lim.gpSession[i].valid == TRUE)
1896 {
1897 if(!( ( ( (pMac->lim.gpSession[i].bssType == eSIR_INFRASTRUCTURE_MODE) ||
1898 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_STA_ROLE))&&
1899 (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE) )||
1900
1901 ( ( (pMac->lim.gpSession[i].bssType == eSIR_IBSS_MODE)||
1902 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_AP_ROLE)||
1903 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_STA_ROLE) )&&
1904 (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_BSS_STARTED_STATE) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001905 || ( ( ( (pMac->lim.gpSession[i].bssType == eSIR_INFRA_AP_MODE)
1906 && ( pMac->lim.gpSession[i].pePersona == VOS_P2P_GO_MODE) )
1907 || (pMac->lim.gpSession[i].limSystemRole == eLIM_AP_ROLE) )
1908 && (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_BSS_STARTED_STATE) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001909 ))
1910 {
1911 return FALSE;
1912
1913 }
1914 }
1915 }
1916
1917 return TRUE;
1918}
1919
1920
1921
1922/**
1923 * limProcessMlmScanReq()
1924 *
1925 *FUNCTION:
1926 * This function is called to process MLM_SCAN_REQ message
1927 * from SME
1928 *
1929 *LOGIC:
1930 *
1931 *ASSUMPTIONS:
1932 *
1933 *NOTE:
1934 *
1935 * @param pMac Pointer to Global MAC structure
1936 * @param *pMsgBuf A pointer to the MLM message buffer
1937 * @return None
1938 */
1939
1940static void
1941limProcessMlmScanReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
1942{
1943 tLimMlmScanCnf mlmScanCnf;
Maleka Vinayd500cd42012-12-10 12:37:09 -08001944 tANI_U8 i = 0;
1945 tANI_U32 val = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001946
1947 if (pMac->lim.gLimSystemInScanLearnMode)
1948 {
1949 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001950 FL("Sending START_SCAN from LIM while one req is pending"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301951 vos_mem_free(pMsgBuf);
Madan Mohan Koyyalamudid4b301b2012-10-11 14:15:54 -07001952 /*Send back a failure*/
1953 mlmScanCnf.resultCode = eSIR_SME_SCAN_FAILED;
1954 mlmScanCnf.scanResultLength = 0;
1955 limPostSmeMessage(pMac,
1956 LIM_MLM_SCAN_CNF,
1957 (tANI_U32 *) &mlmScanCnf);
Jeff Johnson295189b2012-06-20 16:38:30 -07001958 return;
1959 }
1960
1961 if(__limMlmScanAllowed(pMac) &&
1962 (((tLimMlmScanReq *) pMsgBuf)->channelList.numChannels != 0))
1963
1964 {
1965 /// Hold onto SCAN REQ criteria
1966 pMac->lim.gpLimMlmScanReq = (tLimMlmScanReq *) pMsgBuf;
1967
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001968 PELOG3(limLog(pMac, LOG3, FL("Number of channels to scan are %d "),
Jeff Johnson295189b2012-06-20 16:38:30 -07001969 pMac->lim.gpLimMlmScanReq->channelList.numChannels);)
1970
1971 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
1972
1973 if (pMac->lim.gpLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN)
1974 pMac->lim.gLimMlmState = eLIM_MLM_WT_PROBE_RESP_STATE;
1975 else // eSIR_PASSIVE_SCAN
1976 pMac->lim.gLimMlmState = eLIM_MLM_PASSIVE_SCAN_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07001977 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07001978
1979 pMac->lim.gLimSystemInScanLearnMode = 1;
1980
Maleka Vinayd500cd42012-12-10 12:37:09 -08001981 /* temporary fix to handle case where NOA duration calculation is incorrect
1982 * for scanning on DFS channels */
1983
1984 pMac->lim.gTotalScanDuration = 0;
1985
1986 if (wlan_cfgGetInt(pMac, WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME, &val) != eSIR_SUCCESS)
1987 {
1988 /*
1989 * Could not get max channel value
1990 * from CFG. Log error.
1991 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001992 limLog(pMac, LOGP, FL("could not retrieve passive max channel value"));
Maleka Vinayd500cd42012-12-10 12:37:09 -08001993
1994 /* use a default value of 110ms */
1995 val = 110;
1996 }
1997
1998 for (i = 0; i < pMac->lim.gpLimMlmScanReq->channelList.numChannels; i++) {
1999 tANI_U8 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[i];
2000
2001 if (limActiveScanAllowed(pMac, channelNum)) {
2002 /* Use min + max channel time to calculate the total duration of scan */
2003 pMac->lim.gTotalScanDuration += pMac->lim.gpLimMlmScanReq->minChannelTime + pMac->lim.gpLimMlmScanReq->maxChannelTime;
2004 } else {
2005 /* using the value from WNI_CFG_PASSIVE_MINIMUM_CHANNEL_TIME as is done in
2006 * void limContinuePostChannelScan(tpAniSirGlobal pMac)
2007 */
2008 pMac->lim.gTotalScanDuration += val;
2009 }
2010 }
2011
2012 /* Adding an overhead of 5ms to account for the scan messaging delays */
2013 pMac->lim.gTotalScanDuration += 5;
Jeff Johnson295189b2012-06-20 16:38:30 -07002014 limSetScanMode(pMac);
2015 }
2016 else
2017 {
2018 /**
2019 * Should not have received SCAN req in other states
2020 * OR should not have received LIM_MLM_SCAN_REQ with
2021 * zero number of channels
2022 * Log error
2023 */
2024 limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002025 FL("received unexpected MLM_SCAN_REQ in state %X OR zero number of channels: %X"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002026 pMac->lim.gLimMlmState, ((tLimMlmScanReq *) pMsgBuf)->channelList.numChannels);
2027 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
2028
2029 /// Free up buffer allocated for
2030 /// pMac->lim.gLimMlmScanReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302031 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07002032
2033 /// Return Scan confirm with INVALID_PARAMETERS
2034
2035 mlmScanCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2036 mlmScanCnf.scanResultLength = 0;
2037 limPostSmeMessage(pMac,
2038 LIM_MLM_SCAN_CNF,
2039 (tANI_U32 *) &mlmScanCnf);
2040 }
2041} /*** limProcessMlmScanReq() ***/
2042
Jeff Johnsone7245742012-09-05 17:12:55 -07002043#ifdef FEATURE_OEM_DATA_SUPPORT
2044static void limProcessMlmOemDataReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2045{
2046 tLimMlmOemDataRsp* pMlmOemDataRsp;
2047
2048 if (((pMac->lim.gLimMlmState == eLIM_MLM_IDLE_STATE) ||
2049 (pMac->lim.gLimMlmState == eLIM_MLM_JOINED_STATE) ||
2050 (pMac->lim.gLimMlmState == eLIM_MLM_AUTHENTICATED_STATE) ||
2051 (pMac->lim.gLimMlmState == eLIM_MLM_BSS_STARTED_STATE) ||
2052 (pMac->lim.gLimMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)))
2053 {
2054 //Hold onto the oem data request criteria
2055 pMac->lim.gpLimMlmOemDataReq = (tLimMlmOemDataReq*)pMsgBuf;
2056
2057 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
2058
2059 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
2060
2061 //Now request for link suspension
2062 limSuspendLink(pMac, eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN, limSetOemDataReqMode, NULL);
2063 }
2064 else
2065 {
2066 /**
2067 * Should not have received oem data req in other states
2068 * Log error
2069 */
2070
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002071 PELOGW(limLog(pMac, LOGW, FL("OEM_DATA: unexpected LIM_MLM_OEM_DATA_REQ in invalid state %X"),pMac->lim.gLimMlmState);)
Jeff Johnsone7245742012-09-05 17:12:55 -07002072
2073 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
2074
2075 /// Free up buffer allocated
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302076 vos_mem_free(pMsgBuf);
Jeff Johnsone7245742012-09-05 17:12:55 -07002077
2078 /// Return Meas confirm with INVALID_PARAMETERS
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302079 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
2080 if ( pMlmOemDataRsp != NULL)
Jeff Johnsone7245742012-09-05 17:12:55 -07002081 {
2082 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302083 vos_mem_free(pMlmOemDataRsp);
Jeff Johnsone7245742012-09-05 17:12:55 -07002084 }
2085 else
2086 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002087 limLog(pMac, LOGP, FL("Could not allocate memory for pMlmOemDataRsp"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002088 return;
2089 }
2090 }
2091
2092 return;
2093}
2094#endif //FEATURE_OEM_DATA_SUPPORT
Jeff Johnson295189b2012-06-20 16:38:30 -07002095
2096
2097/**
2098 * limProcessMlmPostJoinSuspendLink()
2099 *
2100 *FUNCTION:
2101 * This function is called after the suspend link while joining
2102 * off channel.
2103 *
2104 *LOGIC:
2105 * Check for suspend state.
2106 * If success, proceed with setting link state to recieve the
2107 * probe response/beacon from intended AP.
2108 * Switch to the APs channel.
2109 * On an error case, send the MLM_JOIN_CNF with error status.
2110 *
2111 *ASSUMPTIONS:
2112 *
2113 *NOTE:
2114 *
2115 * @param pMac Pointer to Global MAC structure
2116 * @param status status of suspend link.
2117 * @param ctx passed while calling suspend link(psessionEntry)
2118 * @return None
2119 */
2120static void
2121limProcessMlmPostJoinSuspendLink(tpAniSirGlobal pMac, eHalStatus status, tANI_U32 *ctx)
2122{
Jeff Johnsone7245742012-09-05 17:12:55 -07002123 tANI_U8 chanNum, secChanOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002124 tLimMlmJoinCnf mlmJoinCnf;
2125 tpPESession psessionEntry = (tpPESession)ctx;
2126 tSirLinkState linkState;
2127
2128 if( eHAL_STATUS_SUCCESS != status )
2129 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002130 limLog(pMac, LOGE, FL("Suspend link(NOTIFY_BSS) failed. still proceeding with join"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002131 }
2132 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2133 psessionEntry->limMlmState = eLIM_MLM_WT_JOIN_BEACON_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002134 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002135
2136 limDeactivateAndChangeTimer(pMac, eLIM_JOIN_FAIL_TIMER);
2137
2138 //assign appropriate sessionId to the timer object
2139 pMac->lim.limTimers.gLimJoinFailureTimer.sessionId = psessionEntry->peSessionId;
2140
2141 linkState = ((psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE) ? eSIR_LINK_BTAMP_PREASSOC_STATE : eSIR_LINK_PREASSOC_STATE);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002142 limLog(pMac, LOG1, FL("[limProcessMlmJoinReq]: linkState:%d"),linkState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002143
2144 if (limSetLinkState(pMac, linkState,
2145 psessionEntry->pLimMlmJoinReq->bssDescription.bssId,
2146 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS )
2147 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002148 limLog(pMac, LOGE, FL("limSetLinkState to eSIR_LINK_PREASSOC_STATE Failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002149 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002150 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
2151 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002152 goto error;
2153 }
2154
2155 /** Derive channel from BSS description and store it in the CFG */
2156 // chanNum = pMac->lim.gpLimMlmJoinReq->bssDescription.channelId;
2157
2158 chanNum = psessionEntry->currentOperChannel;
Jeff Johnsone7245742012-09-05 17:12:55 -07002159 secChanOffset = psessionEntry->htSecondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002160 //store the channel switch sessionEntry in the lim global var
2161 psessionEntry->channelChangeReasonCode = LIM_SWITCH_CHANNEL_JOIN;
Madan Mohan Koyyalamudi61bc5662012-11-02 14:33:10 -07002162#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
2163 psessionEntry->pLimMlmReassocRetryReq = NULL;
2164#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002165
Jeff Johnsone7245742012-09-05 17:12:55 -07002166 limSetChannel(pMac, chanNum, secChanOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002167
2168 return;
2169error:
2170 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2171 mlmJoinCnf.sessionId = psessionEntry->peSessionId;
2172 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2173 limPostSmeMessage(pMac, LIM_MLM_JOIN_CNF, (tANI_U32 *) &mlmJoinCnf);
2174
2175}
2176
2177
2178
2179/**
2180 * limProcessMlmJoinReq()
2181 *
2182 *FUNCTION:
2183 * This function is called to process MLM_JOIN_REQ message
2184 * from SME
2185 *
2186 *LOGIC:
2187 * 1) Initialize LIM, HAL, DPH
2188 * 2) Configure the BSS for which the JOIN REQ was received
2189 * a) Send WDA_ADD_BSS_REQ to HAL -
2190 * This will identify the BSS that we are interested in
2191 * --AND--
2192 * Add a STA entry for the AP (in a STA context)
2193 * b) Wait for WDA_ADD_BSS_RSP
2194 * c) Send WDA_ADD_STA_REQ to HAL
2195 * This will add the "local STA" entry to the STA table
2196 * 3) Continue as before, i.e,
2197 * a) Send a PROBE REQ
2198 * b) Wait for PROBE RSP/BEACON containing the SSID that
2199 * we are interested in
2200 * c) Then start an AUTH seq
2201 * d) Followed by the ASSOC seq
2202 *
2203 *ASSUMPTIONS:
2204 *
2205 *NOTE:
2206 *
2207 * @param pMac Pointer to Global MAC structure
2208 * @param *pMsgBuf A pointer to the MLM message buffer
2209 * @return None
2210 */
2211
2212static void
2213limProcessMlmJoinReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2214{
2215 tLimMlmJoinCnf mlmJoinCnf;
2216 tANI_U8 sessionId;
2217 tpPESession psessionEntry;
2218
2219 sessionId = ((tpLimMlmJoinReq)pMsgBuf)->sessionId;
2220
2221 if((psessionEntry = peFindSessionBySessionId(pMac,sessionId))== NULL)
2222 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002223 limLog(pMac, LOGP, FL("session does not exist for given sessionId"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002224
2225 goto error;
2226 }
2227
2228 if (( (psessionEntry->limSystemRole != eLIM_AP_ROLE ) && (psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE )) &&
2229 ( (psessionEntry->limMlmState == eLIM_MLM_IDLE_STATE) ||
2230 (psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE)) &&
2231 (SIR_MAC_GET_ESS( ((tpLimMlmJoinReq) pMsgBuf)->bssDescription.capabilityInfo) !=
2232 SIR_MAC_GET_IBSS( ((tpLimMlmJoinReq) pMsgBuf)->bssDescription.capabilityInfo)))
2233 {
2234 #if 0
2235 if (pMac->lim.gpLimMlmJoinReq)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302236 vos_mem_free(pMac->lim.gpLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002237 #endif //TO SUPPORT BT-AMP , review 23sep
2238
2239 /// Hold onto Join request parameters
2240
2241 psessionEntry->pLimMlmJoinReq =(tpLimMlmJoinReq) pMsgBuf;
2242
2243 if( isLimSessionOffChannel(pMac, sessionId) )
2244 {
2245 //suspend link
2246 limSuspendLink(pMac, eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN,
2247 limProcessMlmPostJoinSuspendLink, (tANI_U32*)psessionEntry );
2248 }
2249 else
2250 {
2251 //No need to suspend link.
2252 limProcessMlmPostJoinSuspendLink( pMac, eHAL_STATUS_SUCCESS,
2253 (tANI_U32*) psessionEntry );
2254 }
2255
2256 return;
2257 }
2258 else
2259 {
2260 /**
2261 * Should not have received JOIN req in states other than
2262 * Idle state or on AP.
2263 * Return join confirm with invalid parameters code.
2264 */
2265 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002266 FL("Unexpected Join request for role %d state %X"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002267 psessionEntry->limSystemRole,
2268 psessionEntry->limMlmState);)
2269 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
2270
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002271 limLog(pMac, LOGE, FL("Unexpected Join request for role %d state %X"),
Jeff Johnsone7245742012-09-05 17:12:55 -07002272 psessionEntry->limSystemRole, psessionEntry->limMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002273 }
2274
2275error:
2276
2277
2278 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2279 mlmJoinCnf.sessionId = sessionId;
2280 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2281 limPostSmeMessage(pMac, LIM_MLM_JOIN_CNF, (tANI_U32 *) &mlmJoinCnf);
2282
2283
2284} /*** limProcessMlmJoinReq() ***/
2285
2286
2287
2288/**
2289 * limProcessMlmAuthReq()
2290 *
2291 *FUNCTION:
2292 * This function is called to process MLM_AUTH_REQ message
2293 * from SME
2294 *
2295 *LOGIC:
2296 *
2297 *ASSUMPTIONS:
2298 *
2299 *NOTE:
2300 *
2301 * @param pMac Pointer to Global MAC structure
2302 * @param *pMsgBuf A pointer to the MLM message buffer
2303 * @return None
2304 */
2305
2306static void
2307limProcessMlmAuthReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2308{
2309 tANI_U32 numPreAuthContexts;
2310 tSirMacAddr currentBssId;
2311 tSirMacAuthFrameBody authFrameBody;
2312 tLimMlmAuthCnf mlmAuthCnf;
2313 struct tLimPreAuthNode *preAuthNode;
2314 tpDphHashNode pStaDs;
2315 tANI_U8 sessionId;
2316 tpPESession psessionEntry;
2317
2318 if(pMsgBuf == NULL)
2319 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002320 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002321 return;
2322 }
2323
2324 pMac->lim.gpLimMlmAuthReq = (tLimMlmAuthReq *) pMsgBuf;
2325 sessionId = pMac->lim.gpLimMlmAuthReq->sessionId;
2326 if((psessionEntry= peFindSessionBySessionId(pMac,sessionId) )== NULL)
2327 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002328 limLog(pMac, LOGP, FL("Session Does not exist for given sessionId"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002329 return;
2330 }
2331
2332 /**
2333 * Expect Auth request only when:
2334 * 1. STA joined/associated with a BSS or
2335 * 2. STA is in IBSS mode
2336 * and STA is going to authenticate with a unicast
2337 * adress and requested authentication algorithm is
2338 * supported.
2339 */
2340 #if 0
2341 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2342 eSIR_SUCCESS)
2343 {
2344 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002345 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002346 }
2347 #endif //To SuppoRT BT-AMP
2348
2349 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2350
2351 if (((((psessionEntry->limSystemRole== eLIM_STA_ROLE) || (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)) &&
2352 ((psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE) ||
2353 (psessionEntry->limMlmState ==
2354 eLIM_MLM_LINK_ESTABLISHED_STATE))) ||
2355 ((psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE) &&
2356 (psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE))) &&
2357 (limIsGroupAddr(pMac->lim.gpLimMlmAuthReq->peerMacAddr)
2358 == false) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07002359 (limIsAuthAlgoSupported(
2360 pMac,
2361 pMac->lim.gpLimMlmAuthReq->authType,
2362 psessionEntry) == true)
Jeff Johnson295189b2012-06-20 16:38:30 -07002363 )
2364 {
2365 /**
2366 * This is a request for pre-authentication.
2367 * Check if there exists context already for
Jeff Johnson1250df42012-12-10 14:31:52 -08002368 * the requested peer OR
Jeff Johnson295189b2012-06-20 16:38:30 -07002369 * if this request is for the AP we're currently
2370 * associated with.
2371 * If yes, return auth confirm immediately when
2372 * requested auth type is same as the one used before.
2373 */
2374 if ((((psessionEntry->limSystemRole == eLIM_STA_ROLE) ||(psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE) )&&
2375 (psessionEntry->limMlmState ==
2376 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
2377 (((pStaDs = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable)) != NULL) &&
2378 (pMac->lim.gpLimMlmAuthReq->authType ==
2379 pStaDs->mlmStaContext.authType)) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302380 (vos_mem_compare(pMac->lim.gpLimMlmAuthReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002381 currentBssId,
2382 sizeof(tSirMacAddr)) )) ||
2383 (((preAuthNode =
2384 limSearchPreAuthList(
2385 pMac,
2386 pMac->lim.gpLimMlmAuthReq->peerMacAddr)) != NULL) &&
2387 (preAuthNode->authType ==
2388 pMac->lim.gpLimMlmAuthReq->authType)))
2389 {
2390 PELOG2(limLog(pMac, LOG2,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002391 FL("Already have pre-auth context with peer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002392 limPrintMacAddr(pMac, pMac->lim.gpLimMlmAuthReq->peerMacAddr,
2393 LOG2);)
2394
2395 mlmAuthCnf.resultCode = (tSirResultCodes)
2396 eSIR_MAC_SUCCESS_STATUS;
2397
2398
2399 goto end;
2400 }
2401 else
2402 {
2403 if (wlan_cfgGetInt(pMac, WNI_CFG_MAX_NUM_PRE_AUTH,
2404 (tANI_U32 *) &numPreAuthContexts) != eSIR_SUCCESS)
2405 {
2406 limLog(pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002407 FL("Could not retrieve NumPreAuthLimit from CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002408 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002409
2410 if (pMac->lim.gLimNumPreAuthContexts == numPreAuthContexts)
2411 {
2412 PELOGW(limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002413 FL("Number of pre-auth reached max limit"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002414
2415 /// Return Auth confirm with reject code
2416 mlmAuthCnf.resultCode =
2417 eSIR_SME_MAX_NUM_OF_PRE_AUTH_REACHED;
2418
2419 goto end;
2420 }
2421 }
2422
2423 // Delete pre-auth node if exists
2424 if (preAuthNode)
2425 limDeletePreAuthNode(pMac,
2426 pMac->lim.gpLimMlmAuthReq->peerMacAddr);
2427
Jeff Johnson295189b2012-06-20 16:38:30 -07002428 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2429 psessionEntry->limMlmState = eLIM_MLM_WT_AUTH_FRAME2_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002430 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002431
2432 /// Prepare & send Authentication frame
2433 authFrameBody.authAlgoNumber =
2434 (tANI_U8) pMac->lim.gpLimMlmAuthReq->authType;
2435 authFrameBody.authTransactionSeqNumber = SIR_MAC_AUTH_FRAME_1;
2436 authFrameBody.authStatusCode = 0;
2437 limSendAuthMgmtFrame(pMac,
2438 &authFrameBody,
2439 pMac->lim.gpLimMlmAuthReq->peerMacAddr,
2440 LIM_NO_WEP_IN_FC,psessionEntry);
2441
Jeff Johnsone7245742012-09-05 17:12:55 -07002442 //assign appropriate sessionId to the timer object
2443 pMac->lim.limTimers.gLimAuthFailureTimer.sessionId = sessionId;
2444
2445 // Activate Auth failure timer
2446 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_AUTH_FAIL_TIMER));
2447 if (tx_timer_activate(&pMac->lim.limTimers.gLimAuthFailureTimer)
2448 != TX_SUCCESS)
2449 {
2450 /// Could not start Auth failure timer.
2451 // Log error
2452 limLog(pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002453 FL("could not start Auth failure timer"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002454 // Cleanup as if auth timer expired
2455 limProcessAuthFailureTimeout(pMac);
2456 }
2457
Jeff Johnson295189b2012-06-20 16:38:30 -07002458 return;
2459 }
2460 else
2461 {
2462 /**
2463 * Unexpected auth request.
2464 * Return Auth confirm with Invalid parameters code.
2465 */
2466 mlmAuthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2467
2468 goto end;
2469 }
2470
2471end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302472 vos_mem_copy((tANI_U8 *) &mlmAuthCnf.peerMacAddr,
2473 (tANI_U8 *) &pMac->lim.gpLimMlmAuthReq->peerMacAddr,
2474 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002475
2476 mlmAuthCnf.authType = pMac->lim.gpLimMlmAuthReq->authType;
2477 mlmAuthCnf.sessionId = sessionId;
2478
2479 /// Free up buffer allocated
2480 /// for pMac->lim.gLimMlmAuthReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302481 vos_mem_free( pMac->lim.gpLimMlmAuthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002482 pMac->lim.gpLimMlmAuthReq = NULL;
2483 limPostSmeMessage(pMac, LIM_MLM_AUTH_CNF, (tANI_U32 *) &mlmAuthCnf);
2484} /*** limProcessMlmAuthReq() ***/
2485
2486
2487
2488/**
2489 * limProcessMlmAssocReq()
2490 *
2491 *FUNCTION:
2492 * This function is called to process MLM_ASSOC_REQ message
2493 * from SME
2494 *
2495 *LOGIC:
2496 *
2497 *ASSUMPTIONS:
2498 *
2499 *NOTE:
2500 *
2501 * @param pMac Pointer to Global MAC structure
2502 * @param *pMsgBuf A pointer to the MLM message buffer
2503 * @return None
2504 */
2505
2506static void
2507limProcessMlmAssocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2508{
2509 tSirMacAddr currentBssId;
2510 tLimMlmAssocReq *pMlmAssocReq;
2511 tLimMlmAssocCnf mlmAssocCnf;
2512 tpPESession psessionEntry;
2513 // tANI_U8 sessionId;
2514
2515 if(pMsgBuf == NULL)
2516 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002517 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002518 return;
2519 }
2520 pMlmAssocReq = (tLimMlmAssocReq *) pMsgBuf;
2521
2522 if( (psessionEntry = peFindSessionBySessionId(pMac,pMlmAssocReq->sessionId) )== NULL)
2523 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002524 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302525 vos_mem_free(pMlmAssocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002526 return;
2527 }
2528
2529 #if 0
2530 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2531 eSIR_SUCCESS)
2532 {
2533 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002534 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002535 }
2536 #endif //TO SUPPORT BT-AMP
2537 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2538
2539 if ( (psessionEntry->limSystemRole != eLIM_AP_ROLE && psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE) &&
2540 (psessionEntry->limMlmState == eLIM_MLM_AUTHENTICATED_STATE || psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302541 (vos_mem_compare(pMlmAssocReq->peerMacAddr, currentBssId, sizeof(tSirMacAddr))) )
Jeff Johnson295189b2012-06-20 16:38:30 -07002542 {
Jeff Johnsone7245742012-09-05 17:12:55 -07002543
Jeff Johnson295189b2012-06-20 16:38:30 -07002544 /// map the session entry pointer to the AssocFailureTimer
2545 pMac->lim.limTimers.gLimAssocFailureTimer.sessionId = pMlmAssocReq->sessionId;
2546
Jeff Johnson295189b2012-06-20 16:38:30 -07002547 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2548 psessionEntry->limMlmState = eLIM_MLM_WT_ASSOC_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002549 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002550
2551 /// Prepare and send Association request frame
2552 limSendAssocReqMgmtFrame(pMac, pMlmAssocReq,psessionEntry);
2553
2554 //Set the link state to postAssoc, so HW can start receiving frames from AP.
2555 if ((psessionEntry->bssType == eSIR_BTAMP_STA_MODE)||
2556 ((psessionEntry->bssType == eSIR_BTAMP_AP_MODE) && (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)))
2557 {
2558 if(limSetLinkState(pMac, eSIR_LINK_BTAMP_POSTASSOC_STATE, currentBssId,
2559 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002560 PELOGE(limLog(pMac, LOGE, FL("Failed to set the LinkState"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002561 }
Jeff Johnsone7245742012-09-05 17:12:55 -07002562 /// Start association failure timer
2563 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_ASSOC_FAIL_TIMER));
2564 if (tx_timer_activate(&pMac->lim.limTimers.gLimAssocFailureTimer)
2565 != TX_SUCCESS)
2566 {
2567 /// Could not start Assoc failure timer.
2568 // Log error
2569 limLog(pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002570 FL("could not start Association failure timer"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002571 // Cleanup as if assoc timer expired
2572 limProcessAssocFailureTimeout(pMac,LIM_ASSOC );
2573
2574 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002575
2576 return;
2577 }
2578 else
2579 {
2580 /**
2581 * Received Association request either in invalid state
2582 * or to a peer MAC entity whose address is different
2583 * from one that STA is currently joined with or on AP.
2584 * Return Assoc confirm with Invalid parameters code.
2585 */
2586
2587 // Log error
2588 PELOGW(limLog(pMac, LOGW,
2589 FL("received unexpected MLM_ASSOC_CNF in state %X for role=%d, MAC addr= "),
2590 psessionEntry->limMlmState,
2591 psessionEntry->limSystemRole);)
2592 limPrintMacAddr(pMac, pMlmAssocReq->peerMacAddr, LOGW);
2593 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
2594
2595 mlmAssocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2596 mlmAssocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2597
2598 goto end;
2599 }
2600
2601end:
2602 /* Update PE session Id*/
2603 mlmAssocCnf.sessionId = pMlmAssocReq->sessionId;
2604
2605 /// Free up buffer allocated for assocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302606 vos_mem_free(pMlmAssocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002607
2608 limPostSmeMessage(pMac, LIM_MLM_ASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
2609} /*** limProcessMlmAssocReq() ***/
2610
2611
2612
2613/**
2614 * limProcessMlmReassocReq()
2615 *
2616 *FUNCTION:
2617 * This function is called to process MLM_REASSOC_REQ message
2618 * from SME
2619 *
2620 *LOGIC:
2621 *
2622 *ASSUMPTIONS:
2623 *
2624 *NOTE:
2625 *
2626 * @param pMac Pointer to Global MAC structure
2627 * @param *pMsgBuf A pointer to the MLM message buffer
2628 * @return None
2629 */
2630
2631static void
2632limProcessMlmReassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2633{
Jeff Johnsone7245742012-09-05 17:12:55 -07002634 tANI_U8 chanNum, secChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002635 struct tLimPreAuthNode *pAuthNode;
2636 tLimMlmReassocReq *pMlmReassocReq;
2637 tLimMlmReassocCnf mlmReassocCnf;
2638 tpPESession psessionEntry;
2639
2640 if(pMsgBuf == NULL)
2641 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002642 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002643 return;
2644 }
2645
2646 pMlmReassocReq = (tLimMlmReassocReq *) pMsgBuf;
2647
2648 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmReassocReq->sessionId)) == NULL)
2649 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002650 PELOGE(limLog(pMac, LOGE,FL("Session Does not exist for given sessionId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302651 vos_mem_free(pMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002652 return;
2653 }
2654
2655 if (((psessionEntry->limSystemRole != eLIM_AP_ROLE) && (psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE)) &&
2656 (psessionEntry->limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE))
2657 {
2658 if (psessionEntry->pLimMlmReassocReq)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302659 vos_mem_free(psessionEntry->pLimMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002660
2661 /* Hold Re-Assoc request as part of Session, knock-out pMac */
2662 /// Hold onto Reassoc request parameters
2663 psessionEntry->pLimMlmReassocReq = pMlmReassocReq;
2664
2665 // See if we have pre-auth context with new AP
2666 pAuthNode = limSearchPreAuthList(pMac, psessionEntry->limReAssocbssId);
2667
2668 if (!pAuthNode &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302669 (!vos_mem_compare(pMlmReassocReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002670 psessionEntry->bssId,
2671 sizeof(tSirMacAddr)) ))
2672 {
2673 // Either pre-auth context does not exist AND
2674 // we are not reassociating with currently
2675 // associated AP.
2676 // Return Reassoc confirm with not authenticated
2677 mlmReassocCnf.resultCode = eSIR_SME_STA_NOT_AUTHENTICATED;
2678 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2679
2680 goto end;
2681 }
2682
2683 //assign the sessionId to the timer object
2684 pMac->lim.limTimers.gLimReassocFailureTimer.sessionId = pMlmReassocReq->sessionId;
2685
2686 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2687 psessionEntry->limMlmState = eLIM_MLM_WT_REASSOC_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002688 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002689
2690#if 0
2691 // Update BSSID at CFG database
2692 if (wlan_cfgSetStr(pMac, WNI_CFG_BSSID,
2693 pMac->lim.gLimReassocBssId,
2694 sizeof(tSirMacAddr)) != eSIR_SUCCESS)
2695 {
2696 /// Could not update BSSID at CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002697 limLog(pMac, LOGP, FL("could not update BSSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002698 }
2699#endif //TO SUPPORT BT-AMP
2700
2701 /* Copy Global Reassoc ID*/
2702 // sirCopyMacAddr(psessionEntry->reassocbssId,pMac->lim.gLimReAssocBssId);
2703
2704 /**
2705 * Derive channel from BSS description and
2706 * store it at CFG.
2707 */
2708
2709 chanNum = psessionEntry->limReassocChannelId;
Jeff Johnsone7245742012-09-05 17:12:55 -07002710 secChannelOffset = psessionEntry->reAssocHtSecondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002711
2712 /* To Support BT-AMP .. read channel number from psessionEntry*/
2713 //chanNum = psessionEntry->currentOperChannel;
2714
2715 // Apply previously set configuration at HW
2716 limApplyConfiguration(pMac,psessionEntry);
2717
2718 //store the channel switch sessionEntry in the lim global var
2719 /* We have already saved the ReAssocreq Pointer abobe */
2720 //psessionEntry->pLimReAssocReq = (void *)pMlmReassocReq;
2721 psessionEntry->channelChangeReasonCode = LIM_SWITCH_CHANNEL_REASSOC;
2722
Jeff Johnsone7245742012-09-05 17:12:55 -07002723 /** Switch channel to the new Operating channel for Reassoc*/
2724 limSetChannel(pMac, chanNum, secChannelOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002725
2726 return;
2727 }
2728 else
2729 {
2730 /**
2731 * Received Reassoc request in invalid state or
2732 * in AP role.Return Reassoc confirm with Invalid
2733 * parameters code.
2734 */
2735
2736 // Log error
2737 PELOGW(limLog(pMac, LOGW,
2738 FL("received unexpected MLM_REASSOC_CNF in state %X for role=%d, MAC addr= "),
2739 psessionEntry->limMlmState,
2740 psessionEntry->limSystemRole);)
2741 limPrintMacAddr(pMac, pMlmReassocReq->peerMacAddr,
2742 LOGW);
2743 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
2744
2745 mlmReassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2746 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2747
2748 goto end;
2749 }
2750
2751end:
2752 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2753 /* Update PE sessio Id*/
2754 mlmReassocCnf.sessionId = pMlmReassocReq->sessionId;
2755 /// Free up buffer allocated for reassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302756 vos_mem_free(pMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002757 psessionEntry->pLimReAssocReq = NULL;
2758
2759 limPostSmeMessage(pMac, LIM_MLM_REASSOC_CNF, (tANI_U32 *) &mlmReassocCnf);
2760} /*** limProcessMlmReassocReq() ***/
2761
2762
2763static void
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08002764limProcessMlmDisassocReqNtf(tpAniSirGlobal pMac, eHalStatus suspendStatus, tANI_U32 *pMsgBuf)
Jeff Johnson295189b2012-06-20 16:38:30 -07002765{
2766 tANI_U16 aid;
2767 tSirMacAddr currentBssId;
2768 tpDphHashNode pStaDs;
2769 tLimMlmDisassocReq *pMlmDisassocReq;
2770 tLimMlmDisassocCnf mlmDisassocCnf;
2771 tpPESession psessionEntry;
2772 extern tANI_BOOLEAN sendDisassocFrame;
2773
2774 if(eHAL_STATUS_SUCCESS != suspendStatus)
2775 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002776 PELOGE(limLog(pMac, LOGE,FL("Suspend Status is not success %X"), suspendStatus);)
Jeff Johnson295189b2012-06-20 16:38:30 -07002777#if 0
2778 //It can ignore the status and proceed with the disassoc processing.
2779 mlmDisassocCnf.resultCode = eSIR_SME_REFUSED;
2780 goto end;
2781#endif
2782 }
2783
2784 pMlmDisassocReq = (tLimMlmDisassocReq *) pMsgBuf;
2785
2786
2787 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDisassocReq->sessionId))== NULL)
2788 {
2789
2790 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002791 FL("session does not exist for given sessionId"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002792 mlmDisassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2793 goto end;
2794 }
2795 #if 0
2796 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2797 eSIR_SUCCESS)
2798 {
2799 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002800 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002801 }
2802 #endif //BT-AMP Support
2803 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2804
2805 switch (psessionEntry->limSystemRole)
2806 {
2807 case eLIM_STA_ROLE:
2808 case eLIM_BT_AMP_STA_ROLE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302809 if ( !vos_mem_compare(pMlmDisassocReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002810 currentBssId,
2811 sizeof(tSirMacAddr)) )
2812 {
2813 PELOGW(limLog(pMac, LOGW,
2814 FL("received MLM_DISASSOC_REQ with invalid BSS id "));)
2815 limPrintMacAddr(pMac, pMlmDisassocReq->peerMacAddr, LOGW);
2816
2817 /// Prepare and Send LIM_MLM_DISASSOC_CNF
2818
2819 mlmDisassocCnf.resultCode =
2820 eSIR_SME_INVALID_PARAMETERS;
2821
2822 goto end;
2823 }
2824
2825 break;
2826
2827 case eLIM_STA_IN_IBSS_ROLE:
2828
2829 break;
2830
2831 default: // eLIM_AP_ROLE
2832
2833 // Fall through
2834 break;
2835
2836 } // end switch (psessionEntry->limSystemRole)
2837
2838 /**
2839 * Check if there exists a context for the peer entity
2840 * to be disassociated with.
2841 */
2842 pStaDs = dphLookupHashEntry(pMac, pMlmDisassocReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable);
2843 if ((pStaDs == NULL) ||
2844 (pStaDs &&
2845 ((pStaDs->mlmStaContext.mlmState !=
2846 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
2847 (pStaDs->mlmStaContext.mlmState !=
2848 eLIM_MLM_WT_ASSOC_CNF_STATE) &&
2849 (pStaDs->mlmStaContext.mlmState !=
2850 eLIM_MLM_ASSOCIATED_STATE))))
2851 {
2852 /**
2853 * Received LIM_MLM_DISASSOC_REQ for STA that does not
2854 * have context or in some transit state.
2855 * Log error
2856 */
2857 PELOGW(limLog(pMac, LOGW,
2858 FL("received MLM_DISASSOC_REQ for STA that either has no context or in some transit state, Addr= "));)
2859 limPrintMacAddr(pMac, pMlmDisassocReq->peerMacAddr, LOGW);
2860
2861 /// Prepare and Send LIM_MLM_DISASSOC_CNF
2862
2863 mlmDisassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2864
2865 goto end;
2866 }
2867
2868 //pStaDs->mlmStaContext.rxPurgeReq = 1;
2869 pStaDs->mlmStaContext.disassocReason = (tSirMacReasonCodes)
2870 pMlmDisassocReq->reasonCode;
2871 pStaDs->mlmStaContext.cleanupTrigger = pMlmDisassocReq->disassocTrigger;
2872
2873 /// Send Disassociate frame to peer entity
Jeff Johnsone7245742012-09-05 17:12:55 -07002874 if (sendDisassocFrame && (pMlmDisassocReq->reasonCode != eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON))
Jeff Johnson295189b2012-06-20 16:38:30 -07002875 {
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08002876 pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq = pMlmDisassocReq;
Madan Mohan Koyyalamudicdcb58f2012-11-28 01:40:44 +05302877 /* Set state to mlm State to eLIM_MLM_WT_DEL_STA_RSP_STATE
2878 * This is to address the issue of race condition between
2879 * disconnect request from the HDD and deauth from AP
2880 */
2881 pStaDs->mlmStaContext.mlmState = eLIM_MLM_WT_DEL_STA_RSP_STATE;
2882
2883 limSendDisassocMgmtFrame(pMac,
2884 pMlmDisassocReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08002885 pMlmDisassocReq->peerMacAddr,
2886 psessionEntry, TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002887 }
2888 else
2889 {
Madan Mohan Koyyalamudib6af0612012-11-19 13:45:45 -08002890 /* Disassoc frame is not sent OTA */
2891 sendDisassocFrame = 1;
2892 // Receive path cleanup with dummy packet
2893 if(eSIR_SUCCESS != limCleanupRxPath(pMac, pStaDs,psessionEntry))
2894 {
2895 mlmDisassocCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2896 goto end;
2897 }
2898 // Free up buffer allocated for mlmDisassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302899 vos_mem_free(pMlmDisassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002900 }
2901
Jeff Johnson295189b2012-06-20 16:38:30 -07002902 return;
2903
2904end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302905 vos_mem_copy((tANI_U8 *) &mlmDisassocCnf.peerMacAddr,
2906 (tANI_U8 *) pMlmDisassocReq->peerMacAddr,
2907 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002908 mlmDisassocCnf.aid = pMlmDisassocReq->aid;
2909 mlmDisassocCnf.disassocTrigger = pMlmDisassocReq->disassocTrigger;
2910
2911 /* Update PE session ID*/
2912 mlmDisassocCnf.sessionId = pMlmDisassocReq->sessionId;
2913
2914 /// Free up buffer allocated for mlmDisassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302915 vos_mem_free(pMlmDisassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002916
2917 limPostSmeMessage(pMac,
2918 LIM_MLM_DISASSOC_CNF,
2919 (tANI_U32 *) &mlmDisassocCnf);
2920}
2921
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08002922tANI_BOOLEAN limCheckDisassocDeauthAckPending(tpAniSirGlobal pMac,
2923 tANI_U8 *staMac
2924 )
2925{
2926 tLimMlmDisassocReq *pMlmDisassocReq;
2927 tLimMlmDeauthReq *pMlmDeauthReq;
2928 pMlmDisassocReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq;
2929 pMlmDeauthReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq;
2930 if (
2931 (pMlmDisassocReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302932 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08002933 (tANI_U8 *) &pMlmDisassocReq->peerMacAddr,
2934 sizeof(tSirMacAddr))))
2935 ||
2936 (pMlmDeauthReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302937 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08002938 (tANI_U8 *) &pMlmDeauthReq->peerMacAddr,
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302939 sizeof(tSirMacAddr))))
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08002940 )
2941 {
Srinivas Girigowdac03c5a82013-07-01 13:44:54 -07002942 PELOG1(limLog(pMac, LOG1, FL("Disassoc/Deauth ack pending"));)
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08002943 return eANI_BOOLEAN_TRUE;
2944 }
2945 else
2946 {
Srinivas Girigowdac03c5a82013-07-01 13:44:54 -07002947 PELOG1(limLog(pMac, LOG1, FL("Disassoc/Deauth Ack not pending"));)
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08002948 return eANI_BOOLEAN_FALSE;
2949 }
2950}
2951
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08002952void limCleanUpDisassocDeauthReq(tpAniSirGlobal pMac,
2953 tANI_U8 *staMac,
2954 tANI_BOOLEAN cleanRxPath)
2955{
2956 tLimMlmDisassocReq *pMlmDisassocReq;
2957 tLimMlmDeauthReq *pMlmDeauthReq;
2958 pMlmDisassocReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq;
2959 if (pMlmDisassocReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302960 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08002961 (tANI_U8 *) &pMlmDisassocReq->peerMacAddr,
2962 sizeof(tSirMacAddr))))
2963 {
2964 if (cleanRxPath)
2965 {
2966 limProcessDisassocAckTimeout(pMac);
2967 }
2968 else
2969 {
2970 if (tx_timer_running(&pMac->lim.limTimers.gLimDisassocAckTimer))
2971 {
2972 limDeactivateAndChangeTimer(pMac, eLIM_DISASSOC_ACK_TIMER);
2973 }
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302974 vos_mem_free(pMlmDisassocReq);
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08002975 pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq = NULL;
2976 }
2977 }
2978
2979 pMlmDeauthReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq;
2980 if (pMlmDeauthReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302981 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08002982 (tANI_U8 *) &pMlmDeauthReq->peerMacAddr,
2983 sizeof(tSirMacAddr))))
2984 {
2985 if (cleanRxPath)
2986 {
2987 limProcessDeauthAckTimeout(pMac);
2988 }
2989 else
2990 {
2991 if (tx_timer_running(&pMac->lim.limTimers.gLimDeauthAckTimer))
2992 {
2993 limDeactivateAndChangeTimer(pMac, eLIM_DEAUTH_ACK_TIMER);
2994 }
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302995 vos_mem_free(pMlmDeauthReq);
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08002996 pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = NULL;
2997 }
2998 }
2999}
3000
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003001void limProcessDisassocAckTimeout(tpAniSirGlobal pMac)
3002{
3003 limSendDisassocCnf(pMac);
3004}
3005
Jeff Johnson295189b2012-06-20 16:38:30 -07003006/**
3007 * limProcessMlmDisassocReq()
3008 *
3009 *FUNCTION:
3010 * This function is called to process MLM_DISASSOC_REQ message
3011 * from SME
3012 *
3013 *LOGIC:
3014 *
3015 *ASSUMPTIONS:
3016 *
3017 *NOTE:
3018 *
3019 * @param pMac Pointer to Global MAC structure
3020 * @param *pMsgBuf A pointer to the MLM message buffer
3021 * @return None
3022 */
3023
3024static void
3025limProcessMlmDisassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3026{
3027// tANI_U16 aid;
3028// tSirMacAddr currentBssId;
3029// tpDphHashNode pStaDs;
3030 tLimMlmDisassocReq *pMlmDisassocReq;
3031// tLimMlmDisassocCnf mlmDisassocCnf;
3032 tpPESession psessionEntry;
3033// extern tANI_BOOLEAN sendDisassocFrame;
3034
3035 if(pMsgBuf == NULL)
3036 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003037 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003038 return;
3039 }
3040
3041 pMlmDisassocReq = (tLimMlmDisassocReq *) pMsgBuf;
3042
3043 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDisassocReq->sessionId))== NULL)
3044 {
3045
3046 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003047 FL("session does not exist for given sessionId"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003048 return;
3049 }
3050
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003051 limProcessMlmDisassocReqNtf( pMac, eHAL_STATUS_SUCCESS, (tANI_U32*) pMsgBuf );
Madan Mohan Koyyalamudib6af0612012-11-19 13:45:45 -08003052
Jeff Johnson295189b2012-06-20 16:38:30 -07003053} /*** limProcessMlmDisassocReq() ***/
3054
3055static void
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003056limProcessMlmDeauthReqNtf(tpAniSirGlobal pMac, eHalStatus suspendStatus, tANI_U32 *pMsgBuf)
Jeff Johnson295189b2012-06-20 16:38:30 -07003057{
3058 tANI_U16 aid;
3059 tSirMacAddr currentBssId;
3060 tpDphHashNode pStaDs;
3061 struct tLimPreAuthNode *pAuthNode;
3062 tLimMlmDeauthReq *pMlmDeauthReq;
3063 tLimMlmDeauthCnf mlmDeauthCnf;
3064 tpPESession psessionEntry;
3065
3066
3067 if(eHAL_STATUS_SUCCESS != suspendStatus)
3068 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003069 PELOGE(limLog(pMac, LOGE,FL("Suspend Status is not success %X"), suspendStatus);)
Jeff Johnson295189b2012-06-20 16:38:30 -07003070#if 0
3071 //It can ignore the status and proceed with the disassoc processing.
3072 mlmDisassocCnf.resultCode = eSIR_SME_REFUSED;
3073 goto end;
3074#endif
3075 }
3076
3077 pMlmDeauthReq = (tLimMlmDeauthReq *) pMsgBuf;
3078
3079 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDeauthReq->sessionId))== NULL)
3080 {
3081
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003082 PELOGE(limLog(pMac, LOGE, FL("session does not exist for given sessionId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303083 vos_mem_free(pMlmDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003084 return;
3085 }
3086 #if 0
3087 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
3088 eSIR_SUCCESS)
3089 {
3090 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003091 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003092 }
3093 #endif //SUPPORT BT-AMP
3094 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3095
3096 switch (psessionEntry->limSystemRole)
3097 {
3098 case eLIM_STA_ROLE:
3099 case eLIM_BT_AMP_STA_ROLE:
3100 switch (psessionEntry->limMlmState)
3101 {
3102 case eLIM_MLM_IDLE_STATE:
3103 // Attempting to Deauthenticate
3104 // with a pre-authenticated peer.
3105 // Deauthetiate with peer if there
3106 // exists a pre-auth context below.
3107 break;
3108
3109 case eLIM_MLM_AUTHENTICATED_STATE:
3110 case eLIM_MLM_WT_ASSOC_RSP_STATE:
3111 case eLIM_MLM_LINK_ESTABLISHED_STATE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303112 if (!vos_mem_compare(pMlmDeauthReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07003113 currentBssId,
3114 sizeof(tSirMacAddr)) )
3115 {
3116 PELOGW(limLog(pMac, LOGW,
3117 FL("received MLM_DEAUTH_REQ with invalid BSS id "));)
3118 PELOGE(limLog(pMac, LOGE, FL("Peer MAC Addr : "));)
3119 limPrintMacAddr(pMac, pMlmDeauthReq->peerMacAddr,LOGE);
3120
3121 PELOGE(limLog(pMac, LOGE, FL("\n CFG BSSID Addr : "));)
3122 limPrintMacAddr(pMac, currentBssId,LOGE);
3123
3124 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3125
3126 mlmDeauthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3127
3128 goto end;
3129 }
3130
3131 if ((psessionEntry->limMlmState ==
3132 eLIM_MLM_AUTHENTICATED_STATE) ||
3133 (psessionEntry->limMlmState ==
3134 eLIM_MLM_WT_ASSOC_RSP_STATE))
3135 {
3136 // Send Deauthentication frame
3137 // to peer entity
3138 limSendDeauthMgmtFrame(
3139 pMac,
3140 pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003141 pMlmDeauthReq->peerMacAddr,
3142 psessionEntry, FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003143
3144 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3145 mlmDeauthCnf.resultCode = eSIR_SME_SUCCESS;
3146 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003147 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003148 goto end;
3149 }
3150 else
3151 {
3152 // LINK_ESTABLISED_STATE
3153 // Cleanup RX & TX paths
3154 // below
3155 }
3156
3157 break;
3158
3159 default:
3160
3161 PELOGW(limLog(pMac, LOGW,
3162 FL("received MLM_DEAUTH_REQ with in state %d for peer "),
3163 psessionEntry->limMlmState);)
3164 limPrintMacAddr(pMac, pMlmDeauthReq->peerMacAddr, LOGW);
3165 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
3166
3167 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3168 mlmDeauthCnf.resultCode =
3169 eSIR_SME_STA_NOT_AUTHENTICATED;
3170
3171 goto end;
3172 }
3173
3174 break;
3175
3176 case eLIM_STA_IN_IBSS_ROLE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303177 vos_mem_free(pMlmDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003178
3179 return;
3180
3181 default: // eLIM_AP_ROLE
3182 break;
3183
3184 } // end switch (psessionEntry->limSystemRole)
3185
3186 /**
3187 * Check if there exists a context for the peer entity
3188 * to be deauthenticated with.
3189 */
3190 pStaDs = dphLookupHashEntry(pMac, pMlmDeauthReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable);
3191
3192 if (pStaDs == NULL)
3193 {
3194 /// Check if there exists pre-auth context for this STA
3195 pAuthNode = limSearchPreAuthList(pMac,
3196 pMlmDeauthReq->peerMacAddr);
3197
3198 if (pAuthNode == NULL)
3199 {
3200 /**
3201 * Received DEAUTH REQ for a STA that is neither
3202 * Associated nor Pre-authenticated. Log error,
3203 * Prepare and Send LIM_MLM_DEAUTH_CNF
3204 */
3205 PELOGW(limLog(pMac, LOGW,
3206 FL("received MLM_DEAUTH_REQ for STA that does not have context, Addr="));)
3207 limPrintMacAddr(pMac, pMlmDeauthReq->peerMacAddr, LOGW);
3208
3209 mlmDeauthCnf.resultCode =
3210 eSIR_SME_STA_NOT_AUTHENTICATED;
3211 }
3212 else
3213 {
3214 mlmDeauthCnf.resultCode = eSIR_SME_SUCCESS;
3215
3216 /// Delete STA from pre-auth STA list
3217 limDeletePreAuthNode(pMac, pMlmDeauthReq->peerMacAddr);
3218
3219 /// Send Deauthentication frame to peer entity
3220 limSendDeauthMgmtFrame(pMac,
3221 pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003222 pMlmDeauthReq->peerMacAddr,
3223 psessionEntry, FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003224 }
3225
3226 goto end;
3227 }
3228 else if ((pStaDs->mlmStaContext.mlmState !=
3229 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
3230 (pStaDs->mlmStaContext.mlmState !=
3231 eLIM_MLM_WT_ASSOC_CNF_STATE))
3232 {
3233 /**
3234 * Received LIM_MLM_DEAUTH_REQ for STA that is n
3235 * some transit state. Log error.
3236 */
3237 PELOGW(limLog(pMac, LOGW,
3238 FL("received MLM_DEAUTH_REQ for STA that either has no context or in some transit state, Addr="));)
3239 limPrintMacAddr(pMac, pMlmDeauthReq->peerMacAddr, LOGW);
3240
3241 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3242
3243 mlmDeauthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3244
3245 goto end;
3246 }
3247
3248 //pStaDs->mlmStaContext.rxPurgeReq = 1;
3249 pStaDs->mlmStaContext.disassocReason = (tSirMacReasonCodes)
3250 pMlmDeauthReq->reasonCode;
3251 pStaDs->mlmStaContext.cleanupTrigger = pMlmDeauthReq->deauthTrigger;
3252
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003253 pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = pMlmDeauthReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07003254 /// Send Deauthentication frame to peer entity
3255 limSendDeauthMgmtFrame(pMac, pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003256 pMlmDeauthReq->peerMacAddr,
3257 psessionEntry, TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003258
3259 return;
3260
3261end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303262 vos_mem_copy((tANI_U8 *) &mlmDeauthCnf.peerMacAddr,
3263 (tANI_U8 *) pMlmDeauthReq->peerMacAddr,
3264 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003265 mlmDeauthCnf.deauthTrigger = pMlmDeauthReq->deauthTrigger;
3266 mlmDeauthCnf.aid = pMlmDeauthReq->aid;
3267 mlmDeauthCnf.sessionId = pMlmDeauthReq->sessionId;
3268
3269 // Free up buffer allocated
3270 // for mlmDeauthReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303271 vos_mem_free(pMlmDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003272
3273 limPostSmeMessage(pMac,
3274 LIM_MLM_DEAUTH_CNF,
3275 (tANI_U32 *) &mlmDeauthCnf);
3276
3277}
3278
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003279
3280void limProcessDeauthAckTimeout(tpAniSirGlobal pMac)
3281{
3282 limSendDeauthCnf(pMac);
3283}
3284
Jeff Johnson295189b2012-06-20 16:38:30 -07003285/**
3286 * limProcessMlmDeauthReq()
3287 *
3288 *FUNCTION:
3289 * This function is called to process MLM_DEAUTH_REQ message
3290 * from SME
3291 *
3292 *LOGIC:
3293 *
3294 *ASSUMPTIONS:
3295 *
3296 *NOTE:
3297 *
3298 * @param pMac Pointer to Global MAC structure
3299 * @param *pMsgBuf A pointer to the MLM message buffer
3300 * @return None
3301 */
3302
3303static void
3304limProcessMlmDeauthReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3305{
3306// tANI_U16 aid;
3307// tSirMacAddr currentBssId;
3308// tpDphHashNode pStaDs;
3309// struct tLimPreAuthNode *pAuthNode;
3310 tLimMlmDeauthReq *pMlmDeauthReq;
3311// tLimMlmDeauthCnf mlmDeauthCnf;
3312 tpPESession psessionEntry;
3313
3314 if(pMsgBuf == NULL)
3315 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003316 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003317 return;
3318 }
3319
3320 pMlmDeauthReq = (tLimMlmDeauthReq *) pMsgBuf;
3321
3322 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDeauthReq->sessionId))== NULL)
3323 {
3324
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003325 PELOGE(limLog(pMac, LOGE, FL("session does not exist for given sessionId"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003326 return;
3327 }
3328
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003329 limProcessMlmDeauthReqNtf( pMac, eHAL_STATUS_SUCCESS, (tANI_U32*) pMsgBuf );
3330
Jeff Johnson295189b2012-06-20 16:38:30 -07003331} /*** limProcessMlmDeauthReq() ***/
3332
3333
3334
3335/**
3336 * @function : limProcessMlmSetKeysReq()
3337 *
3338 * @brief : This function is called to process MLM_SETKEYS_REQ message
3339 * from SME
3340 *
3341 *LOGIC:
3342 *
3343 *ASSUMPTIONS:
3344 *
3345 *NOTE:
3346 *
3347 * @param pMac Pointer to Global MAC structure
3348 * @param *pMsgBuf A pointer to the MLM message buffer
3349 * @return None
3350 */
3351
3352static void
3353limProcessMlmSetKeysReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3354{
3355tANI_U16 aid;
3356tANI_U16 staIdx = 0;
3357tANI_U32 defaultKeyId = 0;
3358tSirMacAddr currentBssId;
3359tpDphHashNode pStaDs;
3360tLimMlmSetKeysReq *pMlmSetKeysReq;
3361tLimMlmSetKeysCnf mlmSetKeysCnf;
3362tpPESession psessionEntry;
3363
3364 if(pMsgBuf == NULL)
3365 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003366 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003367 return;
3368 }
3369
3370
3371 pMlmSetKeysReq = (tLimMlmSetKeysReq *) pMsgBuf;
3372 // Hold onto the SetKeys request parameters
3373 pMac->lim.gpLimMlmSetKeysReq = (void *) pMlmSetKeysReq;
3374
3375 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmSetKeysReq->sessionId))== NULL)
3376 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003377 PELOGE(limLog(pMac, LOGE,FL("session does not exist for given sessionId"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003378 return;
3379 }
3380
3381 limLog( pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003382 FL( "Received MLM_SETKEYS_REQ with parameters:"
Jeff Johnson295189b2012-06-20 16:38:30 -07003383 "AID [%d], ED Type [%d], # Keys [%d] & Peer MAC Addr - "),
3384 pMlmSetKeysReq->aid,
3385 pMlmSetKeysReq->edType,
3386 pMlmSetKeysReq->numKeys );
3387 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3388
3389 #if 0
3390 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac, WNI_CFG_BSSID, currentBssId, &cfg )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003391 limLog( pMac, LOGP, FL("Could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003392 return;
3393 }
3394 #endif //TO SUPPORT BT-AMP
3395 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3396
3397 switch( psessionEntry->limSystemRole ) {
3398 case eLIM_STA_ROLE:
3399 case eLIM_BT_AMP_STA_ROLE:
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003400 //In case of TDLS, peerMac address need not be BssId. Skip this check
3401 //if TDLS is enabled.
3402#ifndef FEATURE_WLAN_TDLS
Jeff Johnson295189b2012-06-20 16:38:30 -07003403 if((!limIsAddrBC( pMlmSetKeysReq->peerMacAddr ) ) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303404 (!vos_mem_compare(pMlmSetKeysReq->peerMacAddr,
3405 currentBssId, sizeof(tSirMacAddr))) ){
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003406 limLog( pMac, LOGW, FL("Received MLM_SETKEYS_REQ with invalid BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003407 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3408
3409 // Prepare and Send LIM_MLM_SETKEYS_CNF with error code
3410 mlmSetKeysCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3411 goto end;
3412 }
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003413#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003414 // Fall thru' & 'Plumb' keys below
3415 break;
3416 case eLIM_STA_IN_IBSS_ROLE:
3417 default: // others
3418 // Fall thru...
3419 break;
3420 }
3421
3422 /**
3423 * Use the "unicast" parameter to determine if the "Group Keys"
3424 * are being set.
3425 * pMlmSetKeysReq->key.unicast = 0 -> Multicast/broadcast
3426 * pMlmSetKeysReq->key.unicast - 1 -> Unicast keys are being set
3427 */
3428 if( limIsAddrBC( pMlmSetKeysReq->peerMacAddr )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003429 limLog( pMac, LOG1, FL("Trying to set Group Keys...%d "), pMlmSetKeysReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07003430 /** When trying to set Group Keys for any
3431 * security mode other than WEP, use the
3432 * STA Index corresponding to the AP...
3433 */
3434 switch( pMlmSetKeysReq->edType ) {
3435 case eSIR_ED_CCMP:
3436
3437#ifdef WLAN_FEATURE_11W
3438 case eSIR_ED_AES_128_CMAC:
3439#endif
3440 staIdx = psessionEntry->staId;
3441 break;
3442
3443 default:
3444 break;
3445 }
3446 }else {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003447 limLog( pMac, LOG1, FL("Trying to set Unicast Keys..."));
Jeff Johnson295189b2012-06-20 16:38:30 -07003448 /**
3449 * Check if there exists a context for the
3450 * peer entity for which keys need to be set.
3451 */
3452
3453
3454 pStaDs = dphLookupHashEntry( pMac, pMlmSetKeysReq->peerMacAddr, &aid , &psessionEntry->dph.dphHashTable);
3455
Jeff Johnson295189b2012-06-20 16:38:30 -07003456 if ((pStaDs == NULL) ||
3457 ((pStaDs->mlmStaContext.mlmState != eLIM_MLM_LINK_ESTABLISHED_STATE) && (psessionEntry->limSystemRole != eLIM_AP_ROLE))) {
Jeff Johnson295189b2012-06-20 16:38:30 -07003458 /**
3459 * Received LIM_MLM_SETKEYS_REQ for STA
3460 * that does not have context or in some
3461 * transit state. Log error.
3462 */
3463 limLog( pMac, LOG1,
3464 FL("Received MLM_SETKEYS_REQ for STA that either has no context or in some transit state, Addr = "));
3465 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3466
3467 // Prepare and Send LIM_MLM_SETKEYS_CNF
3468 mlmSetKeysCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3469 goto end;
3470 } else
3471 staIdx = pStaDs->staIndex;
3472 }
3473
3474 if ((pMlmSetKeysReq->numKeys == 0) && (pMlmSetKeysReq->edType != eSIR_ED_NONE)) {
Jeff Johnsone7245742012-09-05 17:12:55 -07003475 //
3476 // Broadcast/Multicast Keys (for WEP!!) are NOT sent
3477 // via this interface!!
3478 //
3479 // This indicates to HAL that the WEP Keys need to be
3480 // extracted from the CFG and applied to hardware
3481 defaultKeyId = 0xff;
3482 }else if(pMlmSetKeysReq->key[0].keyId &&
3483 ((pMlmSetKeysReq->edType == eSIR_ED_WEP40) ||
3484 (pMlmSetKeysReq->edType == eSIR_ED_WEP104))){
3485 /* If the Key Id is non zero and encryption mode is WEP,
3486 * the key index is coming from the upper layers so that key only
3487 * need to be used as the default tx key, This is being used only
3488 * in case of WEP mode in HAL */
3489 defaultKeyId = pMlmSetKeysReq->key[0].keyId;
3490 }else
3491 defaultKeyId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003492
3493 limLog( pMac, LOG1,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003494 FL( "Trying to set keys for STA Index [%d], using defaultKeyId [%d]" ),
Jeff Johnson295189b2012-06-20 16:38:30 -07003495 staIdx,
3496 defaultKeyId );
3497
3498 if(limIsAddrBC( pMlmSetKeysReq->peerMacAddr )) {
3499 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
3500 psessionEntry->limMlmState = eLIM_MLM_WT_SET_BSS_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003501 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003502 limLog( pMac, LOG1, FL("Trying to set Group Keys...%d "),
Jeff Johnson295189b2012-06-20 16:38:30 -07003503 psessionEntry->peSessionId);
3504
3505 // Package WDA_SET_BSSKEY_REQ message parameters
3506 limSendSetBssKeyReq(pMac, pMlmSetKeysReq,psessionEntry);
3507 return;
3508 }else {
3509 // Package WDA_SET_STAKEY_REQ / WDA_SET_STA_BCASTKEY_REQ message parameters
3510 limSendSetStaKeyReq(pMac, pMlmSetKeysReq, staIdx, (tANI_U8) defaultKeyId,psessionEntry);
3511 return;
3512 }
3513
3514end:
3515 mlmSetKeysCnf.sessionId= pMlmSetKeysReq->sessionId;
3516 limPostSmeSetKeysCnf( pMac, pMlmSetKeysReq, &mlmSetKeysCnf );
3517
3518} /*** limProcessMlmSetKeysReq() ***/
3519
3520/**
3521 * limProcessMlmRemoveKeyReq()
3522 *
3523 *FUNCTION:
3524 * This function is called to process MLM_REMOVEKEY_REQ message
3525 * from SME
3526 *
3527 *LOGIC:
3528 *
3529 *ASSUMPTIONS:
3530 *
3531 *NOTE:
3532 *
3533 * @param pMac Pointer to Global MAC structure
3534 * @param *pMsgBuf A pointer to the MLM message buffer
3535 * @return None
3536 */
3537
3538static void
3539limProcessMlmRemoveKeyReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3540{
3541tANI_U16 aid;
3542tANI_U16 staIdx = 0;
3543tSirMacAddr currentBssId;
3544tpDphHashNode pStaDs;
3545tLimMlmRemoveKeyReq *pMlmRemoveKeyReq;
3546tLimMlmRemoveKeyCnf mlmRemoveKeyCnf;
3547 tpPESession psessionEntry;
3548
3549 if(pMsgBuf == NULL)
3550 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003551 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003552 return;
3553 }
3554
3555 pMlmRemoveKeyReq = (tLimMlmRemoveKeyReq *) pMsgBuf;
3556
3557
3558 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmRemoveKeyReq->sessionId))== NULL)
3559 {
3560 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003561 FL("session does not exist for given sessionId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303562 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07003563 return;
3564 }
3565
3566
3567 if( pMac->lim.gpLimMlmRemoveKeyReq != NULL )
3568 {
3569 // Free any previous requests.
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303570 vos_mem_free(pMac->lim.gpLimMlmRemoveKeyReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003571 pMac->lim.gpLimMlmRemoveKeyReq = NULL;
3572 }
3573 // Hold onto the RemoveKeys request parameters
3574 pMac->lim.gpLimMlmRemoveKeyReq = (void *) pMlmRemoveKeyReq;
3575
3576 #if 0
3577 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac,
3578 WNI_CFG_BSSID,
3579 currentBssId,
3580 &cfg ))
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003581 limLog( pMac, LOGP, FL("Could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003582 #endif //TO-SUPPORT BT-AMP
3583 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3584
3585 switch( psessionEntry->limSystemRole )
3586 {
3587 case eLIM_STA_ROLE:
3588 case eLIM_BT_AMP_STA_ROLE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303589 if (( limIsAddrBC( pMlmRemoveKeyReq->peerMacAddr ) != true ) &&
3590 (!vos_mem_compare(pMlmRemoveKeyReq->peerMacAddr,
3591 currentBssId,
3592 sizeof(tSirMacAddr))))
Jeff Johnson295189b2012-06-20 16:38:30 -07003593 {
3594 limLog( pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003595 FL("Received MLM_REMOVEKEY_REQ with invalid BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003596 limPrintMacAddr( pMac, pMlmRemoveKeyReq->peerMacAddr, LOGW );
3597
3598 // Prepare and Send LIM_MLM_REMOVEKEY_CNF with error code
3599 mlmRemoveKeyCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3600 goto end;
3601 }
3602 break;
3603
3604 case eLIM_STA_IN_IBSS_ROLE:
3605 default: // eLIM_AP_ROLE
3606 // Fall thru...
3607 break;
3608 }
3609
3610
3611 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
3612 if(limIsAddrBC( pMlmRemoveKeyReq->peerMacAddr )) //Second condition for IBSS or AP role.
3613 {
3614 psessionEntry->limMlmState = eLIM_MLM_WT_REMOVE_BSS_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003615 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003616 // Package WDA_REMOVE_BSSKEY_REQ message parameters
3617 limSendRemoveBssKeyReq( pMac,pMlmRemoveKeyReq,psessionEntry);
3618 return;
3619 }
3620
3621 /**
3622 * Check if there exists a context for the
3623 * peer entity for which keys need to be removed.
3624 */
3625 pStaDs = dphLookupHashEntry( pMac, pMlmRemoveKeyReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable );
3626 if ((pStaDs == NULL) ||
3627 (pStaDs &&
3628 (pStaDs->mlmStaContext.mlmState !=
3629 eLIM_MLM_LINK_ESTABLISHED_STATE)))
3630 {
3631 /**
3632 * Received LIM_MLM_REMOVEKEY_REQ for STA
3633 * that does not have context or in some
3634 * transit state. Log error.
3635 */
3636 limLog( pMac, LOGW,
3637 FL("Received MLM_REMOVEKEYS_REQ for STA that either has no context or in some transit state, Addr = "));
3638 limPrintMacAddr( pMac, pMlmRemoveKeyReq->peerMacAddr, LOGW );
3639
3640 // Prepare and Send LIM_MLM_REMOVEKEY_CNF
3641 mlmRemoveKeyCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3642 mlmRemoveKeyCnf.sessionId = pMlmRemoveKeyReq->sessionId;
3643
3644
3645 goto end;
3646 }
3647 else
3648 staIdx = pStaDs->staIndex;
3649
3650
3651
3652 psessionEntry->limMlmState = eLIM_MLM_WT_REMOVE_STA_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003653 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003654
3655 // Package WDA_REMOVE_STAKEY_REQ message parameters
3656 limSendRemoveStaKeyReq( pMac,pMlmRemoveKeyReq,staIdx,psessionEntry);
3657 return;
3658
3659end:
3660 limPostSmeRemoveKeyCnf( pMac,
Jeff Johnsone7245742012-09-05 17:12:55 -07003661 psessionEntry,
Jeff Johnson295189b2012-06-20 16:38:30 -07003662 pMlmRemoveKeyReq,
3663 &mlmRemoveKeyCnf );
3664
3665} /*** limProcessMlmRemoveKeyReq() ***/
3666
3667
3668/**
3669 * limProcessMinChannelTimeout()
3670 *
3671 *FUNCTION:
3672 * This function is called to process Min Channel Timeout
3673 * during channel scan.
3674 *
3675 *LOGIC:
3676 *
3677 *ASSUMPTIONS:
3678 *
3679 *NOTE:
3680 *
3681 * @param pMac Pointer to Global MAC structure
3682 * @return None
3683 */
3684
3685static void
3686limProcessMinChannelTimeout(tpAniSirGlobal pMac)
3687{
3688 tANI_U8 channelNum;
3689
3690#ifdef GEN6_TODO
3691 //if the min Channel is maintained per session, then use the below seesionEntry
3692 //priority - LOW/might not be needed
3693
3694 //TBD-RAJESH HOW TO GET sessionEntry?????
3695 tpPESession psessionEntry;
3696
3697 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimMinChannelTimer.sessionId))== NULL)
3698 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003699 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003700 return;
3701 }
3702#endif
3703
3704
3705 if (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE)
3706 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003707 PELOG1(limLog(pMac, LOG1, FL("Scanning : min channel timeout occurred"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003708
3709 /// Min channel timer timed out
3710 pMac->lim.limTimers.gLimPeriodicProbeReqTimer.sessionId = 0xff;
3711 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
3712 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
3713 if (pMac->lim.gLimCurrentScanChannelId <=
3714 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
3715 {
3716 channelNum = (tANI_U8)limGetCurrentScanChannel(pMac);
3717 }
3718 else
3719 {
3720 // This shouldn't be the case, but when this happens, this timeout should be for the last channelId.
3721 // Get the channelNum as close to correct as possible.
3722 if(pMac->lim.gpLimMlmScanReq->channelList.channelNumber)
3723 {
3724 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1];
3725 }
3726 else
3727 {
3728 channelNum = 1;
3729 }
3730 }
3731
3732 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
3733 }
3734 else
3735 {
3736 /**
3737 * MIN channel timer should not have timed out
3738 * in states other than wait_probe_response.
3739 * Log error.
3740 */
3741 limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003742 FL("received unexpected MIN channel timeout in state %X"),
Jeff Johnson295189b2012-06-20 16:38:30 -07003743 pMac->lim.gLimMlmState);
3744 limPrintMlmState(pMac, LOGE, pMac->lim.gLimMlmState);
3745 }
3746} /*** limProcessMinChannelTimeout() ***/
3747
3748
3749
3750/**
3751 * limProcessMaxChannelTimeout()
3752 *
3753 *FUNCTION:
3754 * This function is called to process Max Channel Timeout
3755 * during channel scan.
3756 *
3757 *LOGIC:
3758 *
3759 *ASSUMPTIONS:
3760 *
3761 *NOTE:
3762 *
3763 * @param pMac Pointer to Global MAC structure
3764 * @return None
3765 */
3766
3767static void
3768limProcessMaxChannelTimeout(tpAniSirGlobal pMac)
3769{
3770 tANI_U8 channelNum;
3771
3772
3773 if (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE ||
3774 pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE)
3775 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003776 PELOG1(limLog(pMac, LOG1, FL("Scanning : Max channel timed out"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003777 /**
3778 * MAX channel timer timed out
3779 * Continue channel scan.
3780 */
3781 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
3782 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
3783 pMac->lim.limTimers.gLimPeriodicProbeReqTimer.sessionId = 0xff;
3784 if (pMac->lim.gLimCurrentScanChannelId <=
3785 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
3786 {
3787 channelNum = limGetCurrentScanChannel(pMac);
3788 }
3789 else
3790 {
3791 if(pMac->lim.gpLimMlmScanReq->channelList.channelNumber)
3792 {
3793 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1];
3794 }
3795 else
3796 {
3797 channelNum = 1;
3798 }
3799 }
3800 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
3801 }
3802 else
3803 {
3804 /**
3805 * MAX channel timer should not have timed out
3806 * in states other than wait_scan.
3807 * Log error.
3808 */
3809 limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003810 FL("received unexpected MAX channel timeout in state %X"),
Jeff Johnson295189b2012-06-20 16:38:30 -07003811 pMac->lim.gLimMlmState);
3812 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
3813 }
3814} /*** limProcessMaxChannelTimeout() ***/
3815
3816/**
3817 * limProcessPeriodicProbeReqTimer()
3818 *
3819 *FUNCTION:
3820 * This function is called to process periodic probe request
3821 * to send during scan.
3822 *
3823 *LOGIC:
3824 *
3825 *ASSUMPTIONS:
3826 *
3827 *NOTE:
3828 *
3829 * @param pMac Pointer to Global MAC structure
3830 * @return None
3831 */
3832
3833static void
3834limProcessPeriodicProbeReqTimer(tpAniSirGlobal pMac)
3835{
3836 tANI_U8 channelNum;
3837 tANI_U8 i = 0;
3838 tSirRetStatus status = eSIR_SUCCESS;
3839 TX_TIMER *pPeriodicProbeReqTimer;
3840 pPeriodicProbeReqTimer = &pMac->lim.limTimers.gLimPeriodicProbeReqTimer;
3841
3842 if(vos_timer_getCurrentState(&pPeriodicProbeReqTimer->vosTimer)
3843 != VOS_TIMER_STATE_STOPPED)
3844 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003845 PELOG1(limLog(pMac, LOG1, FL("Invalid state of timer"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003846 return;
3847 }
3848
3849 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) &&
3850 (pPeriodicProbeReqTimer->sessionId != 0xff))
3851 {
3852 tLimMlmScanReq *pLimMlmScanReq = pMac->lim.gpLimMlmScanReq;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003853 PELOG1(limLog(pMac, LOG1, FL("Scanning : Periodic scanning"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003854 /**
3855 * Periodic channel timer timed out
3856 * to send probe request.
3857 */
3858 channelNum = limGetCurrentScanChannel(pMac);
3859 do
3860 {
3861 /* Prepare and send Probe Request frame for all the SSIDs
3862 * present in the saved MLM
3863 */
3864
3865 /*
3866 * PELOGE(limLog(pMac, LOGW, FL("sending ProbeReq number %d,"
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003867 * " for SSID %s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07003868 * i, pLimMlmScanReq->ssId[i].ssId,
3869 * channelNum);)
3870 */
3871 status = limSendProbeReqMgmtFrame( pMac, &pLimMlmScanReq->ssId[i],
3872 pLimMlmScanReq->bssId, channelNum, pMac->lim.gSelfMacAddr,
3873 pLimMlmScanReq->dot11mode, pLimMlmScanReq->uIEFieldLen,
3874 (tANI_U8 *)(pLimMlmScanReq) + pLimMlmScanReq->uIEFieldOffset);
3875
3876
3877 if ( status != eSIR_SUCCESS)
3878 {
3879 PELOGE(limLog(pMac, LOGE, FL("send ProbeReq failed for SSID "
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003880 "%s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07003881 pLimMlmScanReq->ssId[i].ssId,
3882 channelNum);)
3883 return;
3884 }
3885 i++;
3886 } while (i < pLimMlmScanReq->numSsid);
3887
3888 /* Activate timer again */
Varun Reddy Yeturue3bbf6e2013-02-08 18:50:55 -08003889 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, pPeriodicProbeReqTimer->sessionId, eLIM_PERIODIC_PROBE_REQ_TIMER));
Jeff Johnson295189b2012-06-20 16:38:30 -07003890 if (tx_timer_activate(pPeriodicProbeReqTimer) != TX_SUCCESS)
3891 {
3892 limLog(pMac, LOGP, FL("could not start periodic probe"
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003893 " req timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003894 return;
3895 }
3896 }
3897 else
3898 {
3899 /**
3900 * Periodic scan is timeout is happening in
3901 * in states other than wait_scan.
3902 * Log error.
3903 */
Mohit Khanna23863762012-09-11 17:40:09 -07003904 limLog(pMac, LOG1,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003905 FL("received unexpected Periodic scan timeout in state %X"),
Jeff Johnson295189b2012-06-20 16:38:30 -07003906 pMac->lim.gLimMlmState);
3907 }
3908} /*** limProcessPeriodicProbeReqTimer() ***/
3909
3910/**
3911 * limProcessJoinFailureTimeout()
3912 *
3913 *FUNCTION:
3914 * This function is called to process JoinFailureTimeout
3915 *
3916 *LOGIC:
3917 *
3918 *ASSUMPTIONS:
3919 *
3920 *NOTE:
3921 *
3922 * @param pMac Pointer to Global MAC structure
3923 * @return None
3924 */
3925
3926static void
3927limProcessJoinFailureTimeout(tpAniSirGlobal pMac)
3928{
3929 tLimMlmJoinCnf mlmJoinCnf;
3930 tSirMacAddr bssid;
3931 tANI_U32 len;
krunal soni8d13b092013-07-19 13:23:29 -07003932#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
3933 vos_log_rssi_pkt_type *pRssiLog = NULL;
3934#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07003935
3936 //fetch the sessionEntry based on the sessionId
3937 tpPESession psessionEntry;
3938
3939 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimJoinFailureTimer.sessionId))== NULL)
3940 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003941 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003942 return;
3943 }
krunal soni8d13b092013-07-19 13:23:29 -07003944
3945#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
3946 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
3947 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
3948 if (pRssiLog)
3949 {
3950 pRssiLog->rssi = psessionEntry->rssi;
3951 }
3952 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
3953#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
3954
Jeff Johnson295189b2012-06-20 16:38:30 -07003955 if (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE)
3956 {
3957 len = sizeof(tSirMacAddr);
3958
3959 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, bssid, &len) !=
3960 eSIR_SUCCESS)
3961 {
3962 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003963 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003964 return;
3965 }
3966
3967 // 'Change' timer for future activations
3968 limDeactivateAndChangeTimer(pMac, eLIM_JOIN_FAIL_TIMER);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08003969 // Change Periodic probe req timer for future activation
3970 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_JOIN_PROBE_REQ_TIMER);
Jeff Johnson295189b2012-06-20 16:38:30 -07003971 /**
3972 * Issue MLM join confirm with timeout reason code
3973 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003974 PELOGE(limLog(pMac, LOGE, FL(" Join Failure Timeout occurred."));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003975
3976 mlmJoinCnf.resultCode = eSIR_SME_JOIN_TIMEOUT_RESULT_CODE;
3977 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
3978
3979 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003980 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003981 if(limSetLinkState(pMac, eSIR_LINK_IDLE_STATE, psessionEntry->bssId,
3982 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003983 PELOGE(limLog(pMac, LOGE, FL("Failed to set the LinkState"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003984 /* Update PE session Id */
3985 mlmJoinCnf.sessionId = psessionEntry->peSessionId;
3986
3987
3988 // Freeup buffer allocated to join request
3989 if (psessionEntry->pLimMlmJoinReq)
3990 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303991 vos_mem_free(psessionEntry->pLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003992 psessionEntry->pLimMlmJoinReq = NULL;
3993 }
3994
3995 limPostSmeMessage(pMac,
3996 LIM_MLM_JOIN_CNF,
3997 (tANI_U32 *) &mlmJoinCnf);
3998
3999 return;
4000 }
4001 else
4002 {
4003 /**
4004 * Join failure timer should not have timed out
4005 * in states other than wait_join_beacon state.
4006 * Log error.
4007 */
4008 limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004009 FL("received unexpected JOIN failure timeout in state %X"),psessionEntry->limMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -07004010 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
4011 }
4012} /*** limProcessJoinFailureTimeout() ***/
4013
4014
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004015/**
4016 * limProcessPeriodicJoinProbeReqTimer()
4017 *
4018 *FUNCTION:
4019 * This function is called to process periodic probe request
4020 * send during joining process.
4021 *
4022 *LOGIC:
4023 *
4024 *ASSUMPTIONS:
4025 *
4026 *NOTE:
4027 *
4028 * @param pMac Pointer to Global MAC structure
4029 * @return None
4030 */
4031
4032static void limProcessPeriodicJoinProbeReqTimer(tpAniSirGlobal pMac)
4033{
4034 tpPESession psessionEntry;
4035 tSirMacSSid ssId;
4036
4037 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer.sessionId))== NULL)
4038 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004039 limLog(pMac, LOGE,FL("session does not exist for given SessionId"));
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004040 return;
4041 }
4042
4043 if((VOS_TRUE == tx_timer_running(&pMac->lim.limTimers.gLimJoinFailureTimer)) &&
4044 (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE))
4045 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304046 vos_mem_copy(ssId.ssId,
4047 psessionEntry->ssId.ssId,
4048 psessionEntry->ssId.length);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004049 ssId.length = psessionEntry->ssId.length;
4050
4051 limSendProbeReqMgmtFrame( pMac, &ssId,
4052 psessionEntry->pLimMlmJoinReq->bssDescription.bssId, psessionEntry->currentOperChannel/*chanNum*/,
4053 psessionEntry->selfMacAddr, psessionEntry->dot11mode,
4054 psessionEntry->pLimJoinReq->addIEScan.length, psessionEntry->pLimJoinReq->addIEScan.addIEdata);
4055
4056 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_JOIN_PROBE_REQ_TIMER);
4057
4058 // Activate Join Periodic Probe Req timer
4059 if (tx_timer_activate(&pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer) != TX_SUCCESS)
4060 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004061 limLog(pMac, LOGP, FL("could not activate Periodic Join req failure timer"));
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004062 return;
4063 }
4064 }
4065 return;
4066} /*** limProcessPeriodicJoinProbeReqTimer() ***/
4067
Jeff Johnson295189b2012-06-20 16:38:30 -07004068
4069/**
4070 * limProcessAuthFailureTimeout()
4071 *
4072 *FUNCTION:
4073 * This function is called to process Min Channel Timeout
4074 * during channel scan.
4075 *
4076 *LOGIC:
4077 *
4078 *ASSUMPTIONS:
4079 *
4080 *NOTE:
4081 *
4082 * @param pMac Pointer to Global MAC structure
4083 * @return None
4084 */
4085
4086static void
4087limProcessAuthFailureTimeout(tpAniSirGlobal pMac)
4088{
4089 //fetch the sessionEntry based on the sessionId
4090 tpPESession psessionEntry;
krunal soni8d13b092013-07-19 13:23:29 -07004091#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4092 vos_log_rssi_pkt_type *pRssiLog = NULL;
4093#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07004094
4095 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimAuthFailureTimer.sessionId))== NULL)
4096 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004097 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004098 return;
4099 }
krunal soni8d13b092013-07-19 13:23:29 -07004100#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4101 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
4102 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
4103 if (pRssiLog)
4104 {
4105 pRssiLog->rssi = psessionEntry->rssi;
4106 }
4107 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
4108#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
4109
Jeff Johnson295189b2012-06-20 16:38:30 -07004110 switch (psessionEntry->limMlmState)
4111 {
4112 case eLIM_MLM_WT_AUTH_FRAME2_STATE:
4113 case eLIM_MLM_WT_AUTH_FRAME4_STATE:
4114 /**
4115 * Requesting STA did not receive next auth frame
4116 * before Auth Failure timeout.
4117 * Issue MLM auth confirm with timeout reason code
4118 */
Madan Mohan Koyyalamudi666d33a2012-11-29 11:32:59 -08004119 //Restore default failure timeout
4120 if (VOS_P2P_CLIENT_MODE == psessionEntry->pePersona && psessionEntry->defaultAuthFailureTimeout)
4121 {
4122 ccmCfgSetInt(pMac,WNI_CFG_AUTHENTICATE_FAILURE_TIMEOUT ,
4123 psessionEntry->defaultAuthFailureTimeout, NULL, eANI_BOOLEAN_FALSE);
4124 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004125 limRestoreFromAuthState(pMac,eSIR_SME_AUTH_TIMEOUT_RESULT_CODE,eSIR_MAC_UNSPEC_FAILURE_REASON,psessionEntry);
4126 break;
4127
4128 default:
4129 /**
4130 * Auth failure timer should not have timed out
4131 * in states other than wt_auth_frame2/4
4132 * Log error.
4133 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004134 PELOGE(limLog(pMac, LOGE, FL("received unexpected AUTH failure timeout in state %X"), psessionEntry->limMlmState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004135 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
4136
4137 break;
4138 }
4139} /*** limProcessAuthFailureTimeout() ***/
4140
4141
4142
4143/**
4144 * limProcessAuthRspTimeout()
4145 *
4146 *FUNCTION:
4147 * This function is called to process Min Channel Timeout
4148 * during channel scan.
4149 *
4150 *LOGIC:
4151 *
4152 *ASSUMPTIONS:
4153 *
4154 *NOTE:
4155 *
4156 * @param pMac Pointer to Global MAC structure
4157 * @return None
4158 */
4159
4160static void
4161limProcessAuthRspTimeout(tpAniSirGlobal pMac, tANI_U32 authIndex)
4162{
4163 struct tLimPreAuthNode *pAuthNode;
4164 tpPESession psessionEntry;
4165 tANI_U8 sessionId;
4166
4167 pAuthNode = limGetPreAuthNodeFromIndex(pMac, &pMac->lim.gLimPreAuthTimerTable, authIndex);
4168
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304169 if (NULL == pAuthNode)
4170 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004171 limLog(pMac, LOGW, FL("Invalid auth node"));
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304172 return;
4173 }
4174
4175 if ((psessionEntry = peFindSessionByBssid(pMac, pAuthNode->peerMacAddr, &sessionId)) == NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -07004176 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004177 limLog(pMac, LOGW, FL("session does not exist for given BSSID "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004178 return;
4179 }
4180
4181 if (psessionEntry->limSystemRole == eLIM_AP_ROLE ||
4182 psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE)
4183 {
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304184 if (pAuthNode->mlmState != eLIM_MLM_WT_AUTH_FRAME3_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004185 {
4186 /**
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304187 * Authentication response timer timedout
4188 * in unexpected state. Log error
Jeff Johnson295189b2012-06-20 16:38:30 -07004189 */
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304190 PELOGE(limLog(pMac, LOGE,
4191 FL("received unexpected AUTH rsp timeout for MAC address "));
4192 limPrintMacAddr(pMac, pAuthNode->peerMacAddr, LOGE);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004193 }
4194 else
4195 {
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304196 // Authentication response timer
4197 // timedout for an STA.
4198 pAuthNode->mlmState = eLIM_MLM_AUTH_RSP_TIMEOUT_STATE;
4199 pAuthNode->fTimerStarted = 0;
4200 PELOG1( limLog(pMac, LOG1,
4201 FL("AUTH rsp timedout for MAC address "));
4202 limPrintMacAddr(pMac, pAuthNode->peerMacAddr, LOG1);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004203
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304204 // Change timer to reactivate it in future
4205 limDeactivateAndChangePerStaIdTimer(pMac,
4206 eLIM_AUTH_RSP_TIMER,
4207 pAuthNode->authNodeIdx);
Jeff Johnson295189b2012-06-20 16:38:30 -07004208
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304209 limDeletePreAuthNode(pMac, pAuthNode->peerMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -07004210 }
4211 }
4212} /*** limProcessAuthRspTimeout() ***/
4213
4214
4215/**
4216 * limProcessAssocFailureTimeout()
4217 *
4218 *FUNCTION:
4219 * This function is called to process Min Channel Timeout
4220 * during channel scan.
4221 *
4222 *LOGIC:
4223 *
4224 *ASSUMPTIONS:
4225 *
4226 *NOTE:
4227 *
4228 * @param pMac Pointer to Global MAC structure
4229 * @return None
4230 */
4231
4232static void
4233limProcessAssocFailureTimeout(tpAniSirGlobal pMac, tANI_U32 MsgType)
4234{
4235
4236 tLimMlmAssocCnf mlmAssocCnf;
4237 tpPESession psessionEntry;
krunal soni8d13b092013-07-19 13:23:29 -07004238#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4239 vos_log_rssi_pkt_type *pRssiLog = NULL;
4240#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07004241
4242 //to fetch the lim/mlm state based on the sessionId, use the below sessionEntry
4243 tANI_U8 sessionId;
4244
4245 if(MsgType == LIM_ASSOC)
4246 {
4247 sessionId = pMac->lim.limTimers.gLimAssocFailureTimer.sessionId;
4248 }
4249 else
4250 {
4251 sessionId = pMac->lim.limTimers.gLimReassocFailureTimer.sessionId;
4252 }
4253
4254 if((psessionEntry = peFindSessionBySessionId(pMac, sessionId))== NULL)
4255 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004256 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004257 return;
4258 }
krunal soni8d13b092013-07-19 13:23:29 -07004259#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4260 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
4261 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
4262 if (pRssiLog)
4263 {
4264 pRssiLog->rssi = psessionEntry->rssi;
4265 }
4266 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
4267#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
4268
Jeff Johnson295189b2012-06-20 16:38:30 -07004269 /**
4270 * Expected Re/Association Response frame
4271 * not received within Re/Association Failure Timeout.
4272 */
4273
4274
4275
4276
4277 /* CR: vos packet memory is leaked when assoc rsp timeouted/failed. */
4278 /* notify TL that association is failed so that TL can flush the cached frame */
4279 WLANTL_AssocFailed (psessionEntry->staId);
4280
4281 // Log error
4282 PELOG1(limLog(pMac, LOG1,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004283 FL("Re/Association Response not received before timeout "));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004284
4285 if (( (psessionEntry->limSystemRole == eLIM_AP_ROLE) || (psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE) )||
4286 ( (psessionEntry->limMlmState != eLIM_MLM_WT_ASSOC_RSP_STATE) &&
4287 (psessionEntry->limMlmState != eLIM_MLM_WT_REASSOC_RSP_STATE) &&
4288 (psessionEntry->limMlmState != eLIM_MLM_WT_FT_REASSOC_RSP_STATE)))
4289 {
4290 /**
4291 * Re/Assoc failure timer should not have timedout on AP
4292 * or in a state other than wt_re/assoc_response.
4293 */
4294
4295 // Log error
4296 limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004297 FL("received unexpected REASSOC failure timeout in state %X for role %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004298 psessionEntry->limMlmState, psessionEntry->limSystemRole);
4299 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
4300 }
4301 else
4302 {
4303
4304 if ((MsgType == LIM_ASSOC) ||
4305 ((MsgType == LIM_REASSOC) && (psessionEntry->limMlmState == eLIM_MLM_WT_FT_REASSOC_RSP_STATE)))
4306 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004307 PELOGE(limLog(pMac, LOGE, FL("(Re)Assoc Failure Timeout occurred."));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004308
4309 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07004310 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
4311
Jeff Johnson295189b2012-06-20 16:38:30 -07004312 // 'Change' timer for future activations
4313 limDeactivateAndChangeTimer(pMac, eLIM_ASSOC_FAIL_TIMER);
4314
4315 // Free up buffer allocated for JoinReq held by
4316 // MLM state machine
4317 if (psessionEntry->pLimMlmJoinReq)
4318 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304319 vos_mem_free(psessionEntry->pLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004320 psessionEntry->pLimMlmJoinReq = NULL;
4321 }
4322
Jeff Johnson295189b2012-06-20 16:38:30 -07004323 //To remove the preauth node in case of fail to associate
4324 if (limSearchPreAuthList(pMac, psessionEntry->bssId))
4325 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004326 PELOG1(limLog(pMac, LOG1, FL(" delete pre auth node for %02X-%02X-%02X-%02X-%02X-%02X"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004327 psessionEntry->bssId[0], psessionEntry->bssId[1], psessionEntry->bssId[2],
4328 psessionEntry->bssId[3], psessionEntry->bssId[4], psessionEntry->bssId[5]);)
4329 limDeletePreAuthNode(pMac, psessionEntry->bssId);
4330 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004331
4332 mlmAssocCnf.resultCode =
4333 eSIR_SME_ASSOC_TIMEOUT_RESULT_CODE;
4334 mlmAssocCnf.protStatusCode =
4335 eSIR_MAC_UNSPEC_FAILURE_STATUS;
4336
4337 /* Update PE session Id*/
4338 mlmAssocCnf.sessionId = psessionEntry->peSessionId;
4339 if (MsgType == LIM_ASSOC)
4340 limPostSmeMessage(pMac, LIM_MLM_ASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
4341 else
4342 {
4343 /* Will come here only in case of 11r, CCx FT when reassoc rsp
4344 is not received and we receive a reassoc - timesout */
4345 mlmAssocCnf.resultCode = eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE;
4346 limPostSmeMessage(pMac, LIM_MLM_REASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
4347 }
4348 }
4349 else
4350 {
4351 /**
4352 * Restore pre-reassoc req state.
4353 * Set BSSID to currently associated AP address.
4354 */
4355 psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004356 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004357
4358 limRestorePreReassocState(pMac,
4359 eSIR_SME_REASSOC_TIMEOUT_RESULT_CODE, eSIR_MAC_UNSPEC_FAILURE_STATUS,psessionEntry);
4360 }
4361 }
4362} /*** limProcessAssocFailureTimeout() ***/
4363
4364
4365
4366/**
4367 * limCompleteMlmScan()
4368 *
4369 *FUNCTION:
4370 * This function is called to send MLM_SCAN_CNF message
4371 * to SME state machine.
4372 *
4373 *LOGIC:
4374 *
4375 *ASSUMPTIONS:
4376 *
4377 *NOTE:
4378 *
4379 * @param pMac Pointer to Global MAC structure
4380 * @param retCode Result code to be sent
4381 * @return None
4382 */
4383
4384void
4385limCompleteMlmScan(tpAniSirGlobal pMac, tSirResultCodes retCode)
4386{
4387 tLimMlmScanCnf mlmScanCnf;
4388
4389 /// Restore previous MLM state
4390 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004391 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004392 limRestorePreScanState(pMac);
4393
4394 // Free up pMac->lim.gLimMlmScanReq
4395 if( NULL != pMac->lim.gpLimMlmScanReq )
4396 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304397 vos_mem_free(pMac->lim.gpLimMlmScanReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004398 pMac->lim.gpLimMlmScanReq = NULL;
4399 }
4400
4401 mlmScanCnf.resultCode = retCode;
4402 mlmScanCnf.scanResultLength = pMac->lim.gLimMlmScanResultLength;
4403
4404 limPostSmeMessage(pMac, LIM_MLM_SCAN_CNF, (tANI_U32 *) &mlmScanCnf);
4405
4406} /*** limCompleteMlmScan() ***/
4407
4408/**
4409 * \brief Setup an A-MPDU/BA session
4410 *
4411 * \sa limProcessMlmAddBAReq
4412 *
4413 * \param pMac The global tpAniSirGlobal object
4414 *
4415 * \param pMsgBuf The MLME ADDBA Req message buffer
4416 *
4417 * \return none
4418 */
4419void limProcessMlmAddBAReq( tpAniSirGlobal pMac,
4420 tANI_U32 *pMsgBuf )
4421{
4422tSirRetStatus status = eSIR_SUCCESS;
4423tpLimMlmAddBAReq pMlmAddBAReq;
4424tpLimMlmAddBACnf pMlmAddBACnf;
4425 tpPESession psessionEntry;
4426
4427 if(pMsgBuf == NULL)
4428 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004429 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004430 return;
4431 }
4432
4433 pMlmAddBAReq = (tpLimMlmAddBAReq) pMsgBuf;
4434 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmAddBAReq->sessionId))== NULL)
4435 {
4436 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004437 FL("session does not exist for given sessionId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304438 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004439 return;
4440 }
4441
4442
4443 // Send ADDBA Req over the air
4444 status = limSendAddBAReq( pMac, pMlmAddBAReq,psessionEntry);
4445
4446 //
4447 // Respond immediately to LIM, only if MLME has not been
4448 // successfully able to send WDA_ADDBA_REQ to HAL.
4449 // Else, LIM_MLM_ADDBA_CNF will be sent after receiving
4450 // ADDBA Rsp from peer entity
4451 //
4452 if( eSIR_SUCCESS != status )
4453 {
4454 // Allocate for LIM_MLM_ADDBA_CNF
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304455
4456 pMlmAddBACnf = vos_mem_malloc(sizeof( tLimMlmAddBACnf ));
4457 if ( NULL == pMlmAddBACnf )
Jeff Johnson295189b2012-06-20 16:38:30 -07004458 {
4459 limLog( pMac, LOGP,
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304460 FL("AllocateMemory failed with error code %d"));
4461 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004462 return;
4463 }
4464 else
4465 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304466 vos_mem_set((void *) pMlmAddBACnf, sizeof( tLimMlmAddBACnf ), 0);
4467 vos_mem_copy((void *) pMlmAddBACnf->peerMacAddr,
4468 (void *) pMlmAddBAReq->peerMacAddr,
4469 sizeof( tSirMacAddr ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004470
4471 pMlmAddBACnf->baDialogToken = pMlmAddBAReq->baDialogToken;
4472 pMlmAddBACnf->baTID = pMlmAddBAReq->baTID;
4473 pMlmAddBACnf->baPolicy = pMlmAddBAReq->baPolicy;
4474 pMlmAddBACnf->baBufferSize = pMlmAddBAReq->baBufferSize;
4475 pMlmAddBACnf->baTimeout = pMlmAddBAReq->baTimeout;
4476 pMlmAddBACnf->sessionId = pMlmAddBAReq->sessionId;
4477
4478 // Update the result code
4479 pMlmAddBACnf->addBAResultCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
4480
4481 limPostSmeMessage( pMac,
4482 LIM_MLM_ADDBA_CNF,
4483 (tANI_U32 *) pMlmAddBACnf );
4484 }
4485
4486 // Restore MLME state
4487 psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004488 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004489
4490 }
4491
4492 // Free the buffer allocated for tLimMlmAddBAReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304493 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004494
4495}
4496
4497/**
4498 * \brief Send an ADDBA Rsp to peer STA in response
4499 * to an ADDBA Req received earlier
4500 *
4501 * \sa limProcessMlmAddBARsp
4502 *
4503 * \param pMac The global tpAniSirGlobal object
4504 *
4505 * \param pMsgBuf The MLME ADDBA Rsp message buffer
4506 *
4507 * \return none
4508 */
4509void limProcessMlmAddBARsp( tpAniSirGlobal pMac,
4510 tANI_U32 *pMsgBuf )
4511{
4512tpLimMlmAddBARsp pMlmAddBARsp;
4513 tANI_U16 aid;
4514 tpDphHashNode pSta;
4515 tpPESession psessionEntry;
4516
4517
4518 if(pMsgBuf == NULL)
4519 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004520 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004521 return;
4522 }
4523
4524 pMlmAddBARsp = (tpLimMlmAddBARsp) pMsgBuf;
4525
4526 if(( psessionEntry = peFindSessionBySessionId(pMac,pMlmAddBARsp->sessionId))== NULL)
4527 {
4528 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004529 FL("session does not exist for given session ID"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304530 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004531 return;
4532 }
4533
4534
4535 // Send ADDBA Rsp over the air
4536 if( eSIR_SUCCESS != limSendAddBARsp( pMac,pMlmAddBARsp,psessionEntry))
4537 {
4538 limLog( pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004539 FL("Failed to send ADDBA Rsp to peer "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004540 limPrintMacAddr( pMac, pMlmAddBARsp->peerMacAddr, LOGE );
4541 /* Clean the BA context maintained by HAL and TL on failure */
4542 pSta = dphLookupHashEntry( pMac, pMlmAddBARsp->peerMacAddr, &aid,
4543 &psessionEntry->dph.dphHashTable);
4544 if( NULL != pSta )
4545 {
4546 limPostMsgDelBAInd( pMac, pSta, pMlmAddBARsp->baTID, eBA_RECIPIENT,
4547 psessionEntry);
4548 }
4549 }
4550
4551 // Time to post a WDA_DELBA_IND to HAL in order
4552 // to cleanup the HAL and SoftMAC entries
4553
4554
4555 // Free the buffer allocated for tLimMlmAddBARsp
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304556 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004557
4558}
4559
4560/**
4561 * \brief Setup an A-MPDU/BA session
4562 *
4563 * \sa limProcessMlmDelBAReq
4564 *
4565 * \param pMac The global tpAniSirGlobal object
4566 *
4567 * \param pMsgBuf The MLME DELBA Req message buffer
4568 *
4569 * \return none
4570 */
4571void limProcessMlmDelBAReq( tpAniSirGlobal pMac,
4572 tANI_U32 *pMsgBuf )
4573{
4574 tSirRetStatus status = eSIR_SUCCESS;
4575 tpLimMlmDelBAReq pMlmDelBAReq;
4576 tpLimMlmDelBACnf pMlmDelBACnf;
4577 tpPESession psessionEntry;
4578
4579
4580 if(pMsgBuf == NULL)
4581 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004582 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004583 return;
4584 }
4585
4586 // TODO - Need to validate MLME state
4587 pMlmDelBAReq = (tpLimMlmDelBAReq) pMsgBuf;
4588
4589 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDelBAReq->sessionId))== NULL)
4590 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004591 PELOGE(limLog(pMac, LOGE,FL("session does not exist for given bssId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304592 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004593 return;
4594 }
4595
4596 // Send DELBA Ind over the air
4597 if( eSIR_SUCCESS !=
4598 (status = limSendDelBAInd( pMac, pMlmDelBAReq,psessionEntry)))
4599 status = eSIR_SME_HAL_SEND_MESSAGE_FAIL;
4600 else
4601 {
4602 tANI_U16 aid;
4603 tpDphHashNode pSta;
4604
4605 // Time to post a WDA_DELBA_IND to HAL in order
4606 // to cleanup the HAL and SoftMAC entries
4607 pSta = dphLookupHashEntry( pMac, pMlmDelBAReq->peerMacAddr, &aid , &psessionEntry->dph.dphHashTable);
4608 if( NULL != pSta )
4609 {
4610 status = limPostMsgDelBAInd( pMac,
4611 pSta,
4612 pMlmDelBAReq->baTID,
4613 pMlmDelBAReq->baDirection,psessionEntry);
4614
4615 }
4616 }
4617
4618 //
4619 // Respond immediately to SME with DELBA CNF using
4620 // LIM_MLM_DELBA_CNF with appropriate status
4621 //
4622
4623 // Allocate for LIM_MLM_DELBA_CNF
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304624
4625 pMlmDelBACnf = vos_mem_malloc(sizeof( tLimMlmDelBACnf ));
4626 if ( NULL == pMlmDelBACnf )
Jeff Johnson295189b2012-06-20 16:38:30 -07004627 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304628 limLog( pMac, LOGP, FL("AllocateMemory failed"));
4629 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004630 return;
4631 }
4632 else
4633 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304634 vos_mem_set((void *) pMlmDelBACnf, sizeof( tLimMlmDelBACnf ), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004635
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304636 vos_mem_copy((void *) pMlmDelBACnf,
4637 (void *) pMlmDelBAReq,
4638 sizeof( tLimMlmDelBAReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004639
4640 // Update DELBA result code
4641 pMlmDelBACnf->delBAReasonCode = pMlmDelBAReq->delBAReasonCode;
4642
4643 /* Update PE session Id*/
4644 pMlmDelBACnf->sessionId = pMlmDelBAReq->sessionId;
4645
4646 limPostSmeMessage( pMac,
4647 LIM_MLM_DELBA_CNF,
4648 (tANI_U32 *) pMlmDelBACnf );
4649 }
4650
4651 // Free the buffer allocated for tLimMlmDelBAReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304652 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004653
4654}
4655
4656/**
4657 * @function : limSMPowerSaveStateInd( )
4658 *
4659 * @brief : This function is called upon receiving the PMC Indication to update the STA's MimoPs State.
4660 *
4661 * LOGIC:
4662 *
4663 * ASSUMPTIONS:
4664 * NA
4665 *
4666 * NOTE:
4667 * NA
4668 *
4669 * @param pMac - Pointer to Global MAC structure
4670 * @param limMsg - Lim Message structure object with the MimoPSparam in body
4671 * @return None
4672 */
4673
4674tSirRetStatus
4675limSMPowerSaveStateInd(tpAniSirGlobal pMac, tSirMacHTMIMOPowerSaveState state)
4676{
4677#if 0
4678 tSirRetStatus retStatus = eSIR_SUCCESS;
4679#if 0
4680 tANI_U32 cfgVal1;
4681 tANI_U16 cfgVal2;
4682 tSirMacHTCapabilityInfo *pHTCapabilityInfo;
4683 tpDphHashNode pSta = NULL;
4684
4685 tpPESession psessionEntry = &pMac->lim.gpSession[0]; //TBD-RAJESH HOW TO GET sessionEntry?????
4686 /** Verify the Mode of operation */
4687 if (pMac->lim.gLimSystemRole != eSYSTEM_STA_ROLE) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004688 PELOGE(limLog(pMac, LOGE, FL("Got PMC indication when System not in the STA Role"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004689 return eSIR_FAILURE;
4690 }
4691
4692 if ((pMac->lim.gHTMIMOPSState == state) || (state == eSIR_HT_MIMO_PS_NA )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004693 PELOGE(limLog(pMac, LOGE, FL("Got Indication when already in the same mode or State passed is NA:%d "), state);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004694 return eSIR_FAILURE;
4695 }
4696
4697 if (!pMac->lim.htCapability){
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004698 PELOGW(limLog(pMac, LOGW, FL(" Not in 11n or HT capable mode"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004699 return eSIR_FAILURE;
4700 }
4701
4702 /** Update the CFG about the default MimoPS State */
4703 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &cfgVal1) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004704 limLog(pMac, LOGP, FL("could not retrieve HT Cap CFG "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004705 return eSIR_FAILURE;
4706 }
4707
4708 cfgVal2 = (tANI_U16)cfgVal1;
4709 pHTCapabilityInfo = (tSirMacHTCapabilityInfo *) &cfgVal2;
4710 pHTCapabilityInfo->mimoPowerSave = state;
4711
4712 if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004713 limLog(pMac, LOGP, FL("could not update HT Cap Info CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004714 return eSIR_FAILURE;
4715 }
4716
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004717 PELOG2(limLog(pMac, LOG2, FL(" The HT Capability for Mimo Pwr is updated to State: %u "),state);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004718 if (pMac->lim.gLimSmeState != eLIM_SME_LINK_EST_STATE) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004719 PELOG2(limLog(pMac, LOG2,FL(" The STA is not in the Connected/Link Est Sme_State: %d "), pMac->lim.gLimSmeState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004720 /** Update in the LIM the MIMO PS state of the SELF */
4721 pMac->lim.gHTMIMOPSState = state;
4722 return eSIR_SUCCESS;
4723 }
4724
4725 pSta = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable);
4726 if (!pSta->mlmStaContext.htCapability) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004727 limLog( pMac, LOGE,FL( "limSendSMPowerState: Peer is not HT Capable " ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004728 return eSIR_FAILURE;
4729 }
4730
4731 if (isEnteringMimoPS(pMac->lim.gHTMIMOPSState, state)) {
4732 tSirMacAddr macAddr;
4733 /** Obtain the AP's Mac Address */
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304734 vos_mem_copy((tANI_U8 *)macAddr, psessionEntry->bssId, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004735 /** Send Action Frame with the corresponding mode */
4736 retStatus = limSendSMPowerStateFrame(pMac, macAddr, state);
4737 if (retStatus != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004738 PELOGE(limLog(pMac, LOGE, "Update SM POWER: Sending Action Frame has failed");)
Jeff Johnson295189b2012-06-20 16:38:30 -07004739 return retStatus;
4740 }
4741 }
4742
4743 /** Update MlmState about the SetMimoPS State */
4744 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
4745 pMac->lim.gLimMlmState = eLIM_MLM_WT_SET_MIMOPS_STATE;
4746 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
4747
4748 /** Update the HAL and s/w mac about the mode to be set */
4749 retStatus = limPostSMStateUpdate( pMac,psessionEntry->staId, state);
4750
4751 PELOG2(limLog(pMac, LOG2, " Updated the New SMPS State");)
4752 /** Update in the LIM the MIMO PS state of the SELF */
4753 pMac->lim.gHTMIMOPSState = state;
4754#endif
4755 return retStatus;
4756#endif
4757return eSIR_SUCCESS;
4758}
4759
Jeff Johnsone7245742012-09-05 17:12:55 -07004760#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004761ePhyChanBondState limGet11ACPhyCBState(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 htSecondaryChannelOffset,tANI_U8 peerCenterChan, tpPESession psessionEntry)
Jeff Johnsone7245742012-09-05 17:12:55 -07004762{
4763 ePhyChanBondState cbState = PHY_SINGLE_CHANNEL_CENTERED;
4764
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004765 if(!psessionEntry->apChanWidth)
Jeff Johnsone7245742012-09-05 17:12:55 -07004766 {
4767 return htSecondaryChannelOffset;
4768 }
4769
4770 if ( (htSecondaryChannelOffset
4771 == PHY_DOUBLE_CHANNEL_LOW_PRIMARY)
4772 )
4773 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004774 if ((channel + 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004775 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004776 else if ((channel + 6 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004777 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004778 else if ((channel - 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004779 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
4780 else
4781 limLog (pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004782 FL("Invalid Channel Number = %d Center Chan = %d "),
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004783 channel, peerCenterChan);
Jeff Johnsone7245742012-09-05 17:12:55 -07004784 }
4785 if ( (htSecondaryChannelOffset
4786 == PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
4787 )
4788 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004789 if ((channel - 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004790 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004791 else if ((channel + 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004792 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004793 else if ((channel - 6 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004794 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
4795 else
4796 limLog (pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004797 FL("Invalid Channel Number = %d Center Chan = %d "),
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004798 channel, peerCenterChan);
Jeff Johnsone7245742012-09-05 17:12:55 -07004799 }
4800 return cbState;
4801}
4802
4803#endif
4804
Jeff Johnson295189b2012-06-20 16:38:30 -07004805void
Jeff Johnsone7245742012-09-05 17:12:55 -07004806limSetChannel(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 secChannelOffset, tPowerdBm maxTxPower, tANI_U8 peSessionId)
Jeff Johnson295189b2012-06-20 16:38:30 -07004807{
4808#if !defined WLAN_FEATURE_VOWIFI
4809 tANI_U32 localPwrConstraint;
4810#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07004811 tpPESession peSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07004812
Jeff Johnsone7245742012-09-05 17:12:55 -07004813 peSession = peFindSessionBySessionId (pMac, peSessionId);
4814
4815 if ( NULL == peSession)
4816 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004817 limLog (pMac, LOGP, FL("Invalid PE session = %d"), peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07004818 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07004819 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004820#if defined WLAN_FEATURE_VOWIFI
Jeff Johnsone7245742012-09-05 17:12:55 -07004821#ifdef WLAN_FEATURE_11AC
4822 if ( peSession->vhtCapability )
4823 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004824 limSendSwitchChnlParams( pMac, channel, limGet11ACPhyCBState( pMac,channel,secChannelOffset,peSession->apCenterChan, peSession), maxTxPower, peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07004825 }
4826 else
4827#endif
4828 {
4829 limSendSwitchChnlParams( pMac, channel, secChannelOffset, maxTxPower, peSessionId);
4830 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004831#else
4832 if (wlan_cfgGetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, &localPwrConstraint) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004833 limLog(pMac, LOGP, FL("could not read WNI_CFG_LOCAL_POWER_CONSTRAINT from CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004834 return;
4835 }
4836 // Send WDA_CHNL_SWITCH_IND to HAL
Jeff Johnsone7245742012-09-05 17:12:55 -07004837#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004838 if ( peSession->vhtCapability && peSession->vhtCapabilityPresentInBeacon)
Jeff Johnsone7245742012-09-05 17:12:55 -07004839 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004840 limSendSwitchChnlParams( pMac, channel, limGet11ACPhyCBState( pMac,channel,secChannelOffset,peSession->apCenterChan, peSession), maxTxPower, peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07004841 }
4842 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004843#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07004844 {
4845 limSendSwitchChnlParams( pMac, channel, secChannelOffset, (tPowerdBm)localPwrConstraint, peSessionId);
4846 }
4847#endif
4848
Jeff Johnson295189b2012-06-20 16:38:30 -07004849 }