blob: 4a0bec4249f22beb378c6bfd501a96e88b678df7 [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
Leela Venkata Kiran Kumar Reddy Chirala66639a62013-08-29 15:38:19 -07001024 * Start scan is not already requestd.
1025 * after finish scan rsp from firmware host is sending endscan request so adding
1026 * check for IDLE SCAN STATE also added to avoid this issue
Jeff Johnson295189b2012-06-20 16:38:30 -07001027 */
1028 if((pMac->lim.gLimHalScanState != eLIM_HAL_END_SCAN_WAIT_STATE) &&
Leela Venkata Kiran Kumar Reddy Chirala66639a62013-08-29 15:38:19 -07001029 (pMac->lim.gLimHalScanState != eLIM_HAL_IDLE_SCAN_STATE) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07001030 (pMac->lim.gLimHalScanState != eLIM_HAL_START_SCAN_WAIT_STATE))
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301031 {
1032 pEndScanParam = vos_mem_malloc(sizeof(*pEndScanParam));
1033 if ( NULL == pEndScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -07001034 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301035 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001036 goto error;
1037 }
1038
1039 msg.type = WDA_END_SCAN_REQ;
1040 msg.bodyptr = pEndScanParam;
1041 msg.bodyval = 0;
1042 pEndScanParam->status = eHAL_STATUS_SUCCESS;
1043 pEndScanParam->scanChannel = (tANI_U8)channelNum;
1044
1045 pMac->lim.gLimHalScanState = nextState;
1046 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -07001047 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001048
1049 rc = wdaPostCtrlMsg(pMac, &msg);
1050 if (rc == eSIR_SUCCESS) {
1051 return;
1052 }
1053
1054 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301055 vos_mem_free(pEndScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001056 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001057
1058 error:
1059 switch(nextState)
1060 {
1061 case eLIM_HAL_END_SCAN_WAIT_STATE:
1062 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_END_FAILED);
1063 break;
1064
Jeff Johnson295189b2012-06-20 16:38:30 -07001065
1066 default:
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001067 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg Rcvd invalid nextState %d"), nextState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001068 break;
1069 }
1070 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001071 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001072 }
1073 else
1074 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001075 PELOGW(limLog(pMac, LOGW, FL("Invalid state for END_SCAN_REQ message=%d"), pMac->lim.gLimHalScanState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001076 }
1077
1078
1079 return;
1080}
1081
1082/**
1083 * limSendHalFinishScanReq()
1084 *
1085 *FUNCTION:
1086 * This function is called to finish scan/learn request..
1087 *
1088 *LOGIC:
1089 *
1090 *ASSUMPTIONS:
1091 * NA
1092 *
1093 *NOTE:
1094 * NA
1095 *
1096 * @param pMac - Pointer to Global MAC structure
1097 * @param nextState - this parameters determines whether this call is for scan or learn
1098 *
1099 * @return None
1100 */
1101void limSendHalFinishScanReq(tpAniSirGlobal pMac, tLimLimHalScanState nextState)
1102{
1103
1104 tSirMsgQ msg;
1105 tpFinishScanParams pFinishScanParam;
1106 tSirRetStatus rc = eSIR_SUCCESS;
1107
1108 if(pMac->lim.gLimHalScanState == nextState)
1109 {
1110 /*
1111 * PE may receive multiple probe responses, while waiting for HAL to send 'FINISH_SCAN_RSP' message
1112 * PE was sending multiple finish scan req messages to HAL
1113 * this check will avoid that.
1114 * If PE is already waiting for the 'finish_scan_rsp' message from HAL, it will ignore this request.
1115 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001116 PELOGW(limLog(pMac, LOGW, FL("Next Scan State is same as the current state: %d "), nextState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001117 return;
1118 }
1119
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301120 pFinishScanParam = vos_mem_malloc(sizeof(*pFinishScanParam));
1121 if ( NULL == pFinishScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -07001122 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301123 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001124 goto error;
1125 }
1126
1127 msg.type = WDA_FINISH_SCAN_REQ;
1128 msg.bodyptr = pFinishScanParam;
1129 msg.bodyval = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001130
1131 peGetResumeChannel(pMac, &pFinishScanParam->currentOperChannel, &pFinishScanParam->cbState);
1132
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301133 vos_mem_set((tANI_U8 *)&pFinishScanParam->macMgmtHdr, sizeof(tSirMacMgmtHdr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001134
1135 if (nextState == eLIM_HAL_FINISH_LEARN_WAIT_STATE)
1136 {
1137 //AP - No pkt need to be transmitted
1138 pFinishScanParam->scanMode = eHAL_SYS_MODE_LEARN;
1139 pFinishScanParam->notifyBss = FALSE;
1140 pFinishScanParam->notifyHost = FALSE;
1141 pFinishScanParam->frameType = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001142
Jeff Johnson295189b2012-06-20 16:38:30 -07001143 pFinishScanParam->frameLength = 0;
1144 pMac->lim.gLimHalScanState = nextState;
1145 }
1146 else
1147 {
1148 /* If STA is associated with an AP (ie. STA is in
1149 * LINK_ESTABLISHED state), then STA need to inform
1150 * the AP via either DATA-NULL
1151 */
1152 if (nextState == eLIM_HAL_RESUME_LINK_WAIT_STATE)
1153 {
1154 pFinishScanParam->scanMode = eHAL_SYS_MODE_SUSPEND_LINK;
1155 }
1156 else
1157 {
1158 pFinishScanParam->scanMode = eHAL_SYS_MODE_SCAN;
1159 }
1160 pFinishScanParam->notifyHost = FALSE;
1161 __limCreateFinishScanRawFrame(pMac, pFinishScanParam);
1162 //WLAN_SUSPEND_LINK Related
1163 pMac->lim.gLimHalScanState = nextState;
1164 //end WLAN_SUSPEND_LINK Related
1165 }
1166
1167 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -07001168 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001169
1170 rc = wdaPostCtrlMsg(pMac, &msg);
1171 if (rc == eSIR_SUCCESS) {
1172 return;
1173 }
1174 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301175 vos_mem_free(pFinishScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001176 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001177
1178 error:
1179 if(nextState == eLIM_HAL_FINISH_SCAN_WAIT_STATE)
1180 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_FINISH_FAILED);
1181 //WLAN_SUSPEND_LINK Related
1182 else if ( nextState == eLIM_HAL_RESUME_LINK_WAIT_STATE )
1183 {
1184 if( pMac->lim.gpLimResumeCallback )
1185 {
1186 pMac->lim.gpLimResumeCallback( pMac, rc, pMac->lim.gpLimResumeData );
1187 pMac->lim.gpLimResumeCallback = NULL;
1188 pMac->lim.gpLimResumeData = NULL;
1189 pMac->lim.gLimSystemInScanLearnMode = 0;
1190 }
1191 }
1192 //end WLAN_SUSPEND_LINK Related
1193 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
1194 return;
1195}
1196
1197/**
1198 * limContinueChannelScan()
1199 *
1200 *FUNCTION:
1201 * This function is called by limPerformChannelScan().
1202 * This function is called to continue channel scanning when
1203 * Beacon/Probe Response frame are received.
1204 *
1205 *LOGIC:
1206 * Scan criteria stored in pMac->lim.gLimMlmScanReq is used
1207 * to perform channel scan. In this function MLM sub module
1208 * makes channel switch, sends PROBE REQUEST frame in case of
1209 * ACTIVE SCANNING, starts min/max channel timers, programs
1210 * NAV to probeDelay timer and waits for Beacon/Probe Response.
1211 * Once all required channels are scanned, LIM_MLM_SCAN_CNF
1212 * primitive is used to send Scan results to SME sub module.
1213 *
1214 *ASSUMPTIONS:
1215 * 1. In case of Active scanning, start MAX channel time iff
1216 * MIN channel timer expired and activity is observed on
1217 * the channel.
1218 *
1219 *NOTE:
1220 * NA
1221 *
1222 * @param pMac Pointer to Global MAC structure
1223 * @return None
1224 */
1225void
1226limContinueChannelScan(tpAniSirGlobal pMac)
1227{
1228 tANI_U8 channelNum;
1229
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001230 PELOG1(limLog(pMac, LOG1, FL("Continue SCAN : chan %d tot %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001231 pMac->lim.gLimCurrentScanChannelId,
1232 pMac->lim.gpLimMlmScanReq->channelList.numChannels);)
1233
1234 if (pMac->lim.gLimCurrentScanChannelId >
1235 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1)
1236 || pMac->lim.abortScan)
1237 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001238 pMac->lim.abortScan = 0;
1239 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1240 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1241
1242 //Set the resume channel to Any valid channel (invalid).
1243 //This will instruct HAL to set it to any previous valid channel.
1244 peSetResumeChannel(pMac, 0, 0);
1245
1246 /// Done scanning all required channels
1247 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001248 return;
1249 }
1250
1251 /// Atleast one more channel is to be scanned
1252
1253 if ((pMac->lim.gLimReturnAfterFirstMatch & 0x40) ||
1254 (pMac->lim.gLimReturnAfterFirstMatch & 0x80))
1255 {
1256 while (pMac->lim.gLimCurrentScanChannelId <=
1257 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
1258 {
1259 if (((limGetCurrentScanChannel(pMac) <= 14) &&
1260 pMac->lim.gLim24Band11dScanDone) ||
1261 ((limGetCurrentScanChannel(pMac) > 14) &&
1262 pMac->lim.gLim50Band11dScanDone))
1263 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001264 limLog(pMac, LOGW, FL("skipping chan %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001265 limGetCurrentScanChannel(pMac));
1266 pMac->lim.gLimCurrentScanChannelId++;
1267 }
1268 else
1269 break;
1270 }
1271
1272 if (pMac->lim.gLimCurrentScanChannelId >
1273 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
1274 {
1275 pMac->lim.abortScan = 0;
1276 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1277 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1278 /// Done scanning all required channels
1279 //Set the resume channel to Any valid channel (invalid).
1280 //This will instruct HAL to set it to any previous valid channel.
1281 peSetResumeChannel(pMac, 0, 0);
1282 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
1283 return;
1284 }
1285 }
1286
1287 channelNum = limGetCurrentScanChannel(pMac);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001288 PELOG2(limLog(pMac, LOG2, FL("Current Channel to be scanned is %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001289 channelNum);)
1290
1291 limSendHalStartScanReq(pMac, channelNum, eLIM_HAL_START_SCAN_WAIT_STATE);
1292 return;
1293} /*** end limContinueChannelScan() ***/
1294
1295
1296
1297/**
1298 * limRestorePreScanState()
1299 *
1300 *FUNCTION:
1301 * This function is called by limContinueChannelScan()
1302 * to restore HW state prior to entering 'scan state'
1303 *
1304 *LOGIC
1305 *
1306 *ASSUMPTIONS:
1307 *
1308 *NOTE:
1309 * NA
1310 *
1311 * @param pMac Pointer to Global MAC structure
1312 * @return None
1313 */
1314void
1315limRestorePreScanState(tpAniSirGlobal pMac)
1316{
1317 int i;
1318
1319 /// Deactivate MIN/MAX channel timers if running
1320 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1321 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1322
1323 /* Re-activate Heartbeat timers for connected sessions as scan
Madan Mohan Koyyalamudi70bb4cb2012-10-18 19:31:25 -07001324 * is done if the DUT is in active mode
1325 * AND it is not a ROAMING ("background") scan */
1326 if(((ePMM_STATE_BMPS_WAKEUP == pMac->pmm.gPmmState) ||
Jeff Johnson295189b2012-06-20 16:38:30 -07001327 (ePMM_STATE_READY == pMac->pmm.gPmmState))
Madan Mohan Koyyalamudi70bb4cb2012-10-18 19:31:25 -07001328 && (pMac->lim.gLimBackgroundScanMode != eSIR_ROAMING_SCAN ))
Jeff Johnson295189b2012-06-20 16:38:30 -07001329 {
1330 for(i=0;i<pMac->lim.maxBssId;i++)
1331 {
Jeff Johnson32d95a32012-09-10 13:15:23 -07001332 if((peFindSessionBySessionId(pMac,i) != NULL) &&
1333 (pMac->lim.gpSession[i].valid == TRUE) &&
Yathish9f22e662012-12-10 14:21:35 -08001334 (eLIM_MLM_LINK_ESTABLISHED_STATE == pMac->lim.gpSession[i].limMlmState) &&
1335 (!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
Jeff Johnson295189b2012-06-20 16:38:30 -07001336 {
1337 limReactivateHeartBeatTimer(pMac, peFindSessionBySessionId(pMac,i));
1338 }
1339 }
1340 }
1341
1342 /**
1343 * clean up message queue.
1344 * If SME messages, redirect to deferred queue.
1345 * The rest will be discarded.
1346 */
1347 //limCleanupMsgQ(pMac);
1348
1349 pMac->lim.gLimSystemInScanLearnMode = 0;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001350 PELOG1(limLog(pMac, LOG1, FL("Scan ended, took %d tu"), (tx_time_get() - pMac->lim.scanStartTime));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001351} /*** limRestorePreScanState() ***/
1352
Jeff Johnsone7245742012-09-05 17:12:55 -07001353#ifdef FEATURE_OEM_DATA_SUPPORT
1354
1355void limSendHalOemDataReq(tpAniSirGlobal pMac)
1356{
1357 tSirMsgQ msg;
1358 tpStartOemDataReq pStartOemDataReq = NULL;
1359 tSirRetStatus rc = eSIR_SUCCESS;
1360 tpLimMlmOemDataRsp pMlmOemDataRsp;
1361 tANI_U32 reqLen = 0;
1362 if(NULL == pMac->lim.gpLimMlmOemDataReq)
1363 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001364 PELOGE(limLog(pMac, LOGE, FL("Null pointer"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001365 goto error;
1366 }
1367
1368 reqLen = sizeof(tStartOemDataReq);
1369
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301370 pStartOemDataReq = vos_mem_malloc(reqLen);
1371 if ( NULL == pStartOemDataReq )
Jeff Johnsone7245742012-09-05 17:12:55 -07001372 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001373 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: Could not allocate memory for pStartOemDataReq"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001374 goto error;
1375 }
1376
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301377 vos_mem_set((tANI_U8*)(pStartOemDataReq), reqLen, 0);
Jeff Johnsone7245742012-09-05 17:12:55 -07001378
1379 //Now copy over the information to the OEM DATA REQ to HAL
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301380 vos_mem_copy(pStartOemDataReq->selfMacAddr,
1381 pMac->lim.gpLimMlmOemDataReq->selfMacAddr,
1382 sizeof(tSirMacAddr));
Jeff Johnsone7245742012-09-05 17:12:55 -07001383
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301384 vos_mem_copy(pStartOemDataReq->oemDataReq,
1385 pMac->lim.gpLimMlmOemDataReq->oemDataReq,
1386 OEM_DATA_REQ_SIZE);
Jeff Johnsone7245742012-09-05 17:12:55 -07001387
1388 //Create the message to be passed to HAL
1389 msg.type = WDA_START_OEM_DATA_REQ;
1390 msg.bodyptr = pStartOemDataReq;
1391 msg.bodyval = 0;
1392
1393 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
1394 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
1395
1396 rc = wdaPostCtrlMsg(pMac, &msg);
1397 if(rc == eSIR_SUCCESS)
1398 {
1399 return;
1400 }
1401
1402 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301403 vos_mem_free(pStartOemDataReq);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001404 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: posting WDA_START_OEM_DATA_REQ to HAL failed"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001405
1406error:
1407 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Varun Reddy Yeturue3bbf6e2013-02-08 18:50:55 -08001408 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnsone7245742012-09-05 17:12:55 -07001409
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301410 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
1411 if ( NULL == pMlmOemDataRsp )
Jeff Johnsone7245742012-09-05 17:12:55 -07001412 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001413 limLog(pMac->hHdd, LOGP, FL("OEM_DATA: memory allocation for pMlmOemDataRsp failed under suspend link failure"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001414 return;
1415 }
1416
1417 if(NULL != pMac->lim.gpLimMlmOemDataReq)
1418 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301419 vos_mem_free(pMac->lim.gpLimMlmOemDataReq);
Jeff Johnsone7245742012-09-05 17:12:55 -07001420 pMac->lim.gpLimMlmOemDataReq = NULL;
1421 }
1422
1423 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
1424
1425 return;
1426}
1427/**
1428 * limSetOemDataReqModeFailed()
1429 *
1430 * FUNCTION:
1431 * This function is used as callback to resume link after the suspend fails while
1432 * starting oem data req mode.
1433 * LOGIC:
1434 * NA
1435 *
1436 * ASSUMPTIONS:
1437 * NA
1438 *
1439 * NOTE:
1440 *
1441 * @param pMac - Pointer to Global MAC structure
1442 * @return None
1443 */
1444
1445void limSetOemDataReqModeFailed(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data)
1446{
1447 tpLimMlmOemDataRsp pMlmOemDataRsp;
1448
1449 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Varun Reddy Yeturue3bbf6e2013-02-08 18:50:55 -08001450 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnsone7245742012-09-05 17:12:55 -07001451
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301452 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
1453 if ( NULL == pMlmOemDataRsp )
Jeff Johnsone7245742012-09-05 17:12:55 -07001454 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001455 limLog(pMac->hHdd, LOGP, FL("OEM_DATA: memory allocation for pMlmOemDataRsp failed under suspend link failure"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001456 return;
1457 }
1458
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301459 if (NULL != pMac->lim.gpLimMlmOemDataReq)
Jeff Johnsone7245742012-09-05 17:12:55 -07001460 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301461 vos_mem_free(pMac->lim.gpLimMlmOemDataReq);
Jeff Johnsone7245742012-09-05 17:12:55 -07001462 pMac->lim.gpLimMlmOemDataReq = NULL;
1463 }
1464
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301465 vos_mem_set(pMlmOemDataRsp, sizeof(tLimMlmOemDataRsp), 0);
Jeff Johnsone7245742012-09-05 17:12:55 -07001466
1467 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
1468
1469 return;
1470}
1471
1472/**
1473 * limSetOemDataReqMode()
1474 *
1475 *FUNCTION:
1476 * This function is called to setup system into OEM DATA REQ mode
1477 *
1478 *LOGIC:
1479 * NA
1480 *
1481 *ASSUMPTIONS:
1482 * NA
1483 *
1484 *NOTE:
1485 *
1486 * @param pMac - Pointer to Global MAC structure
1487 * @return None
1488 */
1489
1490void limSetOemDataReqMode(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data)
1491{
1492 if(status != eHAL_STATUS_SUCCESS)
1493 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001494 limLog(pMac, LOGE, FL("OEM_DATA: failed in suspend link"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001495 goto error;
1496 }
1497 else
1498 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001499 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: Calling limSendHalOemDataReq"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001500 limSendHalOemDataReq(pMac);
1501 return;
1502 }
1503
1504error:
1505 limResumeLink(pMac, limSetOemDataReqModeFailed, NULL);
1506 return ;
1507} /*** end limSendHalOemDataReq() ***/
1508
1509#endif //FEATURE_OEM_DATA_SUPPORT
Jeff Johnson295189b2012-06-20 16:38:30 -07001510
1511static void
1512mlm_add_sta(
1513 tpAniSirGlobal pMac,
1514 tpAddStaParams pSta,
1515 tANI_U8 *pBssid,
1516 tANI_U8 htCapable,
1517 tpPESession psessionEntry) //psessionEntry may required in future
1518{
1519 tANI_U32 val;
1520 int i;
1521
1522
1523 pSta->staType = STA_ENTRY_SELF; // Identifying self
1524
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301525 vos_mem_copy(pSta->bssId, pBssid, sizeof( tSirMacAddr ));
1526 vos_mem_copy(pSta->staMac, psessionEntry->selfMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001527
1528 /* Configuration related parameters to be changed to support BT-AMP */
1529
1530 if( eSIR_SUCCESS != wlan_cfgGetInt( pMac, WNI_CFG_LISTEN_INTERVAL, &val ))
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001531 limLog(pMac, LOGP, FL("Couldn't get LISTEN_INTERVAL"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001532
1533 pSta->listenInterval = (tANI_U16) val;
1534
1535 if (eSIR_SUCCESS != wlan_cfgGetInt(pMac, WNI_CFG_SHORT_PREAMBLE, &val) )
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001536 limLog(pMac, LOGP, FL("Couldn't get SHORT_PREAMBLE"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001537 pSta->shortPreambleSupported = (tANI_U8)val;
1538
1539 pSta->assocId = 0; // Is SMAC OK with this?
1540 pSta->wmmEnabled = 0;
1541 pSta->uAPSD = 0;
1542 pSta->maxSPLen = 0;
1543 pSta->us32MaxAmpduDuration = 0;
1544 pSta->maxAmpduSize = 0; // 0: 8k, 1: 16k,2: 32k,3: 64k
1545
1546
Gopichand Nakkalab2d2c312013-01-04 11:41:02 -08001547 /* For Self STA get the LDPC capability from config.ini*/
1548 pSta->htLdpcCapable =
1549 (psessionEntry->txLdpcIniFeatureEnabled & 0x01);
1550 pSta->vhtLdpcCapable =
1551 ((psessionEntry->txLdpcIniFeatureEnabled >> 1)& 0x01);
1552
Jeff Johnson295189b2012-06-20 16:38:30 -07001553 if(IS_DOT11_MODE_HT(psessionEntry->dot11mode))
1554 {
1555 pSta->htCapable = htCapable;
Jeff Johnson295189b2012-06-20 16:38:30 -07001556 pSta->greenFieldCapable = limGetHTCapability( pMac, eHT_GREENFIELD, psessionEntry);
1557 pSta->txChannelWidthSet = limGetHTCapability( pMac, eHT_SUPPORTED_CHANNEL_WIDTH_SET, psessionEntry );
1558 pSta->mimoPS = (tSirMacHTMIMOPowerSaveState)limGetHTCapability( pMac, eHT_MIMO_POWER_SAVE, psessionEntry );
1559 pSta->rifsMode = limGetHTCapability( pMac, eHT_RIFS_MODE, psessionEntry );
1560 pSta->lsigTxopProtection = limGetHTCapability( pMac, eHT_LSIG_TXOP_PROTECTION, psessionEntry );
1561 pSta->delBASupport = limGetHTCapability( pMac, eHT_DELAYED_BA, psessionEntry );
1562 pSta->maxAmpduDensity = limGetHTCapability( pMac, eHT_MPDU_DENSITY, psessionEntry );
1563 pSta->maxAmsduSize = limGetHTCapability( pMac, eHT_MAX_AMSDU_LENGTH, psessionEntry );
1564 pSta->fDsssCckMode40Mhz = limGetHTCapability( pMac, eHT_DSSS_CCK_MODE_40MHZ, psessionEntry);
1565 pSta->fShortGI20Mhz = limGetHTCapability( pMac, eHT_SHORT_GI_20MHZ, psessionEntry);
1566 pSta->fShortGI40Mhz = limGetHTCapability( pMac, eHT_SHORT_GI_40MHZ, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -07001567 }
Jeff Johnsone7245742012-09-05 17:12:55 -07001568#ifdef WLAN_FEATURE_11AC
1569 if (psessionEntry->vhtCapability)
1570 {
1571 pSta->vhtCapable = VOS_TRUE;
Shailender Karmuchi08f87c22013-01-17 12:51:24 -08001572 pSta->vhtTxBFCapable = psessionEntry->txBFIniFeatureEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07001573 }
1574#endif
1575#ifdef WLAN_FEATURE_11AC
1576 limPopulateOwnRateSet(pMac, &pSta->supportedRates, NULL, false,psessionEntry,NULL);
1577#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001578 limPopulateOwnRateSet(pMac, &pSta->supportedRates, NULL, false,psessionEntry);
Jeff Johnsone7245742012-09-05 17:12:55 -07001579#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001580 limFillSupportedRatesInfo(pMac, NULL, &pSta->supportedRates,psessionEntry);
1581
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001582 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 -07001583 pSta->greenFieldCapable, pSta->txChannelWidthSet, pSta->mimoPS, pSta->lsigTxopProtection,
1584 pSta->fDsssCckMode40Mhz,pSta->fShortGI20Mhz, pSta->fShortGI40Mhz);
1585
Jeff Johnson295189b2012-06-20 16:38:30 -07001586 if (VOS_P2P_GO_MODE == psessionEntry->pePersona)
1587 {
1588 pSta->p2pCapableSta = 1;
1589 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001590
1591 //Disable BA. It will be set as part of ADDBA negotiation.
1592 for( i = 0; i < STACFG_MAX_TC; i++ )
1593 {
1594 pSta->staTCParams[i].txUseBA = eBA_DISABLE;
1595 pSta->staTCParams[i].rxUseBA = eBA_DISABLE;
1596 }
1597
1598}
1599
1600//
1601// New HAL interface - WDA_ADD_BSS_REQ
1602// Package WDA_ADD_BSS_REQ to HAL, in order to start a BSS
1603//
1604tSirResultCodes
1605limMlmAddBss (
1606 tpAniSirGlobal pMac,
1607 tLimMlmStartReq *pMlmStartReq,
1608 tpPESession psessionEntry)
1609{
1610 tSirMsgQ msgQ;
1611 tpAddBssParams pAddBssParams = NULL;
1612 tANI_U32 retCode;
1613
Jeff Johnson295189b2012-06-20 16:38:30 -07001614 // Package WDA_ADD_BSS_REQ message parameters
1615
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301616 pAddBssParams = vos_mem_malloc(sizeof( tAddBssParams ));
1617 if ( NULL == pAddBssParams )
Jeff Johnson295189b2012-06-20 16:38:30 -07001618 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301619 limLog( pMac, LOGE, FL( "Unable to allocate memory during ADD_BSS" ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001620 // Respond to SME with LIM_MLM_START_CNF
1621 return eSIR_SME_HAL_SEND_MESSAGE_FAIL;
1622 }
1623
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301624 vos_mem_set(pAddBssParams, sizeof(tAddBssParams), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001625
1626 // Fill in tAddBssParams members
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301627 vos_mem_copy(pAddBssParams->bssId, pMlmStartReq->bssId,
Jeff Johnson295189b2012-06-20 16:38:30 -07001628 sizeof( tSirMacAddr ));
1629
1630 // Fill in tAddBssParams selfMacAddr
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301631 vos_mem_copy (pAddBssParams->selfMacAddr,
1632 psessionEntry->selfMacAddr,
1633 sizeof( tSirMacAddr ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001634
1635 pAddBssParams->bssType = pMlmStartReq->bssType;
1636 if ((pMlmStartReq->bssType == eSIR_IBSS_MODE) ||
1637 (pMlmStartReq->bssType == eSIR_BTAMP_AP_MODE)||
1638 (pMlmStartReq->bssType == eSIR_BTAMP_STA_MODE)) {
1639 pAddBssParams->operMode = BSS_OPERATIONAL_MODE_STA;
1640 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001641 else if (pMlmStartReq->bssType == eSIR_INFRA_AP_MODE){
Jeff Johnson295189b2012-06-20 16:38:30 -07001642 pAddBssParams->operMode = BSS_OPERATIONAL_MODE_AP;
1643 }
1644
Jeff Johnsone7245742012-09-05 17:12:55 -07001645 pAddBssParams->shortSlotTimeSupported = psessionEntry->shortSlotTimeSupported;
Jeff Johnson295189b2012-06-20 16:38:30 -07001646
Jeff Johnson295189b2012-06-20 16:38:30 -07001647 pAddBssParams->beaconInterval = pMlmStartReq->beaconPeriod;
1648 pAddBssParams->dtimPeriod = pMlmStartReq->dtimPeriod;
1649 pAddBssParams->cfParamSet.cfpCount = pMlmStartReq->cfParamSet.cfpCount;
1650 pAddBssParams->cfParamSet.cfpPeriod = pMlmStartReq->cfParamSet.cfpPeriod;
1651 pAddBssParams->cfParamSet.cfpMaxDuration = pMlmStartReq->cfParamSet.cfpMaxDuration;
1652 pAddBssParams->cfParamSet.cfpDurRemaining = pMlmStartReq->cfParamSet.cfpDurRemaining;
1653
1654 pAddBssParams->rateSet.numRates = pMlmStartReq->rateSet.numRates;
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301655 vos_mem_copy(pAddBssParams->rateSet.rate,
1656 pMlmStartReq->rateSet.rate, pMlmStartReq->rateSet.numRates);
Jeff Johnson295189b2012-06-20 16:38:30 -07001657
1658 pAddBssParams->nwType = pMlmStartReq->nwType;
1659
1660 pAddBssParams->htCapable = pMlmStartReq->htCapable;
Jeff Johnsone7245742012-09-05 17:12:55 -07001661#ifdef WLAN_FEATURE_11AC
1662 pAddBssParams->vhtCapable = psessionEntry->vhtCapability;
1663 pAddBssParams->vhtTxChannelWidthSet = psessionEntry->vhtTxChannelWidthSet;
1664#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001665 pAddBssParams->htOperMode = pMlmStartReq->htOperMode;
1666 pAddBssParams->dualCTSProtection = pMlmStartReq->dualCTSProtection;
1667 pAddBssParams->txChannelWidthSet = pMlmStartReq->txChannelWidthSet;
1668
1669 pAddBssParams->currentOperChannel = pMlmStartReq->channelNumber;
Jeff Johnsone7245742012-09-05 17:12:55 -07001670 pAddBssParams->currentExtChannel = pMlmStartReq->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07001671
1672 /* Update PE sessionId*/
1673 pAddBssParams->sessionId = pMlmStartReq->sessionId;
1674
1675 //Send the SSID to HAL to enable SSID matching for IBSS
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301676 vos_mem_copy(&(pAddBssParams->ssId.ssId),
1677 pMlmStartReq->ssId.ssId,
1678 pMlmStartReq->ssId.length);
Jeff Johnson295189b2012-06-20 16:38:30 -07001679 pAddBssParams->ssId.length = pMlmStartReq->ssId.length;
Jeff Johnson295189b2012-06-20 16:38:30 -07001680 pAddBssParams->bHiddenSSIDEn = pMlmStartReq->ssidHidden;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001681 limLog( pMac, LOGE, FL( "TRYING TO HIDE SSID %d" ),pAddBssParams->bHiddenSSIDEn);
Jeff Johnson295189b2012-06-20 16:38:30 -07001682 // CR309183. Disable Proxy Probe Rsp. Host handles Probe Requests. Until FW fixed.
1683 pAddBssParams->bProxyProbeRespEn = 0;
1684 pAddBssParams->obssProtEnabled = pMlmStartReq->obssProtEnabled;
1685
Jeff Johnson295189b2012-06-20 16:38:30 -07001686#if defined WLAN_FEATURE_VOWIFI
1687 pAddBssParams->maxTxPower = psessionEntry->maxTxPower;
1688#endif
1689 mlm_add_sta(pMac, &pAddBssParams->staContext,
1690 pAddBssParams->bssId, pAddBssParams->htCapable,psessionEntry);
1691
1692 pAddBssParams->status = eHAL_STATUS_SUCCESS;
1693 pAddBssParams->respReqd = 1;
1694
1695 // Set a new state for MLME
1696 psessionEntry->limMlmState = eLIM_MLM_WT_ADD_BSS_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07001697 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07001698
1699 pAddBssParams->halPersona=psessionEntry->pePersona; //pass on the session persona to hal
1700
1701 pAddBssParams->bSpectrumMgtEnabled = psessionEntry->spectrumMgtEnabled;
1702
1703#if defined WLAN_FEATURE_VOWIFI_11R
1704 pAddBssParams->extSetStaKeyParamValid = 0;
1705#endif
1706
Chet Lanctot4b9abd72013-06-27 11:14:56 -07001707#ifdef WLAN_FEATURE_11W
1708 pAddBssParams->rmfEnabled = (psessionEntry->gStartBssRSNIe.RSN_Cap[0] >> 7) & 0x1;
1709 limLog( pMac, LOG1, FL("PMF capable value for BSS is %d"), pAddBssParams->rmfEnabled);
1710#endif
1711
Jeff Johnson295189b2012-06-20 16:38:30 -07001712 //
1713 // FIXME_GEN4
1714 // A global counter (dialog token) is required to keep track of
1715 // all PE <-> HAL communication(s)
1716 //
1717 msgQ.type = WDA_ADD_BSS_REQ;
1718 msgQ.reserved = 0;
1719 msgQ.bodyptr = pAddBssParams;
1720 msgQ.bodyval = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001721 MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001722
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001723 limLog( pMac, LOGW, FL( "Sending WDA_ADD_BSS_REQ..." ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001724 if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
1725 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001726 limLog( pMac, LOGE, FL("Posting ADD_BSS_REQ to HAL failed, reason=%X"), retCode );
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301727 vos_mem_free(pAddBssParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07001728 return eSIR_SME_HAL_SEND_MESSAGE_FAIL;
1729 }
1730
1731 return eSIR_SME_SUCCESS;
1732}
1733
1734
1735/**
1736 * limProcessMlmStartReq()
1737 *
1738 *FUNCTION:
1739 * This function is called to process MLM_START_REQ message
1740 * from SME
1741 *
1742 *LOGIC:
1743 * 1) MLME receives LIM_MLM_START_REQ from LIM
1744 * 2) MLME sends WDA_ADD_BSS_REQ to HAL
1745 * 3) MLME changes state to eLIM_MLM_WT_ADD_BSS_RSP_STATE
1746 * MLME now waits for HAL to send WDA_ADD_BSS_RSP
1747 *
1748 *ASSUMPTIONS:
1749 *
1750 *NOTE:
1751 *
1752 * @param pMac Pointer to Global MAC structure
1753 * @param *pMsgBuf A pointer to the MLM message buffer
1754 * @return None
1755 */
1756
1757static void
1758limProcessMlmStartReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
1759{
1760 tLimMlmStartReq *pMlmStartReq;
1761 tLimMlmStartCnf mlmStartCnf;
1762 tpPESession psessionEntry = NULL;
1763
1764 if(pMsgBuf == NULL)
1765 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001766 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001767 return;
1768 }
1769
1770 pMlmStartReq = (tLimMlmStartReq *) pMsgBuf;
1771 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmStartReq->sessionId))==NULL)
1772 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001773 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001774 mlmStartCnf.resultCode = eSIR_SME_REFUSED;
1775 goto end;
1776 }
1777
1778 if (psessionEntry->limMlmState != eLIM_MLM_IDLE_STATE)
1779 {
1780 /**
1781 * Should not have received Start req in states other than idle.
1782 * Return Start confirm with failure code.
1783 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001784 PELOGE(limLog(pMac, LOGE, FL("received unexpected MLM_START_REQ in state %X"),psessionEntry->limMlmState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001785 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
1786 mlmStartCnf.resultCode = eSIR_SME_BSS_ALREADY_STARTED_OR_JOINED;
1787 goto end;
1788 }
1789
1790 #if 0
1791 if (cfgSetInt(pMac, WNI_CFG_CURRENT_CHANNEL, pMlmStartReq->channelNumber)!= eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001792 limLog(pMac, LOGP, FL("could not set CURRENT_CHANNEL at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001793
1794 pMac->lim.gLimCurrentChannelId = pMlmStartReq->channelNumber;
1795 #endif //TO SUPPORT BT-AMP
1796
1797
1798 // Update BSSID & SSID at CFG database
1799 #if 0 //We are not using the BSSID and SSID from the config file, instead we are reading form the session table
1800 if (cfgSetStr(pMac, WNI_CFG_BSSID, (tANI_U8 *) pMlmStartReq->bssId, sizeof(tSirMacAddr))
1801 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001802 limLog(pMac, LOGP, FL("could not update BSSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001803
1804
1805
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301806 vos_mem_copy( pMac->lim.gLimCurrentBssId,
Jeff Johnson295189b2012-06-20 16:38:30 -07001807 pMlmStartReq->bssId,
1808 sizeof(tSirMacAddr));
1809 #endif //TO SUPPORT BT-AMP
1810
1811 #if 0
1812 if (cfgSetStr(pMac, WNI_CFG_SSID, (tANI_U8 *) &pMlmStartReq->ssId.ssId, pMlmStartReq->ssId.length)
1813 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001814 limLog(pMac, LOGP, FL("could not update SSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001815 #endif //To SUPPORT BT-AMP
1816
1817
1818 // pMac->lim.gLimCurrentSSID.length = pMlmStartReq->ssId.length;
1819
1820 #if 0
1821 if (cfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET,
1822 (tANI_U8 *) &pMac->lim.gpLimStartBssReq->operationalRateSet.rate,
1823 pMac->lim.gpLimStartBssReq->operationalRateSet.numRates)
1824 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001825 limLog(pMac, LOGP, FL("could not update Operational Rateset at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001826 #endif //TO SUPPORT BT-AMP
1827
1828
Jeff Johnson295189b2012-06-20 16:38:30 -07001829
Jeff Johnson295189b2012-06-20 16:38:30 -07001830#if 0 // Periodic timer for remove WPS PBC proble response entry in PE is disbaled now.
1831 if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
1832 {
1833 if(pMac->lim.limTimers.gLimWPSOverlapTimerObj.isTimerCreated == eANI_BOOLEAN_FALSE)
1834 {
1835 if (tx_timer_create(&pMac->lim.limTimers.gLimWPSOverlapTimerObj.gLimWPSOverlapTimer,
1836 "PS OVERLAP Timer",
1837 limWPSOverlapTimerHandler,
1838 SIR_LIM_WPS_OVERLAP_TIMEOUT, // expiration_input
1839 SYS_MS_TO_TICKS(LIM_WPS_OVERLAP_TIMER_MS), // initial_ticks
1840 SYS_MS_TO_TICKS(LIM_WPS_OVERLAP_TIMER_MS), // reschedule_ticks
1841 TX_AUTO_ACTIVATE /* TX_NO_ACTIVATE*/) != TX_SUCCESS)
1842 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001843 limLog(pMac, LOGP, FL("failed to create WPS overlap Timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001844 }
1845
1846 pMac->lim.limTimers.gLimWPSOverlapTimerObj.sessionId = pMlmStartReq->sessionId;
1847 pMac->lim.limTimers.gLimWPSOverlapTimerObj.isTimerCreated = eANI_BOOLEAN_TRUE;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001848 limLog(pMac, LOGE, FL("Create WPS overlap Timer, session=%d"), pMlmStartReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07001849
1850 if (tx_timer_activate(&pMac->lim.limTimers.gLimWPSOverlapTimerObj.gLimWPSOverlapTimer) != TX_SUCCESS)
1851 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001852 limLog(pMac, LOGP, FL("tx_timer_activate failed"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001853 }
1854 }
1855 }
1856#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001857
1858
1859
1860 mlmStartCnf.resultCode = limMlmAddBss(pMac, pMlmStartReq,psessionEntry);
1861
1862end:
1863 /* Update PE session Id */
1864 mlmStartCnf.sessionId = pMlmStartReq->sessionId;
1865
1866 /// Free up buffer allocated for LimMlmScanReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301867 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07001868
1869 //
1870 // Respond immediately to LIM, only if MLME has not been
1871 // successfully able to send WDA_ADD_BSS_REQ to HAL.
1872 // Else, LIM_MLM_START_CNF will be sent after receiving
1873 // WDA_ADD_BSS_RSP from HAL
1874 //
1875 if( eSIR_SME_SUCCESS != mlmStartCnf.resultCode )
1876 limPostSmeMessage(pMac, LIM_MLM_START_CNF, (tANI_U32 *) &mlmStartCnf);
1877} /*** limProcessMlmStartReq() ***/
1878
1879
1880/*
1881* This function checks if Scan is allowed or not.
1882* It checks each session and if any session is not in the normal state,
1883* it will return false.
1884* Note: BTAMP_STA can be in LINK_EST as well as BSS_STARTED State, so
1885* both cases are handled below.
1886*/
1887
1888static tANI_U8 __limMlmScanAllowed(tpAniSirGlobal pMac)
1889{
1890 int i;
1891
Jeff Johnson43971f52012-07-17 12:26:56 -07001892 if(pMac->lim.gLimMlmState != eLIM_MLM_IDLE_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07001893 {
1894 return FALSE;
1895 }
1896 for(i =0; i < pMac->lim.maxBssId; i++)
1897 {
1898 if(pMac->lim.gpSession[i].valid == TRUE)
1899 {
1900 if(!( ( ( (pMac->lim.gpSession[i].bssType == eSIR_INFRASTRUCTURE_MODE) ||
1901 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_STA_ROLE))&&
1902 (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE) )||
1903
1904 ( ( (pMac->lim.gpSession[i].bssType == eSIR_IBSS_MODE)||
1905 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_AP_ROLE)||
1906 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_STA_ROLE) )&&
1907 (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_BSS_STARTED_STATE) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001908 || ( ( ( (pMac->lim.gpSession[i].bssType == eSIR_INFRA_AP_MODE)
1909 && ( pMac->lim.gpSession[i].pePersona == VOS_P2P_GO_MODE) )
1910 || (pMac->lim.gpSession[i].limSystemRole == eLIM_AP_ROLE) )
1911 && (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_BSS_STARTED_STATE) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001912 ))
1913 {
1914 return FALSE;
1915
1916 }
1917 }
1918 }
1919
1920 return TRUE;
1921}
1922
1923
1924
1925/**
1926 * limProcessMlmScanReq()
1927 *
1928 *FUNCTION:
1929 * This function is called to process MLM_SCAN_REQ message
1930 * from SME
1931 *
1932 *LOGIC:
1933 *
1934 *ASSUMPTIONS:
1935 *
1936 *NOTE:
1937 *
1938 * @param pMac Pointer to Global MAC structure
1939 * @param *pMsgBuf A pointer to the MLM message buffer
1940 * @return None
1941 */
1942
1943static void
1944limProcessMlmScanReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
1945{
1946 tLimMlmScanCnf mlmScanCnf;
Maleka Vinayd500cd42012-12-10 12:37:09 -08001947 tANI_U8 i = 0;
1948 tANI_U32 val = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001949
1950 if (pMac->lim.gLimSystemInScanLearnMode)
1951 {
1952 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001953 FL("Sending START_SCAN from LIM while one req is pending"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301954 vos_mem_free(pMsgBuf);
Madan Mohan Koyyalamudid4b301b2012-10-11 14:15:54 -07001955 /*Send back a failure*/
1956 mlmScanCnf.resultCode = eSIR_SME_SCAN_FAILED;
1957 mlmScanCnf.scanResultLength = 0;
1958 limPostSmeMessage(pMac,
1959 LIM_MLM_SCAN_CNF,
1960 (tANI_U32 *) &mlmScanCnf);
Jeff Johnson295189b2012-06-20 16:38:30 -07001961 return;
1962 }
1963
1964 if(__limMlmScanAllowed(pMac) &&
1965 (((tLimMlmScanReq *) pMsgBuf)->channelList.numChannels != 0))
1966
1967 {
1968 /// Hold onto SCAN REQ criteria
1969 pMac->lim.gpLimMlmScanReq = (tLimMlmScanReq *) pMsgBuf;
1970
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001971 PELOG3(limLog(pMac, LOG3, FL("Number of channels to scan are %d "),
Jeff Johnson295189b2012-06-20 16:38:30 -07001972 pMac->lim.gpLimMlmScanReq->channelList.numChannels);)
1973
1974 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
1975
1976 if (pMac->lim.gpLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN)
1977 pMac->lim.gLimMlmState = eLIM_MLM_WT_PROBE_RESP_STATE;
1978 else // eSIR_PASSIVE_SCAN
1979 pMac->lim.gLimMlmState = eLIM_MLM_PASSIVE_SCAN_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07001980 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07001981
1982 pMac->lim.gLimSystemInScanLearnMode = 1;
1983
Maleka Vinayd500cd42012-12-10 12:37:09 -08001984 /* temporary fix to handle case where NOA duration calculation is incorrect
1985 * for scanning on DFS channels */
1986
1987 pMac->lim.gTotalScanDuration = 0;
1988
1989 if (wlan_cfgGetInt(pMac, WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME, &val) != eSIR_SUCCESS)
1990 {
1991 /*
1992 * Could not get max channel value
1993 * from CFG. Log error.
1994 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001995 limLog(pMac, LOGP, FL("could not retrieve passive max channel value"));
Maleka Vinayd500cd42012-12-10 12:37:09 -08001996
1997 /* use a default value of 110ms */
1998 val = 110;
1999 }
2000
2001 for (i = 0; i < pMac->lim.gpLimMlmScanReq->channelList.numChannels; i++) {
2002 tANI_U8 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[i];
2003
2004 if (limActiveScanAllowed(pMac, channelNum)) {
2005 /* Use min + max channel time to calculate the total duration of scan */
2006 pMac->lim.gTotalScanDuration += pMac->lim.gpLimMlmScanReq->minChannelTime + pMac->lim.gpLimMlmScanReq->maxChannelTime;
2007 } else {
2008 /* using the value from WNI_CFG_PASSIVE_MINIMUM_CHANNEL_TIME as is done in
2009 * void limContinuePostChannelScan(tpAniSirGlobal pMac)
2010 */
2011 pMac->lim.gTotalScanDuration += val;
2012 }
2013 }
2014
2015 /* Adding an overhead of 5ms to account for the scan messaging delays */
2016 pMac->lim.gTotalScanDuration += 5;
Jeff Johnson295189b2012-06-20 16:38:30 -07002017 limSetScanMode(pMac);
2018 }
2019 else
2020 {
2021 /**
2022 * Should not have received SCAN req in other states
2023 * OR should not have received LIM_MLM_SCAN_REQ with
2024 * zero number of channels
2025 * Log error
2026 */
2027 limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002028 FL("received unexpected MLM_SCAN_REQ in state %X OR zero number of channels: %X"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002029 pMac->lim.gLimMlmState, ((tLimMlmScanReq *) pMsgBuf)->channelList.numChannels);
2030 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
2031
2032 /// Free up buffer allocated for
2033 /// pMac->lim.gLimMlmScanReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302034 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07002035
2036 /// Return Scan confirm with INVALID_PARAMETERS
2037
2038 mlmScanCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2039 mlmScanCnf.scanResultLength = 0;
2040 limPostSmeMessage(pMac,
2041 LIM_MLM_SCAN_CNF,
2042 (tANI_U32 *) &mlmScanCnf);
2043 }
2044} /*** limProcessMlmScanReq() ***/
2045
Jeff Johnsone7245742012-09-05 17:12:55 -07002046#ifdef FEATURE_OEM_DATA_SUPPORT
2047static void limProcessMlmOemDataReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2048{
2049 tLimMlmOemDataRsp* pMlmOemDataRsp;
2050
2051 if (((pMac->lim.gLimMlmState == eLIM_MLM_IDLE_STATE) ||
2052 (pMac->lim.gLimMlmState == eLIM_MLM_JOINED_STATE) ||
2053 (pMac->lim.gLimMlmState == eLIM_MLM_AUTHENTICATED_STATE) ||
2054 (pMac->lim.gLimMlmState == eLIM_MLM_BSS_STARTED_STATE) ||
2055 (pMac->lim.gLimMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)))
2056 {
2057 //Hold onto the oem data request criteria
2058 pMac->lim.gpLimMlmOemDataReq = (tLimMlmOemDataReq*)pMsgBuf;
2059
2060 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
2061
2062 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
2063
2064 //Now request for link suspension
2065 limSuspendLink(pMac, eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN, limSetOemDataReqMode, NULL);
2066 }
2067 else
2068 {
2069 /**
2070 * Should not have received oem data req in other states
2071 * Log error
2072 */
2073
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002074 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 -07002075
2076 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
2077
2078 /// Free up buffer allocated
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302079 vos_mem_free(pMsgBuf);
Jeff Johnsone7245742012-09-05 17:12:55 -07002080
2081 /// Return Meas confirm with INVALID_PARAMETERS
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302082 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
2083 if ( pMlmOemDataRsp != NULL)
Jeff Johnsone7245742012-09-05 17:12:55 -07002084 {
2085 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302086 vos_mem_free(pMlmOemDataRsp);
Jeff Johnsone7245742012-09-05 17:12:55 -07002087 }
2088 else
2089 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002090 limLog(pMac, LOGP, FL("Could not allocate memory for pMlmOemDataRsp"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002091 return;
2092 }
2093 }
2094
2095 return;
2096}
2097#endif //FEATURE_OEM_DATA_SUPPORT
Jeff Johnson295189b2012-06-20 16:38:30 -07002098
2099
2100/**
2101 * limProcessMlmPostJoinSuspendLink()
2102 *
2103 *FUNCTION:
2104 * This function is called after the suspend link while joining
2105 * off channel.
2106 *
2107 *LOGIC:
2108 * Check for suspend state.
2109 * If success, proceed with setting link state to recieve the
2110 * probe response/beacon from intended AP.
2111 * Switch to the APs channel.
2112 * On an error case, send the MLM_JOIN_CNF with error status.
2113 *
2114 *ASSUMPTIONS:
2115 *
2116 *NOTE:
2117 *
2118 * @param pMac Pointer to Global MAC structure
2119 * @param status status of suspend link.
2120 * @param ctx passed while calling suspend link(psessionEntry)
2121 * @return None
2122 */
2123static void
2124limProcessMlmPostJoinSuspendLink(tpAniSirGlobal pMac, eHalStatus status, tANI_U32 *ctx)
2125{
Jeff Johnsone7245742012-09-05 17:12:55 -07002126 tANI_U8 chanNum, secChanOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002127 tLimMlmJoinCnf mlmJoinCnf;
2128 tpPESession psessionEntry = (tpPESession)ctx;
2129 tSirLinkState linkState;
2130
2131 if( eHAL_STATUS_SUCCESS != status )
2132 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002133 limLog(pMac, LOGE, FL("Suspend link(NOTIFY_BSS) failed. still proceeding with join"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002134 }
2135 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2136 psessionEntry->limMlmState = eLIM_MLM_WT_JOIN_BEACON_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002137 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002138
2139 limDeactivateAndChangeTimer(pMac, eLIM_JOIN_FAIL_TIMER);
2140
2141 //assign appropriate sessionId to the timer object
2142 pMac->lim.limTimers.gLimJoinFailureTimer.sessionId = psessionEntry->peSessionId;
2143
2144 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 -07002145 limLog(pMac, LOG1, FL("[limProcessMlmJoinReq]: linkState:%d"),linkState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002146
2147 if (limSetLinkState(pMac, linkState,
2148 psessionEntry->pLimMlmJoinReq->bssDescription.bssId,
2149 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS )
2150 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002151 limLog(pMac, LOGE, FL("limSetLinkState to eSIR_LINK_PREASSOC_STATE Failed!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002152 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002153 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
2154 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002155 goto error;
2156 }
2157
2158 /** Derive channel from BSS description and store it in the CFG */
2159 // chanNum = pMac->lim.gpLimMlmJoinReq->bssDescription.channelId;
2160
2161 chanNum = psessionEntry->currentOperChannel;
Jeff Johnsone7245742012-09-05 17:12:55 -07002162 secChanOffset = psessionEntry->htSecondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002163 //store the channel switch sessionEntry in the lim global var
2164 psessionEntry->channelChangeReasonCode = LIM_SWITCH_CHANNEL_JOIN;
Madan Mohan Koyyalamudi61bc5662012-11-02 14:33:10 -07002165#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
2166 psessionEntry->pLimMlmReassocRetryReq = NULL;
2167#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002168
Jeff Johnsone7245742012-09-05 17:12:55 -07002169 limSetChannel(pMac, chanNum, secChanOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002170
2171 return;
2172error:
2173 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2174 mlmJoinCnf.sessionId = psessionEntry->peSessionId;
2175 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2176 limPostSmeMessage(pMac, LIM_MLM_JOIN_CNF, (tANI_U32 *) &mlmJoinCnf);
2177
2178}
2179
2180
2181
2182/**
2183 * limProcessMlmJoinReq()
2184 *
2185 *FUNCTION:
2186 * This function is called to process MLM_JOIN_REQ message
2187 * from SME
2188 *
2189 *LOGIC:
2190 * 1) Initialize LIM, HAL, DPH
2191 * 2) Configure the BSS for which the JOIN REQ was received
2192 * a) Send WDA_ADD_BSS_REQ to HAL -
2193 * This will identify the BSS that we are interested in
2194 * --AND--
2195 * Add a STA entry for the AP (in a STA context)
2196 * b) Wait for WDA_ADD_BSS_RSP
2197 * c) Send WDA_ADD_STA_REQ to HAL
2198 * This will add the "local STA" entry to the STA table
2199 * 3) Continue as before, i.e,
2200 * a) Send a PROBE REQ
2201 * b) Wait for PROBE RSP/BEACON containing the SSID that
2202 * we are interested in
2203 * c) Then start an AUTH seq
2204 * d) Followed by the ASSOC seq
2205 *
2206 *ASSUMPTIONS:
2207 *
2208 *NOTE:
2209 *
2210 * @param pMac Pointer to Global MAC structure
2211 * @param *pMsgBuf A pointer to the MLM message buffer
2212 * @return None
2213 */
2214
2215static void
2216limProcessMlmJoinReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2217{
2218 tLimMlmJoinCnf mlmJoinCnf;
2219 tANI_U8 sessionId;
2220 tpPESession psessionEntry;
2221
2222 sessionId = ((tpLimMlmJoinReq)pMsgBuf)->sessionId;
2223
2224 if((psessionEntry = peFindSessionBySessionId(pMac,sessionId))== NULL)
2225 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002226 limLog(pMac, LOGP, FL("session does not exist for given sessionId"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002227
2228 goto error;
2229 }
2230
2231 if (( (psessionEntry->limSystemRole != eLIM_AP_ROLE ) && (psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE )) &&
2232 ( (psessionEntry->limMlmState == eLIM_MLM_IDLE_STATE) ||
2233 (psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE)) &&
2234 (SIR_MAC_GET_ESS( ((tpLimMlmJoinReq) pMsgBuf)->bssDescription.capabilityInfo) !=
2235 SIR_MAC_GET_IBSS( ((tpLimMlmJoinReq) pMsgBuf)->bssDescription.capabilityInfo)))
2236 {
2237 #if 0
2238 if (pMac->lim.gpLimMlmJoinReq)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302239 vos_mem_free(pMac->lim.gpLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002240 #endif //TO SUPPORT BT-AMP , review 23sep
2241
2242 /// Hold onto Join request parameters
2243
2244 psessionEntry->pLimMlmJoinReq =(tpLimMlmJoinReq) pMsgBuf;
2245
2246 if( isLimSessionOffChannel(pMac, sessionId) )
2247 {
2248 //suspend link
2249 limSuspendLink(pMac, eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN,
2250 limProcessMlmPostJoinSuspendLink, (tANI_U32*)psessionEntry );
2251 }
2252 else
2253 {
2254 //No need to suspend link.
2255 limProcessMlmPostJoinSuspendLink( pMac, eHAL_STATUS_SUCCESS,
2256 (tANI_U32*) psessionEntry );
2257 }
2258
2259 return;
2260 }
2261 else
2262 {
2263 /**
2264 * Should not have received JOIN req in states other than
2265 * Idle state or on AP.
2266 * Return join confirm with invalid parameters code.
2267 */
2268 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002269 FL("Unexpected Join request for role %d state %X"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002270 psessionEntry->limSystemRole,
2271 psessionEntry->limMlmState);)
2272 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
2273
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002274 limLog(pMac, LOGE, FL("Unexpected Join request for role %d state %X"),
Jeff Johnsone7245742012-09-05 17:12:55 -07002275 psessionEntry->limSystemRole, psessionEntry->limMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002276 }
2277
2278error:
2279
2280
2281 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2282 mlmJoinCnf.sessionId = sessionId;
2283 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2284 limPostSmeMessage(pMac, LIM_MLM_JOIN_CNF, (tANI_U32 *) &mlmJoinCnf);
2285
2286
2287} /*** limProcessMlmJoinReq() ***/
2288
2289
2290
2291/**
2292 * limProcessMlmAuthReq()
2293 *
2294 *FUNCTION:
2295 * This function is called to process MLM_AUTH_REQ message
2296 * from SME
2297 *
2298 *LOGIC:
2299 *
2300 *ASSUMPTIONS:
2301 *
2302 *NOTE:
2303 *
2304 * @param pMac Pointer to Global MAC structure
2305 * @param *pMsgBuf A pointer to the MLM message buffer
2306 * @return None
2307 */
2308
2309static void
2310limProcessMlmAuthReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2311{
2312 tANI_U32 numPreAuthContexts;
2313 tSirMacAddr currentBssId;
2314 tSirMacAuthFrameBody authFrameBody;
2315 tLimMlmAuthCnf mlmAuthCnf;
2316 struct tLimPreAuthNode *preAuthNode;
2317 tpDphHashNode pStaDs;
2318 tANI_U8 sessionId;
2319 tpPESession psessionEntry;
2320
2321 if(pMsgBuf == NULL)
2322 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002323 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002324 return;
2325 }
2326
2327 pMac->lim.gpLimMlmAuthReq = (tLimMlmAuthReq *) pMsgBuf;
2328 sessionId = pMac->lim.gpLimMlmAuthReq->sessionId;
2329 if((psessionEntry= peFindSessionBySessionId(pMac,sessionId) )== NULL)
2330 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002331 limLog(pMac, LOGP, FL("Session Does not exist for given sessionId"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002332 return;
2333 }
2334
2335 /**
2336 * Expect Auth request only when:
2337 * 1. STA joined/associated with a BSS or
2338 * 2. STA is in IBSS mode
2339 * and STA is going to authenticate with a unicast
2340 * adress and requested authentication algorithm is
2341 * supported.
2342 */
2343 #if 0
2344 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2345 eSIR_SUCCESS)
2346 {
2347 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002348 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002349 }
2350 #endif //To SuppoRT BT-AMP
2351
2352 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2353
2354 if (((((psessionEntry->limSystemRole== eLIM_STA_ROLE) || (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)) &&
2355 ((psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE) ||
2356 (psessionEntry->limMlmState ==
2357 eLIM_MLM_LINK_ESTABLISHED_STATE))) ||
2358 ((psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE) &&
2359 (psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE))) &&
2360 (limIsGroupAddr(pMac->lim.gpLimMlmAuthReq->peerMacAddr)
2361 == false) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07002362 (limIsAuthAlgoSupported(
2363 pMac,
2364 pMac->lim.gpLimMlmAuthReq->authType,
2365 psessionEntry) == true)
Jeff Johnson295189b2012-06-20 16:38:30 -07002366 )
2367 {
2368 /**
2369 * This is a request for pre-authentication.
2370 * Check if there exists context already for
Jeff Johnson1250df42012-12-10 14:31:52 -08002371 * the requested peer OR
Jeff Johnson295189b2012-06-20 16:38:30 -07002372 * if this request is for the AP we're currently
2373 * associated with.
2374 * If yes, return auth confirm immediately when
2375 * requested auth type is same as the one used before.
2376 */
2377 if ((((psessionEntry->limSystemRole == eLIM_STA_ROLE) ||(psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE) )&&
2378 (psessionEntry->limMlmState ==
2379 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
2380 (((pStaDs = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable)) != NULL) &&
2381 (pMac->lim.gpLimMlmAuthReq->authType ==
2382 pStaDs->mlmStaContext.authType)) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302383 (vos_mem_compare(pMac->lim.gpLimMlmAuthReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002384 currentBssId,
2385 sizeof(tSirMacAddr)) )) ||
2386 (((preAuthNode =
2387 limSearchPreAuthList(
2388 pMac,
2389 pMac->lim.gpLimMlmAuthReq->peerMacAddr)) != NULL) &&
2390 (preAuthNode->authType ==
2391 pMac->lim.gpLimMlmAuthReq->authType)))
2392 {
2393 PELOG2(limLog(pMac, LOG2,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002394 FL("Already have pre-auth context with peer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002395 limPrintMacAddr(pMac, pMac->lim.gpLimMlmAuthReq->peerMacAddr,
2396 LOG2);)
2397
2398 mlmAuthCnf.resultCode = (tSirResultCodes)
2399 eSIR_MAC_SUCCESS_STATUS;
2400
2401
2402 goto end;
2403 }
2404 else
2405 {
2406 if (wlan_cfgGetInt(pMac, WNI_CFG_MAX_NUM_PRE_AUTH,
2407 (tANI_U32 *) &numPreAuthContexts) != eSIR_SUCCESS)
2408 {
2409 limLog(pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002410 FL("Could not retrieve NumPreAuthLimit from CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002411 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002412
2413 if (pMac->lim.gLimNumPreAuthContexts == numPreAuthContexts)
2414 {
2415 PELOGW(limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002416 FL("Number of pre-auth reached max limit"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002417
2418 /// Return Auth confirm with reject code
2419 mlmAuthCnf.resultCode =
2420 eSIR_SME_MAX_NUM_OF_PRE_AUTH_REACHED;
2421
2422 goto end;
2423 }
2424 }
2425
2426 // Delete pre-auth node if exists
2427 if (preAuthNode)
2428 limDeletePreAuthNode(pMac,
2429 pMac->lim.gpLimMlmAuthReq->peerMacAddr);
2430
Jeff Johnson295189b2012-06-20 16:38:30 -07002431 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2432 psessionEntry->limMlmState = eLIM_MLM_WT_AUTH_FRAME2_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002433 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002434
2435 /// Prepare & send Authentication frame
2436 authFrameBody.authAlgoNumber =
2437 (tANI_U8) pMac->lim.gpLimMlmAuthReq->authType;
2438 authFrameBody.authTransactionSeqNumber = SIR_MAC_AUTH_FRAME_1;
2439 authFrameBody.authStatusCode = 0;
2440 limSendAuthMgmtFrame(pMac,
2441 &authFrameBody,
2442 pMac->lim.gpLimMlmAuthReq->peerMacAddr,
2443 LIM_NO_WEP_IN_FC,psessionEntry);
2444
Jeff Johnsone7245742012-09-05 17:12:55 -07002445 //assign appropriate sessionId to the timer object
2446 pMac->lim.limTimers.gLimAuthFailureTimer.sessionId = sessionId;
2447
2448 // Activate Auth failure timer
2449 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_AUTH_FAIL_TIMER));
2450 if (tx_timer_activate(&pMac->lim.limTimers.gLimAuthFailureTimer)
2451 != TX_SUCCESS)
2452 {
2453 /// Could not start Auth failure timer.
2454 // Log error
2455 limLog(pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002456 FL("could not start Auth failure timer"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002457 // Cleanup as if auth timer expired
2458 limProcessAuthFailureTimeout(pMac);
2459 }
2460
Jeff Johnson295189b2012-06-20 16:38:30 -07002461 return;
2462 }
2463 else
2464 {
2465 /**
2466 * Unexpected auth request.
2467 * Return Auth confirm with Invalid parameters code.
2468 */
2469 mlmAuthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2470
2471 goto end;
2472 }
2473
2474end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302475 vos_mem_copy((tANI_U8 *) &mlmAuthCnf.peerMacAddr,
2476 (tANI_U8 *) &pMac->lim.gpLimMlmAuthReq->peerMacAddr,
2477 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002478
2479 mlmAuthCnf.authType = pMac->lim.gpLimMlmAuthReq->authType;
2480 mlmAuthCnf.sessionId = sessionId;
2481
2482 /// Free up buffer allocated
2483 /// for pMac->lim.gLimMlmAuthReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302484 vos_mem_free( pMac->lim.gpLimMlmAuthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002485 pMac->lim.gpLimMlmAuthReq = NULL;
2486 limPostSmeMessage(pMac, LIM_MLM_AUTH_CNF, (tANI_U32 *) &mlmAuthCnf);
2487} /*** limProcessMlmAuthReq() ***/
2488
2489
2490
2491/**
2492 * limProcessMlmAssocReq()
2493 *
2494 *FUNCTION:
2495 * This function is called to process MLM_ASSOC_REQ message
2496 * from SME
2497 *
2498 *LOGIC:
2499 *
2500 *ASSUMPTIONS:
2501 *
2502 *NOTE:
2503 *
2504 * @param pMac Pointer to Global MAC structure
2505 * @param *pMsgBuf A pointer to the MLM message buffer
2506 * @return None
2507 */
2508
2509static void
2510limProcessMlmAssocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2511{
2512 tSirMacAddr currentBssId;
2513 tLimMlmAssocReq *pMlmAssocReq;
2514 tLimMlmAssocCnf mlmAssocCnf;
2515 tpPESession psessionEntry;
2516 // tANI_U8 sessionId;
2517
2518 if(pMsgBuf == NULL)
2519 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002520 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002521 return;
2522 }
2523 pMlmAssocReq = (tLimMlmAssocReq *) pMsgBuf;
2524
2525 if( (psessionEntry = peFindSessionBySessionId(pMac,pMlmAssocReq->sessionId) )== NULL)
2526 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002527 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302528 vos_mem_free(pMlmAssocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002529 return;
2530 }
2531
2532 #if 0
2533 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2534 eSIR_SUCCESS)
2535 {
2536 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002537 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002538 }
2539 #endif //TO SUPPORT BT-AMP
2540 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2541
2542 if ( (psessionEntry->limSystemRole != eLIM_AP_ROLE && psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE) &&
2543 (psessionEntry->limMlmState == eLIM_MLM_AUTHENTICATED_STATE || psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302544 (vos_mem_compare(pMlmAssocReq->peerMacAddr, currentBssId, sizeof(tSirMacAddr))) )
Jeff Johnson295189b2012-06-20 16:38:30 -07002545 {
Jeff Johnsone7245742012-09-05 17:12:55 -07002546
Jeff Johnson295189b2012-06-20 16:38:30 -07002547 /// map the session entry pointer to the AssocFailureTimer
2548 pMac->lim.limTimers.gLimAssocFailureTimer.sessionId = pMlmAssocReq->sessionId;
2549
Jeff Johnson295189b2012-06-20 16:38:30 -07002550 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2551 psessionEntry->limMlmState = eLIM_MLM_WT_ASSOC_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002552 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002553
2554 /// Prepare and send Association request frame
2555 limSendAssocReqMgmtFrame(pMac, pMlmAssocReq,psessionEntry);
2556
2557 //Set the link state to postAssoc, so HW can start receiving frames from AP.
2558 if ((psessionEntry->bssType == eSIR_BTAMP_STA_MODE)||
2559 ((psessionEntry->bssType == eSIR_BTAMP_AP_MODE) && (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)))
2560 {
2561 if(limSetLinkState(pMac, eSIR_LINK_BTAMP_POSTASSOC_STATE, currentBssId,
2562 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002563 PELOGE(limLog(pMac, LOGE, FL("Failed to set the LinkState"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002564 }
Jeff Johnsone7245742012-09-05 17:12:55 -07002565 /// Start association failure timer
2566 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_ASSOC_FAIL_TIMER));
2567 if (tx_timer_activate(&pMac->lim.limTimers.gLimAssocFailureTimer)
2568 != TX_SUCCESS)
2569 {
2570 /// Could not start Assoc failure timer.
2571 // Log error
2572 limLog(pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002573 FL("could not start Association failure timer"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002574 // Cleanup as if assoc timer expired
2575 limProcessAssocFailureTimeout(pMac,LIM_ASSOC );
2576
2577 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002578
2579 return;
2580 }
2581 else
2582 {
2583 /**
2584 * Received Association request either in invalid state
2585 * or to a peer MAC entity whose address is different
2586 * from one that STA is currently joined with or on AP.
2587 * Return Assoc confirm with Invalid parameters code.
2588 */
2589
2590 // Log error
2591 PELOGW(limLog(pMac, LOGW,
2592 FL("received unexpected MLM_ASSOC_CNF in state %X for role=%d, MAC addr= "),
2593 psessionEntry->limMlmState,
2594 psessionEntry->limSystemRole);)
2595 limPrintMacAddr(pMac, pMlmAssocReq->peerMacAddr, LOGW);
2596 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
2597
2598 mlmAssocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2599 mlmAssocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2600
2601 goto end;
2602 }
2603
2604end:
2605 /* Update PE session Id*/
2606 mlmAssocCnf.sessionId = pMlmAssocReq->sessionId;
2607
2608 /// Free up buffer allocated for assocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302609 vos_mem_free(pMlmAssocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002610
2611 limPostSmeMessage(pMac, LIM_MLM_ASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
2612} /*** limProcessMlmAssocReq() ***/
2613
2614
2615
2616/**
2617 * limProcessMlmReassocReq()
2618 *
2619 *FUNCTION:
2620 * This function is called to process MLM_REASSOC_REQ message
2621 * from SME
2622 *
2623 *LOGIC:
2624 *
2625 *ASSUMPTIONS:
2626 *
2627 *NOTE:
2628 *
2629 * @param pMac Pointer to Global MAC structure
2630 * @param *pMsgBuf A pointer to the MLM message buffer
2631 * @return None
2632 */
2633
2634static void
2635limProcessMlmReassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2636{
Jeff Johnsone7245742012-09-05 17:12:55 -07002637 tANI_U8 chanNum, secChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002638 struct tLimPreAuthNode *pAuthNode;
2639 tLimMlmReassocReq *pMlmReassocReq;
2640 tLimMlmReassocCnf mlmReassocCnf;
2641 tpPESession psessionEntry;
2642
2643 if(pMsgBuf == NULL)
2644 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002645 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002646 return;
2647 }
2648
2649 pMlmReassocReq = (tLimMlmReassocReq *) pMsgBuf;
2650
2651 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmReassocReq->sessionId)) == NULL)
2652 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002653 PELOGE(limLog(pMac, LOGE,FL("Session Does not exist for given sessionId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302654 vos_mem_free(pMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002655 return;
2656 }
2657
2658 if (((psessionEntry->limSystemRole != eLIM_AP_ROLE) && (psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE)) &&
2659 (psessionEntry->limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE))
2660 {
2661 if (psessionEntry->pLimMlmReassocReq)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302662 vos_mem_free(psessionEntry->pLimMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002663
2664 /* Hold Re-Assoc request as part of Session, knock-out pMac */
2665 /// Hold onto Reassoc request parameters
2666 psessionEntry->pLimMlmReassocReq = pMlmReassocReq;
2667
2668 // See if we have pre-auth context with new AP
2669 pAuthNode = limSearchPreAuthList(pMac, psessionEntry->limReAssocbssId);
2670
2671 if (!pAuthNode &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302672 (!vos_mem_compare(pMlmReassocReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002673 psessionEntry->bssId,
2674 sizeof(tSirMacAddr)) ))
2675 {
2676 // Either pre-auth context does not exist AND
2677 // we are not reassociating with currently
2678 // associated AP.
2679 // Return Reassoc confirm with not authenticated
2680 mlmReassocCnf.resultCode = eSIR_SME_STA_NOT_AUTHENTICATED;
2681 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2682
2683 goto end;
2684 }
2685
2686 //assign the sessionId to the timer object
2687 pMac->lim.limTimers.gLimReassocFailureTimer.sessionId = pMlmReassocReq->sessionId;
2688
2689 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2690 psessionEntry->limMlmState = eLIM_MLM_WT_REASSOC_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002691 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002692
2693#if 0
2694 // Update BSSID at CFG database
2695 if (wlan_cfgSetStr(pMac, WNI_CFG_BSSID,
2696 pMac->lim.gLimReassocBssId,
2697 sizeof(tSirMacAddr)) != eSIR_SUCCESS)
2698 {
2699 /// Could not update BSSID at CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002700 limLog(pMac, LOGP, FL("could not update BSSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002701 }
2702#endif //TO SUPPORT BT-AMP
2703
2704 /* Copy Global Reassoc ID*/
2705 // sirCopyMacAddr(psessionEntry->reassocbssId,pMac->lim.gLimReAssocBssId);
2706
2707 /**
2708 * Derive channel from BSS description and
2709 * store it at CFG.
2710 */
2711
2712 chanNum = psessionEntry->limReassocChannelId;
Jeff Johnsone7245742012-09-05 17:12:55 -07002713 secChannelOffset = psessionEntry->reAssocHtSecondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002714
2715 /* To Support BT-AMP .. read channel number from psessionEntry*/
2716 //chanNum = psessionEntry->currentOperChannel;
2717
2718 // Apply previously set configuration at HW
2719 limApplyConfiguration(pMac,psessionEntry);
2720
2721 //store the channel switch sessionEntry in the lim global var
2722 /* We have already saved the ReAssocreq Pointer abobe */
2723 //psessionEntry->pLimReAssocReq = (void *)pMlmReassocReq;
2724 psessionEntry->channelChangeReasonCode = LIM_SWITCH_CHANNEL_REASSOC;
2725
Jeff Johnsone7245742012-09-05 17:12:55 -07002726 /** Switch channel to the new Operating channel for Reassoc*/
2727 limSetChannel(pMac, chanNum, secChannelOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002728
2729 return;
2730 }
2731 else
2732 {
2733 /**
2734 * Received Reassoc request in invalid state or
2735 * in AP role.Return Reassoc confirm with Invalid
2736 * parameters code.
2737 */
2738
2739 // Log error
2740 PELOGW(limLog(pMac, LOGW,
2741 FL("received unexpected MLM_REASSOC_CNF in state %X for role=%d, MAC addr= "),
2742 psessionEntry->limMlmState,
2743 psessionEntry->limSystemRole);)
2744 limPrintMacAddr(pMac, pMlmReassocReq->peerMacAddr,
2745 LOGW);
2746 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
2747
2748 mlmReassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2749 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2750
2751 goto end;
2752 }
2753
2754end:
2755 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2756 /* Update PE sessio Id*/
2757 mlmReassocCnf.sessionId = pMlmReassocReq->sessionId;
2758 /// Free up buffer allocated for reassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302759 vos_mem_free(pMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002760 psessionEntry->pLimReAssocReq = NULL;
2761
2762 limPostSmeMessage(pMac, LIM_MLM_REASSOC_CNF, (tANI_U32 *) &mlmReassocCnf);
2763} /*** limProcessMlmReassocReq() ***/
2764
2765
2766static void
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08002767limProcessMlmDisassocReqNtf(tpAniSirGlobal pMac, eHalStatus suspendStatus, tANI_U32 *pMsgBuf)
Jeff Johnson295189b2012-06-20 16:38:30 -07002768{
2769 tANI_U16 aid;
2770 tSirMacAddr currentBssId;
2771 tpDphHashNode pStaDs;
2772 tLimMlmDisassocReq *pMlmDisassocReq;
2773 tLimMlmDisassocCnf mlmDisassocCnf;
2774 tpPESession psessionEntry;
2775 extern tANI_BOOLEAN sendDisassocFrame;
2776
2777 if(eHAL_STATUS_SUCCESS != suspendStatus)
2778 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002779 PELOGE(limLog(pMac, LOGE,FL("Suspend Status is not success %X"), suspendStatus);)
Jeff Johnson295189b2012-06-20 16:38:30 -07002780#if 0
2781 //It can ignore the status and proceed with the disassoc processing.
2782 mlmDisassocCnf.resultCode = eSIR_SME_REFUSED;
2783 goto end;
2784#endif
2785 }
2786
2787 pMlmDisassocReq = (tLimMlmDisassocReq *) pMsgBuf;
2788
2789
2790 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDisassocReq->sessionId))== NULL)
2791 {
2792
2793 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002794 FL("session does not exist for given sessionId"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002795 mlmDisassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2796 goto end;
2797 }
2798 #if 0
2799 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2800 eSIR_SUCCESS)
2801 {
2802 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002803 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002804 }
2805 #endif //BT-AMP Support
2806 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2807
2808 switch (psessionEntry->limSystemRole)
2809 {
2810 case eLIM_STA_ROLE:
2811 case eLIM_BT_AMP_STA_ROLE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302812 if ( !vos_mem_compare(pMlmDisassocReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002813 currentBssId,
2814 sizeof(tSirMacAddr)) )
2815 {
2816 PELOGW(limLog(pMac, LOGW,
2817 FL("received MLM_DISASSOC_REQ with invalid BSS id "));)
2818 limPrintMacAddr(pMac, pMlmDisassocReq->peerMacAddr, LOGW);
2819
2820 /// Prepare and Send LIM_MLM_DISASSOC_CNF
2821
2822 mlmDisassocCnf.resultCode =
2823 eSIR_SME_INVALID_PARAMETERS;
2824
2825 goto end;
2826 }
2827
2828 break;
2829
2830 case eLIM_STA_IN_IBSS_ROLE:
2831
2832 break;
2833
2834 default: // eLIM_AP_ROLE
2835
2836 // Fall through
2837 break;
2838
2839 } // end switch (psessionEntry->limSystemRole)
2840
2841 /**
2842 * Check if there exists a context for the peer entity
2843 * to be disassociated with.
2844 */
2845 pStaDs = dphLookupHashEntry(pMac, pMlmDisassocReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable);
2846 if ((pStaDs == NULL) ||
2847 (pStaDs &&
2848 ((pStaDs->mlmStaContext.mlmState !=
2849 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
2850 (pStaDs->mlmStaContext.mlmState !=
2851 eLIM_MLM_WT_ASSOC_CNF_STATE) &&
2852 (pStaDs->mlmStaContext.mlmState !=
2853 eLIM_MLM_ASSOCIATED_STATE))))
2854 {
2855 /**
2856 * Received LIM_MLM_DISASSOC_REQ for STA that does not
2857 * have context or in some transit state.
2858 * Log error
2859 */
2860 PELOGW(limLog(pMac, LOGW,
2861 FL("received MLM_DISASSOC_REQ for STA that either has no context or in some transit state, Addr= "));)
2862 limPrintMacAddr(pMac, pMlmDisassocReq->peerMacAddr, LOGW);
2863
2864 /// Prepare and Send LIM_MLM_DISASSOC_CNF
2865
2866 mlmDisassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2867
2868 goto end;
2869 }
2870
2871 //pStaDs->mlmStaContext.rxPurgeReq = 1;
2872 pStaDs->mlmStaContext.disassocReason = (tSirMacReasonCodes)
2873 pMlmDisassocReq->reasonCode;
2874 pStaDs->mlmStaContext.cleanupTrigger = pMlmDisassocReq->disassocTrigger;
2875
2876 /// Send Disassociate frame to peer entity
Jeff Johnsone7245742012-09-05 17:12:55 -07002877 if (sendDisassocFrame && (pMlmDisassocReq->reasonCode != eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON))
Jeff Johnson295189b2012-06-20 16:38:30 -07002878 {
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08002879 pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq = pMlmDisassocReq;
Madan Mohan Koyyalamudicdcb58f2012-11-28 01:40:44 +05302880 /* Set state to mlm State to eLIM_MLM_WT_DEL_STA_RSP_STATE
2881 * This is to address the issue of race condition between
2882 * disconnect request from the HDD and deauth from AP
2883 */
2884 pStaDs->mlmStaContext.mlmState = eLIM_MLM_WT_DEL_STA_RSP_STATE;
2885
2886 limSendDisassocMgmtFrame(pMac,
2887 pMlmDisassocReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08002888 pMlmDisassocReq->peerMacAddr,
2889 psessionEntry, TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002890 }
2891 else
2892 {
Madan Mohan Koyyalamudib6af0612012-11-19 13:45:45 -08002893 /* Disassoc frame is not sent OTA */
2894 sendDisassocFrame = 1;
2895 // Receive path cleanup with dummy packet
2896 if(eSIR_SUCCESS != limCleanupRxPath(pMac, pStaDs,psessionEntry))
2897 {
2898 mlmDisassocCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2899 goto end;
2900 }
2901 // Free up buffer allocated for mlmDisassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302902 vos_mem_free(pMlmDisassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002903 }
2904
Jeff Johnson295189b2012-06-20 16:38:30 -07002905 return;
2906
2907end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302908 vos_mem_copy((tANI_U8 *) &mlmDisassocCnf.peerMacAddr,
2909 (tANI_U8 *) pMlmDisassocReq->peerMacAddr,
2910 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002911 mlmDisassocCnf.aid = pMlmDisassocReq->aid;
2912 mlmDisassocCnf.disassocTrigger = pMlmDisassocReq->disassocTrigger;
2913
2914 /* Update PE session ID*/
2915 mlmDisassocCnf.sessionId = pMlmDisassocReq->sessionId;
2916
2917 /// Free up buffer allocated for mlmDisassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302918 vos_mem_free(pMlmDisassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002919
2920 limPostSmeMessage(pMac,
2921 LIM_MLM_DISASSOC_CNF,
2922 (tANI_U32 *) &mlmDisassocCnf);
2923}
2924
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08002925tANI_BOOLEAN limCheckDisassocDeauthAckPending(tpAniSirGlobal pMac,
2926 tANI_U8 *staMac
2927 )
2928{
2929 tLimMlmDisassocReq *pMlmDisassocReq;
2930 tLimMlmDeauthReq *pMlmDeauthReq;
2931 pMlmDisassocReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq;
2932 pMlmDeauthReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq;
2933 if (
2934 (pMlmDisassocReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302935 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08002936 (tANI_U8 *) &pMlmDisassocReq->peerMacAddr,
2937 sizeof(tSirMacAddr))))
2938 ||
2939 (pMlmDeauthReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302940 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08002941 (tANI_U8 *) &pMlmDeauthReq->peerMacAddr,
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302942 sizeof(tSirMacAddr))))
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08002943 )
2944 {
Srinivas Girigowdac03c5a82013-07-01 13:44:54 -07002945 PELOG1(limLog(pMac, LOG1, FL("Disassoc/Deauth ack pending"));)
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08002946 return eANI_BOOLEAN_TRUE;
2947 }
2948 else
2949 {
Srinivas Girigowdac03c5a82013-07-01 13:44:54 -07002950 PELOG1(limLog(pMac, LOG1, FL("Disassoc/Deauth Ack not pending"));)
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08002951 return eANI_BOOLEAN_FALSE;
2952 }
2953}
2954
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08002955void limCleanUpDisassocDeauthReq(tpAniSirGlobal pMac,
2956 tANI_U8 *staMac,
2957 tANI_BOOLEAN cleanRxPath)
2958{
2959 tLimMlmDisassocReq *pMlmDisassocReq;
2960 tLimMlmDeauthReq *pMlmDeauthReq;
2961 pMlmDisassocReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq;
2962 if (pMlmDisassocReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302963 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08002964 (tANI_U8 *) &pMlmDisassocReq->peerMacAddr,
2965 sizeof(tSirMacAddr))))
2966 {
2967 if (cleanRxPath)
2968 {
2969 limProcessDisassocAckTimeout(pMac);
2970 }
2971 else
2972 {
2973 if (tx_timer_running(&pMac->lim.limTimers.gLimDisassocAckTimer))
2974 {
2975 limDeactivateAndChangeTimer(pMac, eLIM_DISASSOC_ACK_TIMER);
2976 }
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302977 vos_mem_free(pMlmDisassocReq);
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08002978 pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq = NULL;
2979 }
2980 }
2981
2982 pMlmDeauthReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq;
2983 if (pMlmDeauthReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302984 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08002985 (tANI_U8 *) &pMlmDeauthReq->peerMacAddr,
2986 sizeof(tSirMacAddr))))
2987 {
2988 if (cleanRxPath)
2989 {
2990 limProcessDeauthAckTimeout(pMac);
2991 }
2992 else
2993 {
2994 if (tx_timer_running(&pMac->lim.limTimers.gLimDeauthAckTimer))
2995 {
2996 limDeactivateAndChangeTimer(pMac, eLIM_DEAUTH_ACK_TIMER);
2997 }
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302998 vos_mem_free(pMlmDeauthReq);
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08002999 pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = NULL;
3000 }
3001 }
3002}
3003
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003004void limProcessDisassocAckTimeout(tpAniSirGlobal pMac)
3005{
3006 limSendDisassocCnf(pMac);
3007}
3008
Jeff Johnson295189b2012-06-20 16:38:30 -07003009/**
3010 * limProcessMlmDisassocReq()
3011 *
3012 *FUNCTION:
3013 * This function is called to process MLM_DISASSOC_REQ message
3014 * from SME
3015 *
3016 *LOGIC:
3017 *
3018 *ASSUMPTIONS:
3019 *
3020 *NOTE:
3021 *
3022 * @param pMac Pointer to Global MAC structure
3023 * @param *pMsgBuf A pointer to the MLM message buffer
3024 * @return None
3025 */
3026
3027static void
3028limProcessMlmDisassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3029{
3030// tANI_U16 aid;
3031// tSirMacAddr currentBssId;
3032// tpDphHashNode pStaDs;
3033 tLimMlmDisassocReq *pMlmDisassocReq;
3034// tLimMlmDisassocCnf mlmDisassocCnf;
3035 tpPESession psessionEntry;
3036// extern tANI_BOOLEAN sendDisassocFrame;
3037
3038 if(pMsgBuf == NULL)
3039 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003040 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003041 return;
3042 }
3043
3044 pMlmDisassocReq = (tLimMlmDisassocReq *) pMsgBuf;
3045
3046 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDisassocReq->sessionId))== NULL)
3047 {
3048
3049 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003050 FL("session does not exist for given sessionId"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003051 return;
3052 }
3053
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003054 limProcessMlmDisassocReqNtf( pMac, eHAL_STATUS_SUCCESS, (tANI_U32*) pMsgBuf );
Madan Mohan Koyyalamudib6af0612012-11-19 13:45:45 -08003055
Jeff Johnson295189b2012-06-20 16:38:30 -07003056} /*** limProcessMlmDisassocReq() ***/
3057
3058static void
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003059limProcessMlmDeauthReqNtf(tpAniSirGlobal pMac, eHalStatus suspendStatus, tANI_U32 *pMsgBuf)
Jeff Johnson295189b2012-06-20 16:38:30 -07003060{
3061 tANI_U16 aid;
3062 tSirMacAddr currentBssId;
3063 tpDphHashNode pStaDs;
3064 struct tLimPreAuthNode *pAuthNode;
3065 tLimMlmDeauthReq *pMlmDeauthReq;
3066 tLimMlmDeauthCnf mlmDeauthCnf;
3067 tpPESession psessionEntry;
3068
3069
3070 if(eHAL_STATUS_SUCCESS != suspendStatus)
3071 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003072 PELOGE(limLog(pMac, LOGE,FL("Suspend Status is not success %X"), suspendStatus);)
Jeff Johnson295189b2012-06-20 16:38:30 -07003073#if 0
3074 //It can ignore the status and proceed with the disassoc processing.
3075 mlmDisassocCnf.resultCode = eSIR_SME_REFUSED;
3076 goto end;
3077#endif
3078 }
3079
3080 pMlmDeauthReq = (tLimMlmDeauthReq *) pMsgBuf;
3081
3082 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDeauthReq->sessionId))== NULL)
3083 {
3084
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003085 PELOGE(limLog(pMac, LOGE, FL("session does not exist for given sessionId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303086 vos_mem_free(pMlmDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003087 return;
3088 }
3089 #if 0
3090 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
3091 eSIR_SUCCESS)
3092 {
3093 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003094 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003095 }
3096 #endif //SUPPORT BT-AMP
3097 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3098
3099 switch (psessionEntry->limSystemRole)
3100 {
3101 case eLIM_STA_ROLE:
3102 case eLIM_BT_AMP_STA_ROLE:
3103 switch (psessionEntry->limMlmState)
3104 {
3105 case eLIM_MLM_IDLE_STATE:
3106 // Attempting to Deauthenticate
3107 // with a pre-authenticated peer.
3108 // Deauthetiate with peer if there
3109 // exists a pre-auth context below.
3110 break;
3111
3112 case eLIM_MLM_AUTHENTICATED_STATE:
3113 case eLIM_MLM_WT_ASSOC_RSP_STATE:
3114 case eLIM_MLM_LINK_ESTABLISHED_STATE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303115 if (!vos_mem_compare(pMlmDeauthReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07003116 currentBssId,
3117 sizeof(tSirMacAddr)) )
3118 {
3119 PELOGW(limLog(pMac, LOGW,
3120 FL("received MLM_DEAUTH_REQ with invalid BSS id "));)
3121 PELOGE(limLog(pMac, LOGE, FL("Peer MAC Addr : "));)
3122 limPrintMacAddr(pMac, pMlmDeauthReq->peerMacAddr,LOGE);
3123
3124 PELOGE(limLog(pMac, LOGE, FL("\n CFG BSSID Addr : "));)
3125 limPrintMacAddr(pMac, currentBssId,LOGE);
3126
3127 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3128
3129 mlmDeauthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3130
3131 goto end;
3132 }
3133
3134 if ((psessionEntry->limMlmState ==
3135 eLIM_MLM_AUTHENTICATED_STATE) ||
3136 (psessionEntry->limMlmState ==
3137 eLIM_MLM_WT_ASSOC_RSP_STATE))
3138 {
3139 // Send Deauthentication frame
3140 // to peer entity
3141 limSendDeauthMgmtFrame(
3142 pMac,
3143 pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003144 pMlmDeauthReq->peerMacAddr,
3145 psessionEntry, FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003146
3147 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3148 mlmDeauthCnf.resultCode = eSIR_SME_SUCCESS;
3149 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003150 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003151 goto end;
3152 }
3153 else
3154 {
3155 // LINK_ESTABLISED_STATE
3156 // Cleanup RX & TX paths
3157 // below
3158 }
3159
3160 break;
3161
3162 default:
3163
3164 PELOGW(limLog(pMac, LOGW,
3165 FL("received MLM_DEAUTH_REQ with in state %d for peer "),
3166 psessionEntry->limMlmState);)
3167 limPrintMacAddr(pMac, pMlmDeauthReq->peerMacAddr, LOGW);
3168 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
3169
3170 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3171 mlmDeauthCnf.resultCode =
3172 eSIR_SME_STA_NOT_AUTHENTICATED;
3173
3174 goto end;
3175 }
3176
3177 break;
3178
3179 case eLIM_STA_IN_IBSS_ROLE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303180 vos_mem_free(pMlmDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003181
3182 return;
3183
3184 default: // eLIM_AP_ROLE
3185 break;
3186
3187 } // end switch (psessionEntry->limSystemRole)
3188
3189 /**
3190 * Check if there exists a context for the peer entity
3191 * to be deauthenticated with.
3192 */
3193 pStaDs = dphLookupHashEntry(pMac, pMlmDeauthReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable);
3194
3195 if (pStaDs == NULL)
3196 {
3197 /// Check if there exists pre-auth context for this STA
3198 pAuthNode = limSearchPreAuthList(pMac,
3199 pMlmDeauthReq->peerMacAddr);
3200
3201 if (pAuthNode == NULL)
3202 {
3203 /**
3204 * Received DEAUTH REQ for a STA that is neither
3205 * Associated nor Pre-authenticated. Log error,
3206 * Prepare and Send LIM_MLM_DEAUTH_CNF
3207 */
3208 PELOGW(limLog(pMac, LOGW,
3209 FL("received MLM_DEAUTH_REQ for STA that does not have context, Addr="));)
3210 limPrintMacAddr(pMac, pMlmDeauthReq->peerMacAddr, LOGW);
3211
3212 mlmDeauthCnf.resultCode =
3213 eSIR_SME_STA_NOT_AUTHENTICATED;
3214 }
3215 else
3216 {
3217 mlmDeauthCnf.resultCode = eSIR_SME_SUCCESS;
3218
3219 /// Delete STA from pre-auth STA list
3220 limDeletePreAuthNode(pMac, pMlmDeauthReq->peerMacAddr);
3221
3222 /// Send Deauthentication frame to peer entity
3223 limSendDeauthMgmtFrame(pMac,
3224 pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003225 pMlmDeauthReq->peerMacAddr,
3226 psessionEntry, FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003227 }
3228
3229 goto end;
3230 }
3231 else if ((pStaDs->mlmStaContext.mlmState !=
3232 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
3233 (pStaDs->mlmStaContext.mlmState !=
3234 eLIM_MLM_WT_ASSOC_CNF_STATE))
3235 {
3236 /**
3237 * Received LIM_MLM_DEAUTH_REQ for STA that is n
3238 * some transit state. Log error.
3239 */
3240 PELOGW(limLog(pMac, LOGW,
3241 FL("received MLM_DEAUTH_REQ for STA that either has no context or in some transit state, Addr="));)
3242 limPrintMacAddr(pMac, pMlmDeauthReq->peerMacAddr, LOGW);
3243
3244 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3245
3246 mlmDeauthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3247
3248 goto end;
3249 }
3250
3251 //pStaDs->mlmStaContext.rxPurgeReq = 1;
3252 pStaDs->mlmStaContext.disassocReason = (tSirMacReasonCodes)
3253 pMlmDeauthReq->reasonCode;
3254 pStaDs->mlmStaContext.cleanupTrigger = pMlmDeauthReq->deauthTrigger;
3255
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003256 pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = pMlmDeauthReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07003257 /// Send Deauthentication frame to peer entity
3258 limSendDeauthMgmtFrame(pMac, pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003259 pMlmDeauthReq->peerMacAddr,
3260 psessionEntry, TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003261
3262 return;
3263
3264end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303265 vos_mem_copy((tANI_U8 *) &mlmDeauthCnf.peerMacAddr,
3266 (tANI_U8 *) pMlmDeauthReq->peerMacAddr,
3267 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003268 mlmDeauthCnf.deauthTrigger = pMlmDeauthReq->deauthTrigger;
3269 mlmDeauthCnf.aid = pMlmDeauthReq->aid;
3270 mlmDeauthCnf.sessionId = pMlmDeauthReq->sessionId;
3271
3272 // Free up buffer allocated
3273 // for mlmDeauthReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303274 vos_mem_free(pMlmDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003275
3276 limPostSmeMessage(pMac,
3277 LIM_MLM_DEAUTH_CNF,
3278 (tANI_U32 *) &mlmDeauthCnf);
3279
3280}
3281
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003282
3283void limProcessDeauthAckTimeout(tpAniSirGlobal pMac)
3284{
3285 limSendDeauthCnf(pMac);
3286}
3287
Jeff Johnson295189b2012-06-20 16:38:30 -07003288/**
3289 * limProcessMlmDeauthReq()
3290 *
3291 *FUNCTION:
3292 * This function is called to process MLM_DEAUTH_REQ message
3293 * from SME
3294 *
3295 *LOGIC:
3296 *
3297 *ASSUMPTIONS:
3298 *
3299 *NOTE:
3300 *
3301 * @param pMac Pointer to Global MAC structure
3302 * @param *pMsgBuf A pointer to the MLM message buffer
3303 * @return None
3304 */
3305
3306static void
3307limProcessMlmDeauthReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3308{
3309// tANI_U16 aid;
3310// tSirMacAddr currentBssId;
3311// tpDphHashNode pStaDs;
3312// struct tLimPreAuthNode *pAuthNode;
3313 tLimMlmDeauthReq *pMlmDeauthReq;
3314// tLimMlmDeauthCnf mlmDeauthCnf;
3315 tpPESession psessionEntry;
3316
3317 if(pMsgBuf == NULL)
3318 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003319 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003320 return;
3321 }
3322
3323 pMlmDeauthReq = (tLimMlmDeauthReq *) pMsgBuf;
3324
3325 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDeauthReq->sessionId))== NULL)
3326 {
3327
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003328 PELOGE(limLog(pMac, LOGE, FL("session does not exist for given sessionId"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003329 return;
3330 }
3331
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003332 limProcessMlmDeauthReqNtf( pMac, eHAL_STATUS_SUCCESS, (tANI_U32*) pMsgBuf );
3333
Jeff Johnson295189b2012-06-20 16:38:30 -07003334} /*** limProcessMlmDeauthReq() ***/
3335
3336
3337
3338/**
3339 * @function : limProcessMlmSetKeysReq()
3340 *
3341 * @brief : This function is called to process MLM_SETKEYS_REQ message
3342 * from SME
3343 *
3344 *LOGIC:
3345 *
3346 *ASSUMPTIONS:
3347 *
3348 *NOTE:
3349 *
3350 * @param pMac Pointer to Global MAC structure
3351 * @param *pMsgBuf A pointer to the MLM message buffer
3352 * @return None
3353 */
3354
3355static void
3356limProcessMlmSetKeysReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3357{
3358tANI_U16 aid;
3359tANI_U16 staIdx = 0;
3360tANI_U32 defaultKeyId = 0;
3361tSirMacAddr currentBssId;
3362tpDphHashNode pStaDs;
3363tLimMlmSetKeysReq *pMlmSetKeysReq;
3364tLimMlmSetKeysCnf mlmSetKeysCnf;
3365tpPESession psessionEntry;
3366
3367 if(pMsgBuf == NULL)
3368 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003369 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003370 return;
3371 }
3372
3373
3374 pMlmSetKeysReq = (tLimMlmSetKeysReq *) pMsgBuf;
3375 // Hold onto the SetKeys request parameters
3376 pMac->lim.gpLimMlmSetKeysReq = (void *) pMlmSetKeysReq;
3377
3378 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmSetKeysReq->sessionId))== NULL)
3379 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003380 PELOGE(limLog(pMac, LOGE,FL("session does not exist for given sessionId"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003381 return;
3382 }
3383
3384 limLog( pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003385 FL( "Received MLM_SETKEYS_REQ with parameters:"
Jeff Johnson295189b2012-06-20 16:38:30 -07003386 "AID [%d], ED Type [%d], # Keys [%d] & Peer MAC Addr - "),
3387 pMlmSetKeysReq->aid,
3388 pMlmSetKeysReq->edType,
3389 pMlmSetKeysReq->numKeys );
3390 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3391
3392 #if 0
3393 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac, WNI_CFG_BSSID, currentBssId, &cfg )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003394 limLog( pMac, LOGP, FL("Could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003395 return;
3396 }
3397 #endif //TO SUPPORT BT-AMP
3398 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3399
3400 switch( psessionEntry->limSystemRole ) {
3401 case eLIM_STA_ROLE:
3402 case eLIM_BT_AMP_STA_ROLE:
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003403 //In case of TDLS, peerMac address need not be BssId. Skip this check
3404 //if TDLS is enabled.
3405#ifndef FEATURE_WLAN_TDLS
Jeff Johnson295189b2012-06-20 16:38:30 -07003406 if((!limIsAddrBC( pMlmSetKeysReq->peerMacAddr ) ) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303407 (!vos_mem_compare(pMlmSetKeysReq->peerMacAddr,
3408 currentBssId, sizeof(tSirMacAddr))) ){
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003409 limLog( pMac, LOGW, FL("Received MLM_SETKEYS_REQ with invalid BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003410 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3411
3412 // Prepare and Send LIM_MLM_SETKEYS_CNF with error code
3413 mlmSetKeysCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3414 goto end;
3415 }
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003416#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003417 // Fall thru' & 'Plumb' keys below
3418 break;
3419 case eLIM_STA_IN_IBSS_ROLE:
3420 default: // others
3421 // Fall thru...
3422 break;
3423 }
3424
3425 /**
3426 * Use the "unicast" parameter to determine if the "Group Keys"
3427 * are being set.
3428 * pMlmSetKeysReq->key.unicast = 0 -> Multicast/broadcast
3429 * pMlmSetKeysReq->key.unicast - 1 -> Unicast keys are being set
3430 */
3431 if( limIsAddrBC( pMlmSetKeysReq->peerMacAddr )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003432 limLog( pMac, LOG1, FL("Trying to set Group Keys...%d "), pMlmSetKeysReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07003433 /** When trying to set Group Keys for any
3434 * security mode other than WEP, use the
3435 * STA Index corresponding to the AP...
3436 */
3437 switch( pMlmSetKeysReq->edType ) {
3438 case eSIR_ED_CCMP:
3439
3440#ifdef WLAN_FEATURE_11W
3441 case eSIR_ED_AES_128_CMAC:
3442#endif
3443 staIdx = psessionEntry->staId;
3444 break;
3445
3446 default:
3447 break;
3448 }
3449 }else {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003450 limLog( pMac, LOG1, FL("Trying to set Unicast Keys..."));
Jeff Johnson295189b2012-06-20 16:38:30 -07003451 /**
3452 * Check if there exists a context for the
3453 * peer entity for which keys need to be set.
3454 */
3455
3456
3457 pStaDs = dphLookupHashEntry( pMac, pMlmSetKeysReq->peerMacAddr, &aid , &psessionEntry->dph.dphHashTable);
3458
Jeff Johnson295189b2012-06-20 16:38:30 -07003459 if ((pStaDs == NULL) ||
3460 ((pStaDs->mlmStaContext.mlmState != eLIM_MLM_LINK_ESTABLISHED_STATE) && (psessionEntry->limSystemRole != eLIM_AP_ROLE))) {
Jeff Johnson295189b2012-06-20 16:38:30 -07003461 /**
3462 * Received LIM_MLM_SETKEYS_REQ for STA
3463 * that does not have context or in some
3464 * transit state. Log error.
3465 */
3466 limLog( pMac, LOG1,
3467 FL("Received MLM_SETKEYS_REQ for STA that either has no context or in some transit state, Addr = "));
3468 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3469
3470 // Prepare and Send LIM_MLM_SETKEYS_CNF
3471 mlmSetKeysCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3472 goto end;
3473 } else
3474 staIdx = pStaDs->staIndex;
3475 }
3476
3477 if ((pMlmSetKeysReq->numKeys == 0) && (pMlmSetKeysReq->edType != eSIR_ED_NONE)) {
Jeff Johnsone7245742012-09-05 17:12:55 -07003478 //
3479 // Broadcast/Multicast Keys (for WEP!!) are NOT sent
3480 // via this interface!!
3481 //
3482 // This indicates to HAL that the WEP Keys need to be
3483 // extracted from the CFG and applied to hardware
3484 defaultKeyId = 0xff;
3485 }else if(pMlmSetKeysReq->key[0].keyId &&
3486 ((pMlmSetKeysReq->edType == eSIR_ED_WEP40) ||
3487 (pMlmSetKeysReq->edType == eSIR_ED_WEP104))){
3488 /* If the Key Id is non zero and encryption mode is WEP,
3489 * the key index is coming from the upper layers so that key only
3490 * need to be used as the default tx key, This is being used only
3491 * in case of WEP mode in HAL */
3492 defaultKeyId = pMlmSetKeysReq->key[0].keyId;
3493 }else
3494 defaultKeyId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003495
3496 limLog( pMac, LOG1,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003497 FL( "Trying to set keys for STA Index [%d], using defaultKeyId [%d]" ),
Jeff Johnson295189b2012-06-20 16:38:30 -07003498 staIdx,
3499 defaultKeyId );
3500
3501 if(limIsAddrBC( pMlmSetKeysReq->peerMacAddr )) {
3502 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
3503 psessionEntry->limMlmState = eLIM_MLM_WT_SET_BSS_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003504 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003505 limLog( pMac, LOG1, FL("Trying to set Group Keys...%d "),
Jeff Johnson295189b2012-06-20 16:38:30 -07003506 psessionEntry->peSessionId);
3507
3508 // Package WDA_SET_BSSKEY_REQ message parameters
3509 limSendSetBssKeyReq(pMac, pMlmSetKeysReq,psessionEntry);
3510 return;
3511 }else {
3512 // Package WDA_SET_STAKEY_REQ / WDA_SET_STA_BCASTKEY_REQ message parameters
3513 limSendSetStaKeyReq(pMac, pMlmSetKeysReq, staIdx, (tANI_U8) defaultKeyId,psessionEntry);
3514 return;
3515 }
3516
3517end:
3518 mlmSetKeysCnf.sessionId= pMlmSetKeysReq->sessionId;
3519 limPostSmeSetKeysCnf( pMac, pMlmSetKeysReq, &mlmSetKeysCnf );
3520
3521} /*** limProcessMlmSetKeysReq() ***/
3522
3523/**
3524 * limProcessMlmRemoveKeyReq()
3525 *
3526 *FUNCTION:
3527 * This function is called to process MLM_REMOVEKEY_REQ message
3528 * from SME
3529 *
3530 *LOGIC:
3531 *
3532 *ASSUMPTIONS:
3533 *
3534 *NOTE:
3535 *
3536 * @param pMac Pointer to Global MAC structure
3537 * @param *pMsgBuf A pointer to the MLM message buffer
3538 * @return None
3539 */
3540
3541static void
3542limProcessMlmRemoveKeyReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3543{
3544tANI_U16 aid;
3545tANI_U16 staIdx = 0;
3546tSirMacAddr currentBssId;
3547tpDphHashNode pStaDs;
3548tLimMlmRemoveKeyReq *pMlmRemoveKeyReq;
3549tLimMlmRemoveKeyCnf mlmRemoveKeyCnf;
3550 tpPESession psessionEntry;
3551
3552 if(pMsgBuf == NULL)
3553 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003554 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003555 return;
3556 }
3557
3558 pMlmRemoveKeyReq = (tLimMlmRemoveKeyReq *) pMsgBuf;
3559
3560
3561 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmRemoveKeyReq->sessionId))== NULL)
3562 {
3563 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003564 FL("session does not exist for given sessionId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303565 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07003566 return;
3567 }
3568
3569
3570 if( pMac->lim.gpLimMlmRemoveKeyReq != NULL )
3571 {
3572 // Free any previous requests.
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303573 vos_mem_free(pMac->lim.gpLimMlmRemoveKeyReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003574 pMac->lim.gpLimMlmRemoveKeyReq = NULL;
3575 }
3576 // Hold onto the RemoveKeys request parameters
3577 pMac->lim.gpLimMlmRemoveKeyReq = (void *) pMlmRemoveKeyReq;
3578
3579 #if 0
3580 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac,
3581 WNI_CFG_BSSID,
3582 currentBssId,
3583 &cfg ))
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003584 limLog( pMac, LOGP, FL("Could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003585 #endif //TO-SUPPORT BT-AMP
3586 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3587
3588 switch( psessionEntry->limSystemRole )
3589 {
3590 case eLIM_STA_ROLE:
3591 case eLIM_BT_AMP_STA_ROLE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303592 if (( limIsAddrBC( pMlmRemoveKeyReq->peerMacAddr ) != true ) &&
3593 (!vos_mem_compare(pMlmRemoveKeyReq->peerMacAddr,
3594 currentBssId,
3595 sizeof(tSirMacAddr))))
Jeff Johnson295189b2012-06-20 16:38:30 -07003596 {
3597 limLog( pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003598 FL("Received MLM_REMOVEKEY_REQ with invalid BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003599 limPrintMacAddr( pMac, pMlmRemoveKeyReq->peerMacAddr, LOGW );
3600
3601 // Prepare and Send LIM_MLM_REMOVEKEY_CNF with error code
3602 mlmRemoveKeyCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3603 goto end;
3604 }
3605 break;
3606
3607 case eLIM_STA_IN_IBSS_ROLE:
3608 default: // eLIM_AP_ROLE
3609 // Fall thru...
3610 break;
3611 }
3612
3613
3614 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
3615 if(limIsAddrBC( pMlmRemoveKeyReq->peerMacAddr )) //Second condition for IBSS or AP role.
3616 {
3617 psessionEntry->limMlmState = eLIM_MLM_WT_REMOVE_BSS_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003618 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003619 // Package WDA_REMOVE_BSSKEY_REQ message parameters
3620 limSendRemoveBssKeyReq( pMac,pMlmRemoveKeyReq,psessionEntry);
3621 return;
3622 }
3623
3624 /**
3625 * Check if there exists a context for the
3626 * peer entity for which keys need to be removed.
3627 */
3628 pStaDs = dphLookupHashEntry( pMac, pMlmRemoveKeyReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable );
3629 if ((pStaDs == NULL) ||
3630 (pStaDs &&
3631 (pStaDs->mlmStaContext.mlmState !=
3632 eLIM_MLM_LINK_ESTABLISHED_STATE)))
3633 {
3634 /**
3635 * Received LIM_MLM_REMOVEKEY_REQ for STA
3636 * that does not have context or in some
3637 * transit state. Log error.
3638 */
3639 limLog( pMac, LOGW,
3640 FL("Received MLM_REMOVEKEYS_REQ for STA that either has no context or in some transit state, Addr = "));
3641 limPrintMacAddr( pMac, pMlmRemoveKeyReq->peerMacAddr, LOGW );
3642
3643 // Prepare and Send LIM_MLM_REMOVEKEY_CNF
3644 mlmRemoveKeyCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3645 mlmRemoveKeyCnf.sessionId = pMlmRemoveKeyReq->sessionId;
3646
3647
3648 goto end;
3649 }
3650 else
3651 staIdx = pStaDs->staIndex;
3652
3653
3654
3655 psessionEntry->limMlmState = eLIM_MLM_WT_REMOVE_STA_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003656 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003657
3658 // Package WDA_REMOVE_STAKEY_REQ message parameters
3659 limSendRemoveStaKeyReq( pMac,pMlmRemoveKeyReq,staIdx,psessionEntry);
3660 return;
3661
3662end:
3663 limPostSmeRemoveKeyCnf( pMac,
Jeff Johnsone7245742012-09-05 17:12:55 -07003664 psessionEntry,
Jeff Johnson295189b2012-06-20 16:38:30 -07003665 pMlmRemoveKeyReq,
3666 &mlmRemoveKeyCnf );
3667
3668} /*** limProcessMlmRemoveKeyReq() ***/
3669
3670
3671/**
3672 * limProcessMinChannelTimeout()
3673 *
3674 *FUNCTION:
3675 * This function is called to process Min Channel Timeout
3676 * during channel scan.
3677 *
3678 *LOGIC:
3679 *
3680 *ASSUMPTIONS:
3681 *
3682 *NOTE:
3683 *
3684 * @param pMac Pointer to Global MAC structure
3685 * @return None
3686 */
3687
3688static void
3689limProcessMinChannelTimeout(tpAniSirGlobal pMac)
3690{
3691 tANI_U8 channelNum;
3692
3693#ifdef GEN6_TODO
3694 //if the min Channel is maintained per session, then use the below seesionEntry
3695 //priority - LOW/might not be needed
3696
3697 //TBD-RAJESH HOW TO GET sessionEntry?????
3698 tpPESession psessionEntry;
3699
3700 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimMinChannelTimer.sessionId))== NULL)
3701 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003702 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003703 return;
3704 }
3705#endif
3706
3707
3708 if (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE)
3709 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003710 PELOG1(limLog(pMac, LOG1, FL("Scanning : min channel timeout occurred"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003711
3712 /// Min channel timer timed out
3713 pMac->lim.limTimers.gLimPeriodicProbeReqTimer.sessionId = 0xff;
3714 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
3715 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
3716 if (pMac->lim.gLimCurrentScanChannelId <=
3717 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
3718 {
3719 channelNum = (tANI_U8)limGetCurrentScanChannel(pMac);
3720 }
3721 else
3722 {
3723 // This shouldn't be the case, but when this happens, this timeout should be for the last channelId.
3724 // Get the channelNum as close to correct as possible.
3725 if(pMac->lim.gpLimMlmScanReq->channelList.channelNumber)
3726 {
3727 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1];
3728 }
3729 else
3730 {
3731 channelNum = 1;
3732 }
3733 }
3734
3735 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
3736 }
3737 else
3738 {
3739 /**
3740 * MIN channel timer should not have timed out
3741 * in states other than wait_probe_response.
3742 * Log error.
3743 */
3744 limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003745 FL("received unexpected MIN channel timeout in state %X"),
Jeff Johnson295189b2012-06-20 16:38:30 -07003746 pMac->lim.gLimMlmState);
3747 limPrintMlmState(pMac, LOGE, pMac->lim.gLimMlmState);
3748 }
3749} /*** limProcessMinChannelTimeout() ***/
3750
3751
3752
3753/**
3754 * limProcessMaxChannelTimeout()
3755 *
3756 *FUNCTION:
3757 * This function is called to process Max Channel Timeout
3758 * during channel scan.
3759 *
3760 *LOGIC:
3761 *
3762 *ASSUMPTIONS:
3763 *
3764 *NOTE:
3765 *
3766 * @param pMac Pointer to Global MAC structure
3767 * @return None
3768 */
3769
3770static void
3771limProcessMaxChannelTimeout(tpAniSirGlobal pMac)
3772{
3773 tANI_U8 channelNum;
3774
3775
3776 if (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE ||
3777 pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE)
3778 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003779 PELOG1(limLog(pMac, LOG1, FL("Scanning : Max channel timed out"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003780 /**
3781 * MAX channel timer timed out
3782 * Continue channel scan.
3783 */
3784 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
3785 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
3786 pMac->lim.limTimers.gLimPeriodicProbeReqTimer.sessionId = 0xff;
3787 if (pMac->lim.gLimCurrentScanChannelId <=
3788 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
3789 {
3790 channelNum = limGetCurrentScanChannel(pMac);
3791 }
3792 else
3793 {
3794 if(pMac->lim.gpLimMlmScanReq->channelList.channelNumber)
3795 {
3796 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1];
3797 }
3798 else
3799 {
3800 channelNum = 1;
3801 }
3802 }
3803 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
3804 }
3805 else
3806 {
3807 /**
3808 * MAX channel timer should not have timed out
3809 * in states other than wait_scan.
3810 * Log error.
3811 */
3812 limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003813 FL("received unexpected MAX channel timeout in state %X"),
Jeff Johnson295189b2012-06-20 16:38:30 -07003814 pMac->lim.gLimMlmState);
3815 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
3816 }
3817} /*** limProcessMaxChannelTimeout() ***/
3818
3819/**
3820 * limProcessPeriodicProbeReqTimer()
3821 *
3822 *FUNCTION:
3823 * This function is called to process periodic probe request
3824 * to send during scan.
3825 *
3826 *LOGIC:
3827 *
3828 *ASSUMPTIONS:
3829 *
3830 *NOTE:
3831 *
3832 * @param pMac Pointer to Global MAC structure
3833 * @return None
3834 */
3835
3836static void
3837limProcessPeriodicProbeReqTimer(tpAniSirGlobal pMac)
3838{
3839 tANI_U8 channelNum;
3840 tANI_U8 i = 0;
3841 tSirRetStatus status = eSIR_SUCCESS;
3842 TX_TIMER *pPeriodicProbeReqTimer;
3843 pPeriodicProbeReqTimer = &pMac->lim.limTimers.gLimPeriodicProbeReqTimer;
3844
3845 if(vos_timer_getCurrentState(&pPeriodicProbeReqTimer->vosTimer)
3846 != VOS_TIMER_STATE_STOPPED)
3847 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003848 PELOG1(limLog(pMac, LOG1, FL("Invalid state of timer"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003849 return;
3850 }
3851
3852 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) &&
3853 (pPeriodicProbeReqTimer->sessionId != 0xff))
3854 {
3855 tLimMlmScanReq *pLimMlmScanReq = pMac->lim.gpLimMlmScanReq;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003856 PELOG1(limLog(pMac, LOG1, FL("Scanning : Periodic scanning"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003857 /**
3858 * Periodic channel timer timed out
3859 * to send probe request.
3860 */
3861 channelNum = limGetCurrentScanChannel(pMac);
3862 do
3863 {
3864 /* Prepare and send Probe Request frame for all the SSIDs
3865 * present in the saved MLM
3866 */
3867
3868 /*
3869 * PELOGE(limLog(pMac, LOGW, FL("sending ProbeReq number %d,"
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003870 * " for SSID %s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07003871 * i, pLimMlmScanReq->ssId[i].ssId,
3872 * channelNum);)
3873 */
3874 status = limSendProbeReqMgmtFrame( pMac, &pLimMlmScanReq->ssId[i],
3875 pLimMlmScanReq->bssId, channelNum, pMac->lim.gSelfMacAddr,
3876 pLimMlmScanReq->dot11mode, pLimMlmScanReq->uIEFieldLen,
3877 (tANI_U8 *)(pLimMlmScanReq) + pLimMlmScanReq->uIEFieldOffset);
3878
3879
3880 if ( status != eSIR_SUCCESS)
3881 {
3882 PELOGE(limLog(pMac, LOGE, FL("send ProbeReq failed for SSID "
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003883 "%s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07003884 pLimMlmScanReq->ssId[i].ssId,
3885 channelNum);)
3886 return;
3887 }
3888 i++;
3889 } while (i < pLimMlmScanReq->numSsid);
3890
3891 /* Activate timer again */
Varun Reddy Yeturue3bbf6e2013-02-08 18:50:55 -08003892 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, pPeriodicProbeReqTimer->sessionId, eLIM_PERIODIC_PROBE_REQ_TIMER));
Jeff Johnson295189b2012-06-20 16:38:30 -07003893 if (tx_timer_activate(pPeriodicProbeReqTimer) != TX_SUCCESS)
3894 {
3895 limLog(pMac, LOGP, FL("could not start periodic probe"
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003896 " req timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003897 return;
3898 }
3899 }
3900 else
3901 {
3902 /**
3903 * Periodic scan is timeout is happening in
3904 * in states other than wait_scan.
3905 * Log error.
3906 */
Mohit Khanna23863762012-09-11 17:40:09 -07003907 limLog(pMac, LOG1,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003908 FL("received unexpected Periodic scan timeout in state %X"),
Jeff Johnson295189b2012-06-20 16:38:30 -07003909 pMac->lim.gLimMlmState);
3910 }
3911} /*** limProcessPeriodicProbeReqTimer() ***/
3912
3913/**
3914 * limProcessJoinFailureTimeout()
3915 *
3916 *FUNCTION:
3917 * This function is called to process JoinFailureTimeout
3918 *
3919 *LOGIC:
3920 *
3921 *ASSUMPTIONS:
3922 *
3923 *NOTE:
3924 *
3925 * @param pMac Pointer to Global MAC structure
3926 * @return None
3927 */
3928
3929static void
3930limProcessJoinFailureTimeout(tpAniSirGlobal pMac)
3931{
3932 tLimMlmJoinCnf mlmJoinCnf;
3933 tSirMacAddr bssid;
3934 tANI_U32 len;
krunal soni8d13b092013-07-19 13:23:29 -07003935#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
3936 vos_log_rssi_pkt_type *pRssiLog = NULL;
3937#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07003938
3939 //fetch the sessionEntry based on the sessionId
3940 tpPESession psessionEntry;
3941
3942 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimJoinFailureTimer.sessionId))== NULL)
3943 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003944 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003945 return;
3946 }
krunal soni8d13b092013-07-19 13:23:29 -07003947
3948#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
3949 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
3950 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
3951 if (pRssiLog)
3952 {
3953 pRssiLog->rssi = psessionEntry->rssi;
3954 }
3955 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
3956#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
3957
Jeff Johnson295189b2012-06-20 16:38:30 -07003958 if (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE)
3959 {
3960 len = sizeof(tSirMacAddr);
3961
3962 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, bssid, &len) !=
3963 eSIR_SUCCESS)
3964 {
3965 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003966 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003967 return;
3968 }
3969
3970 // 'Change' timer for future activations
3971 limDeactivateAndChangeTimer(pMac, eLIM_JOIN_FAIL_TIMER);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08003972 // Change Periodic probe req timer for future activation
3973 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_JOIN_PROBE_REQ_TIMER);
Jeff Johnson295189b2012-06-20 16:38:30 -07003974 /**
3975 * Issue MLM join confirm with timeout reason code
3976 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003977 PELOGE(limLog(pMac, LOGE, FL(" Join Failure Timeout occurred."));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003978
3979 mlmJoinCnf.resultCode = eSIR_SME_JOIN_TIMEOUT_RESULT_CODE;
3980 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
3981
3982 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003983 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003984 if(limSetLinkState(pMac, eSIR_LINK_IDLE_STATE, psessionEntry->bssId,
3985 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003986 PELOGE(limLog(pMac, LOGE, FL("Failed to set the LinkState"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003987 /* Update PE session Id */
3988 mlmJoinCnf.sessionId = psessionEntry->peSessionId;
3989
3990
3991 // Freeup buffer allocated to join request
3992 if (psessionEntry->pLimMlmJoinReq)
3993 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303994 vos_mem_free(psessionEntry->pLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003995 psessionEntry->pLimMlmJoinReq = NULL;
3996 }
3997
3998 limPostSmeMessage(pMac,
3999 LIM_MLM_JOIN_CNF,
4000 (tANI_U32 *) &mlmJoinCnf);
4001
4002 return;
4003 }
4004 else
4005 {
4006 /**
4007 * Join failure timer should not have timed out
4008 * in states other than wait_join_beacon state.
4009 * Log error.
4010 */
4011 limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004012 FL("received unexpected JOIN failure timeout in state %X"),psessionEntry->limMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -07004013 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
4014 }
4015} /*** limProcessJoinFailureTimeout() ***/
4016
4017
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004018/**
4019 * limProcessPeriodicJoinProbeReqTimer()
4020 *
4021 *FUNCTION:
4022 * This function is called to process periodic probe request
4023 * send during joining process.
4024 *
4025 *LOGIC:
4026 *
4027 *ASSUMPTIONS:
4028 *
4029 *NOTE:
4030 *
4031 * @param pMac Pointer to Global MAC structure
4032 * @return None
4033 */
4034
4035static void limProcessPeriodicJoinProbeReqTimer(tpAniSirGlobal pMac)
4036{
4037 tpPESession psessionEntry;
4038 tSirMacSSid ssId;
4039
4040 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer.sessionId))== NULL)
4041 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004042 limLog(pMac, LOGE,FL("session does not exist for given SessionId"));
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004043 return;
4044 }
4045
4046 if((VOS_TRUE == tx_timer_running(&pMac->lim.limTimers.gLimJoinFailureTimer)) &&
4047 (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE))
4048 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304049 vos_mem_copy(ssId.ssId,
4050 psessionEntry->ssId.ssId,
4051 psessionEntry->ssId.length);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004052 ssId.length = psessionEntry->ssId.length;
4053
4054 limSendProbeReqMgmtFrame( pMac, &ssId,
4055 psessionEntry->pLimMlmJoinReq->bssDescription.bssId, psessionEntry->currentOperChannel/*chanNum*/,
4056 psessionEntry->selfMacAddr, psessionEntry->dot11mode,
4057 psessionEntry->pLimJoinReq->addIEScan.length, psessionEntry->pLimJoinReq->addIEScan.addIEdata);
4058
4059 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_JOIN_PROBE_REQ_TIMER);
4060
4061 // Activate Join Periodic Probe Req timer
4062 if (tx_timer_activate(&pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer) != TX_SUCCESS)
4063 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004064 limLog(pMac, LOGP, FL("could not activate Periodic Join req failure timer"));
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004065 return;
4066 }
4067 }
4068 return;
4069} /*** limProcessPeriodicJoinProbeReqTimer() ***/
4070
Jeff Johnson295189b2012-06-20 16:38:30 -07004071
4072/**
4073 * limProcessAuthFailureTimeout()
4074 *
4075 *FUNCTION:
4076 * This function is called to process Min Channel Timeout
4077 * during channel scan.
4078 *
4079 *LOGIC:
4080 *
4081 *ASSUMPTIONS:
4082 *
4083 *NOTE:
4084 *
4085 * @param pMac Pointer to Global MAC structure
4086 * @return None
4087 */
4088
4089static void
4090limProcessAuthFailureTimeout(tpAniSirGlobal pMac)
4091{
4092 //fetch the sessionEntry based on the sessionId
4093 tpPESession psessionEntry;
krunal soni8d13b092013-07-19 13:23:29 -07004094#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4095 vos_log_rssi_pkt_type *pRssiLog = NULL;
4096#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07004097
4098 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimAuthFailureTimer.sessionId))== NULL)
4099 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004100 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004101 return;
4102 }
krunal soni8d13b092013-07-19 13:23:29 -07004103#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4104 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
4105 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
4106 if (pRssiLog)
4107 {
4108 pRssiLog->rssi = psessionEntry->rssi;
4109 }
4110 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
4111#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
4112
Jeff Johnson295189b2012-06-20 16:38:30 -07004113 switch (psessionEntry->limMlmState)
4114 {
4115 case eLIM_MLM_WT_AUTH_FRAME2_STATE:
4116 case eLIM_MLM_WT_AUTH_FRAME4_STATE:
4117 /**
4118 * Requesting STA did not receive next auth frame
4119 * before Auth Failure timeout.
4120 * Issue MLM auth confirm with timeout reason code
4121 */
Madan Mohan Koyyalamudi666d33a2012-11-29 11:32:59 -08004122 //Restore default failure timeout
4123 if (VOS_P2P_CLIENT_MODE == psessionEntry->pePersona && psessionEntry->defaultAuthFailureTimeout)
4124 {
4125 ccmCfgSetInt(pMac,WNI_CFG_AUTHENTICATE_FAILURE_TIMEOUT ,
4126 psessionEntry->defaultAuthFailureTimeout, NULL, eANI_BOOLEAN_FALSE);
4127 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004128 limRestoreFromAuthState(pMac,eSIR_SME_AUTH_TIMEOUT_RESULT_CODE,eSIR_MAC_UNSPEC_FAILURE_REASON,psessionEntry);
4129 break;
4130
4131 default:
4132 /**
4133 * Auth failure timer should not have timed out
4134 * in states other than wt_auth_frame2/4
4135 * Log error.
4136 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004137 PELOGE(limLog(pMac, LOGE, FL("received unexpected AUTH failure timeout in state %X"), psessionEntry->limMlmState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004138 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
4139
4140 break;
4141 }
4142} /*** limProcessAuthFailureTimeout() ***/
4143
4144
4145
4146/**
4147 * limProcessAuthRspTimeout()
4148 *
4149 *FUNCTION:
4150 * This function is called to process Min Channel Timeout
4151 * during channel scan.
4152 *
4153 *LOGIC:
4154 *
4155 *ASSUMPTIONS:
4156 *
4157 *NOTE:
4158 *
4159 * @param pMac Pointer to Global MAC structure
4160 * @return None
4161 */
4162
4163static void
4164limProcessAuthRspTimeout(tpAniSirGlobal pMac, tANI_U32 authIndex)
4165{
4166 struct tLimPreAuthNode *pAuthNode;
4167 tpPESession psessionEntry;
4168 tANI_U8 sessionId;
4169
4170 pAuthNode = limGetPreAuthNodeFromIndex(pMac, &pMac->lim.gLimPreAuthTimerTable, authIndex);
4171
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304172 if (NULL == pAuthNode)
4173 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004174 limLog(pMac, LOGW, FL("Invalid auth node"));
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304175 return;
4176 }
4177
4178 if ((psessionEntry = peFindSessionByBssid(pMac, pAuthNode->peerMacAddr, &sessionId)) == NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -07004179 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004180 limLog(pMac, LOGW, FL("session does not exist for given BSSID "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004181 return;
4182 }
4183
4184 if (psessionEntry->limSystemRole == eLIM_AP_ROLE ||
4185 psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE)
4186 {
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304187 if (pAuthNode->mlmState != eLIM_MLM_WT_AUTH_FRAME3_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004188 {
4189 /**
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304190 * Authentication response timer timedout
4191 * in unexpected state. Log error
Jeff Johnson295189b2012-06-20 16:38:30 -07004192 */
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304193 PELOGE(limLog(pMac, LOGE,
4194 FL("received unexpected AUTH rsp timeout for MAC address "));
4195 limPrintMacAddr(pMac, pAuthNode->peerMacAddr, LOGE);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004196 }
4197 else
4198 {
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304199 // Authentication response timer
4200 // timedout for an STA.
4201 pAuthNode->mlmState = eLIM_MLM_AUTH_RSP_TIMEOUT_STATE;
4202 pAuthNode->fTimerStarted = 0;
4203 PELOG1( limLog(pMac, LOG1,
4204 FL("AUTH rsp timedout for MAC address "));
4205 limPrintMacAddr(pMac, pAuthNode->peerMacAddr, LOG1);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004206
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304207 // Change timer to reactivate it in future
4208 limDeactivateAndChangePerStaIdTimer(pMac,
4209 eLIM_AUTH_RSP_TIMER,
4210 pAuthNode->authNodeIdx);
Jeff Johnson295189b2012-06-20 16:38:30 -07004211
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304212 limDeletePreAuthNode(pMac, pAuthNode->peerMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -07004213 }
4214 }
4215} /*** limProcessAuthRspTimeout() ***/
4216
4217
4218/**
4219 * limProcessAssocFailureTimeout()
4220 *
4221 *FUNCTION:
4222 * This function is called to process Min Channel Timeout
4223 * during channel scan.
4224 *
4225 *LOGIC:
4226 *
4227 *ASSUMPTIONS:
4228 *
4229 *NOTE:
4230 *
4231 * @param pMac Pointer to Global MAC structure
4232 * @return None
4233 */
4234
4235static void
4236limProcessAssocFailureTimeout(tpAniSirGlobal pMac, tANI_U32 MsgType)
4237{
4238
4239 tLimMlmAssocCnf mlmAssocCnf;
4240 tpPESession psessionEntry;
krunal soni8d13b092013-07-19 13:23:29 -07004241#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4242 vos_log_rssi_pkt_type *pRssiLog = NULL;
4243#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07004244
4245 //to fetch the lim/mlm state based on the sessionId, use the below sessionEntry
4246 tANI_U8 sessionId;
4247
4248 if(MsgType == LIM_ASSOC)
4249 {
4250 sessionId = pMac->lim.limTimers.gLimAssocFailureTimer.sessionId;
4251 }
4252 else
4253 {
4254 sessionId = pMac->lim.limTimers.gLimReassocFailureTimer.sessionId;
4255 }
4256
4257 if((psessionEntry = peFindSessionBySessionId(pMac, sessionId))== NULL)
4258 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004259 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004260 return;
4261 }
krunal soni8d13b092013-07-19 13:23:29 -07004262#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4263 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
4264 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
4265 if (pRssiLog)
4266 {
4267 pRssiLog->rssi = psessionEntry->rssi;
4268 }
4269 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
4270#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
4271
Jeff Johnson295189b2012-06-20 16:38:30 -07004272 /**
4273 * Expected Re/Association Response frame
4274 * not received within Re/Association Failure Timeout.
4275 */
4276
4277
4278
4279
4280 /* CR: vos packet memory is leaked when assoc rsp timeouted/failed. */
4281 /* notify TL that association is failed so that TL can flush the cached frame */
4282 WLANTL_AssocFailed (psessionEntry->staId);
4283
4284 // Log error
4285 PELOG1(limLog(pMac, LOG1,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004286 FL("Re/Association Response not received before timeout "));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004287
4288 if (( (psessionEntry->limSystemRole == eLIM_AP_ROLE) || (psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE) )||
4289 ( (psessionEntry->limMlmState != eLIM_MLM_WT_ASSOC_RSP_STATE) &&
4290 (psessionEntry->limMlmState != eLIM_MLM_WT_REASSOC_RSP_STATE) &&
4291 (psessionEntry->limMlmState != eLIM_MLM_WT_FT_REASSOC_RSP_STATE)))
4292 {
4293 /**
4294 * Re/Assoc failure timer should not have timedout on AP
4295 * or in a state other than wt_re/assoc_response.
4296 */
4297
4298 // Log error
4299 limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004300 FL("received unexpected REASSOC failure timeout in state %X for role %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004301 psessionEntry->limMlmState, psessionEntry->limSystemRole);
4302 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
4303 }
4304 else
4305 {
4306
4307 if ((MsgType == LIM_ASSOC) ||
4308 ((MsgType == LIM_REASSOC) && (psessionEntry->limMlmState == eLIM_MLM_WT_FT_REASSOC_RSP_STATE)))
4309 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004310 PELOGE(limLog(pMac, LOGE, FL("(Re)Assoc Failure Timeout occurred."));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004311
4312 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07004313 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
4314
Jeff Johnson295189b2012-06-20 16:38:30 -07004315 // 'Change' timer for future activations
4316 limDeactivateAndChangeTimer(pMac, eLIM_ASSOC_FAIL_TIMER);
4317
4318 // Free up buffer allocated for JoinReq held by
4319 // MLM state machine
4320 if (psessionEntry->pLimMlmJoinReq)
4321 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304322 vos_mem_free(psessionEntry->pLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004323 psessionEntry->pLimMlmJoinReq = NULL;
4324 }
4325
Jeff Johnson295189b2012-06-20 16:38:30 -07004326 //To remove the preauth node in case of fail to associate
4327 if (limSearchPreAuthList(pMac, psessionEntry->bssId))
4328 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004329 PELOG1(limLog(pMac, LOG1, FL(" delete pre auth node for %02X-%02X-%02X-%02X-%02X-%02X"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004330 psessionEntry->bssId[0], psessionEntry->bssId[1], psessionEntry->bssId[2],
4331 psessionEntry->bssId[3], psessionEntry->bssId[4], psessionEntry->bssId[5]);)
4332 limDeletePreAuthNode(pMac, psessionEntry->bssId);
4333 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004334
4335 mlmAssocCnf.resultCode =
4336 eSIR_SME_ASSOC_TIMEOUT_RESULT_CODE;
4337 mlmAssocCnf.protStatusCode =
4338 eSIR_MAC_UNSPEC_FAILURE_STATUS;
4339
4340 /* Update PE session Id*/
4341 mlmAssocCnf.sessionId = psessionEntry->peSessionId;
4342 if (MsgType == LIM_ASSOC)
4343 limPostSmeMessage(pMac, LIM_MLM_ASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
4344 else
4345 {
4346 /* Will come here only in case of 11r, CCx FT when reassoc rsp
4347 is not received and we receive a reassoc - timesout */
4348 mlmAssocCnf.resultCode = eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE;
4349 limPostSmeMessage(pMac, LIM_MLM_REASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
4350 }
4351 }
4352 else
4353 {
4354 /**
4355 * Restore pre-reassoc req state.
4356 * Set BSSID to currently associated AP address.
4357 */
4358 psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004359 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004360
4361 limRestorePreReassocState(pMac,
4362 eSIR_SME_REASSOC_TIMEOUT_RESULT_CODE, eSIR_MAC_UNSPEC_FAILURE_STATUS,psessionEntry);
4363 }
4364 }
4365} /*** limProcessAssocFailureTimeout() ***/
4366
4367
4368
4369/**
4370 * limCompleteMlmScan()
4371 *
4372 *FUNCTION:
4373 * This function is called to send MLM_SCAN_CNF message
4374 * to SME state machine.
4375 *
4376 *LOGIC:
4377 *
4378 *ASSUMPTIONS:
4379 *
4380 *NOTE:
4381 *
4382 * @param pMac Pointer to Global MAC structure
4383 * @param retCode Result code to be sent
4384 * @return None
4385 */
4386
4387void
4388limCompleteMlmScan(tpAniSirGlobal pMac, tSirResultCodes retCode)
4389{
4390 tLimMlmScanCnf mlmScanCnf;
4391
4392 /// Restore previous MLM state
4393 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004394 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004395 limRestorePreScanState(pMac);
4396
4397 // Free up pMac->lim.gLimMlmScanReq
4398 if( NULL != pMac->lim.gpLimMlmScanReq )
4399 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304400 vos_mem_free(pMac->lim.gpLimMlmScanReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004401 pMac->lim.gpLimMlmScanReq = NULL;
4402 }
4403
4404 mlmScanCnf.resultCode = retCode;
4405 mlmScanCnf.scanResultLength = pMac->lim.gLimMlmScanResultLength;
4406
4407 limPostSmeMessage(pMac, LIM_MLM_SCAN_CNF, (tANI_U32 *) &mlmScanCnf);
4408
4409} /*** limCompleteMlmScan() ***/
4410
4411/**
4412 * \brief Setup an A-MPDU/BA session
4413 *
4414 * \sa limProcessMlmAddBAReq
4415 *
4416 * \param pMac The global tpAniSirGlobal object
4417 *
4418 * \param pMsgBuf The MLME ADDBA Req message buffer
4419 *
4420 * \return none
4421 */
4422void limProcessMlmAddBAReq( tpAniSirGlobal pMac,
4423 tANI_U32 *pMsgBuf )
4424{
4425tSirRetStatus status = eSIR_SUCCESS;
4426tpLimMlmAddBAReq pMlmAddBAReq;
4427tpLimMlmAddBACnf pMlmAddBACnf;
4428 tpPESession psessionEntry;
4429
4430 if(pMsgBuf == NULL)
4431 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004432 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004433 return;
4434 }
4435
4436 pMlmAddBAReq = (tpLimMlmAddBAReq) pMsgBuf;
4437 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmAddBAReq->sessionId))== NULL)
4438 {
4439 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004440 FL("session does not exist for given sessionId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304441 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004442 return;
4443 }
4444
4445
4446 // Send ADDBA Req over the air
4447 status = limSendAddBAReq( pMac, pMlmAddBAReq,psessionEntry);
4448
4449 //
4450 // Respond immediately to LIM, only if MLME has not been
4451 // successfully able to send WDA_ADDBA_REQ to HAL.
4452 // Else, LIM_MLM_ADDBA_CNF will be sent after receiving
4453 // ADDBA Rsp from peer entity
4454 //
4455 if( eSIR_SUCCESS != status )
4456 {
4457 // Allocate for LIM_MLM_ADDBA_CNF
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304458
4459 pMlmAddBACnf = vos_mem_malloc(sizeof( tLimMlmAddBACnf ));
4460 if ( NULL == pMlmAddBACnf )
Jeff Johnson295189b2012-06-20 16:38:30 -07004461 {
4462 limLog( pMac, LOGP,
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304463 FL("AllocateMemory failed with error code %d"));
4464 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004465 return;
4466 }
4467 else
4468 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304469 vos_mem_set((void *) pMlmAddBACnf, sizeof( tLimMlmAddBACnf ), 0);
4470 vos_mem_copy((void *) pMlmAddBACnf->peerMacAddr,
4471 (void *) pMlmAddBAReq->peerMacAddr,
4472 sizeof( tSirMacAddr ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004473
4474 pMlmAddBACnf->baDialogToken = pMlmAddBAReq->baDialogToken;
4475 pMlmAddBACnf->baTID = pMlmAddBAReq->baTID;
4476 pMlmAddBACnf->baPolicy = pMlmAddBAReq->baPolicy;
4477 pMlmAddBACnf->baBufferSize = pMlmAddBAReq->baBufferSize;
4478 pMlmAddBACnf->baTimeout = pMlmAddBAReq->baTimeout;
4479 pMlmAddBACnf->sessionId = pMlmAddBAReq->sessionId;
4480
4481 // Update the result code
4482 pMlmAddBACnf->addBAResultCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
4483
4484 limPostSmeMessage( pMac,
4485 LIM_MLM_ADDBA_CNF,
4486 (tANI_U32 *) pMlmAddBACnf );
4487 }
4488
4489 // Restore MLME state
4490 psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004491 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004492
4493 }
4494
4495 // Free the buffer allocated for tLimMlmAddBAReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304496 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004497
4498}
4499
4500/**
4501 * \brief Send an ADDBA Rsp to peer STA in response
4502 * to an ADDBA Req received earlier
4503 *
4504 * \sa limProcessMlmAddBARsp
4505 *
4506 * \param pMac The global tpAniSirGlobal object
4507 *
4508 * \param pMsgBuf The MLME ADDBA Rsp message buffer
4509 *
4510 * \return none
4511 */
4512void limProcessMlmAddBARsp( tpAniSirGlobal pMac,
4513 tANI_U32 *pMsgBuf )
4514{
4515tpLimMlmAddBARsp pMlmAddBARsp;
4516 tANI_U16 aid;
4517 tpDphHashNode pSta;
4518 tpPESession psessionEntry;
4519
4520
4521 if(pMsgBuf == NULL)
4522 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004523 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004524 return;
4525 }
4526
4527 pMlmAddBARsp = (tpLimMlmAddBARsp) pMsgBuf;
4528
4529 if(( psessionEntry = peFindSessionBySessionId(pMac,pMlmAddBARsp->sessionId))== NULL)
4530 {
4531 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004532 FL("session does not exist for given session ID"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304533 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004534 return;
4535 }
4536
4537
4538 // Send ADDBA Rsp over the air
4539 if( eSIR_SUCCESS != limSendAddBARsp( pMac,pMlmAddBARsp,psessionEntry))
4540 {
4541 limLog( pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004542 FL("Failed to send ADDBA Rsp to peer "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004543 limPrintMacAddr( pMac, pMlmAddBARsp->peerMacAddr, LOGE );
4544 /* Clean the BA context maintained by HAL and TL on failure */
4545 pSta = dphLookupHashEntry( pMac, pMlmAddBARsp->peerMacAddr, &aid,
4546 &psessionEntry->dph.dphHashTable);
4547 if( NULL != pSta )
4548 {
4549 limPostMsgDelBAInd( pMac, pSta, pMlmAddBARsp->baTID, eBA_RECIPIENT,
4550 psessionEntry);
4551 }
4552 }
4553
4554 // Time to post a WDA_DELBA_IND to HAL in order
4555 // to cleanup the HAL and SoftMAC entries
4556
4557
4558 // Free the buffer allocated for tLimMlmAddBARsp
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304559 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004560
4561}
4562
4563/**
4564 * \brief Setup an A-MPDU/BA session
4565 *
4566 * \sa limProcessMlmDelBAReq
4567 *
4568 * \param pMac The global tpAniSirGlobal object
4569 *
4570 * \param pMsgBuf The MLME DELBA Req message buffer
4571 *
4572 * \return none
4573 */
4574void limProcessMlmDelBAReq( tpAniSirGlobal pMac,
4575 tANI_U32 *pMsgBuf )
4576{
4577 tSirRetStatus status = eSIR_SUCCESS;
4578 tpLimMlmDelBAReq pMlmDelBAReq;
4579 tpLimMlmDelBACnf pMlmDelBACnf;
4580 tpPESession psessionEntry;
4581
4582
4583 if(pMsgBuf == NULL)
4584 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004585 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004586 return;
4587 }
4588
4589 // TODO - Need to validate MLME state
4590 pMlmDelBAReq = (tpLimMlmDelBAReq) pMsgBuf;
4591
4592 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDelBAReq->sessionId))== NULL)
4593 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004594 PELOGE(limLog(pMac, LOGE,FL("session does not exist for given bssId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304595 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004596 return;
4597 }
4598
4599 // Send DELBA Ind over the air
4600 if( eSIR_SUCCESS !=
4601 (status = limSendDelBAInd( pMac, pMlmDelBAReq,psessionEntry)))
4602 status = eSIR_SME_HAL_SEND_MESSAGE_FAIL;
4603 else
4604 {
4605 tANI_U16 aid;
4606 tpDphHashNode pSta;
4607
4608 // Time to post a WDA_DELBA_IND to HAL in order
4609 // to cleanup the HAL and SoftMAC entries
4610 pSta = dphLookupHashEntry( pMac, pMlmDelBAReq->peerMacAddr, &aid , &psessionEntry->dph.dphHashTable);
4611 if( NULL != pSta )
4612 {
4613 status = limPostMsgDelBAInd( pMac,
4614 pSta,
4615 pMlmDelBAReq->baTID,
4616 pMlmDelBAReq->baDirection,psessionEntry);
4617
4618 }
4619 }
4620
4621 //
4622 // Respond immediately to SME with DELBA CNF using
4623 // LIM_MLM_DELBA_CNF with appropriate status
4624 //
4625
4626 // Allocate for LIM_MLM_DELBA_CNF
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304627
4628 pMlmDelBACnf = vos_mem_malloc(sizeof( tLimMlmDelBACnf ));
4629 if ( NULL == pMlmDelBACnf )
Jeff Johnson295189b2012-06-20 16:38:30 -07004630 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304631 limLog( pMac, LOGP, FL("AllocateMemory failed"));
4632 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004633 return;
4634 }
4635 else
4636 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304637 vos_mem_set((void *) pMlmDelBACnf, sizeof( tLimMlmDelBACnf ), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004638
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304639 vos_mem_copy((void *) pMlmDelBACnf,
4640 (void *) pMlmDelBAReq,
4641 sizeof( tLimMlmDelBAReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004642
4643 // Update DELBA result code
4644 pMlmDelBACnf->delBAReasonCode = pMlmDelBAReq->delBAReasonCode;
4645
4646 /* Update PE session Id*/
4647 pMlmDelBACnf->sessionId = pMlmDelBAReq->sessionId;
4648
4649 limPostSmeMessage( pMac,
4650 LIM_MLM_DELBA_CNF,
4651 (tANI_U32 *) pMlmDelBACnf );
4652 }
4653
4654 // Free the buffer allocated for tLimMlmDelBAReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304655 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004656
4657}
4658
4659/**
4660 * @function : limSMPowerSaveStateInd( )
4661 *
4662 * @brief : This function is called upon receiving the PMC Indication to update the STA's MimoPs State.
4663 *
4664 * LOGIC:
4665 *
4666 * ASSUMPTIONS:
4667 * NA
4668 *
4669 * NOTE:
4670 * NA
4671 *
4672 * @param pMac - Pointer to Global MAC structure
4673 * @param limMsg - Lim Message structure object with the MimoPSparam in body
4674 * @return None
4675 */
4676
4677tSirRetStatus
4678limSMPowerSaveStateInd(tpAniSirGlobal pMac, tSirMacHTMIMOPowerSaveState state)
4679{
4680#if 0
4681 tSirRetStatus retStatus = eSIR_SUCCESS;
4682#if 0
4683 tANI_U32 cfgVal1;
4684 tANI_U16 cfgVal2;
4685 tSirMacHTCapabilityInfo *pHTCapabilityInfo;
4686 tpDphHashNode pSta = NULL;
4687
4688 tpPESession psessionEntry = &pMac->lim.gpSession[0]; //TBD-RAJESH HOW TO GET sessionEntry?????
4689 /** Verify the Mode of operation */
4690 if (pMac->lim.gLimSystemRole != eSYSTEM_STA_ROLE) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004691 PELOGE(limLog(pMac, LOGE, FL("Got PMC indication when System not in the STA Role"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004692 return eSIR_FAILURE;
4693 }
4694
4695 if ((pMac->lim.gHTMIMOPSState == state) || (state == eSIR_HT_MIMO_PS_NA )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004696 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 -07004697 return eSIR_FAILURE;
4698 }
4699
4700 if (!pMac->lim.htCapability){
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004701 PELOGW(limLog(pMac, LOGW, FL(" Not in 11n or HT capable mode"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004702 return eSIR_FAILURE;
4703 }
4704
4705 /** Update the CFG about the default MimoPS State */
4706 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &cfgVal1) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004707 limLog(pMac, LOGP, FL("could not retrieve HT Cap CFG "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004708 return eSIR_FAILURE;
4709 }
4710
4711 cfgVal2 = (tANI_U16)cfgVal1;
4712 pHTCapabilityInfo = (tSirMacHTCapabilityInfo *) &cfgVal2;
4713 pHTCapabilityInfo->mimoPowerSave = state;
4714
4715 if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004716 limLog(pMac, LOGP, FL("could not update HT Cap Info CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004717 return eSIR_FAILURE;
4718 }
4719
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004720 PELOG2(limLog(pMac, LOG2, FL(" The HT Capability for Mimo Pwr is updated to State: %u "),state);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004721 if (pMac->lim.gLimSmeState != eLIM_SME_LINK_EST_STATE) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004722 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 -07004723 /** Update in the LIM the MIMO PS state of the SELF */
4724 pMac->lim.gHTMIMOPSState = state;
4725 return eSIR_SUCCESS;
4726 }
4727
4728 pSta = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable);
4729 if (!pSta->mlmStaContext.htCapability) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004730 limLog( pMac, LOGE,FL( "limSendSMPowerState: Peer is not HT Capable " ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004731 return eSIR_FAILURE;
4732 }
4733
4734 if (isEnteringMimoPS(pMac->lim.gHTMIMOPSState, state)) {
4735 tSirMacAddr macAddr;
4736 /** Obtain the AP's Mac Address */
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304737 vos_mem_copy((tANI_U8 *)macAddr, psessionEntry->bssId, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004738 /** Send Action Frame with the corresponding mode */
4739 retStatus = limSendSMPowerStateFrame(pMac, macAddr, state);
4740 if (retStatus != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004741 PELOGE(limLog(pMac, LOGE, "Update SM POWER: Sending Action Frame has failed");)
Jeff Johnson295189b2012-06-20 16:38:30 -07004742 return retStatus;
4743 }
4744 }
4745
4746 /** Update MlmState about the SetMimoPS State */
4747 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
4748 pMac->lim.gLimMlmState = eLIM_MLM_WT_SET_MIMOPS_STATE;
4749 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
4750
4751 /** Update the HAL and s/w mac about the mode to be set */
4752 retStatus = limPostSMStateUpdate( pMac,psessionEntry->staId, state);
4753
4754 PELOG2(limLog(pMac, LOG2, " Updated the New SMPS State");)
4755 /** Update in the LIM the MIMO PS state of the SELF */
4756 pMac->lim.gHTMIMOPSState = state;
4757#endif
4758 return retStatus;
4759#endif
4760return eSIR_SUCCESS;
4761}
4762
Jeff Johnsone7245742012-09-05 17:12:55 -07004763#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004764ePhyChanBondState limGet11ACPhyCBState(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 htSecondaryChannelOffset,tANI_U8 peerCenterChan, tpPESession psessionEntry)
Jeff Johnsone7245742012-09-05 17:12:55 -07004765{
4766 ePhyChanBondState cbState = PHY_SINGLE_CHANNEL_CENTERED;
4767
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004768 if(!psessionEntry->apChanWidth)
Jeff Johnsone7245742012-09-05 17:12:55 -07004769 {
4770 return htSecondaryChannelOffset;
4771 }
4772
4773 if ( (htSecondaryChannelOffset
4774 == PHY_DOUBLE_CHANNEL_LOW_PRIMARY)
4775 )
4776 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004777 if ((channel + 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004778 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004779 else if ((channel + 6 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004780 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004781 else if ((channel - 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004782 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
4783 else
4784 limLog (pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004785 FL("Invalid Channel Number = %d Center Chan = %d "),
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004786 channel, peerCenterChan);
Jeff Johnsone7245742012-09-05 17:12:55 -07004787 }
4788 if ( (htSecondaryChannelOffset
4789 == PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
4790 )
4791 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004792 if ((channel - 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004793 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004794 else if ((channel + 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004795 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004796 else if ((channel - 6 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07004797 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
4798 else
4799 limLog (pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004800 FL("Invalid Channel Number = %d Center Chan = %d "),
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004801 channel, peerCenterChan);
Jeff Johnsone7245742012-09-05 17:12:55 -07004802 }
4803 return cbState;
4804}
4805
4806#endif
4807
Jeff Johnson295189b2012-06-20 16:38:30 -07004808void
Jeff Johnsone7245742012-09-05 17:12:55 -07004809limSetChannel(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 secChannelOffset, tPowerdBm maxTxPower, tANI_U8 peSessionId)
Jeff Johnson295189b2012-06-20 16:38:30 -07004810{
4811#if !defined WLAN_FEATURE_VOWIFI
4812 tANI_U32 localPwrConstraint;
4813#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07004814 tpPESession peSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07004815
Jeff Johnsone7245742012-09-05 17:12:55 -07004816 peSession = peFindSessionBySessionId (pMac, peSessionId);
4817
4818 if ( NULL == peSession)
4819 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004820 limLog (pMac, LOGP, FL("Invalid PE session = %d"), peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07004821 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07004822 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004823#if defined WLAN_FEATURE_VOWIFI
Jeff Johnsone7245742012-09-05 17:12:55 -07004824#ifdef WLAN_FEATURE_11AC
4825 if ( peSession->vhtCapability )
4826 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004827 limSendSwitchChnlParams( pMac, channel, limGet11ACPhyCBState( pMac,channel,secChannelOffset,peSession->apCenterChan, peSession), maxTxPower, peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07004828 }
4829 else
4830#endif
4831 {
4832 limSendSwitchChnlParams( pMac, channel, secChannelOffset, maxTxPower, peSessionId);
4833 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004834#else
4835 if (wlan_cfgGetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, &localPwrConstraint) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004836 limLog(pMac, LOGP, FL("could not read WNI_CFG_LOCAL_POWER_CONSTRAINT from CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004837 return;
4838 }
4839 // Send WDA_CHNL_SWITCH_IND to HAL
Jeff Johnsone7245742012-09-05 17:12:55 -07004840#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004841 if ( peSession->vhtCapability && peSession->vhtCapabilityPresentInBeacon)
Jeff Johnsone7245742012-09-05 17:12:55 -07004842 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07004843 limSendSwitchChnlParams( pMac, channel, limGet11ACPhyCBState( pMac,channel,secChannelOffset,peSession->apCenterChan, peSession), maxTxPower, peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07004844 }
4845 else
Jeff Johnson295189b2012-06-20 16:38:30 -07004846#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07004847 {
4848 limSendSwitchChnlParams( pMac, channel, secChannelOffset, (tPowerdBm)localPwrConstraint, peSessionId);
4849 }
4850#endif
4851
Jeff Johnson295189b2012-06-20 16:38:30 -07004852 }