blob: 8035a5fe3970d4b00a3aafa50086fb5629b5ee35 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Satyanarayana Dash6f438272015-03-03 18:01:06 +05302 * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
Kiet Lam842dad02014-02-18 18:44:02 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
Kiet Lam842dad02014-02-18 18:44:02 -080021
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080022/*
Kiet Lam842dad02014-02-18 18:44:02 -080023 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28/*
Jeff Johnson295189b2012-06-20 16:38:30 -070029 * This file limProcessMlmMessages.cc contains the code
30 * for processing MLM request messages.
31 * Author: Chandra Modumudi
32 * Date: 02/12/02
33 * History:-
34 * Date Modified by Modification Information
35 * --------------------------------------------------------------------
36 *
37 */
38#include "palTypes.h"
Satyanarayana Dash6f438272015-03-03 18:01:06 +053039#include "wniCfg.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070040#include "aniGlobal.h"
41#include "sirApi.h"
42#include "sirParams.h"
43#include "cfgApi.h"
44
45#include "schApi.h"
46#include "utilsApi.h"
47#include "limUtils.h"
48#include "limAssocUtils.h"
49#include "limPropExtsUtils.h"
50#include "limSecurityUtils.h"
51#include "limSendMessages.h"
52#include "pmmApi.h"
53#include "limSendMessages.h"
54//#include "limSessionUtils.h"
55#include "limSessionUtils.h"
56#ifdef WLAN_FEATURE_VOWIFI_11R
57#include <limFT.h>
58#endif
krunal soni8d13b092013-07-19 13:23:29 -070059#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM
60#include "vos_diag_core_log.h"
61#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070062
63
64// MLM REQ processing function templates
65static void limProcessMlmStartReq(tpAniSirGlobal, tANI_U32 *);
66static void limProcessMlmScanReq(tpAniSirGlobal, tANI_U32 *);
Jeff Johnsone7245742012-09-05 17:12:55 -070067#ifdef FEATURE_OEM_DATA_SUPPORT
68static void limProcessMlmOemDataReq(tpAniSirGlobal, tANI_U32 *);
69#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070070static void limProcessMlmJoinReq(tpAniSirGlobal, tANI_U32 *);
71static void limProcessMlmAuthReq(tpAniSirGlobal, tANI_U32 *);
72static void limProcessMlmAssocReq(tpAniSirGlobal, tANI_U32 *);
73static void limProcessMlmReassocReq(tpAniSirGlobal, tANI_U32 *);
74static void limProcessMlmDisassocReq(tpAniSirGlobal, tANI_U32 *);
75static void limProcessMlmDeauthReq(tpAniSirGlobal, tANI_U32 *);
76static void limProcessMlmSetKeysReq(tpAniSirGlobal, tANI_U32 *);
77
78static void limProcessMlmAddBAReq( tpAniSirGlobal, tANI_U32 * );
79static void limProcessMlmAddBARsp( tpAniSirGlobal, tANI_U32 * );
80static void limProcessMlmDelBAReq( tpAniSirGlobal, tANI_U32 * );
81
82// MLM Timeout event handler templates
83static void limProcessMinChannelTimeout(tpAniSirGlobal);
84static void limProcessMaxChannelTimeout(tpAniSirGlobal);
85static void limProcessPeriodicProbeReqTimer(tpAniSirGlobal pMac);
86static void limProcessJoinFailureTimeout(tpAniSirGlobal);
87static void limProcessAuthFailureTimeout(tpAniSirGlobal);
88static void limProcessAuthRspTimeout(tpAniSirGlobal, tANI_U32);
89static void limProcessAssocFailureTimeout(tpAniSirGlobal, tANI_U32);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -080090static void limProcessPeriodicJoinProbeReqTimer(tpAniSirGlobal);
Sushant Kaushik9e923872015-04-02 17:09:31 +053091static void limProcessAuthRetryTimer(tpAniSirGlobal);
92
Jeff Johnson295189b2012-06-20 16:38:30 -070093
94static void limProcessMlmRemoveKeyReq(tpAniSirGlobal pMac, tANI_U32 * pMsgBuf);
95void
Jeff Johnsone7245742012-09-05 17:12:55 -070096limSetChannel(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 secChannelOffset, tPowerdBm maxTxPower, tANI_U8 peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -070097#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 -070098#define IS_MLM_SCAN_REQ_BACKGROUND_SCAN_NORMAL(pMac) (pMac->lim.gpLimMlmScanReq->backgroundScanMode == eSIR_NORMAL_BACKGROUND_SCAN)
Jeff Johnson295189b2012-06-20 16:38:30 -070099
100/**
101 * limProcessMlmReqMessages()
102 *
103 *FUNCTION:
104 * This function is called by limPostMlmMessage(). This
105 * function handles MLM primitives invoked by SME.
106 *
107 *LOGIC:
108 * Depending on the message type, corresponding function will be
109 * called.
110 *
111 *ASSUMPTIONS:
112 * 1. Upon receiving Beacon in WT_JOIN_STATE, MLM module invokes
113 * APIs exposed by Beacon Processing module for setting parameters
114 * at MAC hardware.
115 * 2. If attempt to Reassociate with an AP fails, link with current
116 * AP is restored back.
117 *
118 *NOTE:
119 *
120 * @param pMac Pointer to Global MAC structure
121 * @param msgType Indicates the MLM primitive message type
122 * @param *pMsgBuf A pointer to the MLM message buffer
123 *
124 * @return None
125 */
126
127void
128limProcessMlmReqMessages(tpAniSirGlobal pMac, tpSirMsgQ Msg)
129{
130 switch (Msg->type)
131 {
132 case LIM_MLM_START_REQ: limProcessMlmStartReq(pMac, Msg->bodyptr); break;
133 case LIM_MLM_SCAN_REQ: limProcessMlmScanReq(pMac, Msg->bodyptr); break;
Jeff Johnsone7245742012-09-05 17:12:55 -0700134#ifdef FEATURE_OEM_DATA_SUPPORT
135 case LIM_MLM_OEM_DATA_REQ: limProcessMlmOemDataReq(pMac, Msg->bodyptr); break;
136#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700137 case LIM_MLM_JOIN_REQ: limProcessMlmJoinReq(pMac, Msg->bodyptr); break;
138 case LIM_MLM_AUTH_REQ: limProcessMlmAuthReq(pMac, Msg->bodyptr); break;
139 case LIM_MLM_ASSOC_REQ: limProcessMlmAssocReq(pMac, Msg->bodyptr); break;
140 case LIM_MLM_REASSOC_REQ: limProcessMlmReassocReq(pMac, Msg->bodyptr); break;
141 case LIM_MLM_DISASSOC_REQ: limProcessMlmDisassocReq(pMac, Msg->bodyptr); break;
142 case LIM_MLM_DEAUTH_REQ: limProcessMlmDeauthReq(pMac, Msg->bodyptr); break;
143 case LIM_MLM_SETKEYS_REQ: limProcessMlmSetKeysReq(pMac, Msg->bodyptr); break;
144 case LIM_MLM_REMOVEKEY_REQ: limProcessMlmRemoveKeyReq(pMac, Msg->bodyptr); break;
145 case SIR_LIM_MIN_CHANNEL_TIMEOUT: limProcessMinChannelTimeout(pMac); break;
146 case SIR_LIM_MAX_CHANNEL_TIMEOUT: limProcessMaxChannelTimeout(pMac); break;
147 case SIR_LIM_PERIODIC_PROBE_REQ_TIMEOUT:
148 limProcessPeriodicProbeReqTimer(pMac); break;
149 case SIR_LIM_JOIN_FAIL_TIMEOUT: limProcessJoinFailureTimeout(pMac); break;
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -0800150 case SIR_LIM_PERIODIC_JOIN_PROBE_REQ_TIMEOUT:
151 limProcessPeriodicJoinProbeReqTimer(pMac); break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700152 case SIR_LIM_AUTH_FAIL_TIMEOUT: limProcessAuthFailureTimeout(pMac); break;
153 case SIR_LIM_AUTH_RSP_TIMEOUT: limProcessAuthRspTimeout(pMac, Msg->bodyval); break;
154 case SIR_LIM_ASSOC_FAIL_TIMEOUT: limProcessAssocFailureTimeout(pMac, Msg->bodyval); break;
155#ifdef WLAN_FEATURE_VOWIFI_11R
156 case SIR_LIM_FT_PREAUTH_RSP_TIMEOUT:limProcessFTPreauthRspTimeout(pMac); break;
157#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700158 case SIR_LIM_REMAIN_CHN_TIMEOUT: limProcessRemainOnChnTimeout(pMac); break;
Gopichand Nakkala4261ea52012-12-31 16:43:00 -0800159 case SIR_LIM_INSERT_SINGLESHOT_NOA_TIMEOUT:
160 limProcessInsertSingleShotNOATimeout(pMac); break;
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530161 case SIR_LIM_CONVERT_ACTIVE_CHANNEL_TO_PASSIVE:
162 limConvertActiveChannelToPassiveChannel(pMac); break;
Sushant Kaushik9e923872015-04-02 17:09:31 +0530163 case SIR_LIM_AUTH_RETRY_TIMEOUT:
164 limProcessAuthRetryTimer(pMac);
165 break;
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -0800166 case SIR_LIM_DISASSOC_ACK_TIMEOUT: limProcessDisassocAckTimeout(pMac); break;
167 case SIR_LIM_DEAUTH_ACK_TIMEOUT: limProcessDeauthAckTimeout(pMac); break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700168 case LIM_MLM_ADDBA_REQ: limProcessMlmAddBAReq( pMac, Msg->bodyptr ); break;
169 case LIM_MLM_ADDBA_RSP: limProcessMlmAddBARsp( pMac, Msg->bodyptr ); break;
170 case LIM_MLM_DELBA_REQ: limProcessMlmDelBAReq( pMac, Msg->bodyptr ); break;
171 case LIM_MLM_TSPEC_REQ:
172 default:
173 break;
174 } // switch (msgType)
175} /*** end limProcessMlmReqMessages() ***/
176
177
178/**
179 * limSetScanMode()
180 *
181 *FUNCTION:
182 * This function is called to setup system into Scan mode
183 *
184 *LOGIC:
185 * NA
186 *
187 *ASSUMPTIONS:
188 * NA
189 *
190 *NOTE:
191 *
192 * @param pMac - Pointer to Global MAC structure
193 * @return None
194 */
195
196void
197limSetScanMode(tpAniSirGlobal pMac)
198{
199 tSirLinkTrafficCheck checkTraffic;
200
201 /// Set current scan channel id to the first in the channel list
202 pMac->lim.gLimCurrentScanChannelId = 0;
203
Jeff Johnson62c27982013-02-27 17:53:55 -0800204 if ( IS_MLM_SCAN_REQ_BACKGROUND_SCAN_AGGRESSIVE(pMac) )
205 {
206 checkTraffic = eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN;
207 }
208 else if (IS_MLM_SCAN_REQ_BACKGROUND_SCAN_NORMAL(pMac))
209 {
210 checkTraffic = eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN;
211 }
212 else
213 checkTraffic = eSIR_CHECK_ROAMING_SCAN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700214
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530215 limLog(pMac, LOG1, FL("Calling limSendHalInitScanReq"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700216 limSendHalInitScanReq(pMac, eLIM_HAL_INIT_SCAN_WAIT_STATE, checkTraffic);
217
218 return ;
219} /*** end limSetScanMode() ***/
220
221//WLAN_SUSPEND_LINK Related
222
223/* limIsLinkSuspended()
224 *
225 *FUNCTION:
226 * This function returns is link is suspended or not.
227 *
228 *LOGIC:
Jeff Johnson62c27982013-02-27 17:53:55 -0800229 * Since Suspend link uses init scan, it just returns
230 * gLimSystemInScanLearnMode flag.
Jeff Johnson295189b2012-06-20 16:38:30 -0700231 *
232 *ASSUMPTIONS:
233 * NA
234 *
235 *NOTE:
236 *
237 * @param pMac - Pointer to Global MAC structure
238 * @return None
239 */
240tANI_U8
241limIsLinkSuspended(tpAniSirGlobal pMac)
242{
243 return pMac->lim.gLimSystemInScanLearnMode;
244}
245/**
246 * limSuspendLink()
247 *
248 *FUNCTION:
249 * This function is called to suspend traffic. Internally this function uses WDA_INIT_SCAN_REQ.
250 *
251 *LOGIC:
252 * NA
253 *
254 *ASSUMPTIONS:
255 * NA
256 *
257 *NOTE:
258 *
259 * @param pMac - Pointer to Global MAC structure
Jeff Johnson62c27982013-02-27 17:53:55 -0800260 * @param trafficCheck - Takes value from enum tSirLinkTrafficCheck.
Jeff Johnson295189b2012-06-20 16:38:30 -0700261 * @param callback - Callback function to be called after suspending the link.
262 * @param data - Pointer to any buffer that will be passed to callback.
263 * @return None
264 */
265void
266limSuspendLink(tpAniSirGlobal pMac, tSirLinkTrafficCheck trafficCheck, SUSPEND_RESUME_LINK_CALLBACK callback, tANI_U32 *data)
267{
268 if( NULL == callback )
269 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700270 limLog( pMac, LOGE, "%s:%d: Invalid parameters", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700271 return;
272 }
273
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +0530274 if( pMac->lim.gpLimSuspendCallback ||
275 pMac->lim.gLimSystemInScanLearnMode )
Jeff Johnson295189b2012-06-20 16:38:30 -0700276 {
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +0530277 limLog( pMac, LOGE, FL("Something is wrong, SuspendLinkCbk:%p "
278 "IsSystemInScanLearnMode:%d"), pMac->lim.gpLimSuspendCallback,
279 pMac->lim.gLimSystemInScanLearnMode );
Jeff Johnson295189b2012-06-20 16:38:30 -0700280 callback( pMac, eHAL_STATUS_FAILURE, data );
281 return;
282 }
283
284 pMac->lim.gLimSystemInScanLearnMode = 1;
285 pMac->lim.gpLimSuspendCallback = callback;
286 pMac->lim.gpLimSuspendData = data;
287 limSendHalInitScanReq(pMac, eLIM_HAL_SUSPEND_LINK_WAIT_STATE, trafficCheck );
Madan Mohan Koyyalamudi01cba042013-01-10 21:56:05 -0800288
289 WDA_TrafficStatsTimerActivate(FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700290}
291
292/**
293 * limResumeLink()
294 *
295 *FUNCTION:
296 * This function is called to Resume traffic after a suspend. Internally this function uses WDA_FINISH_SCAN_REQ.
297 *
298 *LOGIC:
299 * NA
300 *
301 *ASSUMPTIONS:
302 * NA
303 *
304 *NOTE:
305 *
306 * @param pMac - Pointer to Global MAC structure
307 * @param callback - Callback function to be called after Resuming the link.
308 * @param data - Pointer to any buffer that will be passed to callback.
309 * @return None
310 */
311void
312limResumeLink(tpAniSirGlobal pMac, SUSPEND_RESUME_LINK_CALLBACK callback, tANI_U32 *data)
313{
314 if( NULL == callback )
315 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700316 limLog( pMac, LOGE, "%s:%d: Invalid parameters", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700317 return;
318 }
319
320 if( pMac->lim.gpLimResumeCallback )
321 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700322 limLog( pMac, LOGE, "%s:%d: gLimResumeLink callback is not NULL...something is wrong", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700323 callback( pMac, eHAL_STATUS_FAILURE, data );
324 return;
325 }
326
327 pMac->lim.gpLimResumeCallback = callback;
328 pMac->lim.gpLimResumeData = data;
Abhishek Singh53bfb332013-12-12 18:03:29 +0530329
330 /* eLIM_HAL_IDLE_SCAN_STATE state indicate limSendHalInitScanReq failed.
331 * In case limSendHalInitScanReq is success, Scanstate would be
332 * eLIM_HAL_SUSPEND_LINK_STATE
333 */
334 if( eLIM_HAL_IDLE_SCAN_STATE != pMac->lim.gLimHalScanState )
335 {
336 limSendHalFinishScanReq(pMac, eLIM_HAL_RESUME_LINK_WAIT_STATE );
337 }
338 else
339 {
340 limLog(pMac, LOGW, FL("Init Scan failed, we will not call finish scan."
341 " calling the callback with failure status"));
342 pMac->lim.gpLimResumeCallback( pMac, eSIR_FAILURE, pMac->lim.gpLimResumeData);
343 pMac->lim.gpLimResumeCallback = NULL;
344 pMac->lim.gpLimResumeData = NULL;
345 pMac->lim.gLimSystemInScanLearnMode = 0;
346 }
Madan Mohan Koyyalamudi01cba042013-01-10 21:56:05 -0800347
348 if(limIsInMCC(pMac))
349 {
350 WDA_TrafficStatsTimerActivate(TRUE);
351 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700352}
353//end WLAN_SUSPEND_LINK Related
354
355
356/**
357 *
358 * limChangeChannelWithCallback()
359 *
360 * FUNCTION:
361 * This function is called to change channel and perform off channel operation
362 * if required. The caller registers a callback to be called at the end of the
Jeff Johnson62c27982013-02-27 17:53:55 -0800363 * channel change.
Jeff Johnson295189b2012-06-20 16:38:30 -0700364 *
365 */
366void
367limChangeChannelWithCallback(tpAniSirGlobal pMac, tANI_U8 newChannel,
368 CHANGE_CHANNEL_CALLBACK callback,
369 tANI_U32 *cbdata, tpPESession psessionEntry)
370{
371 // Sanity checks for the current and new channel
372#if defined WLAN_VOWIFI_DEBUG
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700373 PELOGE(limLog( pMac, LOGE, "Switching channel to %d", newChannel);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700374#endif
375 psessionEntry->channelChangeReasonCode=LIM_SWITCH_CHANNEL_OPERATION;
376
377 pMac->lim.gpchangeChannelCallback = callback;
378 pMac->lim.gpchangeChannelData = cbdata;
379
380 limSendSwitchChnlParams(pMac, newChannel,
Jeff Johnsone7245742012-09-05 17:12:55 -0700381 PHY_SINGLE_CHANNEL_CENTERED,
Jeff Johnson295189b2012-06-20 16:38:30 -0700382 psessionEntry->maxTxPower, psessionEntry->peSessionId);
383
384 return;
385}
386
387
388/**
389 * limContinuePostChannelScan()
390 *
391 *FUNCTION:
392 * This function is called to scan the current channel.
393 *
394 *LOGIC:
395 *
396 *ASSUMPTIONS:
397 * NA
398 *
399 *NOTE:
400 * NA
401 *
402 * @param pMac - Pointer to Global MAC structure
403 *
404 * @return None
405 */
406
407void limContinuePostChannelScan(tpAniSirGlobal pMac)
408{
409 tANI_U8 channelNum;
Jeff Johnson295189b2012-06-20 16:38:30 -0700410 tANI_U8 i = 0;
411 tSirRetStatus status = eSIR_SUCCESS;
Abhishek Singh95f7b252015-10-14 14:15:35 +0530412
Jeff Johnson295189b2012-06-20 16:38:30 -0700413 if( pMac->lim.abortScan || (NULL == pMac->lim.gpLimMlmScanReq ) ||
414 (pMac->lim.gLimCurrentScanChannelId >
415 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1)))
416 {
417 pMac->lim.abortScan = 0;
418 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
419 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
420 //Set the resume channel to Any valid channel (invalid).
421 //This will instruct HAL to set it to any previous valid channel.
422 peSetResumeChannel(pMac, 0, 0);
423
424 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
425 return;
426 }
427
428 channelNum = limGetCurrentScanChannel(pMac);
Agarwal Ashish7fed3812014-04-14 15:17:31 +0530429
430 if (channelNum == limGetCurrentOperatingChannel(pMac) &&
431 limIsconnectedOnDFSChannel(channelNum))
432 {
433 limCovertChannelScanType(pMac, channelNum, true);
434 }
435
Jeff Johnson295189b2012-06-20 16:38:30 -0700436 if ((pMac->lim.gpLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN) &&
437 (limActiveScanAllowed(pMac, channelNum)))
438 {
439 TX_TIMER *periodicScanTimer;
Jeff Johnson295189b2012-06-20 16:38:30 -0700440
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -0800441 pMac->lim.probeCounter++;
Abhishek Singh795e1b82015-09-25 15:35:03 +0530442 /* Prepare and send Probe Request frame for all
443 * the SSIDs present in the saved MLM
444 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700445 do
446 {
Siddharth Bhal4f3187c2014-10-09 21:38:08 +0530447 tSirMacAddr gSelfMacAddr;
Abhishek Singh795e1b82015-09-25 15:35:03 +0530448
449 /* Send self MAC as src address if
450 * MAC spoof is not enabled OR
451 * spoofMacAddr is all 0 OR
452 * disableP2PMacSpoof is enabled and scan is P2P scan
453 * else use the spoofMac as src address
454 */
455 if ((pMac->lim.isSpoofingEnabled != TRUE) ||
456 (TRUE ==
457 vos_is_macaddr_zero((v_MACADDR_t *)&pMac->lim.spoofMacAddr)) ||
458 (pMac->roam.configParam.disableP2PMacSpoofing &&
459 pMac->lim.gpLimMlmScanReq->p2pSearch)) {
Siddharth Bhal4f3187c2014-10-09 21:38:08 +0530460 vos_mem_copy(gSelfMacAddr, pMac->lim.gSelfMacAddr, VOS_MAC_ADDRESS_LEN);
461 } else {
462 vos_mem_copy(gSelfMacAddr, pMac->lim.spoofMacAddr, VOS_MAC_ADDRESS_LEN);
463 }
Abhishek Singh525045c2014-12-15 17:18:45 +0530464 limLog(pMac, LOG1,
Agarwal Ashishfb3b1c82015-08-18 16:57:31 +0530465 FL(" Mac Addr "MAC_ADDRESS_STR " used in sending ProbeReq number %d, for SSID %s on channel: %d"),
466 MAC_ADDR_ARRAY(gSelfMacAddr) ,i, pMac->lim.gpLimMlmScanReq->ssId[i].ssId, channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -0700467 // include additional IE if there is
468 status = limSendProbeReqMgmtFrame( pMac, &pMac->lim.gpLimMlmScanReq->ssId[i],
Siddharth Bhal4f3187c2014-10-09 21:38:08 +0530469 pMac->lim.gpLimMlmScanReq->bssId, channelNum, gSelfMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -0700470 pMac->lim.gpLimMlmScanReq->dot11mode,
471 pMac->lim.gpLimMlmScanReq->uIEFieldLen,
472 (tANI_U8 *)(pMac->lim.gpLimMlmScanReq)+pMac->lim.gpLimMlmScanReq->uIEFieldOffset);
473
474 if ( status != eSIR_SUCCESS)
475 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700476 PELOGE(limLog(pMac, LOGE, FL("send ProbeReq failed for SSID %s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700477 pMac->lim.gpLimMlmScanReq->ssId[i].ssId, channelNum);)
478 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
479 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
480 return;
481 }
482 i++;
483 } while (i < pMac->lim.gpLimMlmScanReq->numSsid);
484
485 {
486#if defined WLAN_FEATURE_VOWIFI
487 //If minChannelTime is set to zero, SME is requesting scan to not use min channel timer.
488 //This is used in 11k to request for beacon measurement request with a fixed duration in
489 //max channel time.
490 if( pMac->lim.gpLimMlmScanReq->minChannelTime != 0 )
491 {
492#endif
493 /// TXP has sent Probe Request
494 /// Activate minChannelTimer
495 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
496
497#ifdef GEN6_TODO
Abhishek Singh95f7b252015-10-14 14:15:35 +0530498 /* revisit this piece of code to assign the appropriate sessionId
499 * below priority - LOW/might not be needed
500 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700501 pMac->lim.limTimers.gLimMinChannelTimer.sessionId = sessionId;
Abhishek Singh95f7b252015-10-14 14:15:35 +0530502#endif
503 if (tx_timer_activate(&pMac->lim.limTimers.gLimMinChannelTimer) !=
504 TX_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700505 {
Abhishek Singh95f7b252015-10-14 14:15:35 +0530506 limLog(pMac, LOGE, FL("could not start min channel timer"));
507 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
508 limSendHalEndScanReq(pMac, channelNum,
509 eLIM_HAL_END_SCAN_WAIT_STATE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700510 return;
511 }
512
513 // Initialize max timer too
514 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
515#if defined WLAN_FEATURE_VOWIFI
516 }
517 else
518 {
519#if defined WLAN_VOWIFI_DEBUG
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700520 PELOGE(limLog( pMac, LOGE, "Min channel time == 0, Use only max chan timer" );)
Jeff Johnson295189b2012-06-20 16:38:30 -0700521#endif
522 //No Need to start Min channel timer. Start Max Channel timer.
523 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
524 if (tx_timer_activate(&pMac->lim.limTimers.gLimMaxChannelTimer)
525 == TX_TIMER_ERROR)
526 {
527 /// Could not activate max channel timer.
528 // Log error
Abhishek Singh95f7b252015-10-14 14:15:35 +0530529 limLog(pMac,LOGE, FL("could not start max channel timer"));
530 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
531 limSendHalEndScanReq(pMac,
532 channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
533 return;
Jeff Johnson295189b2012-06-20 16:38:30 -0700534 }
535
536 }
537#endif
538 }
539 /* Start peridic timer which will trigger probe req based on min/max
540 channel timer */
541 periodicScanTimer = &pMac->lim.limTimers.gLimPeriodicProbeReqTimer;
Sachin Ahuja49dedd72014-11-24 16:35:24 +0530542 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
Jeff Johnson295189b2012-06-20 16:38:30 -0700543 if (tx_timer_activate(periodicScanTimer) != TX_SUCCESS)
544 {
Abhishek Singh95f7b252015-10-14 14:15:35 +0530545 limLog(pMac, LOGE, FL("could not start periodic probe req "
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700546 "timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700547 }
548 periodicScanTimer->sessionId = channelNum;
549 }
550 else
551 {
552 tANI_U32 val;
Abhishek Singh525045c2014-12-15 17:18:45 +0530553 limLog(pMac, LOG1, FL("START PASSIVE Scan chan %d"), channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -0700554
555 /// Passive Scanning. Activate maxChannelTimer
Jeff Johnson295189b2012-06-20 16:38:30 -0700556 if (tx_timer_deactivate(&pMac->lim.limTimers.gLimMaxChannelTimer)
557 != TX_SUCCESS)
558 {
559 // Could not deactivate max channel timer.
560 // Log error
Abhishek Singh95f7b252015-10-14 14:15:35 +0530561 limLog(pMac, LOGE, FL("Unable to deactivate max channel timer"));
562 limSendHalEndScanReq(pMac, channelNum,
563 eLIM_HAL_END_SCAN_WAIT_STATE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700564 }
565 else
566 {
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530567 if (pMac->miracast_mode)
568 {
569 val = DEFAULT_MIN_CHAN_TIME_DURING_MIRACAST +
570 DEFAULT_MAX_CHAN_TIME_DURING_MIRACAST;
571 }
572 else if (wlan_cfgGetInt(pMac, WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME,
Jeff Johnson295189b2012-06-20 16:38:30 -0700573 &val) != eSIR_SUCCESS)
574 {
575 /**
576 * Could not get max channel value
577 * from CFG. Log error.
578 */
Abhishek Singh95f7b252015-10-14 14:15:35 +0530579 limLog(pMac, LOGE,
580 FL("could not retrieve passive max chan value, Use Def val"));
581 val= WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME_STADEF;
Jeff Johnson295189b2012-06-20 16:38:30 -0700582 }
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530583
584 val = SYS_MS_TO_TICKS(val);
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530585 if (tx_timer_change(&pMac->lim.limTimers.gLimMaxChannelTimer,
586 val, 0) != TX_SUCCESS)
587 {
588 // Could not change max channel timer.
589 // Log error
Abhishek Singh95f7b252015-10-14 14:15:35 +0530590 limLog(pMac, LOGE, FL("Unable to change max channel timer"));
591 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
592 limSendHalEndScanReq(pMac, channelNum,
593 eLIM_HAL_END_SCAN_WAIT_STATE);
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530594 return;
595 }
Abhishek Singh95f7b252015-10-14 14:15:35 +0530596 else if (tx_timer_activate(&pMac->lim.limTimers.gLimMaxChannelTimer)
597 != TX_SUCCESS)
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530598 {
Abhishek Singh95f7b252015-10-14 14:15:35 +0530599
600 limLog(pMac, LOGE, FL("could not start max channel timer"));
601 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
602 limSendHalEndScanReq(pMac, channelNum,
603 eLIM_HAL_END_SCAN_WAIT_STATE);
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530604 return;
Jeff Johnson295189b2012-06-20 16:38:30 -0700605 }
606 }
607 // Wait for Beacons to arrive
608 } // if (pMac->lim.gLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN)
609
Abhishek Singh95f7b252015-10-14 14:15:35 +0530610 limAddScanChannelInfo(pMac, channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -0700611 return;
612}
613
614
615
616
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530617
618/* limCovertChannelScanType()
619 *
620 *FUNCTION:
621 * This function is called to get the list, change the channel type and set again.
622 *
623 *LOGIC:
624 *
625 *ASSUMPTIONS:
626 * NA
627 *
628 *NOTE: If a channel is ACTIVE, this function will make it as PASSIVE
629 * If a channel is PASSIVE, this fucntion will make it as ACTIVE
630 * NA
631 *
632 * @param pMac - Pointer to Global MAC structure
633 * channelNum - Channel which need to be convert
634 PassiveToActive - Boolean flag to convert channel
635 *
636 * @return None
637 */
638
639
640void limCovertChannelScanType(tpAniSirGlobal pMac,tANI_U8 channelNum, tANI_BOOLEAN passiveToActive)
641{
642
643 tANI_U32 i;
644 tANI_U8 channelPair[WNI_CFG_SCAN_CONTROL_LIST_LEN];
645 tANI_U32 len = WNI_CFG_SCAN_CONTROL_LIST_LEN;
Hanumantha Reddy Pothula97ea0952015-10-09 11:29:39 +0530646
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530647 if (wlan_cfgGetStr(pMac, WNI_CFG_SCAN_CONTROL_LIST, channelPair, &len)
648 != eSIR_SUCCESS)
649 {
650 PELOGE(limLog(pMac, LOGE, FL("Unable to get scan control list"));)
651 return ;
652 }
653 if (len > WNI_CFG_SCAN_CONTROL_LIST_LEN)
654 {
655 limLog(pMac, LOGE, FL("Invalid scan control list length:%d"), len);
656 return ;
657 }
Padma, Santhosh Kumar778d8382015-03-04 17:41:22 +0530658 if (pMac->fActiveScanOnDFSChannels)
659 {
660 limLog(pMac, LOG1, FL("DFS feature triggered,"
661 "block scan type conversion"));
662 return ;
663 }
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530664 for (i=0; (i+1) < len; i+=2)
665 {
666 if (channelPair[i] == channelNum)
667 {
668 if ((eSIR_PASSIVE_SCAN == channelPair[i+1]) && TRUE == passiveToActive)
669 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530670 limLog(pMac, LOG1, FL("Channel %d changed from Passive to Active"),
671 channelNum);
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530672 channelPair[i+1] = eSIR_ACTIVE_SCAN;
673 break ;
674 }
675 if ((eSIR_ACTIVE_SCAN == channelPair[i+1]) && FALSE == passiveToActive)
676 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530677 limLog(pMac, LOG1, FL("Channel %d changed from Active to Passive"),
678 channelNum);
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530679 channelPair[i+1] = eSIR_PASSIVE_SCAN;
680 break ;
681 }
682 }
683 }
684
685 cfgSetStrNotify(pMac, WNI_CFG_SCAN_CONTROL_LIST, (tANI_U8 *)channelPair, len, FALSE);
686 return ;
687}
688
689
690
691
692/* limSetDFSChannelList()
693 *
694 *FUNCTION:
695 * This function is called to convert DFS channel list to active channel list when any
696 * beacon is present on that channel. This function store time for passive channels
697 * which help to know that for how much time channel has been passive.
698 *
699 *LOGIC:
700 *
701 *ASSUMPTIONS:
702 * NA
703 *
704 *NOTE: If a channel is ACTIVE, it won't store any time
705 * If a channel is PAssive, it will store time as timestamp
706 * NA
707 *
708 * @param pMac - Pointer to Global MAC structure
709 * dfsChannelList - DFS channel list.
710 * @return None
711 */
712
713void limSetDFSChannelList(tpAniSirGlobal pMac,tANI_U8 channelNum, tSirDFSChannelList *dfsChannelList)
714{
715
716 tANI_BOOLEAN passiveToActive = TRUE;
Hanumantha Reddy Pothula97ea0952015-10-09 11:29:39 +0530717 tANI_U32 cfgVal;
718
719 if (eSIR_SUCCESS == wlan_cfgGetInt(pMac, WNI_CFG_ACTIVE_PASSIVE_CON,
720 &cfgVal))
721 {
722 limLog(pMac, LOG1, FL("WNI_CFG_ACTIVE_PASSIVE_CON: %d"), cfgVal);
723 if (!cfgVal)
724 return;
725 }
726
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530727 if ((1 <= channelNum) && (165 >= channelNum))
728 {
729 if (eANI_BOOLEAN_TRUE == limIsconnectedOnDFSChannel(channelNum))
730 {
731 if (dfsChannelList->timeStamp[channelNum] == 0)
732 {
733 //Received first beacon; Convert DFS channel to Active channel.
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530734 limLog(pMac, LOG1, FL("Received first beacon on DFS channel: %d"), channelNum);
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530735 limCovertChannelScanType(pMac,channelNum, passiveToActive);
736 }
737 dfsChannelList->timeStamp[channelNum] = vos_timer_get_system_time();
738 }
739 else
740 {
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530741 return;
742 }
743 if (!tx_timer_running(&pMac->lim.limTimers.gLimActiveToPassiveChannelTimer))
744 {
745 tx_timer_activate(&pMac->lim.limTimers.gLimActiveToPassiveChannelTimer);
746 }
747 }
748 else
749 {
750 PELOGE(limLog(pMac, LOGE, FL("Invalid Channel: %d"), channelNum);)
751 return;
752 }
753
754 return;
755}
756
757
758
759
Jeff Johnson295189b2012-06-20 16:38:30 -0700760/*
761* Creates a Raw frame to be sent before every Scan, if required.
762* If only infra link is active (mlmState = Link Estb), then send Data Null
763* If only BT-AMP-AP link is active(mlmState = BSS_STARTED), then send CTS2Self frame.
764* If only BT-AMP-STA link is active(mlmState = BSS_STARTED or Link Est) then send CTS2Self
765* If Only IBSS link is active, then send CTS2Self
766* for concurrent scenario: Infra+BT or Infra+IBSS, always send CTS2Self, no need to send Data Null
767*
768*/
769static void __limCreateInitScanRawFrame(tpAniSirGlobal pMac,
770 tpInitScanParams pInitScanParam)
771{
772 tANI_U8 i;
773 pInitScanParam->scanEntry.activeBSScnt = 0;
774
775 /* Don't send CTS to self as we have issue with BTQM queues where BTQM can
776 * not handle transmition of CTS2self frames. Sending CTS 2 self at this
777 * juncture also doesn't serve much purpose as probe request frames go out
778 * immediately, No need to notify BSS in IBSS case.
779 * */
780
781 for(i =0; i < pMac->lim.maxBssId; i++)
782 {
783 if(pMac->lim.gpSession[i].valid == TRUE)
784 {
785 if(pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)
786 {
787 if ((pMac->lim.gpSession[i].limSystemRole != eLIM_BT_AMP_STA_ROLE) &&
788 (pInitScanParam->scanEntry.activeBSScnt < HAL_NUM_BSSID))
789 {
790 pInitScanParam->scanEntry.bssIdx[pInitScanParam->scanEntry.activeBSScnt]
791 = pMac->lim.gpSession[i].bssIdx;
792 pInitScanParam->scanEntry.activeBSScnt++;
793
794 }
795 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700796 else if( (eLIM_AP_ROLE == pMac->lim.gpSession[i].limSystemRole )
797 && ( VOS_P2P_GO_MODE == pMac->lim.gpSession[i].pePersona )
798 )
799 {
800 pInitScanParam->useNoA = TRUE;
801 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700802 }
803 }
804 if (pInitScanParam->scanEntry.activeBSScnt)
805 {
806 pInitScanParam->notifyBss = TRUE;
807 pInitScanParam->frameType = SIR_MAC_DATA_FRAME;
808 pInitScanParam->frameLength = 0;
809 }
810}
811
812/*
813* Creates a Raw frame to be sent during finish scan, if required.
814* Send data null frame, only when there is just one session active and that session is
815* in 'link Estb' state.
816* if more than one session is active, don't send any frame.
817* for concurrent scenario: Infra+BT or Infra+IBSS, no need to send Data Null
818*
819*/
820static void __limCreateFinishScanRawFrame(tpAniSirGlobal pMac,
821 tpFinishScanParams pFinishScanParam)
822{
823 tANI_U8 i;
824 pFinishScanParam->scanEntry.activeBSScnt = 0;
825
826 for(i =0; i < pMac->lim.maxBssId; i++)
827 {
828 if(pMac->lim.gpSession[i].valid == TRUE)
829 {
830 if(pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)
831 {
832 //BT-STA can either be in LINK-ESTB state or BSS_STARTED State
833 //for BT, need to send CTS2Self
834 if ((pMac->lim.gpSession[i].limSystemRole != eLIM_BT_AMP_STA_ROLE) &&
835 (pFinishScanParam->scanEntry.activeBSScnt < HAL_NUM_BSSID))
836 {
837 pFinishScanParam->scanEntry.bssIdx[pFinishScanParam->scanEntry.activeBSScnt]
838 = pMac->lim.gpSession[i].bssIdx;
839 pFinishScanParam->scanEntry.activeBSScnt++;
840 }
841 }
842 }
843 }
844
845 if (pFinishScanParam->scanEntry.activeBSScnt)
846 {
847 pFinishScanParam->notifyBss = TRUE;
848 pFinishScanParam->frameType = SIR_MAC_DATA_FRAME;
849 pFinishScanParam->frameLength = 0;
850 }
851}
852
853void
854limSendHalInitScanReq(tpAniSirGlobal pMac, tLimLimHalScanState nextState, tSirLinkTrafficCheck trafficCheck)
855{
856
857
858 tSirMsgQ msg;
859 tpInitScanParams pInitScanParam;
860 tSirRetStatus rc = eSIR_SUCCESS;
861
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530862 pInitScanParam = vos_mem_malloc(sizeof(*pInitScanParam));
863 if ( NULL == pInitScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -0700864 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530865 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700866 goto error;
867 }
868
869 /*Initialize the pInitScanParam with 0*/
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530870 vos_mem_set((tANI_U8 *)pInitScanParam, sizeof(*pInitScanParam), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700871
872 msg.type = WDA_INIT_SCAN_REQ;
873 msg.bodyptr = pInitScanParam;
874 msg.bodyval = 0;
875
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530876 vos_mem_set((tANI_U8 *)&pInitScanParam->macMgmtHdr, sizeof(tSirMacMgmtHdr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700877 if (nextState == eLIM_HAL_INIT_LEARN_WAIT_STATE)
878 {
879 pInitScanParam->notifyBss = TRUE;
880 pInitScanParam->notifyHost = FALSE;
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700881 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
882 {
883 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SCAN;
884 }
885 else
886 {
887 pInitScanParam->scanMode = eHAL_SYS_MODE_LEARN;
888 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700889
Jeff Johnsone7245742012-09-05 17:12:55 -0700890 pInitScanParam->frameType = SIR_MAC_CTRL_CTS;
891 __limCreateInitScanRawFrame(pMac, pInitScanParam);
892 pInitScanParam->checkLinkTraffic = trafficCheck;
Jeff Johnson295189b2012-06-20 16:38:30 -0700893 }
894 else
895 {
896 if(nextState == eLIM_HAL_SUSPEND_LINK_WAIT_STATE)
897 {
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700898 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
899 {
900 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SUSPEND_LINK;
901 }
902 else
903 {
904 pInitScanParam->scanMode = eHAL_SYS_MODE_SUSPEND_LINK;
905 }
906
Jeff Johnson295189b2012-06-20 16:38:30 -0700907 }
908 else
909 {
Madan Mohan Koyyalamudi94d111d2012-11-19 20:11:26 -0800910 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
911 {
912 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SCAN;
913 }
914 else
915 {
916 pInitScanParam->scanMode = eHAL_SYS_MODE_SCAN;
917 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700918 }
919 __limCreateInitScanRawFrame(pMac, pInitScanParam);
Jeff Johnson295189b2012-06-20 16:38:30 -0700920 if (pInitScanParam->useNoA)
921 {
922 pInitScanParam->scanDuration = pMac->lim.gTotalScanDuration;
923 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700924 /* Inform HAL whether it should check for traffic on the link
925 * prior to performing a background scan
926 */
927 pInitScanParam->checkLinkTraffic = trafficCheck;
928 }
929
930 pMac->lim.gLimHalScanState = nextState;
931 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -0700932 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -0700933
934 rc = wdaPostCtrlMsg(pMac, &msg);
935 if (rc == eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700936 PELOG3(limLog(pMac, LOG3, FL("wdaPostCtrlMsg() return eSIR_SUCCESS pMac=%x nextState=%d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700937 pMac, pMac->lim.gLimHalScanState);)
938 return;
939 }
940
941 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530942 vos_mem_free(pInitScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700943 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700944
945error:
946 switch(nextState)
947 {
948 case eLIM_HAL_START_SCAN_WAIT_STATE:
Padma, Santhosh Kumar9a3eea12015-02-18 14:05:03 +0530949 case eLIM_HAL_INIT_SCAN_WAIT_STATE:
Jeff Johnson295189b2012-06-20 16:38:30 -0700950 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_INIT_FAILED);
951 break;
952
Jeff Johnson295189b2012-06-20 16:38:30 -0700953
954 //WLAN_SUSPEND_LINK Related
955 case eLIM_HAL_SUSPEND_LINK_WAIT_STATE:
956 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
957 if( pMac->lim.gpLimSuspendCallback )
958 {
959 pMac->lim.gpLimSuspendCallback( pMac, rc, pMac->lim.gpLimSuspendData );
960 pMac->lim.gpLimSuspendCallback = NULL;
961 pMac->lim.gpLimSuspendData = NULL;
962 }
963 pMac->lim.gLimSystemInScanLearnMode = 0;
964 break;
965 //end WLAN_SUSPEND_LINK Related
966 default:
967 break;
968 }
969 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
970
971 return ;
972}
973
974void
975limSendHalStartScanReq(tpAniSirGlobal pMac, tANI_U8 channelNum, tLimLimHalScanState nextState)
976{
977 tSirMsgQ msg;
978 tpStartScanParams pStartScanParam;
979 tSirRetStatus rc = eSIR_SUCCESS;
980
981 /**
982 * The Start scan request to be sent only if Start Scan is not already requested
983 */
984 if(pMac->lim.gLimHalScanState != eLIM_HAL_START_SCAN_WAIT_STATE)
985 {
986
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530987 pStartScanParam = vos_mem_malloc(sizeof(*pStartScanParam));
988 if ( NULL == pStartScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -0700989 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530990 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700991 goto error;
992 }
993
994 msg.type = WDA_START_SCAN_REQ;
995 msg.bodyptr = pStartScanParam;
996 msg.bodyval = 0;
997 pStartScanParam->status = eHAL_STATUS_SUCCESS;
998 pStartScanParam->scanChannel = (tANI_U8)channelNum;
999
1000 pMac->lim.gLimHalScanState = nextState;
1001 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
1002
Jeff Johnsone7245742012-09-05 17:12:55 -07001003 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001004
1005 rc = wdaPostCtrlMsg(pMac, &msg);
1006 if (rc == eSIR_SUCCESS) {
1007 return;
1008 }
1009
1010 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301011 vos_mem_free(pStartScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001012 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001013
1014error:
1015 switch(nextState)
1016 {
1017 case eLIM_HAL_START_SCAN_WAIT_STATE:
1018 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_INIT_FAILED);
1019 break;
1020
Jeff Johnson295189b2012-06-20 16:38:30 -07001021
1022 default:
1023 break;
1024 }
1025 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
1026
1027 }
1028 else
1029 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001030 PELOGW(limLog(pMac, LOGW, FL("Invalid state for START_SCAN_REQ message=%d"), pMac->lim.gLimHalScanState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001031 }
1032
1033 return;
1034}
1035
1036void limSendHalEndScanReq(tpAniSirGlobal pMac, tANI_U8 channelNum, tLimLimHalScanState nextState)
1037{
1038 tSirMsgQ msg;
1039 tpEndScanParams pEndScanParam;
1040 tSirRetStatus rc = eSIR_SUCCESS;
1041
1042 /**
1043 * 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 -07001044 * Start scan is not already requestd.
1045 * after finish scan rsp from firmware host is sending endscan request so adding
1046 * check for IDLE SCAN STATE also added to avoid this issue
Jeff Johnson295189b2012-06-20 16:38:30 -07001047 */
1048 if((pMac->lim.gLimHalScanState != eLIM_HAL_END_SCAN_WAIT_STATE) &&
Leela Venkata Kiran Kumar Reddy Chirala66639a62013-08-29 15:38:19 -07001049 (pMac->lim.gLimHalScanState != eLIM_HAL_IDLE_SCAN_STATE) &&
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07001050 (pMac->lim.gLimHalScanState == eLIM_HAL_SCANNING_STATE) &&
1051 (pMac->lim.gLimHalScanState != eLIM_HAL_FINISH_SCAN_WAIT_STATE) &&
1052 (pMac->lim.gLimHalScanState != eLIM_HAL_START_SCAN_WAIT_STATE))
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301053 {
1054 pEndScanParam = vos_mem_malloc(sizeof(*pEndScanParam));
1055 if ( NULL == pEndScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -07001056 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301057 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001058 goto error;
1059 }
1060
1061 msg.type = WDA_END_SCAN_REQ;
1062 msg.bodyptr = pEndScanParam;
1063 msg.bodyval = 0;
1064 pEndScanParam->status = eHAL_STATUS_SUCCESS;
1065 pEndScanParam->scanChannel = (tANI_U8)channelNum;
1066
1067 pMac->lim.gLimHalScanState = nextState;
1068 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -07001069 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001070
1071 rc = wdaPostCtrlMsg(pMac, &msg);
1072 if (rc == eSIR_SUCCESS) {
1073 return;
1074 }
1075
1076 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301077 vos_mem_free(pEndScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001078 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001079
1080 error:
1081 switch(nextState)
1082 {
1083 case eLIM_HAL_END_SCAN_WAIT_STATE:
1084 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_END_FAILED);
1085 break;
1086
Jeff Johnson295189b2012-06-20 16:38:30 -07001087
1088 default:
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001089 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg Rcvd invalid nextState %d"), nextState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001090 break;
1091 }
1092 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001093 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001094 }
1095 else
1096 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001097 PELOGW(limLog(pMac, LOGW, FL("Invalid state for END_SCAN_REQ message=%d"), pMac->lim.gLimHalScanState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001098 }
1099
1100
1101 return;
1102}
1103
1104/**
1105 * limSendHalFinishScanReq()
1106 *
1107 *FUNCTION:
1108 * This function is called to finish scan/learn request..
1109 *
1110 *LOGIC:
1111 *
1112 *ASSUMPTIONS:
1113 * NA
1114 *
1115 *NOTE:
1116 * NA
1117 *
1118 * @param pMac - Pointer to Global MAC structure
1119 * @param nextState - this parameters determines whether this call is for scan or learn
1120 *
1121 * @return None
1122 */
1123void limSendHalFinishScanReq(tpAniSirGlobal pMac, tLimLimHalScanState nextState)
1124{
1125
1126 tSirMsgQ msg;
1127 tpFinishScanParams pFinishScanParam;
1128 tSirRetStatus rc = eSIR_SUCCESS;
1129
1130 if(pMac->lim.gLimHalScanState == nextState)
1131 {
1132 /*
1133 * PE may receive multiple probe responses, while waiting for HAL to send 'FINISH_SCAN_RSP' message
1134 * PE was sending multiple finish scan req messages to HAL
1135 * this check will avoid that.
1136 * If PE is already waiting for the 'finish_scan_rsp' message from HAL, it will ignore this request.
1137 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001138 PELOGW(limLog(pMac, LOGW, FL("Next Scan State is same as the current state: %d "), nextState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001139 return;
1140 }
1141
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301142 pFinishScanParam = vos_mem_malloc(sizeof(*pFinishScanParam));
1143 if ( NULL == pFinishScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -07001144 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301145 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001146 goto error;
1147 }
1148
1149 msg.type = WDA_FINISH_SCAN_REQ;
1150 msg.bodyptr = pFinishScanParam;
1151 msg.bodyval = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001152
1153 peGetResumeChannel(pMac, &pFinishScanParam->currentOperChannel, &pFinishScanParam->cbState);
1154
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301155 vos_mem_set((tANI_U8 *)&pFinishScanParam->macMgmtHdr, sizeof(tSirMacMgmtHdr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001156
1157 if (nextState == eLIM_HAL_FINISH_LEARN_WAIT_STATE)
1158 {
1159 //AP - No pkt need to be transmitted
1160 pFinishScanParam->scanMode = eHAL_SYS_MODE_LEARN;
1161 pFinishScanParam->notifyBss = FALSE;
1162 pFinishScanParam->notifyHost = FALSE;
1163 pFinishScanParam->frameType = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001164
Jeff Johnson295189b2012-06-20 16:38:30 -07001165 pFinishScanParam->frameLength = 0;
1166 pMac->lim.gLimHalScanState = nextState;
1167 }
1168 else
1169 {
1170 /* If STA is associated with an AP (ie. STA is in
1171 * LINK_ESTABLISHED state), then STA need to inform
1172 * the AP via either DATA-NULL
1173 */
1174 if (nextState == eLIM_HAL_RESUME_LINK_WAIT_STATE)
1175 {
1176 pFinishScanParam->scanMode = eHAL_SYS_MODE_SUSPEND_LINK;
1177 }
1178 else
1179 {
1180 pFinishScanParam->scanMode = eHAL_SYS_MODE_SCAN;
1181 }
1182 pFinishScanParam->notifyHost = FALSE;
1183 __limCreateFinishScanRawFrame(pMac, pFinishScanParam);
1184 //WLAN_SUSPEND_LINK Related
1185 pMac->lim.gLimHalScanState = nextState;
1186 //end WLAN_SUSPEND_LINK Related
1187 }
1188
1189 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -07001190 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001191
1192 rc = wdaPostCtrlMsg(pMac, &msg);
1193 if (rc == eSIR_SUCCESS) {
1194 return;
1195 }
1196 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301197 vos_mem_free(pFinishScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001198 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001199
1200 error:
1201 if(nextState == eLIM_HAL_FINISH_SCAN_WAIT_STATE)
1202 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_FINISH_FAILED);
1203 //WLAN_SUSPEND_LINK Related
1204 else if ( nextState == eLIM_HAL_RESUME_LINK_WAIT_STATE )
1205 {
1206 if( pMac->lim.gpLimResumeCallback )
1207 {
1208 pMac->lim.gpLimResumeCallback( pMac, rc, pMac->lim.gpLimResumeData );
1209 pMac->lim.gpLimResumeCallback = NULL;
1210 pMac->lim.gpLimResumeData = NULL;
1211 pMac->lim.gLimSystemInScanLearnMode = 0;
1212 }
1213 }
1214 //end WLAN_SUSPEND_LINK Related
1215 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
1216 return;
1217}
1218
1219/**
1220 * limContinueChannelScan()
1221 *
1222 *FUNCTION:
1223 * This function is called by limPerformChannelScan().
1224 * This function is called to continue channel scanning when
1225 * Beacon/Probe Response frame are received.
1226 *
1227 *LOGIC:
1228 * Scan criteria stored in pMac->lim.gLimMlmScanReq is used
1229 * to perform channel scan. In this function MLM sub module
1230 * makes channel switch, sends PROBE REQUEST frame in case of
1231 * ACTIVE SCANNING, starts min/max channel timers, programs
1232 * NAV to probeDelay timer and waits for Beacon/Probe Response.
1233 * Once all required channels are scanned, LIM_MLM_SCAN_CNF
1234 * primitive is used to send Scan results to SME sub module.
1235 *
1236 *ASSUMPTIONS:
1237 * 1. In case of Active scanning, start MAX channel time iff
1238 * MIN channel timer expired and activity is observed on
1239 * the channel.
1240 *
1241 *NOTE:
1242 * NA
1243 *
1244 * @param pMac Pointer to Global MAC structure
1245 * @return None
1246 */
1247void
1248limContinueChannelScan(tpAniSirGlobal pMac)
1249{
1250 tANI_U8 channelNum;
1251
Jeff Johnson295189b2012-06-20 16:38:30 -07001252 if (pMac->lim.gLimCurrentScanChannelId >
1253 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1)
1254 || pMac->lim.abortScan)
1255 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001256 pMac->lim.abortScan = 0;
1257 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1258 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1259
1260 //Set the resume channel to Any valid channel (invalid).
1261 //This will instruct HAL to set it to any previous valid channel.
1262 peSetResumeChannel(pMac, 0, 0);
1263
1264 /// Done scanning all required channels
1265 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001266 return;
1267 }
1268
1269 /// Atleast one more channel is to be scanned
1270
1271 if ((pMac->lim.gLimReturnAfterFirstMatch & 0x40) ||
1272 (pMac->lim.gLimReturnAfterFirstMatch & 0x80))
1273 {
1274 while (pMac->lim.gLimCurrentScanChannelId <=
1275 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
1276 {
1277 if (((limGetCurrentScanChannel(pMac) <= 14) &&
1278 pMac->lim.gLim24Band11dScanDone) ||
1279 ((limGetCurrentScanChannel(pMac) > 14) &&
1280 pMac->lim.gLim50Band11dScanDone))
1281 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001282 limLog(pMac, LOGW, FL("skipping chan %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001283 limGetCurrentScanChannel(pMac));
1284 pMac->lim.gLimCurrentScanChannelId++;
1285 }
1286 else
1287 break;
1288 }
1289
1290 if (pMac->lim.gLimCurrentScanChannelId >
1291 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
1292 {
1293 pMac->lim.abortScan = 0;
1294 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1295 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1296 /// Done scanning all required channels
1297 //Set the resume channel to Any valid channel (invalid).
1298 //This will instruct HAL to set it to any previous valid channel.
1299 peSetResumeChannel(pMac, 0, 0);
1300 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
1301 return;
1302 }
1303 }
1304
1305 channelNum = limGetCurrentScanChannel(pMac);
Abhishek Singh525045c2014-12-15 17:18:45 +05301306 limLog(pMac, LOG1, FL("Current Channel to be scanned is %d"),
1307 channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -07001308
1309 limSendHalStartScanReq(pMac, channelNum, eLIM_HAL_START_SCAN_WAIT_STATE);
1310 return;
1311} /*** end limContinueChannelScan() ***/
1312
1313
1314
1315/**
1316 * limRestorePreScanState()
1317 *
1318 *FUNCTION:
1319 * This function is called by limContinueChannelScan()
1320 * to restore HW state prior to entering 'scan state'
1321 *
1322 *LOGIC
1323 *
1324 *ASSUMPTIONS:
1325 *
1326 *NOTE:
1327 * NA
1328 *
1329 * @param pMac Pointer to Global MAC structure
1330 * @return None
1331 */
1332void
1333limRestorePreScanState(tpAniSirGlobal pMac)
1334{
1335 int i;
1336
1337 /// Deactivate MIN/MAX channel timers if running
1338 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1339 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1340
1341 /* Re-activate Heartbeat timers for connected sessions as scan
Madan Mohan Koyyalamudi70bb4cb2012-10-18 19:31:25 -07001342 * is done if the DUT is in active mode
1343 * AND it is not a ROAMING ("background") scan */
1344 if(((ePMM_STATE_BMPS_WAKEUP == pMac->pmm.gPmmState) ||
Jeff Johnson295189b2012-06-20 16:38:30 -07001345 (ePMM_STATE_READY == pMac->pmm.gPmmState))
Madan Mohan Koyyalamudi70bb4cb2012-10-18 19:31:25 -07001346 && (pMac->lim.gLimBackgroundScanMode != eSIR_ROAMING_SCAN ))
Jeff Johnson295189b2012-06-20 16:38:30 -07001347 {
1348 for(i=0;i<pMac->lim.maxBssId;i++)
1349 {
Jeff Johnson32d95a32012-09-10 13:15:23 -07001350 if((peFindSessionBySessionId(pMac,i) != NULL) &&
1351 (pMac->lim.gpSession[i].valid == TRUE) &&
Yathish9f22e662012-12-10 14:21:35 -08001352 (eLIM_MLM_LINK_ESTABLISHED_STATE == pMac->lim.gpSession[i].limMlmState) &&
1353 (!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
Jeff Johnson295189b2012-06-20 16:38:30 -07001354 {
1355 limReactivateHeartBeatTimer(pMac, peFindSessionBySessionId(pMac,i));
1356 }
1357 }
1358 }
1359
1360 /**
1361 * clean up message queue.
1362 * If SME messages, redirect to deferred queue.
1363 * The rest will be discarded.
1364 */
1365 //limCleanupMsgQ(pMac);
1366
1367 pMac->lim.gLimSystemInScanLearnMode = 0;
Abhishek Singh3cbf6052014-12-15 16:46:42 +05301368 limLog(pMac, LOG1, FL("Scan ended, took %ld tu"),
1369 (tx_time_get() - pMac->lim.scanStartTime));
Jeff Johnson295189b2012-06-20 16:38:30 -07001370} /*** limRestorePreScanState() ***/
1371
Jeff Johnsone7245742012-09-05 17:12:55 -07001372#ifdef FEATURE_OEM_DATA_SUPPORT
1373
1374void limSendHalOemDataReq(tpAniSirGlobal pMac)
1375{
1376 tSirMsgQ msg;
1377 tpStartOemDataReq pStartOemDataReq = NULL;
1378 tSirRetStatus rc = eSIR_SUCCESS;
1379 tpLimMlmOemDataRsp pMlmOemDataRsp;
1380 tANI_U32 reqLen = 0;
1381 if(NULL == pMac->lim.gpLimMlmOemDataReq)
1382 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001383 PELOGE(limLog(pMac, LOGE, FL("Null pointer"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001384 goto error;
1385 }
1386
1387 reqLen = sizeof(tStartOemDataReq);
1388
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301389 pStartOemDataReq = vos_mem_malloc(reqLen);
1390 if ( NULL == pStartOemDataReq )
Jeff Johnsone7245742012-09-05 17:12:55 -07001391 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001392 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: Could not allocate memory for pStartOemDataReq"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001393 goto error;
1394 }
1395
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301396 vos_mem_set((tANI_U8*)(pStartOemDataReq), reqLen, 0);
Jeff Johnsone7245742012-09-05 17:12:55 -07001397
1398 //Now copy over the information to the OEM DATA REQ to HAL
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301399 vos_mem_copy(pStartOemDataReq->selfMacAddr,
1400 pMac->lim.gpLimMlmOemDataReq->selfMacAddr,
1401 sizeof(tSirMacAddr));
Jeff Johnsone7245742012-09-05 17:12:55 -07001402
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301403 vos_mem_copy(pStartOemDataReq->oemDataReq,
1404 pMac->lim.gpLimMlmOemDataReq->oemDataReq,
1405 OEM_DATA_REQ_SIZE);
Jeff Johnsone7245742012-09-05 17:12:55 -07001406
1407 //Create the message to be passed to HAL
1408 msg.type = WDA_START_OEM_DATA_REQ;
1409 msg.bodyptr = pStartOemDataReq;
1410 msg.bodyval = 0;
1411
1412 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
1413 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
1414
1415 rc = wdaPostCtrlMsg(pMac, &msg);
1416 if(rc == eSIR_SUCCESS)
1417 {
1418 return;
1419 }
1420
1421 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301422 vos_mem_free(pStartOemDataReq);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001423 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: posting WDA_START_OEM_DATA_REQ to HAL failed"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001424
1425error:
1426 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Varun Reddy Yeturue3bbf6e2013-02-08 18:50:55 -08001427 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnsone7245742012-09-05 17:12:55 -07001428
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301429 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
1430 if ( NULL == pMlmOemDataRsp )
Jeff Johnsone7245742012-09-05 17:12:55 -07001431 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001432 limLog(pMac->hHdd, LOGP, FL("OEM_DATA: memory allocation for pMlmOemDataRsp failed under suspend link failure"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001433 return;
1434 }
1435
1436 if(NULL != pMac->lim.gpLimMlmOemDataReq)
1437 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301438 vos_mem_free(pMac->lim.gpLimMlmOemDataReq);
Jeff Johnsone7245742012-09-05 17:12:55 -07001439 pMac->lim.gpLimMlmOemDataReq = NULL;
1440 }
1441
1442 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
1443
1444 return;
1445}
1446/**
1447 * limSetOemDataReqModeFailed()
1448 *
1449 * FUNCTION:
1450 * This function is used as callback to resume link after the suspend fails while
1451 * starting oem data req mode.
1452 * LOGIC:
1453 * NA
1454 *
1455 * ASSUMPTIONS:
1456 * NA
1457 *
1458 * NOTE:
1459 *
1460 * @param pMac - Pointer to Global MAC structure
1461 * @return None
1462 */
1463
1464void limSetOemDataReqModeFailed(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data)
1465{
1466 tpLimMlmOemDataRsp pMlmOemDataRsp;
1467
1468 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Varun Reddy Yeturue3bbf6e2013-02-08 18:50:55 -08001469 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnsone7245742012-09-05 17:12:55 -07001470
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301471 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
1472 if ( NULL == pMlmOemDataRsp )
Jeff Johnsone7245742012-09-05 17:12:55 -07001473 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001474 limLog(pMac->hHdd, LOGP, FL("OEM_DATA: memory allocation for pMlmOemDataRsp failed under suspend link failure"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001475 return;
1476 }
1477
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301478 if (NULL != pMac->lim.gpLimMlmOemDataReq)
Jeff Johnsone7245742012-09-05 17:12:55 -07001479 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301480 vos_mem_free(pMac->lim.gpLimMlmOemDataReq);
Jeff Johnsone7245742012-09-05 17:12:55 -07001481 pMac->lim.gpLimMlmOemDataReq = NULL;
1482 }
1483
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301484 vos_mem_set(pMlmOemDataRsp, sizeof(tLimMlmOemDataRsp), 0);
Jeff Johnsone7245742012-09-05 17:12:55 -07001485
1486 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
1487
1488 return;
1489}
1490
1491/**
1492 * limSetOemDataReqMode()
1493 *
1494 *FUNCTION:
1495 * This function is called to setup system into OEM DATA REQ mode
1496 *
1497 *LOGIC:
1498 * NA
1499 *
1500 *ASSUMPTIONS:
1501 * NA
1502 *
1503 *NOTE:
1504 *
1505 * @param pMac - Pointer to Global MAC structure
1506 * @return None
1507 */
1508
1509void limSetOemDataReqMode(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data)
1510{
1511 if(status != eHAL_STATUS_SUCCESS)
1512 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001513 limLog(pMac, LOGE, FL("OEM_DATA: failed in suspend link"));
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05301514 /* If failed to suspend the link, there is no need
1515 * to resume link. Return failure.
1516 */
1517 limSetOemDataReqModeFailed(pMac, status, data);
Jeff Johnsone7245742012-09-05 17:12:55 -07001518 }
1519 else
1520 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001521 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: Calling limSendHalOemDataReq"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001522 limSendHalOemDataReq(pMac);
Jeff Johnsone7245742012-09-05 17:12:55 -07001523 }
1524
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05301525 return;
Jeff Johnsone7245742012-09-05 17:12:55 -07001526} /*** end limSendHalOemDataReq() ***/
1527
1528#endif //FEATURE_OEM_DATA_SUPPORT
Jeff Johnson295189b2012-06-20 16:38:30 -07001529
1530static void
1531mlm_add_sta(
1532 tpAniSirGlobal pMac,
1533 tpAddStaParams pSta,
1534 tANI_U8 *pBssid,
1535 tANI_U8 htCapable,
1536 tpPESession psessionEntry) //psessionEntry may required in future
1537{
1538 tANI_U32 val;
1539 int i;
1540
1541
1542 pSta->staType = STA_ENTRY_SELF; // Identifying self
1543
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301544 vos_mem_copy(pSta->bssId, pBssid, sizeof( tSirMacAddr ));
1545 vos_mem_copy(pSta->staMac, psessionEntry->selfMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001546
1547 /* Configuration related parameters to be changed to support BT-AMP */
1548
1549 if( eSIR_SUCCESS != wlan_cfgGetInt( pMac, WNI_CFG_LISTEN_INTERVAL, &val ))
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001550 limLog(pMac, LOGP, FL("Couldn't get LISTEN_INTERVAL"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001551
1552 pSta->listenInterval = (tANI_U16) val;
1553
1554 if (eSIR_SUCCESS != wlan_cfgGetInt(pMac, WNI_CFG_SHORT_PREAMBLE, &val) )
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001555 limLog(pMac, LOGP, FL("Couldn't get SHORT_PREAMBLE"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001556 pSta->shortPreambleSupported = (tANI_U8)val;
1557
1558 pSta->assocId = 0; // Is SMAC OK with this?
1559 pSta->wmmEnabled = 0;
1560 pSta->uAPSD = 0;
1561 pSta->maxSPLen = 0;
1562 pSta->us32MaxAmpduDuration = 0;
1563 pSta->maxAmpduSize = 0; // 0: 8k, 1: 16k,2: 32k,3: 64k
1564
1565
Gopichand Nakkalab2d2c312013-01-04 11:41:02 -08001566 /* For Self STA get the LDPC capability from config.ini*/
1567 pSta->htLdpcCapable =
1568 (psessionEntry->txLdpcIniFeatureEnabled & 0x01);
1569 pSta->vhtLdpcCapable =
1570 ((psessionEntry->txLdpcIniFeatureEnabled >> 1)& 0x01);
1571
Jeff Johnson295189b2012-06-20 16:38:30 -07001572 if(IS_DOT11_MODE_HT(psessionEntry->dot11mode))
1573 {
1574 pSta->htCapable = htCapable;
Jeff Johnson295189b2012-06-20 16:38:30 -07001575 pSta->greenFieldCapable = limGetHTCapability( pMac, eHT_GREENFIELD, psessionEntry);
1576 pSta->txChannelWidthSet = limGetHTCapability( pMac, eHT_SUPPORTED_CHANNEL_WIDTH_SET, psessionEntry );
1577 pSta->mimoPS = (tSirMacHTMIMOPowerSaveState)limGetHTCapability( pMac, eHT_MIMO_POWER_SAVE, psessionEntry );
1578 pSta->rifsMode = limGetHTCapability( pMac, eHT_RIFS_MODE, psessionEntry );
1579 pSta->lsigTxopProtection = limGetHTCapability( pMac, eHT_LSIG_TXOP_PROTECTION, psessionEntry );
1580 pSta->delBASupport = limGetHTCapability( pMac, eHT_DELAYED_BA, psessionEntry );
1581 pSta->maxAmpduDensity = limGetHTCapability( pMac, eHT_MPDU_DENSITY, psessionEntry );
1582 pSta->maxAmsduSize = limGetHTCapability( pMac, eHT_MAX_AMSDU_LENGTH, psessionEntry );
1583 pSta->fDsssCckMode40Mhz = limGetHTCapability( pMac, eHT_DSSS_CCK_MODE_40MHZ, psessionEntry);
1584 pSta->fShortGI20Mhz = limGetHTCapability( pMac, eHT_SHORT_GI_20MHZ, psessionEntry);
1585 pSta->fShortGI40Mhz = limGetHTCapability( pMac, eHT_SHORT_GI_40MHZ, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -07001586 }
Jeff Johnsone7245742012-09-05 17:12:55 -07001587#ifdef WLAN_FEATURE_11AC
1588 if (psessionEntry->vhtCapability)
1589 {
1590 pSta->vhtCapable = VOS_TRUE;
Shailender Karmuchi08f87c22013-01-17 12:51:24 -08001591 pSta->vhtTxBFCapable = psessionEntry->txBFIniFeatureEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07001592 }
1593#endif
1594#ifdef WLAN_FEATURE_11AC
1595 limPopulateOwnRateSet(pMac, &pSta->supportedRates, NULL, false,psessionEntry,NULL);
1596#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001597 limPopulateOwnRateSet(pMac, &pSta->supportedRates, NULL, false,psessionEntry);
Jeff Johnsone7245742012-09-05 17:12:55 -07001598#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001599 limFillSupportedRatesInfo(pMac, NULL, &pSta->supportedRates,psessionEntry);
1600
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001601 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 -07001602 pSta->greenFieldCapable, pSta->txChannelWidthSet, pSta->mimoPS, pSta->lsigTxopProtection,
1603 pSta->fDsssCckMode40Mhz,pSta->fShortGI20Mhz, pSta->fShortGI40Mhz);
1604
Jeff Johnson295189b2012-06-20 16:38:30 -07001605 if (VOS_P2P_GO_MODE == psessionEntry->pePersona)
1606 {
1607 pSta->p2pCapableSta = 1;
1608 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001609
1610 //Disable BA. It will be set as part of ADDBA negotiation.
1611 for( i = 0; i < STACFG_MAX_TC; i++ )
1612 {
1613 pSta->staTCParams[i].txUseBA = eBA_DISABLE;
1614 pSta->staTCParams[i].rxUseBA = eBA_DISABLE;
1615 }
1616
1617}
1618
1619//
1620// New HAL interface - WDA_ADD_BSS_REQ
1621// Package WDA_ADD_BSS_REQ to HAL, in order to start a BSS
1622//
1623tSirResultCodes
1624limMlmAddBss (
1625 tpAniSirGlobal pMac,
1626 tLimMlmStartReq *pMlmStartReq,
1627 tpPESession psessionEntry)
1628{
1629 tSirMsgQ msgQ;
1630 tpAddBssParams pAddBssParams = NULL;
1631 tANI_U32 retCode;
1632
Jeff Johnson295189b2012-06-20 16:38:30 -07001633 // Package WDA_ADD_BSS_REQ message parameters
1634
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301635 pAddBssParams = vos_mem_malloc(sizeof( tAddBssParams ));
1636 if ( NULL == pAddBssParams )
Jeff Johnson295189b2012-06-20 16:38:30 -07001637 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301638 limLog( pMac, LOGE, FL( "Unable to allocate memory during ADD_BSS" ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001639 // Respond to SME with LIM_MLM_START_CNF
1640 return eSIR_SME_HAL_SEND_MESSAGE_FAIL;
1641 }
1642
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301643 vos_mem_set(pAddBssParams, sizeof(tAddBssParams), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001644
1645 // Fill in tAddBssParams members
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301646 vos_mem_copy(pAddBssParams->bssId, pMlmStartReq->bssId,
Jeff Johnson295189b2012-06-20 16:38:30 -07001647 sizeof( tSirMacAddr ));
1648
1649 // Fill in tAddBssParams selfMacAddr
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301650 vos_mem_copy (pAddBssParams->selfMacAddr,
1651 psessionEntry->selfMacAddr,
1652 sizeof( tSirMacAddr ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001653
1654 pAddBssParams->bssType = pMlmStartReq->bssType;
1655 if ((pMlmStartReq->bssType == eSIR_IBSS_MODE) ||
1656 (pMlmStartReq->bssType == eSIR_BTAMP_AP_MODE)||
1657 (pMlmStartReq->bssType == eSIR_BTAMP_STA_MODE)) {
1658 pAddBssParams->operMode = BSS_OPERATIONAL_MODE_STA;
1659 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001660 else if (pMlmStartReq->bssType == eSIR_INFRA_AP_MODE){
Jeff Johnson295189b2012-06-20 16:38:30 -07001661 pAddBssParams->operMode = BSS_OPERATIONAL_MODE_AP;
1662 }
1663
Jeff Johnsone7245742012-09-05 17:12:55 -07001664 pAddBssParams->shortSlotTimeSupported = psessionEntry->shortSlotTimeSupported;
Jeff Johnson295189b2012-06-20 16:38:30 -07001665
Jeff Johnson295189b2012-06-20 16:38:30 -07001666 pAddBssParams->beaconInterval = pMlmStartReq->beaconPeriod;
1667 pAddBssParams->dtimPeriod = pMlmStartReq->dtimPeriod;
1668 pAddBssParams->cfParamSet.cfpCount = pMlmStartReq->cfParamSet.cfpCount;
1669 pAddBssParams->cfParamSet.cfpPeriod = pMlmStartReq->cfParamSet.cfpPeriod;
1670 pAddBssParams->cfParamSet.cfpMaxDuration = pMlmStartReq->cfParamSet.cfpMaxDuration;
1671 pAddBssParams->cfParamSet.cfpDurRemaining = pMlmStartReq->cfParamSet.cfpDurRemaining;
1672
1673 pAddBssParams->rateSet.numRates = pMlmStartReq->rateSet.numRates;
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301674 vos_mem_copy(pAddBssParams->rateSet.rate,
1675 pMlmStartReq->rateSet.rate, pMlmStartReq->rateSet.numRates);
Jeff Johnson295189b2012-06-20 16:38:30 -07001676
1677 pAddBssParams->nwType = pMlmStartReq->nwType;
1678
1679 pAddBssParams->htCapable = pMlmStartReq->htCapable;
Jeff Johnsone7245742012-09-05 17:12:55 -07001680#ifdef WLAN_FEATURE_11AC
1681 pAddBssParams->vhtCapable = psessionEntry->vhtCapability;
1682 pAddBssParams->vhtTxChannelWidthSet = psessionEntry->vhtTxChannelWidthSet;
1683#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001684 pAddBssParams->htOperMode = pMlmStartReq->htOperMode;
1685 pAddBssParams->dualCTSProtection = pMlmStartReq->dualCTSProtection;
1686 pAddBssParams->txChannelWidthSet = pMlmStartReq->txChannelWidthSet;
1687
1688 pAddBssParams->currentOperChannel = pMlmStartReq->channelNumber;
Jeff Johnsone7245742012-09-05 17:12:55 -07001689 pAddBssParams->currentExtChannel = pMlmStartReq->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07001690
Chet Lanctot8cecea22014-02-11 19:09:36 -08001691#ifdef WLAN_FEATURE_11W
1692 pAddBssParams->rmfEnabled = psessionEntry->limRmfEnabled;
1693#endif
1694
Jeff Johnson295189b2012-06-20 16:38:30 -07001695 /* Update PE sessionId*/
1696 pAddBssParams->sessionId = pMlmStartReq->sessionId;
1697
1698 //Send the SSID to HAL to enable SSID matching for IBSS
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301699 vos_mem_copy(&(pAddBssParams->ssId.ssId),
1700 pMlmStartReq->ssId.ssId,
1701 pMlmStartReq->ssId.length);
Jeff Johnson295189b2012-06-20 16:38:30 -07001702 pAddBssParams->ssId.length = pMlmStartReq->ssId.length;
Jeff Johnson295189b2012-06-20 16:38:30 -07001703 pAddBssParams->bHiddenSSIDEn = pMlmStartReq->ssidHidden;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001704 limLog( pMac, LOGE, FL( "TRYING TO HIDE SSID %d" ),pAddBssParams->bHiddenSSIDEn);
Jeff Johnson295189b2012-06-20 16:38:30 -07001705 // CR309183. Disable Proxy Probe Rsp. Host handles Probe Requests. Until FW fixed.
1706 pAddBssParams->bProxyProbeRespEn = 0;
1707 pAddBssParams->obssProtEnabled = pMlmStartReq->obssProtEnabled;
1708
Jeff Johnson295189b2012-06-20 16:38:30 -07001709#if defined WLAN_FEATURE_VOWIFI
1710 pAddBssParams->maxTxPower = psessionEntry->maxTxPower;
1711#endif
1712 mlm_add_sta(pMac, &pAddBssParams->staContext,
1713 pAddBssParams->bssId, pAddBssParams->htCapable,psessionEntry);
1714
1715 pAddBssParams->status = eHAL_STATUS_SUCCESS;
1716 pAddBssParams->respReqd = 1;
1717
1718 // Set a new state for MLME
1719 psessionEntry->limMlmState = eLIM_MLM_WT_ADD_BSS_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07001720 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07001721
1722 pAddBssParams->halPersona=psessionEntry->pePersona; //pass on the session persona to hal
1723
1724 pAddBssParams->bSpectrumMgtEnabled = psessionEntry->spectrumMgtEnabled;
1725
1726#if defined WLAN_FEATURE_VOWIFI_11R
1727 pAddBssParams->extSetStaKeyParamValid = 0;
1728#endif
1729
1730 //
1731 // FIXME_GEN4
1732 // A global counter (dialog token) is required to keep track of
1733 // all PE <-> HAL communication(s)
1734 //
1735 msgQ.type = WDA_ADD_BSS_REQ;
1736 msgQ.reserved = 0;
1737 msgQ.bodyptr = pAddBssParams;
1738 msgQ.bodyval = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001739 MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001740
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001741 limLog( pMac, LOGW, FL( "Sending WDA_ADD_BSS_REQ..." ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001742 if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
1743 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001744 limLog( pMac, LOGE, FL("Posting ADD_BSS_REQ to HAL failed, reason=%X"), retCode );
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301745 vos_mem_free(pAddBssParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07001746 return eSIR_SME_HAL_SEND_MESSAGE_FAIL;
1747 }
1748
1749 return eSIR_SME_SUCCESS;
1750}
1751
1752
1753/**
1754 * limProcessMlmStartReq()
1755 *
1756 *FUNCTION:
1757 * This function is called to process MLM_START_REQ message
1758 * from SME
1759 *
1760 *LOGIC:
1761 * 1) MLME receives LIM_MLM_START_REQ from LIM
1762 * 2) MLME sends WDA_ADD_BSS_REQ to HAL
1763 * 3) MLME changes state to eLIM_MLM_WT_ADD_BSS_RSP_STATE
1764 * MLME now waits for HAL to send WDA_ADD_BSS_RSP
1765 *
1766 *ASSUMPTIONS:
1767 *
1768 *NOTE:
1769 *
1770 * @param pMac Pointer to Global MAC structure
1771 * @param *pMsgBuf A pointer to the MLM message buffer
1772 * @return None
1773 */
1774
1775static void
1776limProcessMlmStartReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
1777{
1778 tLimMlmStartReq *pMlmStartReq;
1779 tLimMlmStartCnf mlmStartCnf;
1780 tpPESession psessionEntry = NULL;
1781
1782 if(pMsgBuf == NULL)
1783 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001784 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001785 return;
1786 }
1787
1788 pMlmStartReq = (tLimMlmStartReq *) pMsgBuf;
1789 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmStartReq->sessionId))==NULL)
1790 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001791 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001792 mlmStartCnf.resultCode = eSIR_SME_REFUSED;
1793 goto end;
1794 }
1795
1796 if (psessionEntry->limMlmState != eLIM_MLM_IDLE_STATE)
1797 {
1798 /**
1799 * Should not have received Start req in states other than idle.
1800 * Return Start confirm with failure code.
1801 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001802 PELOGE(limLog(pMac, LOGE, FL("received unexpected MLM_START_REQ in state %X"),psessionEntry->limMlmState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001803 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
1804 mlmStartCnf.resultCode = eSIR_SME_BSS_ALREADY_STARTED_OR_JOINED;
1805 goto end;
1806 }
1807
1808 #if 0
1809 if (cfgSetInt(pMac, WNI_CFG_CURRENT_CHANNEL, pMlmStartReq->channelNumber)!= eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001810 limLog(pMac, LOGP, FL("could not set CURRENT_CHANNEL at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001811
1812 pMac->lim.gLimCurrentChannelId = pMlmStartReq->channelNumber;
1813 #endif //TO SUPPORT BT-AMP
1814
1815
1816 // Update BSSID & SSID at CFG database
1817 #if 0 //We are not using the BSSID and SSID from the config file, instead we are reading form the session table
1818 if (cfgSetStr(pMac, WNI_CFG_BSSID, (tANI_U8 *) pMlmStartReq->bssId, sizeof(tSirMacAddr))
1819 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001820 limLog(pMac, LOGP, FL("could not update BSSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001821
1822
1823
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301824 vos_mem_copy( pMac->lim.gLimCurrentBssId,
Jeff Johnson295189b2012-06-20 16:38:30 -07001825 pMlmStartReq->bssId,
1826 sizeof(tSirMacAddr));
1827 #endif //TO SUPPORT BT-AMP
1828
1829 #if 0
1830 if (cfgSetStr(pMac, WNI_CFG_SSID, (tANI_U8 *) &pMlmStartReq->ssId.ssId, pMlmStartReq->ssId.length)
1831 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001832 limLog(pMac, LOGP, FL("could not update SSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001833 #endif //To SUPPORT BT-AMP
1834
1835
1836 // pMac->lim.gLimCurrentSSID.length = pMlmStartReq->ssId.length;
1837
1838 #if 0
1839 if (cfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET,
1840 (tANI_U8 *) &pMac->lim.gpLimStartBssReq->operationalRateSet.rate,
1841 pMac->lim.gpLimStartBssReq->operationalRateSet.numRates)
1842 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001843 limLog(pMac, LOGP, FL("could not update Operational Rateset at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001844 #endif //TO SUPPORT BT-AMP
1845
1846
Jeff Johnson295189b2012-06-20 16:38:30 -07001847
Jeff Johnson295189b2012-06-20 16:38:30 -07001848#if 0 // Periodic timer for remove WPS PBC proble response entry in PE is disbaled now.
1849 if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
1850 {
1851 if(pMac->lim.limTimers.gLimWPSOverlapTimerObj.isTimerCreated == eANI_BOOLEAN_FALSE)
1852 {
1853 if (tx_timer_create(&pMac->lim.limTimers.gLimWPSOverlapTimerObj.gLimWPSOverlapTimer,
1854 "PS OVERLAP Timer",
1855 limWPSOverlapTimerHandler,
1856 SIR_LIM_WPS_OVERLAP_TIMEOUT, // expiration_input
1857 SYS_MS_TO_TICKS(LIM_WPS_OVERLAP_TIMER_MS), // initial_ticks
1858 SYS_MS_TO_TICKS(LIM_WPS_OVERLAP_TIMER_MS), // reschedule_ticks
1859 TX_AUTO_ACTIVATE /* TX_NO_ACTIVATE*/) != TX_SUCCESS)
1860 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001861 limLog(pMac, LOGP, FL("failed to create WPS overlap Timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001862 }
1863
1864 pMac->lim.limTimers.gLimWPSOverlapTimerObj.sessionId = pMlmStartReq->sessionId;
1865 pMac->lim.limTimers.gLimWPSOverlapTimerObj.isTimerCreated = eANI_BOOLEAN_TRUE;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001866 limLog(pMac, LOGE, FL("Create WPS overlap Timer, session=%d"), pMlmStartReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07001867
1868 if (tx_timer_activate(&pMac->lim.limTimers.gLimWPSOverlapTimerObj.gLimWPSOverlapTimer) != TX_SUCCESS)
1869 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001870 limLog(pMac, LOGP, FL("tx_timer_activate failed"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001871 }
1872 }
1873 }
1874#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001875
1876
1877
1878 mlmStartCnf.resultCode = limMlmAddBss(pMac, pMlmStartReq,psessionEntry);
1879
1880end:
1881 /* Update PE session Id */
1882 mlmStartCnf.sessionId = pMlmStartReq->sessionId;
1883
1884 /// Free up buffer allocated for LimMlmScanReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301885 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07001886
1887 //
1888 // Respond immediately to LIM, only if MLME has not been
1889 // successfully able to send WDA_ADD_BSS_REQ to HAL.
1890 // Else, LIM_MLM_START_CNF will be sent after receiving
1891 // WDA_ADD_BSS_RSP from HAL
1892 //
1893 if( eSIR_SME_SUCCESS != mlmStartCnf.resultCode )
1894 limPostSmeMessage(pMac, LIM_MLM_START_CNF, (tANI_U32 *) &mlmStartCnf);
1895} /*** limProcessMlmStartReq() ***/
1896
1897
1898/*
1899* This function checks if Scan is allowed or not.
1900* It checks each session and if any session is not in the normal state,
1901* it will return false.
1902* Note: BTAMP_STA can be in LINK_EST as well as BSS_STARTED State, so
1903* both cases are handled below.
1904*/
1905
1906static tANI_U8 __limMlmScanAllowed(tpAniSirGlobal pMac)
1907{
1908 int i;
1909
Jeff Johnson43971f52012-07-17 12:26:56 -07001910 if(pMac->lim.gLimMlmState != eLIM_MLM_IDLE_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07001911 {
1912 return FALSE;
1913 }
1914 for(i =0; i < pMac->lim.maxBssId; i++)
1915 {
1916 if(pMac->lim.gpSession[i].valid == TRUE)
1917 {
1918 if(!( ( ( (pMac->lim.gpSession[i].bssType == eSIR_INFRASTRUCTURE_MODE) ||
1919 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_STA_ROLE))&&
1920 (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE) )||
1921
1922 ( ( (pMac->lim.gpSession[i].bssType == eSIR_IBSS_MODE)||
1923 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_AP_ROLE)||
1924 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_STA_ROLE) )&&
1925 (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_BSS_STARTED_STATE) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001926 || ( ( ( (pMac->lim.gpSession[i].bssType == eSIR_INFRA_AP_MODE)
1927 && ( pMac->lim.gpSession[i].pePersona == VOS_P2P_GO_MODE) )
1928 || (pMac->lim.gpSession[i].limSystemRole == eLIM_AP_ROLE) )
1929 && (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_BSS_STARTED_STATE) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001930 ))
1931 {
1932 return FALSE;
1933
1934 }
1935 }
1936 }
1937
1938 return TRUE;
1939}
1940
1941
1942
1943/**
1944 * limProcessMlmScanReq()
1945 *
1946 *FUNCTION:
1947 * This function is called to process MLM_SCAN_REQ message
1948 * from SME
1949 *
1950 *LOGIC:
1951 *
1952 *ASSUMPTIONS:
1953 *
1954 *NOTE:
1955 *
1956 * @param pMac Pointer to Global MAC structure
1957 * @param *pMsgBuf A pointer to the MLM message buffer
1958 * @return None
1959 */
1960
1961static void
1962limProcessMlmScanReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
1963{
1964 tLimMlmScanCnf mlmScanCnf;
Maleka Vinayd500cd42012-12-10 12:37:09 -08001965 tANI_U8 i = 0;
1966 tANI_U32 val = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07001967
1968 if (pMac->lim.gLimSystemInScanLearnMode)
1969 {
1970 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001971 FL("Sending START_SCAN from LIM while one req is pending"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301972 vos_mem_free(pMsgBuf);
Madan Mohan Koyyalamudid4b301b2012-10-11 14:15:54 -07001973 /*Send back a failure*/
1974 mlmScanCnf.resultCode = eSIR_SME_SCAN_FAILED;
1975 mlmScanCnf.scanResultLength = 0;
1976 limPostSmeMessage(pMac,
1977 LIM_MLM_SCAN_CNF,
1978 (tANI_U32 *) &mlmScanCnf);
Jeff Johnson295189b2012-06-20 16:38:30 -07001979 return;
1980 }
1981
1982 if(__limMlmScanAllowed(pMac) &&
1983 (((tLimMlmScanReq *) pMsgBuf)->channelList.numChannels != 0))
1984
1985 {
1986 /// Hold onto SCAN REQ criteria
1987 pMac->lim.gpLimMlmScanReq = (tLimMlmScanReq *) pMsgBuf;
1988
Abhishek Singh127a8442014-12-15 17:31:27 +05301989 limLog(pMac, LOG1, FL("Number of channels to scan are %d "),
1990 pMac->lim.gpLimMlmScanReq->channelList.numChannels);
Jeff Johnson295189b2012-06-20 16:38:30 -07001991
1992 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
1993
1994 if (pMac->lim.gpLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN)
1995 pMac->lim.gLimMlmState = eLIM_MLM_WT_PROBE_RESP_STATE;
1996 else // eSIR_PASSIVE_SCAN
1997 pMac->lim.gLimMlmState = eLIM_MLM_PASSIVE_SCAN_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07001998 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07001999
2000 pMac->lim.gLimSystemInScanLearnMode = 1;
2001
Maleka Vinayd500cd42012-12-10 12:37:09 -08002002 /* temporary fix to handle case where NOA duration calculation is incorrect
2003 * for scanning on DFS channels */
2004
2005 pMac->lim.gTotalScanDuration = 0;
2006
2007 if (wlan_cfgGetInt(pMac, WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME, &val) != eSIR_SUCCESS)
2008 {
2009 /*
2010 * Could not get max channel value
2011 * from CFG. Log error.
2012 */
Abhishek Singh95f7b252015-10-14 14:15:35 +05302013 limLog(pMac, LOGP,
2014 FL("could not retrieve passive max channel value use def"));
2015 /* use a default value */
2016 val= WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME_STADEF;
Maleka Vinayd500cd42012-12-10 12:37:09 -08002017 }
2018
2019 for (i = 0; i < pMac->lim.gpLimMlmScanReq->channelList.numChannels; i++) {
2020 tANI_U8 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[i];
2021
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +05302022 if (pMac->miracast_mode) {
2023 pMac->lim.gTotalScanDuration += (DEFAULT_MIN_CHAN_TIME_DURING_MIRACAST +
2024 DEFAULT_MAX_CHAN_TIME_DURING_MIRACAST);
2025 } else if (limActiveScanAllowed(pMac, channelNum)) {
Maleka Vinayd500cd42012-12-10 12:37:09 -08002026 /* Use min + max channel time to calculate the total duration of scan */
2027 pMac->lim.gTotalScanDuration += pMac->lim.gpLimMlmScanReq->minChannelTime + pMac->lim.gpLimMlmScanReq->maxChannelTime;
2028 } else {
2029 /* using the value from WNI_CFG_PASSIVE_MINIMUM_CHANNEL_TIME as is done in
2030 * void limContinuePostChannelScan(tpAniSirGlobal pMac)
2031 */
2032 pMac->lim.gTotalScanDuration += val;
2033 }
2034 }
2035
2036 /* Adding an overhead of 5ms to account for the scan messaging delays */
2037 pMac->lim.gTotalScanDuration += 5;
Jeff Johnson295189b2012-06-20 16:38:30 -07002038 limSetScanMode(pMac);
2039 }
2040 else
2041 {
2042 /**
2043 * Should not have received SCAN req in other states
2044 * OR should not have received LIM_MLM_SCAN_REQ with
2045 * zero number of channels
2046 * Log error
2047 */
2048 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05302049 FL("received unexpected MLM_SCAN_REQ in state %d OR zero number of channels: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002050 pMac->lim.gLimMlmState, ((tLimMlmScanReq *) pMsgBuf)->channelList.numChannels);
2051 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
2052
2053 /// Free up buffer allocated for
2054 /// pMac->lim.gLimMlmScanReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302055 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07002056
2057 /// Return Scan confirm with INVALID_PARAMETERS
2058
2059 mlmScanCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2060 mlmScanCnf.scanResultLength = 0;
2061 limPostSmeMessage(pMac,
2062 LIM_MLM_SCAN_CNF,
2063 (tANI_U32 *) &mlmScanCnf);
2064 }
2065} /*** limProcessMlmScanReq() ***/
2066
Jeff Johnsone7245742012-09-05 17:12:55 -07002067#ifdef FEATURE_OEM_DATA_SUPPORT
2068static void limProcessMlmOemDataReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2069{
2070 tLimMlmOemDataRsp* pMlmOemDataRsp;
2071
2072 if (((pMac->lim.gLimMlmState == eLIM_MLM_IDLE_STATE) ||
2073 (pMac->lim.gLimMlmState == eLIM_MLM_JOINED_STATE) ||
2074 (pMac->lim.gLimMlmState == eLIM_MLM_AUTHENTICATED_STATE) ||
2075 (pMac->lim.gLimMlmState == eLIM_MLM_BSS_STARTED_STATE) ||
2076 (pMac->lim.gLimMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)))
2077 {
2078 //Hold onto the oem data request criteria
2079 pMac->lim.gpLimMlmOemDataReq = (tLimMlmOemDataReq*)pMsgBuf;
2080
2081 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
2082
2083 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
2084
2085 //Now request for link suspension
2086 limSuspendLink(pMac, eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN, limSetOemDataReqMode, NULL);
2087 }
2088 else
2089 {
2090 /**
2091 * Should not have received oem data req in other states
2092 * Log error
2093 */
2094
Sushant Kaushik1b645382014-10-13 16:39:36 +05302095 PELOGW(limLog(pMac, LOGW, FL("OEM_DATA: unexpected LIM_MLM_OEM_DATA_REQ in invalid state %d"),pMac->lim.gLimMlmState);)
Jeff Johnsone7245742012-09-05 17:12:55 -07002096
2097 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
2098
2099 /// Free up buffer allocated
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302100 vos_mem_free(pMsgBuf);
Jeff Johnsone7245742012-09-05 17:12:55 -07002101
2102 /// Return Meas confirm with INVALID_PARAMETERS
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302103 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
2104 if ( pMlmOemDataRsp != NULL)
Jeff Johnsone7245742012-09-05 17:12:55 -07002105 {
2106 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302107 vos_mem_free(pMlmOemDataRsp);
Jeff Johnsone7245742012-09-05 17:12:55 -07002108 }
2109 else
2110 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002111 limLog(pMac, LOGP, FL("Could not allocate memory for pMlmOemDataRsp"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002112 return;
2113 }
2114 }
2115
2116 return;
2117}
2118#endif //FEATURE_OEM_DATA_SUPPORT
Jeff Johnson295189b2012-06-20 16:38:30 -07002119
2120
2121/**
2122 * limProcessMlmPostJoinSuspendLink()
2123 *
2124 *FUNCTION:
2125 * This function is called after the suspend link while joining
2126 * off channel.
2127 *
2128 *LOGIC:
2129 * Check for suspend state.
2130 * If success, proceed with setting link state to recieve the
2131 * probe response/beacon from intended AP.
2132 * Switch to the APs channel.
2133 * On an error case, send the MLM_JOIN_CNF with error status.
2134 *
2135 *ASSUMPTIONS:
2136 *
2137 *NOTE:
2138 *
2139 * @param pMac Pointer to Global MAC structure
2140 * @param status status of suspend link.
2141 * @param ctx passed while calling suspend link(psessionEntry)
2142 * @return None
2143 */
2144static void
2145limProcessMlmPostJoinSuspendLink(tpAniSirGlobal pMac, eHalStatus status, tANI_U32 *ctx)
2146{
Jeff Johnsone7245742012-09-05 17:12:55 -07002147 tANI_U8 chanNum, secChanOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002148 tLimMlmJoinCnf mlmJoinCnf;
2149 tpPESession psessionEntry = (tpPESession)ctx;
2150 tSirLinkState linkState;
2151
2152 if( eHAL_STATUS_SUCCESS != status )
2153 {
Abhishek Singhdcbd8272014-01-09 14:16:01 +05302154 limLog(pMac, LOGE, FL("Sessionid %d Suspend link(NOTIFY_BSS) failed. "
2155 "still proceeding with join"),psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002156 }
2157 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2158 psessionEntry->limMlmState = eLIM_MLM_WT_JOIN_BEACON_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002159 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002160
Abhishek Singhdcbd8272014-01-09 14:16:01 +05302161 limLog(pMac, LOG1, FL("Sessionid %d prev lim state %d new lim state %d "
2162 "systemrole = %d"), psessionEntry->peSessionId,
2163 psessionEntry->limPrevMlmState,
2164 psessionEntry->limMlmState,psessionEntry->limSystemRole);
2165
Jeff Johnson295189b2012-06-20 16:38:30 -07002166 limDeactivateAndChangeTimer(pMac, eLIM_JOIN_FAIL_TIMER);
2167
2168 //assign appropriate sessionId to the timer object
2169 pMac->lim.limTimers.gLimJoinFailureTimer.sessionId = psessionEntry->peSessionId;
2170
2171 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 -07002172 limLog(pMac, LOG1, FL("[limProcessMlmJoinReq]: linkState:%d"),linkState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002173
2174 if (limSetLinkState(pMac, linkState,
2175 psessionEntry->pLimMlmJoinReq->bssDescription.bssId,
2176 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS )
2177 {
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302178 limLog(pMac, LOGE,
2179 FL("SessionId:%d limSetLinkState to eSIR_LINK_PREASSOC_STATE"
2180 " Failed!!"),psessionEntry->peSessionId);
2181 limPrintMacAddr(pMac,
2182 psessionEntry->pLimMlmJoinReq->bssDescription.bssId,LOGE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002183 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002184 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
2185 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002186 goto error;
2187 }
2188
2189 /** Derive channel from BSS description and store it in the CFG */
2190 // chanNum = pMac->lim.gpLimMlmJoinReq->bssDescription.channelId;
2191
2192 chanNum = psessionEntry->currentOperChannel;
Jeff Johnsone7245742012-09-05 17:12:55 -07002193 secChanOffset = psessionEntry->htSecondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002194 //store the channel switch sessionEntry in the lim global var
2195 psessionEntry->channelChangeReasonCode = LIM_SWITCH_CHANNEL_JOIN;
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08002196#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
Madan Mohan Koyyalamudi61bc5662012-11-02 14:33:10 -07002197 psessionEntry->pLimMlmReassocRetryReq = NULL;
2198#endif
Sushant Kaushikb97a0082015-08-31 12:36:45 +05302199
2200#ifdef FEATURE_WLAN_DIAG_SUPPORT
2201 limDiagEventReport(pMac, WLAN_PE_DIAG_CHANNEL_SWITCH_ANOUNCEMENT,
2202 psessionEntry, eSIR_SUCCESS, LIM_SWITCH_CHANNEL_JOIN);
2203#endif
2204
Dino Myclea7f18452014-04-24 08:55:31 +05302205 limLog(pMac, LOG1, FL("[limProcessMlmJoinReq]: suspend link success(%d) "
2206 "on sessionid: %d setting channel to: %d with secChanOffset:%d "
Abhishek Singhdcbd8272014-01-09 14:16:01 +05302207 "and maxtxPower: %d"), status, psessionEntry->peSessionId,
2208 chanNum, secChanOffset, psessionEntry->maxTxPower);
Jeff Johnsone7245742012-09-05 17:12:55 -07002209 limSetChannel(pMac, chanNum, secChanOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002210
2211 return;
2212error:
2213 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2214 mlmJoinCnf.sessionId = psessionEntry->peSessionId;
2215 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2216 limPostSmeMessage(pMac, LIM_MLM_JOIN_CNF, (tANI_U32 *) &mlmJoinCnf);
2217
2218}
2219
2220
2221
2222/**
2223 * limProcessMlmJoinReq()
2224 *
2225 *FUNCTION:
2226 * This function is called to process MLM_JOIN_REQ message
2227 * from SME
2228 *
2229 *LOGIC:
2230 * 1) Initialize LIM, HAL, DPH
2231 * 2) Configure the BSS for which the JOIN REQ was received
2232 * a) Send WDA_ADD_BSS_REQ to HAL -
2233 * This will identify the BSS that we are interested in
2234 * --AND--
2235 * Add a STA entry for the AP (in a STA context)
2236 * b) Wait for WDA_ADD_BSS_RSP
2237 * c) Send WDA_ADD_STA_REQ to HAL
2238 * This will add the "local STA" entry to the STA table
2239 * 3) Continue as before, i.e,
2240 * a) Send a PROBE REQ
2241 * b) Wait for PROBE RSP/BEACON containing the SSID that
2242 * we are interested in
2243 * c) Then start an AUTH seq
2244 * d) Followed by the ASSOC seq
2245 *
2246 *ASSUMPTIONS:
2247 *
2248 *NOTE:
2249 *
2250 * @param pMac Pointer to Global MAC structure
2251 * @param *pMsgBuf A pointer to the MLM message buffer
2252 * @return None
2253 */
2254
2255static void
2256limProcessMlmJoinReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2257{
2258 tLimMlmJoinCnf mlmJoinCnf;
2259 tANI_U8 sessionId;
2260 tpPESession psessionEntry;
2261
2262 sessionId = ((tpLimMlmJoinReq)pMsgBuf)->sessionId;
2263
2264 if((psessionEntry = peFindSessionBySessionId(pMac,sessionId))== NULL)
2265 {
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302266 limLog(pMac, LOGE, FL("SessionId:%d session does not exist"),sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002267 goto error;
2268 }
2269
2270 if (( (psessionEntry->limSystemRole != eLIM_AP_ROLE ) && (psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE )) &&
2271 ( (psessionEntry->limMlmState == eLIM_MLM_IDLE_STATE) ||
2272 (psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE)) &&
2273 (SIR_MAC_GET_ESS( ((tpLimMlmJoinReq) pMsgBuf)->bssDescription.capabilityInfo) !=
2274 SIR_MAC_GET_IBSS( ((tpLimMlmJoinReq) pMsgBuf)->bssDescription.capabilityInfo)))
2275 {
2276 #if 0
2277 if (pMac->lim.gpLimMlmJoinReq)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302278 vos_mem_free(pMac->lim.gpLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002279 #endif //TO SUPPORT BT-AMP , review 23sep
2280
2281 /// Hold onto Join request parameters
2282
2283 psessionEntry->pLimMlmJoinReq =(tpLimMlmJoinReq) pMsgBuf;
2284
2285 if( isLimSessionOffChannel(pMac, sessionId) )
2286 {
2287 //suspend link
Abhishek Singhdcbd8272014-01-09 14:16:01 +05302288 limLog(pMac, LOG1, FL("Suspend link as LimSession on sessionid %d"
2289 "is off channel"),sessionId);
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302290 if (limIsLinkSuspended(pMac))
2291 {
2292 limLog(pMac, LOGE, FL("Link is already suspended for some other"
2293 " reason. Return failure on sessionId:%d"), sessionId);
2294 goto error;
2295 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002296 limSuspendLink(pMac, eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN,
2297 limProcessMlmPostJoinSuspendLink, (tANI_U32*)psessionEntry );
2298 }
2299 else
2300 {
2301 //No need to suspend link.
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302302 limLog(pMac,LOG1,"SessionId:%d Join request on current channel",
2303 sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002304 limProcessMlmPostJoinSuspendLink( pMac, eHAL_STATUS_SUCCESS,
2305 (tANI_U32*) psessionEntry );
2306 }
2307
2308 return;
2309 }
2310 else
2311 {
2312 /**
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302313 * Should not have received JOIN req in states other than
2314 * Idle state or on AP.
2315 * Return join confirm with invalid parameters code.
2316 */
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302317 limLog(pMac, LOGE,
Sushant Kaushik1b645382014-10-13 16:39:36 +05302318 FL("SessionId:%d Unexpected Join request for role %d state %d "),
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302319 psessionEntry->peSessionId,psessionEntry->limSystemRole,
2320 psessionEntry->limMlmState);
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302321 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002322 }
2323
2324error:
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302325 vos_mem_free(pMsgBuf);
2326 if (psessionEntry != NULL)
2327 psessionEntry->pLimMlmJoinReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002328
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302329 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2330 mlmJoinCnf.sessionId = sessionId;
2331 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2332 limPostSmeMessage(pMac, LIM_MLM_JOIN_CNF, (tANI_U32 *) &mlmJoinCnf);
Jeff Johnson295189b2012-06-20 16:38:30 -07002333} /*** limProcessMlmJoinReq() ***/
2334
2335
2336
2337/**
2338 * limProcessMlmAuthReq()
2339 *
2340 *FUNCTION:
2341 * This function is called to process MLM_AUTH_REQ message
2342 * from SME
2343 *
2344 *LOGIC:
2345 *
2346 *ASSUMPTIONS:
2347 *
2348 *NOTE:
2349 *
2350 * @param pMac Pointer to Global MAC structure
2351 * @param *pMsgBuf A pointer to the MLM message buffer
2352 * @return None
2353 */
2354
2355static void
2356limProcessMlmAuthReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2357{
2358 tANI_U32 numPreAuthContexts;
2359 tSirMacAddr currentBssId;
2360 tSirMacAuthFrameBody authFrameBody;
2361 tLimMlmAuthCnf mlmAuthCnf;
2362 struct tLimPreAuthNode *preAuthNode;
2363 tpDphHashNode pStaDs;
2364 tANI_U8 sessionId;
2365 tpPESession psessionEntry;
2366
2367 if(pMsgBuf == NULL)
2368 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002369 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002370 return;
2371 }
2372
2373 pMac->lim.gpLimMlmAuthReq = (tLimMlmAuthReq *) pMsgBuf;
2374 sessionId = pMac->lim.gpLimMlmAuthReq->sessionId;
2375 if((psessionEntry= peFindSessionBySessionId(pMac,sessionId) )== NULL)
2376 {
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302377 limLog(pMac, LOGP, FL("SessionId:%d Session Does not exist"),sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002378 return;
2379 }
2380
Abhishek Singhcd09b562013-12-24 16:02:20 +05302381 limLog(pMac, LOG1,FL("Process Auth Req on sessionID %d Systemrole %d"
2382 "mlmstate %d from: "MAC_ADDRESS_STR" with authtype %d"), sessionId,
2383 psessionEntry->limSystemRole,psessionEntry->limMlmState,
2384 MAC_ADDR_ARRAY(pMac->lim.gpLimMlmAuthReq->peerMacAddr),
2385 pMac->lim.gpLimMlmAuthReq->authType);
2386
2387
Jeff Johnson295189b2012-06-20 16:38:30 -07002388 /**
2389 * Expect Auth request only when:
2390 * 1. STA joined/associated with a BSS or
2391 * 2. STA is in IBSS mode
2392 * and STA is going to authenticate with a unicast
2393 * adress and requested authentication algorithm is
2394 * supported.
2395 */
2396 #if 0
2397 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2398 eSIR_SUCCESS)
2399 {
2400 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002401 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002402 }
2403 #endif //To SuppoRT BT-AMP
2404
2405 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2406
2407 if (((((psessionEntry->limSystemRole== eLIM_STA_ROLE) || (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)) &&
2408 ((psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE) ||
2409 (psessionEntry->limMlmState ==
2410 eLIM_MLM_LINK_ESTABLISHED_STATE))) ||
2411 ((psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE) &&
2412 (psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE))) &&
2413 (limIsGroupAddr(pMac->lim.gpLimMlmAuthReq->peerMacAddr)
2414 == false) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07002415 (limIsAuthAlgoSupported(
2416 pMac,
2417 pMac->lim.gpLimMlmAuthReq->authType,
2418 psessionEntry) == true)
Jeff Johnson295189b2012-06-20 16:38:30 -07002419 )
2420 {
2421 /**
2422 * This is a request for pre-authentication.
2423 * Check if there exists context already for
Jeff Johnson1250df42012-12-10 14:31:52 -08002424 * the requested peer OR
Jeff Johnson295189b2012-06-20 16:38:30 -07002425 * if this request is for the AP we're currently
2426 * associated with.
2427 * If yes, return auth confirm immediately when
2428 * requested auth type is same as the one used before.
2429 */
2430 if ((((psessionEntry->limSystemRole == eLIM_STA_ROLE) ||(psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE) )&&
2431 (psessionEntry->limMlmState ==
2432 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
2433 (((pStaDs = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable)) != NULL) &&
2434 (pMac->lim.gpLimMlmAuthReq->authType ==
2435 pStaDs->mlmStaContext.authType)) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302436 (vos_mem_compare(pMac->lim.gpLimMlmAuthReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002437 currentBssId,
2438 sizeof(tSirMacAddr)) )) ||
2439 (((preAuthNode =
2440 limSearchPreAuthList(
2441 pMac,
2442 pMac->lim.gpLimMlmAuthReq->peerMacAddr)) != NULL) &&
2443 (preAuthNode->authType ==
2444 pMac->lim.gpLimMlmAuthReq->authType)))
2445 {
Abhishek Singhcd09b562013-12-24 16:02:20 +05302446 limLog(pMac, LOG2,
2447 FL("Already have pre-auth context with peer: "MAC_ADDRESS_STR),
2448 MAC_ADDR_ARRAY(pMac->lim.gpLimMlmAuthReq->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002449
2450 mlmAuthCnf.resultCode = (tSirResultCodes)
2451 eSIR_MAC_SUCCESS_STATUS;
2452
2453
2454 goto end;
2455 }
2456 else
2457 {
2458 if (wlan_cfgGetInt(pMac, WNI_CFG_MAX_NUM_PRE_AUTH,
2459 (tANI_U32 *) &numPreAuthContexts) != eSIR_SUCCESS)
2460 {
2461 limLog(pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002462 FL("Could not retrieve NumPreAuthLimit from CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002463 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002464
2465 if (pMac->lim.gLimNumPreAuthContexts == numPreAuthContexts)
2466 {
2467 PELOGW(limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002468 FL("Number of pre-auth reached max limit"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002469
2470 /// Return Auth confirm with reject code
2471 mlmAuthCnf.resultCode =
2472 eSIR_SME_MAX_NUM_OF_PRE_AUTH_REACHED;
2473
2474 goto end;
2475 }
2476 }
2477
2478 // Delete pre-auth node if exists
2479 if (preAuthNode)
2480 limDeletePreAuthNode(pMac,
2481 pMac->lim.gpLimMlmAuthReq->peerMacAddr);
2482
Jeff Johnson295189b2012-06-20 16:38:30 -07002483 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2484 psessionEntry->limMlmState = eLIM_MLM_WT_AUTH_FRAME2_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002485 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002486
2487 /// Prepare & send Authentication frame
2488 authFrameBody.authAlgoNumber =
2489 (tANI_U8) pMac->lim.gpLimMlmAuthReq->authType;
2490 authFrameBody.authTransactionSeqNumber = SIR_MAC_AUTH_FRAME_1;
2491 authFrameBody.authStatusCode = 0;
Sushant Kaushik9e923872015-04-02 17:09:31 +05302492 pMac->authAckStatus = LIM_AUTH_ACK_NOT_RCD;
Jeff Johnson295189b2012-06-20 16:38:30 -07002493 limSendAuthMgmtFrame(pMac,
2494 &authFrameBody,
2495 pMac->lim.gpLimMlmAuthReq->peerMacAddr,
Sushant Kaushik9e923872015-04-02 17:09:31 +05302496 LIM_NO_WEP_IN_FC, psessionEntry, eSIR_TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002497
Jeff Johnsone7245742012-09-05 17:12:55 -07002498 //assign appropriate sessionId to the timer object
2499 pMac->lim.limTimers.gLimAuthFailureTimer.sessionId = sessionId;
Sushant Kaushik9e923872015-04-02 17:09:31 +05302500 /* assign appropriate sessionId to the timer object */
2501 pMac->lim.limTimers.gLimPeriodicAuthRetryTimer.sessionId = sessionId;
2502 limDeactivateAndChangeTimer(pMac, eLIM_AUTH_RETRY_TIMER);
Jeff Johnsone7245742012-09-05 17:12:55 -07002503 // Activate Auth failure timer
2504 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_AUTH_FAIL_TIMER));
2505 if (tx_timer_activate(&pMac->lim.limTimers.gLimAuthFailureTimer)
2506 != TX_SUCCESS)
2507 {
2508 /// Could not start Auth failure timer.
2509 // Log error
2510 limLog(pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002511 FL("could not start Auth failure timer"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002512 // Cleanup as if auth timer expired
2513 limProcessAuthFailureTimeout(pMac);
2514 }
Sushant Kaushik9e923872015-04-02 17:09:31 +05302515 else
2516 {
2517 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE,
2518 psessionEntry->peSessionId, eLIM_AUTH_RETRY_TIMER));
2519 // Activate Auth Retry timer
2520 if (tx_timer_activate(&pMac->lim.limTimers.gLimPeriodicAuthRetryTimer)
2521 != TX_SUCCESS)
2522 {
2523 limLog(pMac, LOGP, FL("could not activate Auth Retry timer"));
2524 }
2525 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002526 return;
2527 }
2528 else
2529 {
2530 /**
2531 * Unexpected auth request.
2532 * Return Auth confirm with Invalid parameters code.
2533 */
2534 mlmAuthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2535
2536 goto end;
2537 }
2538
2539end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302540 vos_mem_copy((tANI_U8 *) &mlmAuthCnf.peerMacAddr,
2541 (tANI_U8 *) &pMac->lim.gpLimMlmAuthReq->peerMacAddr,
2542 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002543
2544 mlmAuthCnf.authType = pMac->lim.gpLimMlmAuthReq->authType;
2545 mlmAuthCnf.sessionId = sessionId;
2546
2547 /// Free up buffer allocated
2548 /// for pMac->lim.gLimMlmAuthReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302549 vos_mem_free( pMac->lim.gpLimMlmAuthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002550 pMac->lim.gpLimMlmAuthReq = NULL;
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302551 limLog(pMac,LOG1,"SessionId:%d LimPostSme LIM_MLM_AUTH_CNF ",sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002552 limPostSmeMessage(pMac, LIM_MLM_AUTH_CNF, (tANI_U32 *) &mlmAuthCnf);
2553} /*** limProcessMlmAuthReq() ***/
2554
2555
2556
2557/**
2558 * limProcessMlmAssocReq()
2559 *
2560 *FUNCTION:
2561 * This function is called to process MLM_ASSOC_REQ message
2562 * from SME
2563 *
2564 *LOGIC:
2565 *
2566 *ASSUMPTIONS:
2567 *
2568 *NOTE:
2569 *
2570 * @param pMac Pointer to Global MAC structure
2571 * @param *pMsgBuf A pointer to the MLM message buffer
2572 * @return None
2573 */
2574
2575static void
2576limProcessMlmAssocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2577{
2578 tSirMacAddr currentBssId;
2579 tLimMlmAssocReq *pMlmAssocReq;
2580 tLimMlmAssocCnf mlmAssocCnf;
2581 tpPESession psessionEntry;
2582 // tANI_U8 sessionId;
2583
2584 if(pMsgBuf == NULL)
2585 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002586 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002587 return;
2588 }
2589 pMlmAssocReq = (tLimMlmAssocReq *) pMsgBuf;
2590
2591 if( (psessionEntry = peFindSessionBySessionId(pMac,pMlmAssocReq->sessionId) )== NULL)
2592 {
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302593 limLog(pMac, LOGP,FL("SessionId:%d Session Does not exist"),
2594 pMlmAssocReq->sessionId);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302595 vos_mem_free(pMlmAssocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002596 return;
2597 }
2598
Abhishek Singhcd09b562013-12-24 16:02:20 +05302599 limLog(pMac, LOG1,FL("Process Assoc Req on sessionID %d Systemrole %d"
2600 "mlmstate %d from: "MAC_ADDRESS_STR), pMlmAssocReq->sessionId,
2601 psessionEntry->limSystemRole, psessionEntry->limMlmState,
2602 MAC_ADDR_ARRAY(pMlmAssocReq->peerMacAddr));
2603
Jeff Johnson295189b2012-06-20 16:38:30 -07002604 #if 0
2605 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2606 eSIR_SUCCESS)
2607 {
2608 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002609 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002610 }
2611 #endif //TO SUPPORT BT-AMP
2612 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2613
2614 if ( (psessionEntry->limSystemRole != eLIM_AP_ROLE && psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE) &&
2615 (psessionEntry->limMlmState == eLIM_MLM_AUTHENTICATED_STATE || psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302616 (vos_mem_compare(pMlmAssocReq->peerMacAddr, currentBssId, sizeof(tSirMacAddr))) )
Jeff Johnson295189b2012-06-20 16:38:30 -07002617 {
Jeff Johnsone7245742012-09-05 17:12:55 -07002618
Jeff Johnson295189b2012-06-20 16:38:30 -07002619 /// map the session entry pointer to the AssocFailureTimer
2620 pMac->lim.limTimers.gLimAssocFailureTimer.sessionId = pMlmAssocReq->sessionId;
2621
Jeff Johnson295189b2012-06-20 16:38:30 -07002622 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2623 psessionEntry->limMlmState = eLIM_MLM_WT_ASSOC_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002624 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302625 limLog(pMac,LOG1,"SessionId:%d Sending Assoc_Req Frame",
2626 psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002627
2628 /// Prepare and send Association request frame
2629 limSendAssocReqMgmtFrame(pMac, pMlmAssocReq,psessionEntry);
Sushant Kaushikb97a0082015-08-31 12:36:45 +05302630#ifdef FEATURE_WLAN_DIAG_SUPPORT
2631 limDiagEventReport(pMac, WLAN_PE_DIAG_ASSOC_REQ_EVENT, psessionEntry,
2632 eSIR_SUCCESS, eSIR_SUCCESS);
2633#endif
2634
Jeff Johnson295189b2012-06-20 16:38:30 -07002635
2636 //Set the link state to postAssoc, so HW can start receiving frames from AP.
2637 if ((psessionEntry->bssType == eSIR_BTAMP_STA_MODE)||
2638 ((psessionEntry->bssType == eSIR_BTAMP_AP_MODE) && (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)))
2639 {
2640 if(limSetLinkState(pMac, eSIR_LINK_BTAMP_POSTASSOC_STATE, currentBssId,
2641 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002642 PELOGE(limLog(pMac, LOGE, FL("Failed to set the LinkState"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002643 }
Jeff Johnsone7245742012-09-05 17:12:55 -07002644 /// Start association failure timer
2645 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_ASSOC_FAIL_TIMER));
2646 if (tx_timer_activate(&pMac->lim.limTimers.gLimAssocFailureTimer)
2647 != TX_SUCCESS)
2648 {
2649 /// Could not start Assoc failure timer.
2650 // Log error
2651 limLog(pMac, LOGP,
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302652 FL("SessionId:%d could not start Association failure timer"),
2653 psessionEntry->peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07002654 // Cleanup as if assoc timer expired
2655 limProcessAssocFailureTimeout(pMac,LIM_ASSOC );
2656
2657 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002658
2659 return;
2660 }
2661 else
2662 {
2663 /**
2664 * Received Association request either in invalid state
2665 * or to a peer MAC entity whose address is different
2666 * from one that STA is currently joined with or on AP.
2667 * Return Assoc confirm with Invalid parameters code.
2668 */
2669
2670 // Log error
2671 PELOGW(limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05302672 FL("received unexpected MLM_ASSOC_CNF in state %d for role=%d, MAC addr= "
Abhishek Singhcd09b562013-12-24 16:02:20 +05302673 MAC_ADDRESS_STR), psessionEntry->limMlmState,
2674 psessionEntry->limSystemRole, MAC_ADDR_ARRAY(pMlmAssocReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002675 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
2676
2677 mlmAssocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2678 mlmAssocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2679
2680 goto end;
2681 }
2682
2683end:
2684 /* Update PE session Id*/
2685 mlmAssocCnf.sessionId = pMlmAssocReq->sessionId;
2686
2687 /// Free up buffer allocated for assocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302688 vos_mem_free(pMlmAssocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002689
2690 limPostSmeMessage(pMac, LIM_MLM_ASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
2691} /*** limProcessMlmAssocReq() ***/
2692
2693
2694
2695/**
2696 * limProcessMlmReassocReq()
2697 *
2698 *FUNCTION:
2699 * This function is called to process MLM_REASSOC_REQ message
2700 * from SME
2701 *
2702 *LOGIC:
2703 *
2704 *ASSUMPTIONS:
2705 *
2706 *NOTE:
2707 *
2708 * @param pMac Pointer to Global MAC structure
2709 * @param *pMsgBuf A pointer to the MLM message buffer
2710 * @return None
2711 */
2712
2713static void
2714limProcessMlmReassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2715{
Jeff Johnsone7245742012-09-05 17:12:55 -07002716 tANI_U8 chanNum, secChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002717 struct tLimPreAuthNode *pAuthNode;
2718 tLimMlmReassocReq *pMlmReassocReq;
2719 tLimMlmReassocCnf mlmReassocCnf;
2720 tpPESession psessionEntry;
2721
2722 if(pMsgBuf == NULL)
2723 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002724 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002725 return;
2726 }
2727
2728 pMlmReassocReq = (tLimMlmReassocReq *) pMsgBuf;
Abhishek Singhcd09b562013-12-24 16:02:20 +05302729
Jeff Johnson295189b2012-06-20 16:38:30 -07002730 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmReassocReq->sessionId)) == NULL)
2731 {
Abhishek Singhcd09b562013-12-24 16:02:20 +05302732 limLog(pMac, LOGE,FL("Session Does not exist for given sessionId %d"),
2733 pMlmReassocReq->sessionId);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302734 vos_mem_free(pMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002735 return;
2736 }
Abhishek Singhcd09b562013-12-24 16:02:20 +05302737
2738 limLog(pMac, LOG1,FL("Process ReAssoc Req on sessionID %d Systemrole %d"
2739 "mlmstate %d from: "MAC_ADDRESS_STR), pMlmReassocReq->sessionId,
2740 psessionEntry->limSystemRole, psessionEntry->limMlmState,
2741 MAC_ADDR_ARRAY(pMlmReassocReq->peerMacAddr));
2742
Jeff Johnson295189b2012-06-20 16:38:30 -07002743 if (((psessionEntry->limSystemRole != eLIM_AP_ROLE) && (psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE)) &&
2744 (psessionEntry->limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE))
2745 {
2746 if (psessionEntry->pLimMlmReassocReq)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302747 vos_mem_free(psessionEntry->pLimMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002748
2749 /* Hold Re-Assoc request as part of Session, knock-out pMac */
2750 /// Hold onto Reassoc request parameters
2751 psessionEntry->pLimMlmReassocReq = pMlmReassocReq;
2752
2753 // See if we have pre-auth context with new AP
2754 pAuthNode = limSearchPreAuthList(pMac, psessionEntry->limReAssocbssId);
2755
2756 if (!pAuthNode &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302757 (!vos_mem_compare(pMlmReassocReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002758 psessionEntry->bssId,
2759 sizeof(tSirMacAddr)) ))
2760 {
2761 // Either pre-auth context does not exist AND
2762 // we are not reassociating with currently
2763 // associated AP.
2764 // Return Reassoc confirm with not authenticated
2765 mlmReassocCnf.resultCode = eSIR_SME_STA_NOT_AUTHENTICATED;
2766 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2767
2768 goto end;
2769 }
2770
2771 //assign the sessionId to the timer object
2772 pMac->lim.limTimers.gLimReassocFailureTimer.sessionId = pMlmReassocReq->sessionId;
2773
2774 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2775 psessionEntry->limMlmState = eLIM_MLM_WT_REASSOC_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002776 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002777
2778#if 0
2779 // Update BSSID at CFG database
2780 if (wlan_cfgSetStr(pMac, WNI_CFG_BSSID,
2781 pMac->lim.gLimReassocBssId,
2782 sizeof(tSirMacAddr)) != eSIR_SUCCESS)
2783 {
2784 /// Could not update BSSID at CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002785 limLog(pMac, LOGP, FL("could not update BSSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002786 }
2787#endif //TO SUPPORT BT-AMP
2788
2789 /* Copy Global Reassoc ID*/
2790 // sirCopyMacAddr(psessionEntry->reassocbssId,pMac->lim.gLimReAssocBssId);
2791
2792 /**
2793 * Derive channel from BSS description and
2794 * store it at CFG.
2795 */
2796
2797 chanNum = psessionEntry->limReassocChannelId;
Jeff Johnsone7245742012-09-05 17:12:55 -07002798 secChannelOffset = psessionEntry->reAssocHtSecondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002799
2800 /* To Support BT-AMP .. read channel number from psessionEntry*/
2801 //chanNum = psessionEntry->currentOperChannel;
2802
2803 // Apply previously set configuration at HW
2804 limApplyConfiguration(pMac,psessionEntry);
2805
2806 //store the channel switch sessionEntry in the lim global var
2807 /* We have already saved the ReAssocreq Pointer abobe */
2808 //psessionEntry->pLimReAssocReq = (void *)pMlmReassocReq;
2809 psessionEntry->channelChangeReasonCode = LIM_SWITCH_CHANNEL_REASSOC;
2810
Jeff Johnsone7245742012-09-05 17:12:55 -07002811 /** Switch channel to the new Operating channel for Reassoc*/
Sushant Kaushikb97a0082015-08-31 12:36:45 +05302812
2813#ifdef FEATURE_WLAN_DIAG_SUPPORT
2814 limDiagEventReport(pMac, WLAN_PE_DIAG_CHANNEL_SWITCH_ANOUNCEMENT,
2815 psessionEntry, eSIR_SUCCESS, LIM_SWITCH_CHANNEL_REASSOC);
2816#endif
2817
Jeff Johnsone7245742012-09-05 17:12:55 -07002818 limSetChannel(pMac, chanNum, secChannelOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002819
2820 return;
2821 }
2822 else
2823 {
2824 /**
2825 * Received Reassoc request in invalid state or
2826 * in AP role.Return Reassoc confirm with Invalid
2827 * parameters code.
2828 */
2829
2830 // Log error
Abhishek Singhcd09b562013-12-24 16:02:20 +05302831 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05302832 FL("received unexpected MLM_REASSOC_CNF in state %d for role=%d, "
Abhishek Singhcd09b562013-12-24 16:02:20 +05302833 "MAC addr= "
2834 MAC_ADDRESS_STR), psessionEntry->limMlmState,
2835 psessionEntry->limSystemRole,
2836 MAC_ADDR_ARRAY(pMlmReassocReq->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002837 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
2838
2839 mlmReassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2840 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2841
2842 goto end;
2843 }
2844
2845end:
2846 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2847 /* Update PE sessio Id*/
2848 mlmReassocCnf.sessionId = pMlmReassocReq->sessionId;
2849 /// Free up buffer allocated for reassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302850 vos_mem_free(pMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002851 psessionEntry->pLimReAssocReq = NULL;
2852
2853 limPostSmeMessage(pMac, LIM_MLM_REASSOC_CNF, (tANI_U32 *) &mlmReassocCnf);
2854} /*** limProcessMlmReassocReq() ***/
2855
2856
2857static void
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08002858limProcessMlmDisassocReqNtf(tpAniSirGlobal pMac, eHalStatus suspendStatus, tANI_U32 *pMsgBuf)
Jeff Johnson295189b2012-06-20 16:38:30 -07002859{
2860 tANI_U16 aid;
2861 tSirMacAddr currentBssId;
2862 tpDphHashNode pStaDs;
2863 tLimMlmDisassocReq *pMlmDisassocReq;
2864 tLimMlmDisassocCnf mlmDisassocCnf;
2865 tpPESession psessionEntry;
2866 extern tANI_BOOLEAN sendDisassocFrame;
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05302867 tSirSmeDisassocRsp *pSirSmeDisassocRsp;
2868 tANI_U32 *pMsg;
2869 tANI_U8 *pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07002870
2871 if(eHAL_STATUS_SUCCESS != suspendStatus)
2872 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002873 PELOGE(limLog(pMac, LOGE,FL("Suspend Status is not success %X"), suspendStatus);)
Jeff Johnson295189b2012-06-20 16:38:30 -07002874#if 0
2875 //It can ignore the status and proceed with the disassoc processing.
2876 mlmDisassocCnf.resultCode = eSIR_SME_REFUSED;
2877 goto end;
2878#endif
2879 }
2880
2881 pMlmDisassocReq = (tLimMlmDisassocReq *) pMsgBuf;
2882
Jeff Johnson295189b2012-06-20 16:38:30 -07002883 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDisassocReq->sessionId))== NULL)
2884 {
2885
Abhishek Singhcd09b562013-12-24 16:02:20 +05302886 limLog(pMac, LOGE,
2887 FL("session does not exist for given sessionId %d"),
2888 pMlmDisassocReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002889 mlmDisassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2890 goto end;
2891 }
Abhishek Singhcd09b562013-12-24 16:02:20 +05302892 limLog(pMac, LOG1,FL("Process DisAssoc Req on sessionID %d Systemrole %d"
2893 "mlmstate %d from: "MAC_ADDRESS_STR), pMlmDisassocReq->sessionId,
2894 psessionEntry->limSystemRole, psessionEntry->limMlmState,
2895 MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));
2896
Jeff Johnson295189b2012-06-20 16:38:30 -07002897 #if 0
2898 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2899 eSIR_SUCCESS)
2900 {
2901 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002902 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002903 }
2904 #endif //BT-AMP Support
2905 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2906
2907 switch (psessionEntry->limSystemRole)
2908 {
2909 case eLIM_STA_ROLE:
2910 case eLIM_BT_AMP_STA_ROLE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302911 if ( !vos_mem_compare(pMlmDisassocReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002912 currentBssId,
2913 sizeof(tSirMacAddr)) )
2914 {
2915 PELOGW(limLog(pMac, LOGW,
Abhishek Singhcd09b562013-12-24 16:02:20 +05302916 FL("received MLM_DISASSOC_REQ with invalid BSS id from: "
2917 MAC_ADDRESS_STR),
2918 MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002919
2920 /// Prepare and Send LIM_MLM_DISASSOC_CNF
2921
2922 mlmDisassocCnf.resultCode =
2923 eSIR_SME_INVALID_PARAMETERS;
2924
2925 goto end;
2926 }
2927
2928 break;
2929
2930 case eLIM_STA_IN_IBSS_ROLE:
2931
2932 break;
2933
2934 default: // eLIM_AP_ROLE
2935
2936 // Fall through
2937 break;
2938
2939 } // end switch (psessionEntry->limSystemRole)
2940
2941 /**
2942 * Check if there exists a context for the peer entity
2943 * to be disassociated with.
2944 */
2945 pStaDs = dphLookupHashEntry(pMac, pMlmDisassocReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable);
2946 if ((pStaDs == NULL) ||
2947 (pStaDs &&
2948 ((pStaDs->mlmStaContext.mlmState !=
2949 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
2950 (pStaDs->mlmStaContext.mlmState !=
2951 eLIM_MLM_WT_ASSOC_CNF_STATE) &&
2952 (pStaDs->mlmStaContext.mlmState !=
2953 eLIM_MLM_ASSOCIATED_STATE))))
2954 {
2955 /**
2956 * Received LIM_MLM_DISASSOC_REQ for STA that does not
2957 * have context or in some transit state.
2958 * Log error
2959 */
Sachin Ahuja2fea3d12014-12-18 17:31:31 +05302960 limLog(pMac, LOGE,
Abhishek Singhcd09b562013-12-24 16:02:20 +05302961 FL("received MLM_DISASSOC_REQ for STA that either has no context "
2962 "or in some transit state, Addr= "
Sachin Ahuja2fea3d12014-12-18 17:31:31 +05302963 MAC_ADDRESS_STR),MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));
2964 if (pStaDs != NULL)
2965 limLog(pMac, LOGE, FL("Sta MlmState : %d"),
2966 pStaDs->mlmStaContext.mlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002967
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05302968 /*
2969 * Disassociation response due to
2970 * host triggered disassociation
2971 */
Jeff Johnson295189b2012-06-20 16:38:30 -07002972
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05302973 pSirSmeDisassocRsp = vos_mem_malloc(sizeof(tSirSmeDisassocRsp));
2974 if ( NULL == pSirSmeDisassocRsp )
2975 {
2976 // Log error
2977 limLog(pMac, LOGP,
2978 FL("call to AllocateMemory failed for eWNI_SME_DISASSOC_RSP"));
2979 return;
2980 }
2981 limLog(pMac, LOG1, FL("send eWNI_SME_DISASSOC_RSP with "
2982 "retCode: %d for "MAC_ADDRESS_STR),eSIR_SME_DEAUTH_STATUS,
2983 MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));
2984 pSirSmeDisassocRsp->messageType = eWNI_SME_DISASSOC_RSP;
2985 pSirSmeDisassocRsp->length = sizeof(tSirSmeDisassocRsp);
2986 pSirSmeDisassocRsp->sessionId = pMlmDisassocReq->sessionId;
2987 pSirSmeDisassocRsp->transactionId = 0;
2988 pSirSmeDisassocRsp->statusCode = eSIR_SME_DEAUTH_STATUS;
Jeff Johnson295189b2012-06-20 16:38:30 -07002989
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05302990 pBuf = (tANI_U8 *) pSirSmeDisassocRsp->peerMacAddr;
2991 vos_mem_copy( pBuf, pMlmDisassocReq->peerMacAddr, sizeof(tSirMacAddr));
2992
2993 pMsg = (tANI_U32*) pSirSmeDisassocRsp;
2994
2995 limSendSmeDisassocDeauthNtf( pMac, eHAL_STATUS_SUCCESS,
2996 (tANI_U32*) pMsg );
2997 return;
2998
Jeff Johnson295189b2012-06-20 16:38:30 -07002999 }
3000
3001 //pStaDs->mlmStaContext.rxPurgeReq = 1;
3002 pStaDs->mlmStaContext.disassocReason = (tSirMacReasonCodes)
3003 pMlmDisassocReq->reasonCode;
3004 pStaDs->mlmStaContext.cleanupTrigger = pMlmDisassocReq->disassocTrigger;
Mukul Sharma91947a22014-06-09 11:07:51 +05303005 /** Set state to mlm State to eLIM_MLM_WT_DEL_STA_RSP_STATE
3006 * This is to address the issue of race condition between
3007 * disconnect request from the HDD and deauth from AP
3008 */
3009 pStaDs->mlmStaContext.mlmState = eLIM_MLM_WT_DEL_STA_RSP_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003010
3011 /// Send Disassociate frame to peer entity
Jeff Johnsone7245742012-09-05 17:12:55 -07003012 if (sendDisassocFrame && (pMlmDisassocReq->reasonCode != eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON))
Jeff Johnson295189b2012-06-20 16:38:30 -07003013 {
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003014 pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq = pMlmDisassocReq;
Edhar, Mahesh Kumar03cf7ff2015-11-26 17:59:29 +05303015 if (IS_FW_IN_TX_PATH_FEATURE_ENABLE)
Sandeep Puligilla25728282013-12-01 19:44:14 +05303016 {
Edhar, Mahesh Kumar03cf7ff2015-11-26 17:59:29 +05303017 limSendDisassocMgmtFrame(pMac, pMlmDisassocReq->reasonCode,
Sandeep Puligilla25728282013-12-01 19:44:14 +05303018 pMlmDisassocReq->peerMacAddr,
3019 psessionEntry, FALSE);
Edhar, Mahesh Kumar03cf7ff2015-11-26 17:59:29 +05303020 /* Send Disassoc CNF and receive path cleanup */
3021 limSendDisassocCnf(pMac);
Sandeep Puligilla25728282013-12-01 19:44:14 +05303022 }
3023 else
3024 {
Edhar, Mahesh Kumar03cf7ff2015-11-26 17:59:29 +05303025 limSendDisassocMgmtFrame(pMac, pMlmDisassocReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003026 pMlmDisassocReq->peerMacAddr,
3027 psessionEntry, TRUE);
Sandeep Puligilla25728282013-12-01 19:44:14 +05303028 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003029 }
3030 else
3031 {
Madan Mohan Koyyalamudib6af0612012-11-19 13:45:45 -08003032 /* Disassoc frame is not sent OTA */
3033 sendDisassocFrame = 1;
3034 // Receive path cleanup with dummy packet
3035 if(eSIR_SUCCESS != limCleanupRxPath(pMac, pStaDs,psessionEntry))
3036 {
3037 mlmDisassocCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
3038 goto end;
3039 }
3040 // Free up buffer allocated for mlmDisassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303041 vos_mem_free(pMlmDisassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003042 }
3043
Jeff Johnson295189b2012-06-20 16:38:30 -07003044 return;
3045
3046end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303047 vos_mem_copy((tANI_U8 *) &mlmDisassocCnf.peerMacAddr,
3048 (tANI_U8 *) pMlmDisassocReq->peerMacAddr,
3049 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003050 mlmDisassocCnf.aid = pMlmDisassocReq->aid;
3051 mlmDisassocCnf.disassocTrigger = pMlmDisassocReq->disassocTrigger;
3052
3053 /* Update PE session ID*/
3054 mlmDisassocCnf.sessionId = pMlmDisassocReq->sessionId;
3055
3056 /// Free up buffer allocated for mlmDisassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303057 vos_mem_free(pMlmDisassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003058
3059 limPostSmeMessage(pMac,
3060 LIM_MLM_DISASSOC_CNF,
3061 (tANI_U32 *) &mlmDisassocCnf);
3062}
3063
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003064tANI_BOOLEAN limCheckDisassocDeauthAckPending(tpAniSirGlobal pMac,
3065 tANI_U8 *staMac
3066 )
3067{
3068 tLimMlmDisassocReq *pMlmDisassocReq;
3069 tLimMlmDeauthReq *pMlmDeauthReq;
3070 pMlmDisassocReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq;
3071 pMlmDeauthReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq;
3072 if (
3073 (pMlmDisassocReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303074 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003075 (tANI_U8 *) &pMlmDisassocReq->peerMacAddr,
3076 sizeof(tSirMacAddr))))
3077 ||
3078 (pMlmDeauthReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303079 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003080 (tANI_U8 *) &pMlmDeauthReq->peerMacAddr,
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303081 sizeof(tSirMacAddr))))
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003082 )
3083 {
Srinivas Girigowdac03c5a82013-07-01 13:44:54 -07003084 PELOG1(limLog(pMac, LOG1, FL("Disassoc/Deauth ack pending"));)
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003085 return eANI_BOOLEAN_TRUE;
3086 }
3087 else
3088 {
Srinivas Girigowdac03c5a82013-07-01 13:44:54 -07003089 PELOG1(limLog(pMac, LOG1, FL("Disassoc/Deauth Ack not pending"));)
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003090 return eANI_BOOLEAN_FALSE;
3091 }
3092}
3093
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003094void limCleanUpDisassocDeauthReq(tpAniSirGlobal pMac,
3095 tANI_U8 *staMac,
3096 tANI_BOOLEAN cleanRxPath)
3097{
3098 tLimMlmDisassocReq *pMlmDisassocReq;
3099 tLimMlmDeauthReq *pMlmDeauthReq;
3100 pMlmDisassocReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq;
3101 if (pMlmDisassocReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303102 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003103 (tANI_U8 *) &pMlmDisassocReq->peerMacAddr,
3104 sizeof(tSirMacAddr))))
3105 {
3106 if (cleanRxPath)
3107 {
3108 limProcessDisassocAckTimeout(pMac);
3109 }
3110 else
3111 {
3112 if (tx_timer_running(&pMac->lim.limTimers.gLimDisassocAckTimer))
3113 {
3114 limDeactivateAndChangeTimer(pMac, eLIM_DISASSOC_ACK_TIMER);
3115 }
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303116 vos_mem_free(pMlmDisassocReq);
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003117 pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq = NULL;
3118 }
3119 }
3120
3121 pMlmDeauthReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq;
3122 if (pMlmDeauthReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303123 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003124 (tANI_U8 *) &pMlmDeauthReq->peerMacAddr,
3125 sizeof(tSirMacAddr))))
3126 {
3127 if (cleanRxPath)
3128 {
3129 limProcessDeauthAckTimeout(pMac);
3130 }
3131 else
3132 {
3133 if (tx_timer_running(&pMac->lim.limTimers.gLimDeauthAckTimer))
3134 {
3135 limDeactivateAndChangeTimer(pMac, eLIM_DEAUTH_ACK_TIMER);
3136 }
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303137 vos_mem_free(pMlmDeauthReq);
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003138 pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = NULL;
3139 }
3140 }
3141}
3142
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003143void limProcessDisassocAckTimeout(tpAniSirGlobal pMac)
3144{
Abhishek Singhcd09b562013-12-24 16:02:20 +05303145 limLog(pMac, LOG1, FL(""));
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003146 limSendDisassocCnf(pMac);
3147}
3148
Jeff Johnson295189b2012-06-20 16:38:30 -07003149/**
3150 * limProcessMlmDisassocReq()
3151 *
3152 *FUNCTION:
3153 * This function is called to process MLM_DISASSOC_REQ message
3154 * from SME
3155 *
3156 *LOGIC:
3157 *
3158 *ASSUMPTIONS:
3159 *
3160 *NOTE:
3161 *
3162 * @param pMac Pointer to Global MAC structure
3163 * @param *pMsgBuf A pointer to the MLM message buffer
3164 * @return None
3165 */
3166
3167static void
3168limProcessMlmDisassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3169{
Jeff Johnson295189b2012-06-20 16:38:30 -07003170 tLimMlmDisassocReq *pMlmDisassocReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07003171
3172 if(pMsgBuf == NULL)
3173 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003174 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003175 return;
3176 }
3177
3178 pMlmDisassocReq = (tLimMlmDisassocReq *) pMsgBuf;
Kanchanapally, Vidyullathac796fc62015-03-17 10:45:28 +05303179
Abhishek Singhcd09b562013-12-24 16:02:20 +05303180 limLog(pMac, LOG1,FL("Process DisAssoc Req on sessionID %d "
3181 "from: "MAC_ADDRESS_STR), pMlmDisassocReq->sessionId,
3182 MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003183
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003184 limProcessMlmDisassocReqNtf( pMac, eHAL_STATUS_SUCCESS, (tANI_U32*) pMsgBuf );
Madan Mohan Koyyalamudib6af0612012-11-19 13:45:45 -08003185
Jeff Johnson295189b2012-06-20 16:38:30 -07003186} /*** limProcessMlmDisassocReq() ***/
3187
3188static void
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003189limProcessMlmDeauthReqNtf(tpAniSirGlobal pMac, eHalStatus suspendStatus, tANI_U32 *pMsgBuf)
Jeff Johnson295189b2012-06-20 16:38:30 -07003190{
3191 tANI_U16 aid;
3192 tSirMacAddr currentBssId;
3193 tpDphHashNode pStaDs;
3194 struct tLimPreAuthNode *pAuthNode;
3195 tLimMlmDeauthReq *pMlmDeauthReq;
3196 tLimMlmDeauthCnf mlmDeauthCnf;
3197 tpPESession psessionEntry;
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303198 tSirSmeDeauthRsp *pSirSmeDeauthRsp;
3199 tANI_U8 *pBuf;
3200 tANI_U32 *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -07003201
3202
3203 if(eHAL_STATUS_SUCCESS != suspendStatus)
3204 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003205 PELOGE(limLog(pMac, LOGE,FL("Suspend Status is not success %X"), suspendStatus);)
Jeff Johnson295189b2012-06-20 16:38:30 -07003206#if 0
3207 //It can ignore the status and proceed with the disassoc processing.
3208 mlmDisassocCnf.resultCode = eSIR_SME_REFUSED;
3209 goto end;
3210#endif
3211 }
3212
3213 pMlmDeauthReq = (tLimMlmDeauthReq *) pMsgBuf;
3214
3215 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDeauthReq->sessionId))== NULL)
3216 {
3217
Abhishek Singhcd09b562013-12-24 16:02:20 +05303218 limLog(pMac, LOGE, FL("session does not exist for given sessionId %d"),
3219 pMlmDeauthReq->sessionId);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303220 vos_mem_free(pMlmDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003221 return;
3222 }
Abhishek Singhcd09b562013-12-24 16:02:20 +05303223 limLog(pMac, LOG1,FL("Process Deauth Req on sessionID %d Systemrole %d"
3224 "mlmstate %d from: "MAC_ADDRESS_STR), pMlmDeauthReq->sessionId,
3225 psessionEntry->limSystemRole, psessionEntry->limMlmState,
3226 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003227 #if 0
3228 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
3229 eSIR_SUCCESS)
3230 {
3231 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003232 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003233 }
3234 #endif //SUPPORT BT-AMP
3235 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3236
3237 switch (psessionEntry->limSystemRole)
3238 {
3239 case eLIM_STA_ROLE:
3240 case eLIM_BT_AMP_STA_ROLE:
3241 switch (psessionEntry->limMlmState)
3242 {
3243 case eLIM_MLM_IDLE_STATE:
3244 // Attempting to Deauthenticate
3245 // with a pre-authenticated peer.
3246 // Deauthetiate with peer if there
3247 // exists a pre-auth context below.
3248 break;
3249
3250 case eLIM_MLM_AUTHENTICATED_STATE:
3251 case eLIM_MLM_WT_ASSOC_RSP_STATE:
3252 case eLIM_MLM_LINK_ESTABLISHED_STATE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303253 if (!vos_mem_compare(pMlmDeauthReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07003254 currentBssId,
3255 sizeof(tSirMacAddr)) )
3256 {
Abhishek Singhcd09b562013-12-24 16:02:20 +05303257 limLog(pMac, LOGE,
3258 FL("received MLM_DEAUTH_REQ with invalid BSS id "
3259 "Peer MAC: "MAC_ADDRESS_STR " CFG BSSID Addr : "
3260 MAC_ADDRESS_STR),
3261 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr),
3262 MAC_ADDR_ARRAY(currentBssId));
Jeff Johnson295189b2012-06-20 16:38:30 -07003263
3264 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3265
3266 mlmDeauthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3267
3268 goto end;
3269 }
3270
3271 if ((psessionEntry->limMlmState ==
3272 eLIM_MLM_AUTHENTICATED_STATE) ||
3273 (psessionEntry->limMlmState ==
3274 eLIM_MLM_WT_ASSOC_RSP_STATE))
3275 {
3276 // Send Deauthentication frame
3277 // to peer entity
3278 limSendDeauthMgmtFrame(
3279 pMac,
3280 pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003281 pMlmDeauthReq->peerMacAddr,
3282 psessionEntry, FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003283
3284 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3285 mlmDeauthCnf.resultCode = eSIR_SME_SUCCESS;
3286 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003287 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003288 goto end;
3289 }
3290 else
3291 {
3292 // LINK_ESTABLISED_STATE
3293 // Cleanup RX & TX paths
3294 // below
3295 }
3296
3297 break;
3298
3299 default:
3300
3301 PELOGW(limLog(pMac, LOGW,
Abhishek Singhcd09b562013-12-24 16:02:20 +05303302 FL("received MLM_DEAUTH_REQ with in state %d for peer "MAC_ADDRESS_STR),
3303 psessionEntry->limMlmState,MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003304 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
3305
3306 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3307 mlmDeauthCnf.resultCode =
3308 eSIR_SME_STA_NOT_AUTHENTICATED;
3309
3310 goto end;
3311 }
3312
3313 break;
3314
3315 case eLIM_STA_IN_IBSS_ROLE:
Abhishek Singh92fbac22015-03-24 17:57:36 +05303316 limLog(pMac, LOGE,
3317 FL("received MLM_DEAUTH_REQ IBSS Mode "));
3318 mlmDeauthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3319 goto end;
Jeff Johnson295189b2012-06-20 16:38:30 -07003320 default: // eLIM_AP_ROLE
3321 break;
3322
3323 } // end switch (psessionEntry->limSystemRole)
3324
3325 /**
3326 * Check if there exists a context for the peer entity
3327 * to be deauthenticated with.
3328 */
3329 pStaDs = dphLookupHashEntry(pMac, pMlmDeauthReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable);
3330
3331 if (pStaDs == NULL)
3332 {
3333 /// Check if there exists pre-auth context for this STA
3334 pAuthNode = limSearchPreAuthList(pMac,
3335 pMlmDeauthReq->peerMacAddr);
3336
3337 if (pAuthNode == NULL)
3338 {
3339 /**
3340 * Received DEAUTH REQ for a STA that is neither
3341 * Associated nor Pre-authenticated. Log error,
3342 * Prepare and Send LIM_MLM_DEAUTH_CNF
3343 */
3344 PELOGW(limLog(pMac, LOGW,
Abhishek Singhcd09b562013-12-24 16:02:20 +05303345 FL("received MLM_DEAUTH_REQ in mlme state %d for STA that "
3346 "does not have context, Addr="MAC_ADDRESS_STR),
3347 psessionEntry->limMlmState,
3348 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003349
3350 mlmDeauthCnf.resultCode =
3351 eSIR_SME_STA_NOT_AUTHENTICATED;
3352 }
3353 else
3354 {
3355 mlmDeauthCnf.resultCode = eSIR_SME_SUCCESS;
3356
3357 /// Delete STA from pre-auth STA list
3358 limDeletePreAuthNode(pMac, pMlmDeauthReq->peerMacAddr);
3359
3360 /// Send Deauthentication frame to peer entity
3361 limSendDeauthMgmtFrame(pMac,
3362 pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003363 pMlmDeauthReq->peerMacAddr,
3364 psessionEntry, FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003365 }
3366
3367 goto end;
3368 }
3369 else if ((pStaDs->mlmStaContext.mlmState !=
3370 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
3371 (pStaDs->mlmStaContext.mlmState !=
3372 eLIM_MLM_WT_ASSOC_CNF_STATE))
3373 {
3374 /**
3375 * Received LIM_MLM_DEAUTH_REQ for STA that is n
3376 * some transit state. Log error.
3377 */
3378 PELOGW(limLog(pMac, LOGW,
Abhishek Singhcd09b562013-12-24 16:02:20 +05303379 FL("received MLM_DEAUTH_REQ for STA that either has no context or in some transit state, Addr="
3380 MAC_ADDRESS_STR),MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003381
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303382 /*
3383 * Deauthentication response to host triggered
3384 * deauthentication.
3385 */
3386 pSirSmeDeauthRsp = vos_mem_malloc(sizeof(tSirSmeDeauthRsp));
3387 if ( NULL == pSirSmeDeauthRsp )
3388 {
3389 // Log error
3390 limLog(pMac, LOGP,
3391 FL("call to AllocateMemory failed for eWNI_SME_DEAUTH_RSP"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003392
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303393 return;
3394 }
3395 limLog(pMac, LOG1, FL("send eWNI_SME_DEAUTH_RSP with "
3396 "retCode: %d for"MAC_ADDRESS_STR),eSIR_SME_DEAUTH_STATUS,
3397 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));
3398 pSirSmeDeauthRsp->messageType = eWNI_SME_DEAUTH_RSP;
3399 pSirSmeDeauthRsp->length = sizeof(tSirSmeDeauthRsp);
3400 pSirSmeDeauthRsp->statusCode = eSIR_SME_DEAUTH_STATUS;
3401 pSirSmeDeauthRsp->sessionId = pMlmDeauthReq->sessionId;
3402 pSirSmeDeauthRsp->transactionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003403
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303404 pBuf = (tANI_U8 *) pSirSmeDeauthRsp->peerMacAddr;
3405 vos_mem_copy( pBuf, pMlmDeauthReq->peerMacAddr, sizeof(tSirMacAddr));
3406
3407 pMsg = (tANI_U32*)pSirSmeDeauthRsp;
3408
3409 limSendSmeDisassocDeauthNtf( pMac, eHAL_STATUS_SUCCESS,
3410 (tANI_U32*) pMsg );
3411
3412 return;
3413
Jeff Johnson295189b2012-06-20 16:38:30 -07003414 }
3415
3416 //pStaDs->mlmStaContext.rxPurgeReq = 1;
3417 pStaDs->mlmStaContext.disassocReason = (tSirMacReasonCodes)
3418 pMlmDeauthReq->reasonCode;
3419 pStaDs->mlmStaContext.cleanupTrigger = pMlmDeauthReq->deauthTrigger;
3420
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003421 pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = pMlmDeauthReq;
Abhishek Singh94152932014-01-16 19:04:51 +05303422
3423 /* Set state to mlm State to eLIM_MLM_WT_DEL_STA_RSP_STATE
3424 * This is to address the issue of race condition between
3425 * disconnect request from the HDD and disassoc from
3426 * inactivity timer. This will make sure that we will not
3427 * process disassoc if deauth is in progress for the station
3428 * and thus mlmStaContext.cleanupTrigger will not be overwritten.
3429 */
3430 pStaDs->mlmStaContext.mlmState = eLIM_MLM_WT_DEL_STA_RSP_STATE;
3431
Jeff Johnson295189b2012-06-20 16:38:30 -07003432 /// Send Deauthentication frame to peer entity
Kanchanapally, Vidyullathaf9426e52013-12-24 17:28:54 +05303433 /* If FW_IN_TX_PATH feature is enabled
3434 do not wait for ACK */
3435 if( IS_FW_IN_TX_PATH_FEATURE_ENABLE )
3436 {
3437 limSendDeauthMgmtFrame(pMac, pMlmDeauthReq->reasonCode,
3438 pMlmDeauthReq->peerMacAddr,
3439 psessionEntry, FALSE);
3440
3441 /* Send Deauth CNF and receive path cleanup */
3442 limSendDeauthCnf(pMac);
3443 }
3444 else
3445 {
3446 limSendDeauthMgmtFrame(pMac, pMlmDeauthReq->reasonCode,
3447 pMlmDeauthReq->peerMacAddr,
3448 psessionEntry, TRUE);
3449 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003450
3451 return;
3452
3453end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303454 vos_mem_copy((tANI_U8 *) &mlmDeauthCnf.peerMacAddr,
3455 (tANI_U8 *) pMlmDeauthReq->peerMacAddr,
3456 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003457 mlmDeauthCnf.deauthTrigger = pMlmDeauthReq->deauthTrigger;
3458 mlmDeauthCnf.aid = pMlmDeauthReq->aid;
3459 mlmDeauthCnf.sessionId = pMlmDeauthReq->sessionId;
3460
3461 // Free up buffer allocated
3462 // for mlmDeauthReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303463 vos_mem_free(pMlmDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003464
3465 limPostSmeMessage(pMac,
3466 LIM_MLM_DEAUTH_CNF,
3467 (tANI_U32 *) &mlmDeauthCnf);
3468
3469}
3470
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003471
3472void limProcessDeauthAckTimeout(tpAniSirGlobal pMac)
3473{
Abhishek Singhcd09b562013-12-24 16:02:20 +05303474 limLog(pMac, LOG1, FL(""));
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003475 limSendDeauthCnf(pMac);
3476}
3477
Jeff Johnson295189b2012-06-20 16:38:30 -07003478/**
3479 * limProcessMlmDeauthReq()
3480 *
3481 *FUNCTION:
3482 * This function is called to process MLM_DEAUTH_REQ message
3483 * from SME
3484 *
3485 *LOGIC:
3486 *
3487 *ASSUMPTIONS:
3488 *
3489 *NOTE:
3490 *
3491 * @param pMac Pointer to Global MAC structure
3492 * @param *pMsgBuf A pointer to the MLM message buffer
3493 * @return None
3494 */
3495
3496static void
3497limProcessMlmDeauthReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3498{
3499// tANI_U16 aid;
3500// tSirMacAddr currentBssId;
3501// tpDphHashNode pStaDs;
3502// struct tLimPreAuthNode *pAuthNode;
3503 tLimMlmDeauthReq *pMlmDeauthReq;
3504// tLimMlmDeauthCnf mlmDeauthCnf;
3505 tpPESession psessionEntry;
3506
3507 if(pMsgBuf == NULL)
3508 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003509 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003510 return;
3511 }
3512
3513 pMlmDeauthReq = (tLimMlmDeauthReq *) pMsgBuf;
3514
Abhishek Singhcd09b562013-12-24 16:02:20 +05303515 limLog(pMac, LOG1,FL("Process Deauth Req on sessionID %d "
3516 "from: "MAC_ADDRESS_STR), pMlmDeauthReq->sessionId,
3517 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));
3518
Jeff Johnson295189b2012-06-20 16:38:30 -07003519 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDeauthReq->sessionId))== NULL)
3520 {
3521
Abhishek Singhcd09b562013-12-24 16:02:20 +05303522 limLog(pMac, LOGE, FL("session does not exist for given sessionId %d"),
3523 pMlmDeauthReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07003524 return;
3525 }
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003526 limProcessMlmDeauthReqNtf( pMac, eHAL_STATUS_SUCCESS, (tANI_U32*) pMsgBuf );
3527
Jeff Johnson295189b2012-06-20 16:38:30 -07003528} /*** limProcessMlmDeauthReq() ***/
3529
3530
3531
3532/**
3533 * @function : limProcessMlmSetKeysReq()
3534 *
3535 * @brief : This function is called to process MLM_SETKEYS_REQ message
3536 * from SME
3537 *
3538 *LOGIC:
3539 *
3540 *ASSUMPTIONS:
3541 *
3542 *NOTE:
3543 *
3544 * @param pMac Pointer to Global MAC structure
3545 * @param *pMsgBuf A pointer to the MLM message buffer
3546 * @return None
3547 */
3548
3549static void
3550limProcessMlmSetKeysReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3551{
3552tANI_U16 aid;
3553tANI_U16 staIdx = 0;
3554tANI_U32 defaultKeyId = 0;
3555tSirMacAddr currentBssId;
3556tpDphHashNode pStaDs;
3557tLimMlmSetKeysReq *pMlmSetKeysReq;
3558tLimMlmSetKeysCnf mlmSetKeysCnf;
3559tpPESession psessionEntry;
3560
3561 if(pMsgBuf == NULL)
3562 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003563 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003564 return;
3565 }
3566
3567
3568 pMlmSetKeysReq = (tLimMlmSetKeysReq *) pMsgBuf;
3569 // Hold onto the SetKeys request parameters
3570 pMac->lim.gpLimMlmSetKeysReq = (void *) pMlmSetKeysReq;
3571
3572 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmSetKeysReq->sessionId))== NULL)
3573 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003574 PELOGE(limLog(pMac, LOGE,FL("session does not exist for given sessionId"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003575 return;
3576 }
3577
3578 limLog( pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003579 FL( "Received MLM_SETKEYS_REQ with parameters:"
Jeff Johnson295189b2012-06-20 16:38:30 -07003580 "AID [%d], ED Type [%d], # Keys [%d] & Peer MAC Addr - "),
3581 pMlmSetKeysReq->aid,
3582 pMlmSetKeysReq->edType,
3583 pMlmSetKeysReq->numKeys );
3584 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3585
3586 #if 0
3587 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac, WNI_CFG_BSSID, currentBssId, &cfg )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003588 limLog( pMac, LOGP, FL("Could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003589 return;
3590 }
3591 #endif //TO SUPPORT BT-AMP
3592 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3593
3594 switch( psessionEntry->limSystemRole ) {
3595 case eLIM_STA_ROLE:
3596 case eLIM_BT_AMP_STA_ROLE:
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003597 //In case of TDLS, peerMac address need not be BssId. Skip this check
3598 //if TDLS is enabled.
3599#ifndef FEATURE_WLAN_TDLS
Jeff Johnson295189b2012-06-20 16:38:30 -07003600 if((!limIsAddrBC( pMlmSetKeysReq->peerMacAddr ) ) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303601 (!vos_mem_compare(pMlmSetKeysReq->peerMacAddr,
3602 currentBssId, sizeof(tSirMacAddr))) ){
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003603 limLog( pMac, LOGW, FL("Received MLM_SETKEYS_REQ with invalid BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003604 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3605
3606 // Prepare and Send LIM_MLM_SETKEYS_CNF with error code
3607 mlmSetKeysCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3608 goto end;
3609 }
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003610#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003611 // Fall thru' & 'Plumb' keys below
3612 break;
3613 case eLIM_STA_IN_IBSS_ROLE:
3614 default: // others
3615 // Fall thru...
3616 break;
3617 }
3618
3619 /**
3620 * Use the "unicast" parameter to determine if the "Group Keys"
3621 * are being set.
3622 * pMlmSetKeysReq->key.unicast = 0 -> Multicast/broadcast
3623 * pMlmSetKeysReq->key.unicast - 1 -> Unicast keys are being set
3624 */
3625 if( limIsAddrBC( pMlmSetKeysReq->peerMacAddr )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003626 limLog( pMac, LOG1, FL("Trying to set Group Keys...%d "), pMlmSetKeysReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07003627 /** When trying to set Group Keys for any
3628 * security mode other than WEP, use the
3629 * STA Index corresponding to the AP...
3630 */
3631 switch( pMlmSetKeysReq->edType ) {
3632 case eSIR_ED_CCMP:
3633
3634#ifdef WLAN_FEATURE_11W
3635 case eSIR_ED_AES_128_CMAC:
3636#endif
3637 staIdx = psessionEntry->staId;
3638 break;
3639
3640 default:
3641 break;
3642 }
3643 }else {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003644 limLog( pMac, LOG1, FL("Trying to set Unicast Keys..."));
Jeff Johnson295189b2012-06-20 16:38:30 -07003645 /**
3646 * Check if there exists a context for the
3647 * peer entity for which keys need to be set.
3648 */
3649
3650
3651 pStaDs = dphLookupHashEntry( pMac, pMlmSetKeysReq->peerMacAddr, &aid , &psessionEntry->dph.dphHashTable);
3652
Jeff Johnson295189b2012-06-20 16:38:30 -07003653 if ((pStaDs == NULL) ||
3654 ((pStaDs->mlmStaContext.mlmState != eLIM_MLM_LINK_ESTABLISHED_STATE) && (psessionEntry->limSystemRole != eLIM_AP_ROLE))) {
Jeff Johnson295189b2012-06-20 16:38:30 -07003655 /**
3656 * Received LIM_MLM_SETKEYS_REQ for STA
3657 * that does not have context or in some
3658 * transit state. Log error.
3659 */
3660 limLog( pMac, LOG1,
3661 FL("Received MLM_SETKEYS_REQ for STA that either has no context or in some transit state, Addr = "));
3662 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3663
3664 // Prepare and Send LIM_MLM_SETKEYS_CNF
3665 mlmSetKeysCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3666 goto end;
3667 } else
3668 staIdx = pStaDs->staIndex;
3669 }
3670
3671 if ((pMlmSetKeysReq->numKeys == 0) && (pMlmSetKeysReq->edType != eSIR_ED_NONE)) {
Jeff Johnsone7245742012-09-05 17:12:55 -07003672 //
3673 // Broadcast/Multicast Keys (for WEP!!) are NOT sent
3674 // via this interface!!
3675 //
3676 // This indicates to HAL that the WEP Keys need to be
3677 // extracted from the CFG and applied to hardware
3678 defaultKeyId = 0xff;
3679 }else if(pMlmSetKeysReq->key[0].keyId &&
3680 ((pMlmSetKeysReq->edType == eSIR_ED_WEP40) ||
3681 (pMlmSetKeysReq->edType == eSIR_ED_WEP104))){
3682 /* If the Key Id is non zero and encryption mode is WEP,
3683 * the key index is coming from the upper layers so that key only
3684 * need to be used as the default tx key, This is being used only
3685 * in case of WEP mode in HAL */
3686 defaultKeyId = pMlmSetKeysReq->key[0].keyId;
3687 }else
3688 defaultKeyId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003689
3690 limLog( pMac, LOG1,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003691 FL( "Trying to set keys for STA Index [%d], using defaultKeyId [%d]" ),
Jeff Johnson295189b2012-06-20 16:38:30 -07003692 staIdx,
3693 defaultKeyId );
3694
3695 if(limIsAddrBC( pMlmSetKeysReq->peerMacAddr )) {
3696 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
3697 psessionEntry->limMlmState = eLIM_MLM_WT_SET_BSS_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003698 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003699 limLog( pMac, LOG1, FL("Trying to set Group Keys...%d "),
Jeff Johnson295189b2012-06-20 16:38:30 -07003700 psessionEntry->peSessionId);
3701
3702 // Package WDA_SET_BSSKEY_REQ message parameters
3703 limSendSetBssKeyReq(pMac, pMlmSetKeysReq,psessionEntry);
3704 return;
3705 }else {
3706 // Package WDA_SET_STAKEY_REQ / WDA_SET_STA_BCASTKEY_REQ message parameters
3707 limSendSetStaKeyReq(pMac, pMlmSetKeysReq, staIdx, (tANI_U8) defaultKeyId,psessionEntry);
3708 return;
3709 }
3710
3711end:
3712 mlmSetKeysCnf.sessionId= pMlmSetKeysReq->sessionId;
3713 limPostSmeSetKeysCnf( pMac, pMlmSetKeysReq, &mlmSetKeysCnf );
3714
3715} /*** limProcessMlmSetKeysReq() ***/
3716
3717/**
3718 * limProcessMlmRemoveKeyReq()
3719 *
3720 *FUNCTION:
3721 * This function is called to process MLM_REMOVEKEY_REQ message
3722 * from SME
3723 *
3724 *LOGIC:
3725 *
3726 *ASSUMPTIONS:
3727 *
3728 *NOTE:
3729 *
3730 * @param pMac Pointer to Global MAC structure
3731 * @param *pMsgBuf A pointer to the MLM message buffer
3732 * @return None
3733 */
3734
3735static void
3736limProcessMlmRemoveKeyReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3737{
3738tANI_U16 aid;
3739tANI_U16 staIdx = 0;
3740tSirMacAddr currentBssId;
3741tpDphHashNode pStaDs;
3742tLimMlmRemoveKeyReq *pMlmRemoveKeyReq;
3743tLimMlmRemoveKeyCnf mlmRemoveKeyCnf;
3744 tpPESession psessionEntry;
3745
3746 if(pMsgBuf == NULL)
3747 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003748 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003749 return;
3750 }
3751
3752 pMlmRemoveKeyReq = (tLimMlmRemoveKeyReq *) pMsgBuf;
3753
3754
3755 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmRemoveKeyReq->sessionId))== NULL)
3756 {
3757 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003758 FL("session does not exist for given sessionId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303759 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07003760 return;
3761 }
3762
3763
3764 if( pMac->lim.gpLimMlmRemoveKeyReq != NULL )
3765 {
3766 // Free any previous requests.
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303767 vos_mem_free(pMac->lim.gpLimMlmRemoveKeyReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003768 pMac->lim.gpLimMlmRemoveKeyReq = NULL;
3769 }
3770 // Hold onto the RemoveKeys request parameters
3771 pMac->lim.gpLimMlmRemoveKeyReq = (void *) pMlmRemoveKeyReq;
3772
3773 #if 0
3774 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac,
3775 WNI_CFG_BSSID,
3776 currentBssId,
3777 &cfg ))
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003778 limLog( pMac, LOGP, FL("Could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003779 #endif //TO-SUPPORT BT-AMP
3780 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3781
3782 switch( psessionEntry->limSystemRole )
3783 {
3784 case eLIM_STA_ROLE:
3785 case eLIM_BT_AMP_STA_ROLE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303786 if (( limIsAddrBC( pMlmRemoveKeyReq->peerMacAddr ) != true ) &&
3787 (!vos_mem_compare(pMlmRemoveKeyReq->peerMacAddr,
3788 currentBssId,
3789 sizeof(tSirMacAddr))))
Jeff Johnson295189b2012-06-20 16:38:30 -07003790 {
3791 limLog( pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003792 FL("Received MLM_REMOVEKEY_REQ with invalid BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003793 limPrintMacAddr( pMac, pMlmRemoveKeyReq->peerMacAddr, LOGW );
3794
3795 // Prepare and Send LIM_MLM_REMOVEKEY_CNF with error code
3796 mlmRemoveKeyCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3797 goto end;
3798 }
3799 break;
3800
3801 case eLIM_STA_IN_IBSS_ROLE:
3802 default: // eLIM_AP_ROLE
3803 // Fall thru...
3804 break;
3805 }
3806
3807
3808 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
3809 if(limIsAddrBC( pMlmRemoveKeyReq->peerMacAddr )) //Second condition for IBSS or AP role.
3810 {
3811 psessionEntry->limMlmState = eLIM_MLM_WT_REMOVE_BSS_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003812 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003813 // Package WDA_REMOVE_BSSKEY_REQ message parameters
3814 limSendRemoveBssKeyReq( pMac,pMlmRemoveKeyReq,psessionEntry);
3815 return;
3816 }
3817
3818 /**
3819 * Check if there exists a context for the
3820 * peer entity for which keys need to be removed.
3821 */
3822 pStaDs = dphLookupHashEntry( pMac, pMlmRemoveKeyReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable );
3823 if ((pStaDs == NULL) ||
3824 (pStaDs &&
3825 (pStaDs->mlmStaContext.mlmState !=
3826 eLIM_MLM_LINK_ESTABLISHED_STATE)))
3827 {
3828 /**
3829 * Received LIM_MLM_REMOVEKEY_REQ for STA
3830 * that does not have context or in some
3831 * transit state. Log error.
3832 */
3833 limLog( pMac, LOGW,
3834 FL("Received MLM_REMOVEKEYS_REQ for STA that either has no context or in some transit state, Addr = "));
3835 limPrintMacAddr( pMac, pMlmRemoveKeyReq->peerMacAddr, LOGW );
3836
3837 // Prepare and Send LIM_MLM_REMOVEKEY_CNF
3838 mlmRemoveKeyCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3839 mlmRemoveKeyCnf.sessionId = pMlmRemoveKeyReq->sessionId;
3840
3841
3842 goto end;
3843 }
3844 else
3845 staIdx = pStaDs->staIndex;
3846
3847
3848
3849 psessionEntry->limMlmState = eLIM_MLM_WT_REMOVE_STA_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003850 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003851
3852 // Package WDA_REMOVE_STAKEY_REQ message parameters
3853 limSendRemoveStaKeyReq( pMac,pMlmRemoveKeyReq,staIdx,psessionEntry);
3854 return;
3855
3856end:
3857 limPostSmeRemoveKeyCnf( pMac,
Jeff Johnsone7245742012-09-05 17:12:55 -07003858 psessionEntry,
Jeff Johnson295189b2012-06-20 16:38:30 -07003859 pMlmRemoveKeyReq,
3860 &mlmRemoveKeyCnf );
3861
3862} /*** limProcessMlmRemoveKeyReq() ***/
3863
3864
3865/**
3866 * limProcessMinChannelTimeout()
3867 *
3868 *FUNCTION:
3869 * This function is called to process Min Channel Timeout
3870 * during channel scan.
3871 *
3872 *LOGIC:
3873 *
3874 *ASSUMPTIONS:
3875 *
3876 *NOTE:
3877 *
3878 * @param pMac Pointer to Global MAC structure
3879 * @return None
3880 */
3881
3882static void
3883limProcessMinChannelTimeout(tpAniSirGlobal pMac)
3884{
3885 tANI_U8 channelNum;
3886
3887#ifdef GEN6_TODO
3888 //if the min Channel is maintained per session, then use the below seesionEntry
3889 //priority - LOW/might not be needed
3890
3891 //TBD-RAJESH HOW TO GET sessionEntry?????
3892 tpPESession psessionEntry;
3893
3894 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimMinChannelTimer.sessionId))== NULL)
3895 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003896 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003897 return;
3898 }
3899#endif
3900
Abhishek Singh89e1d672013-11-28 15:13:42 +05303901 /*do not process if we are in finish scan wait state i.e.
3902 scan is aborted or finished*/
3903 if (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE &&
3904 pMac->lim.gLimHalScanState != eLIM_HAL_FINISH_SCAN_WAIT_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07003905 {
Jeff Johnson295189b2012-06-20 16:38:30 -07003906 /// Min channel timer timed out
3907 pMac->lim.limTimers.gLimPeriodicProbeReqTimer.sessionId = 0xff;
3908 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
3909 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -08003910 pMac->lim.probeCounter = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003911 if (pMac->lim.gLimCurrentScanChannelId <=
3912 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
3913 {
3914 channelNum = (tANI_U8)limGetCurrentScanChannel(pMac);
3915 }
3916 else
3917 {
3918 // This shouldn't be the case, but when this happens, this timeout should be for the last channelId.
3919 // Get the channelNum as close to correct as possible.
3920 if(pMac->lim.gpLimMlmScanReq->channelList.channelNumber)
3921 {
3922 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1];
3923 }
3924 else
3925 {
3926 channelNum = 1;
3927 }
3928 }
3929
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07003930 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05303931 FL("Sending End Scan req from MIN_CH_TIMEOUT in state %d ch-%d"),
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07003932 pMac->lim.gLimMlmState,channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -07003933 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
3934 }
3935 else
3936 {
3937 /**
3938 * MIN channel timer should not have timed out
3939 * in states other than wait_probe_response.
3940 * Log error.
3941 */
3942 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05303943 FL("received unexpected MIN channel timeout in mlme state %d and hal scan State %d"),
Abhishek Singh89e1d672013-11-28 15:13:42 +05303944 pMac->lim.gLimMlmState,pMac->lim.gLimHalScanState);
Jeff Johnson295189b2012-06-20 16:38:30 -07003945 limPrintMlmState(pMac, LOGE, pMac->lim.gLimMlmState);
3946 }
3947} /*** limProcessMinChannelTimeout() ***/
3948
3949
3950
3951/**
3952 * limProcessMaxChannelTimeout()
3953 *
3954 *FUNCTION:
3955 * This function is called to process Max Channel Timeout
3956 * during channel scan.
3957 *
3958 *LOGIC:
3959 *
3960 *ASSUMPTIONS:
3961 *
3962 *NOTE:
3963 *
3964 * @param pMac Pointer to Global MAC structure
3965 * @return None
3966 */
3967
3968static void
3969limProcessMaxChannelTimeout(tpAniSirGlobal pMac)
3970{
3971 tANI_U8 channelNum;
3972
Abhishek Singh89e1d672013-11-28 15:13:42 +05303973 /*do not process if we are in finish scan wait state i.e.
3974 scan is aborted or finished*/
3975 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE ||
3976 pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) &&
3977 pMac->lim.gLimHalScanState != eLIM_HAL_FINISH_SCAN_WAIT_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07003978 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +05303979 limLog(pMac, LOG1, FL("Scanning : Max channel timed out"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003980 /**
3981 * MAX channel timer timed out
3982 * Continue channel scan.
3983 */
3984 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
3985 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
3986 pMac->lim.limTimers.gLimPeriodicProbeReqTimer.sessionId = 0xff;
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -08003987 pMac->lim.probeCounter = 0;
3988
Kiet Lamaa8e15a2014-02-11 23:30:06 -08003989 if (pMac->lim.gLimCurrentScanChannelId <=
Jeff Johnson295189b2012-06-20 16:38:30 -07003990 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
3991 {
3992 channelNum = limGetCurrentScanChannel(pMac);
3993 }
3994 else
3995 {
3996 if(pMac->lim.gpLimMlmScanReq->channelList.channelNumber)
3997 {
3998 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1];
3999 }
4000 else
4001 {
4002 channelNum = 1;
4003 }
4004 }
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07004005 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304006 FL("Sending End Scan req from MAX_CH_TIMEOUT in state %d on ch-%d"),
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07004007 pMac->lim.gLimMlmState,channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -07004008 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
4009 }
4010 else
4011 {
4012 /**
4013 * MAX channel timer should not have timed out
4014 * in states other than wait_scan.
4015 * Log error.
4016 */
4017 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304018 FL("received unexpected MAX channel timeout in mlme state %d and hal scan state %d"),
Abhishek Singh89e1d672013-11-28 15:13:42 +05304019 pMac->lim.gLimMlmState, pMac->lim.gLimHalScanState);
Jeff Johnson295189b2012-06-20 16:38:30 -07004020 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
4021 }
4022} /*** limProcessMaxChannelTimeout() ***/
4023
4024/**
4025 * limProcessPeriodicProbeReqTimer()
4026 *
4027 *FUNCTION:
4028 * This function is called to process periodic probe request
4029 * to send during scan.
4030 *
4031 *LOGIC:
4032 *
4033 *ASSUMPTIONS:
4034 *
4035 *NOTE:
4036 *
4037 * @param pMac Pointer to Global MAC structure
4038 * @return None
4039 */
4040
4041static void
4042limProcessPeriodicProbeReqTimer(tpAniSirGlobal pMac)
4043{
4044 tANI_U8 channelNum;
4045 tANI_U8 i = 0;
4046 tSirRetStatus status = eSIR_SUCCESS;
4047 TX_TIMER *pPeriodicProbeReqTimer;
4048 pPeriodicProbeReqTimer = &pMac->lim.limTimers.gLimPeriodicProbeReqTimer;
4049
4050 if(vos_timer_getCurrentState(&pPeriodicProbeReqTimer->vosTimer)
4051 != VOS_TIMER_STATE_STOPPED)
4052 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304053 limLog(pMac, LOG1, FL("Invalid state of timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004054 return;
4055 }
4056
4057 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) &&
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -08004058 (pPeriodicProbeReqTimer->sessionId != 0xff) && (pMac->lim.probeCounter < pMac->lim.maxProbe))
Jeff Johnson295189b2012-06-20 16:38:30 -07004059 {
4060 tLimMlmScanReq *pLimMlmScanReq = pMac->lim.gpLimMlmScanReq;
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -08004061 pMac->lim.probeCounter++;
Jeff Johnson295189b2012-06-20 16:38:30 -07004062 /**
4063 * Periodic channel timer timed out
4064 * to send probe request.
4065 */
4066 channelNum = limGetCurrentScanChannel(pMac);
Abhishek Singh795e1b82015-09-25 15:35:03 +05304067 /* Prepare and send Probe Request frame for all the SSIDs
4068 * present in the saved MLM
4069 */
Jeff Johnson295189b2012-06-20 16:38:30 -07004070 do
4071 {
Siddharth Bhal4f3187c2014-10-09 21:38:08 +05304072 tSirMacAddr gSelfMacAddr;
4073
Abhishek Singh795e1b82015-09-25 15:35:03 +05304074 /* Send self MAC as src address if
4075 * MAC spoof is not enabled OR
4076 * spoofMacAddr is all 0 OR
4077 * disableP2PMacSpoof is enabled and scan is P2P scan
4078 * else use the spoofMac as src address
Jeff Johnson295189b2012-06-20 16:38:30 -07004079 */
Abhishek Singh795e1b82015-09-25 15:35:03 +05304080 if ((pMac->lim.isSpoofingEnabled != TRUE) ||
4081 (TRUE ==
4082 vos_is_macaddr_zero((v_MACADDR_t *)&pMac->lim.spoofMacAddr)) ||
4083 (pMac->roam.configParam.disableP2PMacSpoofing &&
4084 pMac->lim.gpLimMlmScanReq->p2pSearch)) {
Siddharth Bhal4f3187c2014-10-09 21:38:08 +05304085 vos_mem_copy(gSelfMacAddr, pMac->lim.gSelfMacAddr, VOS_MAC_ADDRESS_LEN);
4086 } else {
4087 vos_mem_copy(gSelfMacAddr, pMac->lim.spoofMacAddr, VOS_MAC_ADDRESS_LEN);
4088 }
4089 limLog( pMac, LOG1, FL("Mac Addr used in Probe Req is :"MAC_ADDRESS_STR),
4090 MAC_ADDR_ARRAY(gSelfMacAddr));
4091
Jeff Johnson295189b2012-06-20 16:38:30 -07004092 /*
4093 * PELOGE(limLog(pMac, LOGW, FL("sending ProbeReq number %d,"
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004094 * " for SSID %s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004095 * i, pLimMlmScanReq->ssId[i].ssId,
4096 * channelNum);)
4097 */
4098 status = limSendProbeReqMgmtFrame( pMac, &pLimMlmScanReq->ssId[i],
Siddharth Bhal4f3187c2014-10-09 21:38:08 +05304099 pLimMlmScanReq->bssId, channelNum, gSelfMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07004100 pLimMlmScanReq->dot11mode, pLimMlmScanReq->uIEFieldLen,
4101 (tANI_U8 *)(pLimMlmScanReq) + pLimMlmScanReq->uIEFieldOffset);
4102
4103
4104 if ( status != eSIR_SUCCESS)
4105 {
4106 PELOGE(limLog(pMac, LOGE, FL("send ProbeReq failed for SSID "
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004107 "%s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004108 pLimMlmScanReq->ssId[i].ssId,
4109 channelNum);)
4110 return;
4111 }
4112 i++;
4113 } while (i < pLimMlmScanReq->numSsid);
4114
4115 /* Activate timer again */
4116 if (tx_timer_activate(pPeriodicProbeReqTimer) != TX_SUCCESS)
4117 {
4118 limLog(pMac, LOGP, FL("could not start periodic probe"
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004119 " req timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004120 return;
4121 }
4122 }
4123 else
4124 {
4125 /**
4126 * Periodic scan is timeout is happening in
4127 * in states other than wait_scan.
4128 * Log error.
4129 */
Mohit Khanna23863762012-09-11 17:40:09 -07004130 limLog(pMac, LOG1,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304131 FL("received unexpected Periodic scan timeout in state %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004132 pMac->lim.gLimMlmState);
4133 }
4134} /*** limProcessPeriodicProbeReqTimer() ***/
4135
4136/**
4137 * limProcessJoinFailureTimeout()
4138 *
4139 *FUNCTION:
4140 * This function is called to process JoinFailureTimeout
4141 *
4142 *LOGIC:
4143 *
4144 *ASSUMPTIONS:
4145 *
4146 *NOTE:
4147 *
4148 * @param pMac Pointer to Global MAC structure
4149 * @return None
4150 */
4151
4152static void
4153limProcessJoinFailureTimeout(tpAniSirGlobal pMac)
4154{
4155 tLimMlmJoinCnf mlmJoinCnf;
4156 tSirMacAddr bssid;
4157 tANI_U32 len;
krunal soni8d13b092013-07-19 13:23:29 -07004158#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4159 vos_log_rssi_pkt_type *pRssiLog = NULL;
4160#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07004161
4162 //fetch the sessionEntry based on the sessionId
4163 tpPESession psessionEntry;
4164
4165 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimJoinFailureTimer.sessionId))== NULL)
4166 {
Srinivas Girigowda2a69dcf2013-09-13 14:48:34 -07004167 limLog(pMac, LOGE, FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004168 return;
4169 }
krunal soni8d13b092013-07-19 13:23:29 -07004170
4171#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4172 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
4173 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
4174 if (pRssiLog)
4175 {
4176 pRssiLog->rssi = psessionEntry->rssi;
4177 }
4178 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
4179#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
4180
Jeff Johnson295189b2012-06-20 16:38:30 -07004181 if (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE)
4182 {
4183 len = sizeof(tSirMacAddr);
4184
4185 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, bssid, &len) !=
4186 eSIR_SUCCESS)
4187 {
4188 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004189 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004190 return;
4191 }
4192
4193 // 'Change' timer for future activations
4194 limDeactivateAndChangeTimer(pMac, eLIM_JOIN_FAIL_TIMER);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004195 // Change Periodic probe req timer for future activation
4196 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_JOIN_PROBE_REQ_TIMER);
Jeff Johnson295189b2012-06-20 16:38:30 -07004197 /**
4198 * Issue MLM join confirm with timeout reason code
4199 */
Kiet Lam82004c62013-11-11 13:24:28 +05304200 PELOGE(limLog(pMac, LOGE, FL(" In state eLIM_MLM_WT_JOIN_BEACON_STATE."));)
4201 PELOGE(limLog(pMac, LOGE, FL(" Join Failure Timeout occurred for session %d with BSS "),
4202 psessionEntry->peSessionId);
4203 limPrintMacAddr(pMac, psessionEntry->bssId, LOGE);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004204
4205 mlmJoinCnf.resultCode = eSIR_SME_JOIN_TIMEOUT_RESULT_CODE;
4206 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
4207
4208 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07004209 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004210 if(limSetLinkState(pMac, eSIR_LINK_IDLE_STATE, psessionEntry->bssId,
4211 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004212 PELOGE(limLog(pMac, LOGE, FL("Failed to set the LinkState"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004213 /* Update PE session Id */
4214 mlmJoinCnf.sessionId = psessionEntry->peSessionId;
4215
4216
4217 // Freeup buffer allocated to join request
4218 if (psessionEntry->pLimMlmJoinReq)
4219 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304220 vos_mem_free(psessionEntry->pLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004221 psessionEntry->pLimMlmJoinReq = NULL;
4222 }
4223
4224 limPostSmeMessage(pMac,
4225 LIM_MLM_JOIN_CNF,
4226 (tANI_U32 *) &mlmJoinCnf);
4227
4228 return;
4229 }
4230 else
4231 {
4232 /**
4233 * Join failure timer should not have timed out
4234 * in states other than wait_join_beacon state.
4235 * Log error.
4236 */
4237 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304238 FL("received unexpected JOIN failure timeout in state %d"),psessionEntry->limMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -07004239 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
4240 }
4241} /*** limProcessJoinFailureTimeout() ***/
4242
4243
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004244/**
4245 * limProcessPeriodicJoinProbeReqTimer()
4246 *
4247 *FUNCTION:
4248 * This function is called to process periodic probe request
4249 * send during joining process.
4250 *
4251 *LOGIC:
4252 *
4253 *ASSUMPTIONS:
4254 *
4255 *NOTE:
4256 *
4257 * @param pMac Pointer to Global MAC structure
4258 * @return None
4259 */
4260
4261static void limProcessPeriodicJoinProbeReqTimer(tpAniSirGlobal pMac)
4262{
4263 tpPESession psessionEntry;
4264 tSirMacSSid ssId;
4265
4266 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer.sessionId))== NULL)
4267 {
Kiet Lam82004c62013-11-11 13:24:28 +05304268 limLog(pMac, LOGE,FL("session does not exist for given SessionId : %d"),
4269 pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer.sessionId);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004270 return;
4271 }
4272
4273 if((VOS_TRUE == tx_timer_running(&pMac->lim.limTimers.gLimJoinFailureTimer)) &&
4274 (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE))
4275 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304276 vos_mem_copy(ssId.ssId,
4277 psessionEntry->ssId.ssId,
4278 psessionEntry->ssId.length);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004279 ssId.length = psessionEntry->ssId.length;
4280
4281 limSendProbeReqMgmtFrame( pMac, &ssId,
4282 psessionEntry->pLimMlmJoinReq->bssDescription.bssId, psessionEntry->currentOperChannel/*chanNum*/,
4283 psessionEntry->selfMacAddr, psessionEntry->dot11mode,
4284 psessionEntry->pLimJoinReq->addIEScan.length, psessionEntry->pLimJoinReq->addIEScan.addIEdata);
4285
4286 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_JOIN_PROBE_REQ_TIMER);
4287
4288 // Activate Join Periodic Probe Req timer
4289 if (tx_timer_activate(&pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer) != TX_SUCCESS)
4290 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004291 limLog(pMac, LOGP, FL("could not activate Periodic Join req failure timer"));
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004292 return;
4293 }
4294 }
4295 return;
4296} /*** limProcessPeriodicJoinProbeReqTimer() ***/
4297
Sushant Kaushik9e923872015-04-02 17:09:31 +05304298/**
4299 * limProcessAuthRetryTimer()
4300 *
4301 *FUNCTION:
4302 * This function is called to process Auth Retry request
4303 * send during joining process.
4304 *
4305 *LOGIC:
4306 *
4307 *ASSUMPTIONS:
4308 *
4309 *NOTE:
4310 *
4311 * @param pMac Pointer to Global MAC structure
4312 * @return None
4313 */
4314
4315static void limProcessAuthRetryTimer(tpAniSirGlobal pMac)
4316{
4317 tpPESession psessionEntry;
4318 limLog(pMac, LOG1, FL(" ENTER "));
4319 if ((psessionEntry =
4320 peFindSessionBySessionId(pMac,
4321 pMac->lim.limTimers.gLimPeriodicAuthRetryTimer.sessionId)) == NULL)
4322 {
4323 limLog(pMac, LOGE,FL("session does not exist for given SessionId : %d"),
4324 pMac->lim.limTimers.gLimPeriodicAuthRetryTimer.sessionId);
4325 return;
4326 }
4327
4328 if ((VOS_TRUE ==
4329 tx_timer_running(&pMac->lim.limTimers.gLimAuthFailureTimer)) &&
4330 (psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME2_STATE) &&
4331 (LIM_AUTH_ACK_RCD_SUCCESS != pMac->authAckStatus))
4332 {
4333 tSirMacAuthFrameBody authFrameBody;
4334
4335 /* Send the auth retry only in case we have received ack failure
4336 * else just restart the retry timer.
4337 */
4338 if (LIM_AUTH_ACK_RCD_FAILURE == pMac->authAckStatus)
4339 {
4340 /// Prepare & send Authentication frame
4341 authFrameBody.authAlgoNumber =
4342 (tANI_U8) pMac->lim.gpLimMlmAuthReq->authType;
4343 authFrameBody.authTransactionSeqNumber = SIR_MAC_AUTH_FRAME_1;
4344 authFrameBody.authStatusCode = 0;
4345 limLog(pMac, LOGW, FL("Retry Auth "));
4346 pMac->authAckStatus = LIM_AUTH_ACK_NOT_RCD;
4347 limSendAuthMgmtFrame(pMac,
4348 &authFrameBody,
4349 pMac->lim.gpLimMlmAuthReq->peerMacAddr,
4350 LIM_NO_WEP_IN_FC, psessionEntry, eSIR_TRUE);
4351 }
4352
4353 limDeactivateAndChangeTimer(pMac, eLIM_AUTH_RETRY_TIMER);
4354
4355 // Activate Auth Retry timer
4356 if (tx_timer_activate(&pMac->lim.limTimers.gLimPeriodicAuthRetryTimer)
4357 != TX_SUCCESS)
4358 {
4359 limLog(pMac, LOGE,
4360 FL("could not activate Auth Retry failure timer"));
4361 return;
4362 }
4363 }
4364 return;
4365} /*** limProcessAuthRetryTimer() ***/
4366
Jeff Johnson295189b2012-06-20 16:38:30 -07004367
4368/**
4369 * limProcessAuthFailureTimeout()
4370 *
4371 *FUNCTION:
4372 * This function is called to process Min Channel Timeout
4373 * during channel scan.
4374 *
4375 *LOGIC:
4376 *
4377 *ASSUMPTIONS:
4378 *
4379 *NOTE:
4380 *
4381 * @param pMac Pointer to Global MAC structure
4382 * @return None
4383 */
4384
4385static void
4386limProcessAuthFailureTimeout(tpAniSirGlobal pMac)
4387{
4388 //fetch the sessionEntry based on the sessionId
4389 tpPESession psessionEntry;
krunal soni8d13b092013-07-19 13:23:29 -07004390#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4391 vos_log_rssi_pkt_type *pRssiLog = NULL;
4392#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07004393 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimAuthFailureTimer.sessionId))== NULL)
4394 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004395 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004396 return;
4397 }
Abhishek Singhdcbd8272014-01-09 14:16:01 +05304398 limLog(pMac, LOGE, FL("received AUTH failure timeout in sessionid %d "
Sushant Kaushik1b645382014-10-13 16:39:36 +05304399 "limMlmstate %d limSmeState %d"), psessionEntry->peSessionId,
Abhishek Singhdcbd8272014-01-09 14:16:01 +05304400 psessionEntry->limMlmState, psessionEntry->limSmeState);
krunal soni8d13b092013-07-19 13:23:29 -07004401#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4402 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
4403 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
4404 if (pRssiLog)
4405 {
4406 pRssiLog->rssi = psessionEntry->rssi;
4407 }
4408 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
4409#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
4410
Jeff Johnson295189b2012-06-20 16:38:30 -07004411 switch (psessionEntry->limMlmState)
4412 {
4413 case eLIM_MLM_WT_AUTH_FRAME2_STATE:
4414 case eLIM_MLM_WT_AUTH_FRAME4_STATE:
4415 /**
4416 * Requesting STA did not receive next auth frame
4417 * before Auth Failure timeout.
4418 * Issue MLM auth confirm with timeout reason code
4419 */
Madan Mohan Koyyalamudi666d33a2012-11-29 11:32:59 -08004420 //Restore default failure timeout
4421 if (VOS_P2P_CLIENT_MODE == psessionEntry->pePersona && psessionEntry->defaultAuthFailureTimeout)
4422 {
4423 ccmCfgSetInt(pMac,WNI_CFG_AUTHENTICATE_FAILURE_TIMEOUT ,
4424 psessionEntry->defaultAuthFailureTimeout, NULL, eANI_BOOLEAN_FALSE);
4425 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004426 limRestoreFromAuthState(pMac,eSIR_SME_AUTH_TIMEOUT_RESULT_CODE,eSIR_MAC_UNSPEC_FAILURE_REASON,psessionEntry);
4427 break;
4428
4429 default:
4430 /**
4431 * Auth failure timer should not have timed out
4432 * in states other than wt_auth_frame2/4
4433 * Log error.
4434 */
Sushant Kaushik1b645382014-10-13 16:39:36 +05304435 PELOGE(limLog(pMac, LOGE, FL("received unexpected AUTH failure timeout in state %d"), psessionEntry->limMlmState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004436 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
4437
4438 break;
4439 }
4440} /*** limProcessAuthFailureTimeout() ***/
4441
4442
4443
4444/**
4445 * limProcessAuthRspTimeout()
4446 *
4447 *FUNCTION:
4448 * This function is called to process Min Channel Timeout
4449 * during channel scan.
4450 *
4451 *LOGIC:
4452 *
4453 *ASSUMPTIONS:
4454 *
4455 *NOTE:
4456 *
4457 * @param pMac Pointer to Global MAC structure
4458 * @return None
4459 */
4460
4461static void
4462limProcessAuthRspTimeout(tpAniSirGlobal pMac, tANI_U32 authIndex)
4463{
4464 struct tLimPreAuthNode *pAuthNode;
4465 tpPESession psessionEntry;
4466 tANI_U8 sessionId;
4467
4468 pAuthNode = limGetPreAuthNodeFromIndex(pMac, &pMac->lim.gLimPreAuthTimerTable, authIndex);
4469
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304470 if (NULL == pAuthNode)
4471 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004472 limLog(pMac, LOGW, FL("Invalid auth node"));
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304473 return;
4474 }
4475
4476 if ((psessionEntry = peFindSessionByBssid(pMac, pAuthNode->peerMacAddr, &sessionId)) == NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -07004477 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004478 limLog(pMac, LOGW, FL("session does not exist for given BSSID "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004479 return;
4480 }
4481
4482 if (psessionEntry->limSystemRole == eLIM_AP_ROLE ||
4483 psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE)
4484 {
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304485 if (pAuthNode->mlmState != eLIM_MLM_WT_AUTH_FRAME3_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004486 {
4487 /**
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304488 * Authentication response timer timedout
4489 * in unexpected state. Log error
Jeff Johnson295189b2012-06-20 16:38:30 -07004490 */
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304491 PELOGE(limLog(pMac, LOGE,
Abhishek Singhcd09b562013-12-24 16:02:20 +05304492 FL("received AUTH rsp timeout in unexpected state "
4493 "for MAC address: "MAC_ADDRESS_STR),
4494 MAC_ADDR_ARRAY(pAuthNode->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004495 }
4496 else
4497 {
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304498 // Authentication response timer
4499 // timedout for an STA.
4500 pAuthNode->mlmState = eLIM_MLM_AUTH_RSP_TIMEOUT_STATE;
4501 pAuthNode->fTimerStarted = 0;
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304502 limLog(pMac, LOG1,
Abhishek Singhcd09b562013-12-24 16:02:20 +05304503 FL("AUTH rsp timedout for MAC address "MAC_ADDRESS_STR),
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304504 MAC_ADDR_ARRAY(pAuthNode->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004505
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304506 // Change timer to reactivate it in future
4507 limDeactivateAndChangePerStaIdTimer(pMac,
4508 eLIM_AUTH_RSP_TIMER,
4509 pAuthNode->authNodeIdx);
Jeff Johnson295189b2012-06-20 16:38:30 -07004510
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304511 limDeletePreAuthNode(pMac, pAuthNode->peerMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -07004512 }
4513 }
4514} /*** limProcessAuthRspTimeout() ***/
4515
4516
4517/**
4518 * limProcessAssocFailureTimeout()
4519 *
4520 *FUNCTION:
4521 * This function is called to process Min Channel Timeout
4522 * during channel scan.
4523 *
4524 *LOGIC:
4525 *
4526 *ASSUMPTIONS:
4527 *
4528 *NOTE:
4529 *
4530 * @param pMac Pointer to Global MAC structure
4531 * @return None
4532 */
4533
4534static void
4535limProcessAssocFailureTimeout(tpAniSirGlobal pMac, tANI_U32 MsgType)
4536{
4537
4538 tLimMlmAssocCnf mlmAssocCnf;
4539 tpPESession psessionEntry;
krunal soni8d13b092013-07-19 13:23:29 -07004540#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4541 vos_log_rssi_pkt_type *pRssiLog = NULL;
4542#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07004543
4544 //to fetch the lim/mlm state based on the sessionId, use the below sessionEntry
4545 tANI_U8 sessionId;
4546
4547 if(MsgType == LIM_ASSOC)
4548 {
4549 sessionId = pMac->lim.limTimers.gLimAssocFailureTimer.sessionId;
4550 }
4551 else
4552 {
4553 sessionId = pMac->lim.limTimers.gLimReassocFailureTimer.sessionId;
4554 }
4555
4556 if((psessionEntry = peFindSessionBySessionId(pMac, sessionId))== NULL)
4557 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004558 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004559 return;
4560 }
krunal soni8d13b092013-07-19 13:23:29 -07004561#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4562 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
4563 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
4564 if (pRssiLog)
4565 {
4566 pRssiLog->rssi = psessionEntry->rssi;
4567 }
4568 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
4569#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
4570
Jeff Johnson295189b2012-06-20 16:38:30 -07004571 /**
4572 * Expected Re/Association Response frame
4573 * not received within Re/Association Failure Timeout.
4574 */
4575
4576
4577
4578
4579 /* CR: vos packet memory is leaked when assoc rsp timeouted/failed. */
4580 /* notify TL that association is failed so that TL can flush the cached frame */
4581 WLANTL_AssocFailed (psessionEntry->staId);
4582
4583 // Log error
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304584 limLog(pMac, LOG1,
4585 FL("Re/Association Response not received before timeout "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004586
4587 if (( (psessionEntry->limSystemRole == eLIM_AP_ROLE) || (psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE) )||
4588 ( (psessionEntry->limMlmState != eLIM_MLM_WT_ASSOC_RSP_STATE) &&
4589 (psessionEntry->limMlmState != eLIM_MLM_WT_REASSOC_RSP_STATE) &&
4590 (psessionEntry->limMlmState != eLIM_MLM_WT_FT_REASSOC_RSP_STATE)))
4591 {
4592 /**
4593 * Re/Assoc failure timer should not have timedout on AP
4594 * or in a state other than wt_re/assoc_response.
4595 */
4596
4597 // Log error
4598 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304599 FL("received unexpected REASSOC failure timeout in state %d for role %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004600 psessionEntry->limMlmState, psessionEntry->limSystemRole);
4601 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
4602 }
4603 else
4604 {
4605
4606 if ((MsgType == LIM_ASSOC) ||
4607 ((MsgType == LIM_REASSOC) && (psessionEntry->limMlmState == eLIM_MLM_WT_FT_REASSOC_RSP_STATE)))
4608 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004609 PELOGE(limLog(pMac, LOGE, FL("(Re)Assoc Failure Timeout occurred."));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004610
4611 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07004612 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
4613
Jeff Johnson295189b2012-06-20 16:38:30 -07004614 // 'Change' timer for future activations
4615 limDeactivateAndChangeTimer(pMac, eLIM_ASSOC_FAIL_TIMER);
4616
4617 // Free up buffer allocated for JoinReq held by
4618 // MLM state machine
4619 if (psessionEntry->pLimMlmJoinReq)
4620 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304621 vos_mem_free(psessionEntry->pLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004622 psessionEntry->pLimMlmJoinReq = NULL;
4623 }
4624
Jeff Johnson295189b2012-06-20 16:38:30 -07004625 //To remove the preauth node in case of fail to associate
4626 if (limSearchPreAuthList(pMac, psessionEntry->bssId))
4627 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304628 limLog(pMac, LOG1, FL(" delete pre auth node for "
4629 MAC_ADDRESS_STR), MAC_ADDR_ARRAY(psessionEntry->bssId));
Jeff Johnson295189b2012-06-20 16:38:30 -07004630 limDeletePreAuthNode(pMac, psessionEntry->bssId);
4631 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004632
4633 mlmAssocCnf.resultCode =
4634 eSIR_SME_ASSOC_TIMEOUT_RESULT_CODE;
4635 mlmAssocCnf.protStatusCode =
4636 eSIR_MAC_UNSPEC_FAILURE_STATUS;
4637
4638 /* Update PE session Id*/
4639 mlmAssocCnf.sessionId = psessionEntry->peSessionId;
4640 if (MsgType == LIM_ASSOC)
4641 limPostSmeMessage(pMac, LIM_MLM_ASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
4642 else
4643 {
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004644 /* Will come here only in case of 11r, ESE, FT when reassoc rsp
Jeff Johnson295189b2012-06-20 16:38:30 -07004645 is not received and we receive a reassoc - timesout */
4646 mlmAssocCnf.resultCode = eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE;
4647 limPostSmeMessage(pMac, LIM_MLM_REASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
4648 }
4649 }
4650 else
4651 {
4652 /**
4653 * Restore pre-reassoc req state.
4654 * Set BSSID to currently associated AP address.
4655 */
4656 psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004657 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004658
4659 limRestorePreReassocState(pMac,
4660 eSIR_SME_REASSOC_TIMEOUT_RESULT_CODE, eSIR_MAC_UNSPEC_FAILURE_STATUS,psessionEntry);
4661 }
4662 }
4663} /*** limProcessAssocFailureTimeout() ***/
4664
4665
4666
4667/**
4668 * limCompleteMlmScan()
4669 *
4670 *FUNCTION:
4671 * This function is called to send MLM_SCAN_CNF message
4672 * to SME state machine.
4673 *
4674 *LOGIC:
4675 *
4676 *ASSUMPTIONS:
4677 *
4678 *NOTE:
4679 *
4680 * @param pMac Pointer to Global MAC structure
4681 * @param retCode Result code to be sent
4682 * @return None
4683 */
4684
4685void
4686limCompleteMlmScan(tpAniSirGlobal pMac, tSirResultCodes retCode)
4687{
4688 tLimMlmScanCnf mlmScanCnf;
4689
4690 /// Restore previous MLM state
4691 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004692 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004693 limRestorePreScanState(pMac);
4694
4695 // Free up pMac->lim.gLimMlmScanReq
4696 if( NULL != pMac->lim.gpLimMlmScanReq )
4697 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304698 vos_mem_free(pMac->lim.gpLimMlmScanReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004699 pMac->lim.gpLimMlmScanReq = NULL;
4700 }
4701
4702 mlmScanCnf.resultCode = retCode;
4703 mlmScanCnf.scanResultLength = pMac->lim.gLimMlmScanResultLength;
4704
4705 limPostSmeMessage(pMac, LIM_MLM_SCAN_CNF, (tANI_U32 *) &mlmScanCnf);
4706
4707} /*** limCompleteMlmScan() ***/
4708
4709/**
4710 * \brief Setup an A-MPDU/BA session
4711 *
4712 * \sa limProcessMlmAddBAReq
4713 *
4714 * \param pMac The global tpAniSirGlobal object
4715 *
4716 * \param pMsgBuf The MLME ADDBA Req message buffer
4717 *
4718 * \return none
4719 */
4720void limProcessMlmAddBAReq( tpAniSirGlobal pMac,
4721 tANI_U32 *pMsgBuf )
4722{
4723tSirRetStatus status = eSIR_SUCCESS;
4724tpLimMlmAddBAReq pMlmAddBAReq;
4725tpLimMlmAddBACnf pMlmAddBACnf;
4726 tpPESession psessionEntry;
4727
4728 if(pMsgBuf == NULL)
4729 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004730 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004731 return;
4732 }
4733
4734 pMlmAddBAReq = (tpLimMlmAddBAReq) pMsgBuf;
4735 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmAddBAReq->sessionId))== NULL)
4736 {
4737 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004738 FL("session does not exist for given sessionId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304739 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004740 return;
4741 }
4742
4743
4744 // Send ADDBA Req over the air
4745 status = limSendAddBAReq( pMac, pMlmAddBAReq,psessionEntry);
4746
4747 //
4748 // Respond immediately to LIM, only if MLME has not been
4749 // successfully able to send WDA_ADDBA_REQ to HAL.
4750 // Else, LIM_MLM_ADDBA_CNF will be sent after receiving
4751 // ADDBA Rsp from peer entity
4752 //
4753 if( eSIR_SUCCESS != status )
4754 {
4755 // Allocate for LIM_MLM_ADDBA_CNF
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304756
4757 pMlmAddBACnf = vos_mem_malloc(sizeof( tLimMlmAddBACnf ));
4758 if ( NULL == pMlmAddBACnf )
Jeff Johnson295189b2012-06-20 16:38:30 -07004759 {
4760 limLog( pMac, LOGP,
Jeff Johnson0f4d0bc2013-11-03 17:48:50 -08004761 FL("AllocateMemory failed"));
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304762 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004763 return;
4764 }
4765 else
4766 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304767 vos_mem_set((void *) pMlmAddBACnf, sizeof( tLimMlmAddBACnf ), 0);
4768 vos_mem_copy((void *) pMlmAddBACnf->peerMacAddr,
4769 (void *) pMlmAddBAReq->peerMacAddr,
4770 sizeof( tSirMacAddr ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004771
4772 pMlmAddBACnf->baDialogToken = pMlmAddBAReq->baDialogToken;
4773 pMlmAddBACnf->baTID = pMlmAddBAReq->baTID;
4774 pMlmAddBACnf->baPolicy = pMlmAddBAReq->baPolicy;
4775 pMlmAddBACnf->baBufferSize = pMlmAddBAReq->baBufferSize;
4776 pMlmAddBACnf->baTimeout = pMlmAddBAReq->baTimeout;
4777 pMlmAddBACnf->sessionId = pMlmAddBAReq->sessionId;
4778
4779 // Update the result code
4780 pMlmAddBACnf->addBAResultCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
4781
4782 limPostSmeMessage( pMac,
4783 LIM_MLM_ADDBA_CNF,
4784 (tANI_U32 *) pMlmAddBACnf );
4785 }
4786
4787 // Restore MLME state
4788 psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004789 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004790
4791 }
4792
4793 // Free the buffer allocated for tLimMlmAddBAReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304794 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004795
4796}
4797
4798/**
4799 * \brief Send an ADDBA Rsp to peer STA in response
4800 * to an ADDBA Req received earlier
4801 *
4802 * \sa limProcessMlmAddBARsp
4803 *
4804 * \param pMac The global tpAniSirGlobal object
4805 *
4806 * \param pMsgBuf The MLME ADDBA Rsp message buffer
4807 *
4808 * \return none
4809 */
4810void limProcessMlmAddBARsp( tpAniSirGlobal pMac,
4811 tANI_U32 *pMsgBuf )
4812{
4813tpLimMlmAddBARsp pMlmAddBARsp;
4814 tANI_U16 aid;
4815 tpDphHashNode pSta;
4816 tpPESession psessionEntry;
4817
4818
4819 if(pMsgBuf == NULL)
4820 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004821 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004822 return;
4823 }
4824
4825 pMlmAddBARsp = (tpLimMlmAddBARsp) pMsgBuf;
4826
4827 if(( psessionEntry = peFindSessionBySessionId(pMac,pMlmAddBARsp->sessionId))== NULL)
4828 {
4829 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004830 FL("session does not exist for given session ID"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304831 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004832 return;
4833 }
4834
4835
4836 // Send ADDBA Rsp over the air
4837 if( eSIR_SUCCESS != limSendAddBARsp( pMac,pMlmAddBARsp,psessionEntry))
4838 {
4839 limLog( pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004840 FL("Failed to send ADDBA Rsp to peer "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004841 limPrintMacAddr( pMac, pMlmAddBARsp->peerMacAddr, LOGE );
4842 /* Clean the BA context maintained by HAL and TL on failure */
4843 pSta = dphLookupHashEntry( pMac, pMlmAddBARsp->peerMacAddr, &aid,
4844 &psessionEntry->dph.dphHashTable);
4845 if( NULL != pSta )
4846 {
4847 limPostMsgDelBAInd( pMac, pSta, pMlmAddBARsp->baTID, eBA_RECIPIENT,
4848 psessionEntry);
4849 }
4850 }
4851
4852 // Time to post a WDA_DELBA_IND to HAL in order
4853 // to cleanup the HAL and SoftMAC entries
4854
4855
4856 // Free the buffer allocated for tLimMlmAddBARsp
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304857 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004858
4859}
4860
4861/**
4862 * \brief Setup an A-MPDU/BA session
4863 *
4864 * \sa limProcessMlmDelBAReq
4865 *
4866 * \param pMac The global tpAniSirGlobal object
4867 *
4868 * \param pMsgBuf The MLME DELBA Req message buffer
4869 *
4870 * \return none
4871 */
4872void limProcessMlmDelBAReq( tpAniSirGlobal pMac,
4873 tANI_U32 *pMsgBuf )
4874{
4875 tSirRetStatus status = eSIR_SUCCESS;
4876 tpLimMlmDelBAReq pMlmDelBAReq;
4877 tpLimMlmDelBACnf pMlmDelBACnf;
4878 tpPESession psessionEntry;
4879
4880
4881 if(pMsgBuf == NULL)
4882 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004883 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004884 return;
4885 }
4886
4887 // TODO - Need to validate MLME state
4888 pMlmDelBAReq = (tpLimMlmDelBAReq) pMsgBuf;
4889
4890 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDelBAReq->sessionId))== NULL)
4891 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004892 PELOGE(limLog(pMac, LOGE,FL("session does not exist for given bssId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304893 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004894 return;
4895 }
4896
4897 // Send DELBA Ind over the air
4898 if( eSIR_SUCCESS !=
4899 (status = limSendDelBAInd( pMac, pMlmDelBAReq,psessionEntry)))
4900 status = eSIR_SME_HAL_SEND_MESSAGE_FAIL;
4901 else
4902 {
4903 tANI_U16 aid;
4904 tpDphHashNode pSta;
4905
4906 // Time to post a WDA_DELBA_IND to HAL in order
4907 // to cleanup the HAL and SoftMAC entries
4908 pSta = dphLookupHashEntry( pMac, pMlmDelBAReq->peerMacAddr, &aid , &psessionEntry->dph.dphHashTable);
4909 if( NULL != pSta )
4910 {
4911 status = limPostMsgDelBAInd( pMac,
4912 pSta,
4913 pMlmDelBAReq->baTID,
4914 pMlmDelBAReq->baDirection,psessionEntry);
4915
4916 }
4917 }
4918
4919 //
4920 // Respond immediately to SME with DELBA CNF using
4921 // LIM_MLM_DELBA_CNF with appropriate status
4922 //
4923
4924 // Allocate for LIM_MLM_DELBA_CNF
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304925
4926 pMlmDelBACnf = vos_mem_malloc(sizeof( tLimMlmDelBACnf ));
4927 if ( NULL == pMlmDelBACnf )
Jeff Johnson295189b2012-06-20 16:38:30 -07004928 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304929 limLog( pMac, LOGP, FL("AllocateMemory failed"));
4930 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004931 return;
4932 }
4933 else
4934 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304935 vos_mem_set((void *) pMlmDelBACnf, sizeof( tLimMlmDelBACnf ), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004936
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304937 vos_mem_copy((void *) pMlmDelBACnf,
4938 (void *) pMlmDelBAReq,
4939 sizeof( tLimMlmDelBAReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004940
4941 // Update DELBA result code
4942 pMlmDelBACnf->delBAReasonCode = pMlmDelBAReq->delBAReasonCode;
4943
4944 /* Update PE session Id*/
4945 pMlmDelBACnf->sessionId = pMlmDelBAReq->sessionId;
4946
4947 limPostSmeMessage( pMac,
4948 LIM_MLM_DELBA_CNF,
4949 (tANI_U32 *) pMlmDelBACnf );
4950 }
4951
4952 // Free the buffer allocated for tLimMlmDelBAReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304953 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004954
4955}
4956
4957/**
4958 * @function : limSMPowerSaveStateInd( )
4959 *
4960 * @brief : This function is called upon receiving the PMC Indication to update the STA's MimoPs State.
4961 *
4962 * LOGIC:
4963 *
4964 * ASSUMPTIONS:
4965 * NA
4966 *
4967 * NOTE:
4968 * NA
4969 *
4970 * @param pMac - Pointer to Global MAC structure
4971 * @param limMsg - Lim Message structure object with the MimoPSparam in body
4972 * @return None
4973 */
4974
4975tSirRetStatus
4976limSMPowerSaveStateInd(tpAniSirGlobal pMac, tSirMacHTMIMOPowerSaveState state)
4977{
4978#if 0
4979 tSirRetStatus retStatus = eSIR_SUCCESS;
4980#if 0
4981 tANI_U32 cfgVal1;
4982 tANI_U16 cfgVal2;
4983 tSirMacHTCapabilityInfo *pHTCapabilityInfo;
4984 tpDphHashNode pSta = NULL;
4985
4986 tpPESession psessionEntry = &pMac->lim.gpSession[0]; //TBD-RAJESH HOW TO GET sessionEntry?????
4987 /** Verify the Mode of operation */
4988 if (pMac->lim.gLimSystemRole != eSYSTEM_STA_ROLE) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004989 PELOGE(limLog(pMac, LOGE, FL("Got PMC indication when System not in the STA Role"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004990 return eSIR_FAILURE;
4991 }
4992
4993 if ((pMac->lim.gHTMIMOPSState == state) || (state == eSIR_HT_MIMO_PS_NA )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004994 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 -07004995 return eSIR_FAILURE;
4996 }
4997
4998 if (!pMac->lim.htCapability){
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004999 PELOGW(limLog(pMac, LOGW, FL(" Not in 11n or HT capable mode"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07005000 return eSIR_FAILURE;
5001 }
5002
5003 /** Update the CFG about the default MimoPS State */
5004 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &cfgVal1) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005005 limLog(pMac, LOGP, FL("could not retrieve HT Cap CFG "));
Jeff Johnson295189b2012-06-20 16:38:30 -07005006 return eSIR_FAILURE;
5007 }
5008
5009 cfgVal2 = (tANI_U16)cfgVal1;
5010 pHTCapabilityInfo = (tSirMacHTCapabilityInfo *) &cfgVal2;
5011 pHTCapabilityInfo->mimoPowerSave = state;
5012
5013 if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005014 limLog(pMac, LOGP, FL("could not update HT Cap Info CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005015 return eSIR_FAILURE;
5016 }
5017
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005018 PELOG2(limLog(pMac, LOG2, FL(" The HT Capability for Mimo Pwr is updated to State: %u "),state);)
Jeff Johnson295189b2012-06-20 16:38:30 -07005019 if (pMac->lim.gLimSmeState != eLIM_SME_LINK_EST_STATE) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005020 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 -07005021 /** Update in the LIM the MIMO PS state of the SELF */
5022 pMac->lim.gHTMIMOPSState = state;
5023 return eSIR_SUCCESS;
5024 }
5025
5026 pSta = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable);
5027 if (!pSta->mlmStaContext.htCapability) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005028 limLog( pMac, LOGE,FL( "limSendSMPowerState: Peer is not HT Capable " ));
Jeff Johnson295189b2012-06-20 16:38:30 -07005029 return eSIR_FAILURE;
5030 }
5031
5032 if (isEnteringMimoPS(pMac->lim.gHTMIMOPSState, state)) {
5033 tSirMacAddr macAddr;
5034 /** Obtain the AP's Mac Address */
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05305035 vos_mem_copy((tANI_U8 *)macAddr, psessionEntry->bssId, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005036 /** Send Action Frame with the corresponding mode */
5037 retStatus = limSendSMPowerStateFrame(pMac, macAddr, state);
5038 if (retStatus != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005039 PELOGE(limLog(pMac, LOGE, "Update SM POWER: Sending Action Frame has failed");)
Jeff Johnson295189b2012-06-20 16:38:30 -07005040 return retStatus;
5041 }
5042 }
5043
5044 /** Update MlmState about the SetMimoPS State */
5045 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
5046 pMac->lim.gLimMlmState = eLIM_MLM_WT_SET_MIMOPS_STATE;
5047 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
5048
5049 /** Update the HAL and s/w mac about the mode to be set */
5050 retStatus = limPostSMStateUpdate( pMac,psessionEntry->staId, state);
5051
5052 PELOG2(limLog(pMac, LOG2, " Updated the New SMPS State");)
5053 /** Update in the LIM the MIMO PS state of the SELF */
5054 pMac->lim.gHTMIMOPSState = state;
5055#endif
5056 return retStatus;
5057#endif
5058return eSIR_SUCCESS;
5059}
5060
Jeff Johnsone7245742012-09-05 17:12:55 -07005061#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005062ePhyChanBondState limGet11ACPhyCBState(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 htSecondaryChannelOffset,tANI_U8 peerCenterChan, tpPESession psessionEntry)
Jeff Johnsone7245742012-09-05 17:12:55 -07005063{
5064 ePhyChanBondState cbState = PHY_SINGLE_CHANNEL_CENTERED;
5065
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005066 if(!psessionEntry->apChanWidth)
Jeff Johnsone7245742012-09-05 17:12:55 -07005067 {
5068 return htSecondaryChannelOffset;
5069 }
5070
5071 if ( (htSecondaryChannelOffset
5072 == PHY_DOUBLE_CHANNEL_LOW_PRIMARY)
5073 )
5074 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005075 if ((channel + 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005076 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005077 else if ((channel + 6 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005078 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005079 else if ((channel - 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005080 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
5081 else
5082 limLog (pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005083 FL("Invalid Channel Number = %d Center Chan = %d "),
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005084 channel, peerCenterChan);
Jeff Johnsone7245742012-09-05 17:12:55 -07005085 }
5086 if ( (htSecondaryChannelOffset
5087 == PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
5088 )
5089 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005090 if ((channel - 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005091 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005092 else if ((channel + 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005093 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005094 else if ((channel - 6 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005095 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
5096 else
5097 limLog (pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005098 FL("Invalid Channel Number = %d Center Chan = %d "),
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005099 channel, peerCenterChan);
Jeff Johnsone7245742012-09-05 17:12:55 -07005100 }
5101 return cbState;
5102}
5103
5104#endif
5105
Jeff Johnson295189b2012-06-20 16:38:30 -07005106void
Jeff Johnsone7245742012-09-05 17:12:55 -07005107limSetChannel(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 secChannelOffset, tPowerdBm maxTxPower, tANI_U8 peSessionId)
Jeff Johnson295189b2012-06-20 16:38:30 -07005108{
5109#if !defined WLAN_FEATURE_VOWIFI
5110 tANI_U32 localPwrConstraint;
5111#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07005112 tpPESession peSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07005113
Jeff Johnsone7245742012-09-05 17:12:55 -07005114 peSession = peFindSessionBySessionId (pMac, peSessionId);
5115
5116 if ( NULL == peSession)
5117 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005118 limLog (pMac, LOGP, FL("Invalid PE session = %d"), peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07005119 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07005120 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005121#if defined WLAN_FEATURE_VOWIFI
Jeff Johnsone7245742012-09-05 17:12:55 -07005122#ifdef WLAN_FEATURE_11AC
5123 if ( peSession->vhtCapability )
5124 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005125 limSendSwitchChnlParams( pMac, channel, limGet11ACPhyCBState( pMac,channel,secChannelOffset,peSession->apCenterChan, peSession), maxTxPower, peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07005126 }
5127 else
5128#endif
5129 {
5130 limSendSwitchChnlParams( pMac, channel, secChannelOffset, maxTxPower, peSessionId);
5131 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005132#else
5133 if (wlan_cfgGetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, &localPwrConstraint) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005134 limLog(pMac, LOGP, FL("could not read WNI_CFG_LOCAL_POWER_CONSTRAINT from CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005135 return;
5136 }
5137 // Send WDA_CHNL_SWITCH_IND to HAL
Jeff Johnsone7245742012-09-05 17:12:55 -07005138#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005139 if ( peSession->vhtCapability && peSession->vhtCapabilityPresentInBeacon)
Jeff Johnsone7245742012-09-05 17:12:55 -07005140 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005141 limSendSwitchChnlParams( pMac, channel, limGet11ACPhyCBState( pMac,channel,secChannelOffset,peSession->apCenterChan, peSession), maxTxPower, peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07005142 }
5143 else
Jeff Johnson295189b2012-06-20 16:38:30 -07005144#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07005145 {
5146 limSendSwitchChnlParams( pMac, channel, secChannelOffset, (tPowerdBm)localPwrConstraint, peSessionId);
5147 }
5148#endif
5149
Jeff Johnson295189b2012-06-20 16:38:30 -07005150 }