blob: 2c9a86028dc71c72ac878f393d08dc9f45136227 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Padma, Santhosh Kumar67f479b2016-12-28 15:43:42 +05302 * Copyright (c) 2012-2017 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
Padma, Santhosh Kumar67f479b2016-12-28 15:43:42 +053062#ifdef WLAN_FEATURE_LFR_MBB
63#include "lim_mbb.h"
64#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070065
66
67// MLM REQ processing function templates
68static void limProcessMlmStartReq(tpAniSirGlobal, tANI_U32 *);
69static void limProcessMlmScanReq(tpAniSirGlobal, tANI_U32 *);
Jeff Johnsone7245742012-09-05 17:12:55 -070070#ifdef FEATURE_OEM_DATA_SUPPORT
71static void limProcessMlmOemDataReq(tpAniSirGlobal, tANI_U32 *);
72#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070073static void limProcessMlmJoinReq(tpAniSirGlobal, tANI_U32 *);
74static void limProcessMlmAuthReq(tpAniSirGlobal, tANI_U32 *);
75static void limProcessMlmAssocReq(tpAniSirGlobal, tANI_U32 *);
76static void limProcessMlmReassocReq(tpAniSirGlobal, tANI_U32 *);
77static void limProcessMlmDisassocReq(tpAniSirGlobal, tANI_U32 *);
78static void limProcessMlmDeauthReq(tpAniSirGlobal, tANI_U32 *);
79static void limProcessMlmSetKeysReq(tpAniSirGlobal, tANI_U32 *);
80
81static void limProcessMlmAddBAReq( tpAniSirGlobal, tANI_U32 * );
82static void limProcessMlmAddBARsp( tpAniSirGlobal, tANI_U32 * );
83static void limProcessMlmDelBAReq( tpAniSirGlobal, tANI_U32 * );
84
85// MLM Timeout event handler templates
86static void limProcessMinChannelTimeout(tpAniSirGlobal);
87static void limProcessMaxChannelTimeout(tpAniSirGlobal);
88static void limProcessPeriodicProbeReqTimer(tpAniSirGlobal pMac);
89static void limProcessJoinFailureTimeout(tpAniSirGlobal);
90static void limProcessAuthFailureTimeout(tpAniSirGlobal);
91static void limProcessAuthRspTimeout(tpAniSirGlobal, tANI_U32);
92static void limProcessAssocFailureTimeout(tpAniSirGlobal, tANI_U32);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -080093static void limProcessPeriodicJoinProbeReqTimer(tpAniSirGlobal);
Sushant Kaushik9e923872015-04-02 17:09:31 +053094static void limProcessAuthRetryTimer(tpAniSirGlobal);
95
Jeff Johnson295189b2012-06-20 16:38:30 -070096
97static void limProcessMlmRemoveKeyReq(tpAniSirGlobal pMac, tANI_U32 * pMsgBuf);
98void
Jeff Johnsone7245742012-09-05 17:12:55 -070099limSetChannel(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 secChannelOffset, tPowerdBm maxTxPower, tANI_U8 peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -0700100#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 -0700101#define IS_MLM_SCAN_REQ_BACKGROUND_SCAN_NORMAL(pMac) (pMac->lim.gpLimMlmScanReq->backgroundScanMode == eSIR_NORMAL_BACKGROUND_SCAN)
Jeff Johnson295189b2012-06-20 16:38:30 -0700102
103/**
104 * limProcessMlmReqMessages()
105 *
106 *FUNCTION:
107 * This function is called by limPostMlmMessage(). This
108 * function handles MLM primitives invoked by SME.
109 *
110 *LOGIC:
111 * Depending on the message type, corresponding function will be
112 * called.
113 *
114 *ASSUMPTIONS:
115 * 1. Upon receiving Beacon in WT_JOIN_STATE, MLM module invokes
116 * APIs exposed by Beacon Processing module for setting parameters
117 * at MAC hardware.
118 * 2. If attempt to Reassociate with an AP fails, link with current
119 * AP is restored back.
120 *
121 *NOTE:
122 *
123 * @param pMac Pointer to Global MAC structure
124 * @param msgType Indicates the MLM primitive message type
125 * @param *pMsgBuf A pointer to the MLM message buffer
126 *
127 * @return None
128 */
129
130void
131limProcessMlmReqMessages(tpAniSirGlobal pMac, tpSirMsgQ Msg)
132{
133 switch (Msg->type)
134 {
135 case LIM_MLM_START_REQ: limProcessMlmStartReq(pMac, Msg->bodyptr); break;
136 case LIM_MLM_SCAN_REQ: limProcessMlmScanReq(pMac, Msg->bodyptr); break;
Jeff Johnsone7245742012-09-05 17:12:55 -0700137#ifdef FEATURE_OEM_DATA_SUPPORT
138 case LIM_MLM_OEM_DATA_REQ: limProcessMlmOemDataReq(pMac, Msg->bodyptr); break;
139#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700140 case LIM_MLM_JOIN_REQ: limProcessMlmJoinReq(pMac, Msg->bodyptr); break;
141 case LIM_MLM_AUTH_REQ: limProcessMlmAuthReq(pMac, Msg->bodyptr); break;
142 case LIM_MLM_ASSOC_REQ: limProcessMlmAssocReq(pMac, Msg->bodyptr); break;
143 case LIM_MLM_REASSOC_REQ: limProcessMlmReassocReq(pMac, Msg->bodyptr); break;
144 case LIM_MLM_DISASSOC_REQ: limProcessMlmDisassocReq(pMac, Msg->bodyptr); break;
145 case LIM_MLM_DEAUTH_REQ: limProcessMlmDeauthReq(pMac, Msg->bodyptr); break;
146 case LIM_MLM_SETKEYS_REQ: limProcessMlmSetKeysReq(pMac, Msg->bodyptr); break;
147 case LIM_MLM_REMOVEKEY_REQ: limProcessMlmRemoveKeyReq(pMac, Msg->bodyptr); break;
148 case SIR_LIM_MIN_CHANNEL_TIMEOUT: limProcessMinChannelTimeout(pMac); break;
149 case SIR_LIM_MAX_CHANNEL_TIMEOUT: limProcessMaxChannelTimeout(pMac); break;
150 case SIR_LIM_PERIODIC_PROBE_REQ_TIMEOUT:
151 limProcessPeriodicProbeReqTimer(pMac); break;
152 case SIR_LIM_JOIN_FAIL_TIMEOUT: limProcessJoinFailureTimeout(pMac); break;
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -0800153 case SIR_LIM_PERIODIC_JOIN_PROBE_REQ_TIMEOUT:
154 limProcessPeriodicJoinProbeReqTimer(pMac); break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700155 case SIR_LIM_AUTH_FAIL_TIMEOUT: limProcessAuthFailureTimeout(pMac); break;
156 case SIR_LIM_AUTH_RSP_TIMEOUT: limProcessAuthRspTimeout(pMac, Msg->bodyval); break;
157 case SIR_LIM_ASSOC_FAIL_TIMEOUT: limProcessAssocFailureTimeout(pMac, Msg->bodyval); break;
158#ifdef WLAN_FEATURE_VOWIFI_11R
159 case SIR_LIM_FT_PREAUTH_RSP_TIMEOUT:limProcessFTPreauthRspTimeout(pMac); break;
160#endif
Padma, Santhosh Kumar67f479b2016-12-28 15:43:42 +0530161#ifdef WLAN_FEATURE_LFR_MBB
162 case SIR_LIM_PREAUTH_MBB_RSP_TIMEOUT:
163 lim_process_preauth_mbb_rsp_timeout(pMac);
164 break;
Padma, Santhosh Kumarf4966dc2017-01-03 18:56:00 +0530165 case SIR_LIM_REASSOC_MBB_RSP_TIMEOUT:
166 lim_process_reassoc_mbb_rsp_timeout(pMac);
167 break;
Padma, Santhosh Kumar67f479b2016-12-28 15:43:42 +0530168#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700169 case SIR_LIM_REMAIN_CHN_TIMEOUT: limProcessRemainOnChnTimeout(pMac); break;
Gopichand Nakkala4261ea52012-12-31 16:43:00 -0800170 case SIR_LIM_INSERT_SINGLESHOT_NOA_TIMEOUT:
171 limProcessInsertSingleShotNOATimeout(pMac); break;
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530172 case SIR_LIM_CONVERT_ACTIVE_CHANNEL_TO_PASSIVE:
173 limConvertActiveChannelToPassiveChannel(pMac); break;
Sushant Kaushik9e923872015-04-02 17:09:31 +0530174 case SIR_LIM_AUTH_RETRY_TIMEOUT:
175 limProcessAuthRetryTimer(pMac);
176 break;
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -0800177 case SIR_LIM_DISASSOC_ACK_TIMEOUT: limProcessDisassocAckTimeout(pMac); break;
178 case SIR_LIM_DEAUTH_ACK_TIMEOUT: limProcessDeauthAckTimeout(pMac); break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700179 case LIM_MLM_ADDBA_REQ: limProcessMlmAddBAReq( pMac, Msg->bodyptr ); break;
180 case LIM_MLM_ADDBA_RSP: limProcessMlmAddBARsp( pMac, Msg->bodyptr ); break;
181 case LIM_MLM_DELBA_REQ: limProcessMlmDelBAReq( pMac, Msg->bodyptr ); break;
182 case LIM_MLM_TSPEC_REQ:
183 default:
184 break;
185 } // switch (msgType)
186} /*** end limProcessMlmReqMessages() ***/
187
188
189/**
190 * limSetScanMode()
191 *
192 *FUNCTION:
193 * This function is called to setup system into Scan mode
194 *
195 *LOGIC:
196 * NA
197 *
198 *ASSUMPTIONS:
199 * NA
200 *
201 *NOTE:
202 *
203 * @param pMac - Pointer to Global MAC structure
204 * @return None
205 */
206
207void
208limSetScanMode(tpAniSirGlobal pMac)
209{
210 tSirLinkTrafficCheck checkTraffic;
211
212 /// Set current scan channel id to the first in the channel list
213 pMac->lim.gLimCurrentScanChannelId = 0;
214
Jeff Johnson62c27982013-02-27 17:53:55 -0800215 if ( IS_MLM_SCAN_REQ_BACKGROUND_SCAN_AGGRESSIVE(pMac) )
216 {
217 checkTraffic = eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN;
218 }
219 else if (IS_MLM_SCAN_REQ_BACKGROUND_SCAN_NORMAL(pMac))
220 {
221 checkTraffic = eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN;
222 }
223 else
224 checkTraffic = eSIR_CHECK_ROAMING_SCAN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700225
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530226 limLog(pMac, LOG1, FL("Calling limSendHalInitScanReq"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700227 limSendHalInitScanReq(pMac, eLIM_HAL_INIT_SCAN_WAIT_STATE, checkTraffic);
228
229 return ;
230} /*** end limSetScanMode() ***/
231
232//WLAN_SUSPEND_LINK Related
233
234/* limIsLinkSuspended()
235 *
236 *FUNCTION:
237 * This function returns is link is suspended or not.
238 *
239 *LOGIC:
Jeff Johnson62c27982013-02-27 17:53:55 -0800240 * Since Suspend link uses init scan, it just returns
241 * gLimSystemInScanLearnMode flag.
Jeff Johnson295189b2012-06-20 16:38:30 -0700242 *
243 *ASSUMPTIONS:
244 * NA
245 *
246 *NOTE:
247 *
248 * @param pMac - Pointer to Global MAC structure
249 * @return None
250 */
251tANI_U8
252limIsLinkSuspended(tpAniSirGlobal pMac)
253{
254 return pMac->lim.gLimSystemInScanLearnMode;
255}
256/**
257 * limSuspendLink()
258 *
259 *FUNCTION:
260 * This function is called to suspend traffic. Internally this function uses WDA_INIT_SCAN_REQ.
261 *
262 *LOGIC:
263 * NA
264 *
265 *ASSUMPTIONS:
266 * NA
267 *
268 *NOTE:
269 *
270 * @param pMac - Pointer to Global MAC structure
Jeff Johnson62c27982013-02-27 17:53:55 -0800271 * @param trafficCheck - Takes value from enum tSirLinkTrafficCheck.
Jeff Johnson295189b2012-06-20 16:38:30 -0700272 * @param callback - Callback function to be called after suspending the link.
273 * @param data - Pointer to any buffer that will be passed to callback.
274 * @return None
275 */
276void
277limSuspendLink(tpAniSirGlobal pMac, tSirLinkTrafficCheck trafficCheck, SUSPEND_RESUME_LINK_CALLBACK callback, tANI_U32 *data)
278{
279 if( NULL == callback )
280 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700281 limLog( pMac, LOGE, "%s:%d: Invalid parameters", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700282 return;
283 }
284
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +0530285 if( pMac->lim.gpLimSuspendCallback ||
286 pMac->lim.gLimSystemInScanLearnMode )
Jeff Johnson295189b2012-06-20 16:38:30 -0700287 {
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +0530288 limLog( pMac, LOGE, FL("Something is wrong, SuspendLinkCbk:%p "
289 "IsSystemInScanLearnMode:%d"), pMac->lim.gpLimSuspendCallback,
290 pMac->lim.gLimSystemInScanLearnMode );
Jeff Johnson295189b2012-06-20 16:38:30 -0700291 callback( pMac, eHAL_STATUS_FAILURE, data );
292 return;
293 }
294
295 pMac->lim.gLimSystemInScanLearnMode = 1;
296 pMac->lim.gpLimSuspendCallback = callback;
297 pMac->lim.gpLimSuspendData = data;
298 limSendHalInitScanReq(pMac, eLIM_HAL_SUSPEND_LINK_WAIT_STATE, trafficCheck );
Madan Mohan Koyyalamudi01cba042013-01-10 21:56:05 -0800299
300 WDA_TrafficStatsTimerActivate(FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700301}
302
303/**
304 * limResumeLink()
305 *
306 *FUNCTION:
307 * This function is called to Resume traffic after a suspend. Internally this function uses WDA_FINISH_SCAN_REQ.
308 *
309 *LOGIC:
310 * NA
311 *
312 *ASSUMPTIONS:
313 * NA
314 *
315 *NOTE:
316 *
317 * @param pMac - Pointer to Global MAC structure
318 * @param callback - Callback function to be called after Resuming the link.
319 * @param data - Pointer to any buffer that will be passed to callback.
320 * @return None
321 */
322void
323limResumeLink(tpAniSirGlobal pMac, SUSPEND_RESUME_LINK_CALLBACK callback, tANI_U32 *data)
324{
325 if( NULL == callback )
326 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700327 limLog( pMac, LOGE, "%s:%d: Invalid parameters", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700328 return;
329 }
330
331 if( pMac->lim.gpLimResumeCallback )
332 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700333 limLog( pMac, LOGE, "%s:%d: gLimResumeLink callback is not NULL...something is wrong", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700334 callback( pMac, eHAL_STATUS_FAILURE, data );
335 return;
336 }
337
338 pMac->lim.gpLimResumeCallback = callback;
339 pMac->lim.gpLimResumeData = data;
Abhishek Singh53bfb332013-12-12 18:03:29 +0530340
341 /* eLIM_HAL_IDLE_SCAN_STATE state indicate limSendHalInitScanReq failed.
342 * In case limSendHalInitScanReq is success, Scanstate would be
343 * eLIM_HAL_SUSPEND_LINK_STATE
344 */
345 if( eLIM_HAL_IDLE_SCAN_STATE != pMac->lim.gLimHalScanState )
346 {
347 limSendHalFinishScanReq(pMac, eLIM_HAL_RESUME_LINK_WAIT_STATE );
348 }
349 else
350 {
351 limLog(pMac, LOGW, FL("Init Scan failed, we will not call finish scan."
352 " calling the callback with failure status"));
353 pMac->lim.gpLimResumeCallback( pMac, eSIR_FAILURE, pMac->lim.gpLimResumeData);
354 pMac->lim.gpLimResumeCallback = NULL;
355 pMac->lim.gpLimResumeData = NULL;
356 pMac->lim.gLimSystemInScanLearnMode = 0;
357 }
Madan Mohan Koyyalamudi01cba042013-01-10 21:56:05 -0800358
359 if(limIsInMCC(pMac))
360 {
361 WDA_TrafficStatsTimerActivate(TRUE);
362 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700363}
364//end WLAN_SUSPEND_LINK Related
365
366
367/**
368 *
369 * limChangeChannelWithCallback()
370 *
371 * FUNCTION:
372 * This function is called to change channel and perform off channel operation
373 * if required. The caller registers a callback to be called at the end of the
Jeff Johnson62c27982013-02-27 17:53:55 -0800374 * channel change.
Jeff Johnson295189b2012-06-20 16:38:30 -0700375 *
376 */
377void
378limChangeChannelWithCallback(tpAniSirGlobal pMac, tANI_U8 newChannel,
379 CHANGE_CHANNEL_CALLBACK callback,
380 tANI_U32 *cbdata, tpPESession psessionEntry)
381{
382 // Sanity checks for the current and new channel
383#if defined WLAN_VOWIFI_DEBUG
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700384 PELOGE(limLog( pMac, LOGE, "Switching channel to %d", newChannel);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700385#endif
386 psessionEntry->channelChangeReasonCode=LIM_SWITCH_CHANNEL_OPERATION;
387
388 pMac->lim.gpchangeChannelCallback = callback;
389 pMac->lim.gpchangeChannelData = cbdata;
390
391 limSendSwitchChnlParams(pMac, newChannel,
Jeff Johnsone7245742012-09-05 17:12:55 -0700392 PHY_SINGLE_CHANNEL_CENTERED,
Jeff Johnson295189b2012-06-20 16:38:30 -0700393 psessionEntry->maxTxPower, psessionEntry->peSessionId);
394
395 return;
396}
397
398
399/**
400 * limContinuePostChannelScan()
401 *
402 *FUNCTION:
403 * This function is called to scan the current channel.
404 *
405 *LOGIC:
406 *
407 *ASSUMPTIONS:
408 * NA
409 *
410 *NOTE:
411 * NA
412 *
413 * @param pMac - Pointer to Global MAC structure
414 *
415 * @return None
416 */
417
418void limContinuePostChannelScan(tpAniSirGlobal pMac)
419{
420 tANI_U8 channelNum;
Jeff Johnson295189b2012-06-20 16:38:30 -0700421 tANI_U8 i = 0;
422 tSirRetStatus status = eSIR_SUCCESS;
Abhishek Singh95f7b252015-10-14 14:15:35 +0530423
Jeff Johnson295189b2012-06-20 16:38:30 -0700424 if( pMac->lim.abortScan || (NULL == pMac->lim.gpLimMlmScanReq ) ||
425 (pMac->lim.gLimCurrentScanChannelId >
426 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1)))
427 {
428 pMac->lim.abortScan = 0;
429 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
430 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
431 //Set the resume channel to Any valid channel (invalid).
432 //This will instruct HAL to set it to any previous valid channel.
433 peSetResumeChannel(pMac, 0, 0);
434
435 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
436 return;
437 }
438
439 channelNum = limGetCurrentScanChannel(pMac);
Agarwal Ashish7fed3812014-04-14 15:17:31 +0530440
441 if (channelNum == limGetCurrentOperatingChannel(pMac) &&
442 limIsconnectedOnDFSChannel(channelNum))
443 {
444 limCovertChannelScanType(pMac, channelNum, true);
445 }
446
Jeff Johnson295189b2012-06-20 16:38:30 -0700447 if ((pMac->lim.gpLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN) &&
448 (limActiveScanAllowed(pMac, channelNum)))
449 {
450 TX_TIMER *periodicScanTimer;
Jeff Johnson295189b2012-06-20 16:38:30 -0700451
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -0800452 pMac->lim.probeCounter++;
Abhishek Singh795e1b82015-09-25 15:35:03 +0530453 /* Prepare and send Probe Request frame for all
454 * the SSIDs present in the saved MLM
455 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700456 do
457 {
Siddharth Bhal4f3187c2014-10-09 21:38:08 +0530458 tSirMacAddr gSelfMacAddr;
Abhishek Singh795e1b82015-09-25 15:35:03 +0530459
460 /* Send self MAC as src address if
461 * MAC spoof is not enabled OR
462 * spoofMacAddr is all 0 OR
463 * disableP2PMacSpoof is enabled and scan is P2P scan
464 * else use the spoofMac as src address
465 */
466 if ((pMac->lim.isSpoofingEnabled != TRUE) ||
467 (TRUE ==
468 vos_is_macaddr_zero((v_MACADDR_t *)&pMac->lim.spoofMacAddr)) ||
469 (pMac->roam.configParam.disableP2PMacSpoofing &&
470 pMac->lim.gpLimMlmScanReq->p2pSearch)) {
Siddharth Bhal4f3187c2014-10-09 21:38:08 +0530471 vos_mem_copy(gSelfMacAddr, pMac->lim.gSelfMacAddr, VOS_MAC_ADDRESS_LEN);
472 } else {
473 vos_mem_copy(gSelfMacAddr, pMac->lim.spoofMacAddr, VOS_MAC_ADDRESS_LEN);
474 }
Abhishek Singh525045c2014-12-15 17:18:45 +0530475 limLog(pMac, LOG1,
Agarwal Ashishfb3b1c82015-08-18 16:57:31 +0530476 FL(" Mac Addr "MAC_ADDRESS_STR " used in sending ProbeReq number %d, for SSID %s on channel: %d"),
477 MAC_ADDR_ARRAY(gSelfMacAddr) ,i, pMac->lim.gpLimMlmScanReq->ssId[i].ssId, channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -0700478 // include additional IE if there is
479 status = limSendProbeReqMgmtFrame( pMac, &pMac->lim.gpLimMlmScanReq->ssId[i],
Siddharth Bhal4f3187c2014-10-09 21:38:08 +0530480 pMac->lim.gpLimMlmScanReq->bssId, channelNum, gSelfMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -0700481 pMac->lim.gpLimMlmScanReq->dot11mode,
482 pMac->lim.gpLimMlmScanReq->uIEFieldLen,
483 (tANI_U8 *)(pMac->lim.gpLimMlmScanReq)+pMac->lim.gpLimMlmScanReq->uIEFieldOffset);
484
485 if ( status != eSIR_SUCCESS)
486 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700487 PELOGE(limLog(pMac, LOGE, FL("send ProbeReq failed for SSID %s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700488 pMac->lim.gpLimMlmScanReq->ssId[i].ssId, channelNum);)
489 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
490 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
491 return;
492 }
493 i++;
494 } while (i < pMac->lim.gpLimMlmScanReq->numSsid);
495
496 {
497#if defined WLAN_FEATURE_VOWIFI
498 //If minChannelTime is set to zero, SME is requesting scan to not use min channel timer.
499 //This is used in 11k to request for beacon measurement request with a fixed duration in
500 //max channel time.
501 if( pMac->lim.gpLimMlmScanReq->minChannelTime != 0 )
502 {
503#endif
504 /// TXP has sent Probe Request
505 /// Activate minChannelTimer
506 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
507
508#ifdef GEN6_TODO
Abhishek Singh95f7b252015-10-14 14:15:35 +0530509 /* revisit this piece of code to assign the appropriate sessionId
510 * below priority - LOW/might not be needed
511 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700512 pMac->lim.limTimers.gLimMinChannelTimer.sessionId = sessionId;
Abhishek Singh95f7b252015-10-14 14:15:35 +0530513#endif
514 if (tx_timer_activate(&pMac->lim.limTimers.gLimMinChannelTimer) !=
515 TX_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700516 {
Abhishek Singh95f7b252015-10-14 14:15:35 +0530517 limLog(pMac, LOGE, FL("could not start min channel timer"));
518 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
519 limSendHalEndScanReq(pMac, channelNum,
520 eLIM_HAL_END_SCAN_WAIT_STATE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700521 return;
522 }
523
524 // Initialize max timer too
525 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
526#if defined WLAN_FEATURE_VOWIFI
527 }
528 else
529 {
530#if defined WLAN_VOWIFI_DEBUG
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700531 PELOGE(limLog( pMac, LOGE, "Min channel time == 0, Use only max chan timer" );)
Jeff Johnson295189b2012-06-20 16:38:30 -0700532#endif
533 //No Need to start Min channel timer. Start Max Channel timer.
534 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
535 if (tx_timer_activate(&pMac->lim.limTimers.gLimMaxChannelTimer)
536 == TX_TIMER_ERROR)
537 {
538 /// Could not activate max channel timer.
539 // Log error
Abhishek Singh95f7b252015-10-14 14:15:35 +0530540 limLog(pMac,LOGE, FL("could not start max channel timer"));
541 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
542 limSendHalEndScanReq(pMac,
543 channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
544 return;
Jeff Johnson295189b2012-06-20 16:38:30 -0700545 }
546
547 }
548#endif
549 }
550 /* Start peridic timer which will trigger probe req based on min/max
551 channel timer */
552 periodicScanTimer = &pMac->lim.limTimers.gLimPeriodicProbeReqTimer;
Sachin Ahuja49dedd72014-11-24 16:35:24 +0530553 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
Jeff Johnson295189b2012-06-20 16:38:30 -0700554 if (tx_timer_activate(periodicScanTimer) != TX_SUCCESS)
555 {
Abhishek Singh95f7b252015-10-14 14:15:35 +0530556 limLog(pMac, LOGE, FL("could not start periodic probe req "
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700557 "timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700558 }
559 periodicScanTimer->sessionId = channelNum;
560 }
561 else
562 {
563 tANI_U32 val;
Abhishek Singh525045c2014-12-15 17:18:45 +0530564 limLog(pMac, LOG1, FL("START PASSIVE Scan chan %d"), channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -0700565
566 /// Passive Scanning. Activate maxChannelTimer
Jeff Johnson295189b2012-06-20 16:38:30 -0700567 if (tx_timer_deactivate(&pMac->lim.limTimers.gLimMaxChannelTimer)
568 != TX_SUCCESS)
569 {
570 // Could not deactivate max channel timer.
571 // Log error
Abhishek Singh95f7b252015-10-14 14:15:35 +0530572 limLog(pMac, LOGE, FL("Unable to deactivate max channel timer"));
573 limSendHalEndScanReq(pMac, channelNum,
574 eLIM_HAL_END_SCAN_WAIT_STATE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700575 }
576 else
577 {
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530578 if (pMac->miracast_mode)
579 {
580 val = DEFAULT_MIN_CHAN_TIME_DURING_MIRACAST +
581 DEFAULT_MAX_CHAN_TIME_DURING_MIRACAST;
582 }
583 else if (wlan_cfgGetInt(pMac, WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME,
Jeff Johnson295189b2012-06-20 16:38:30 -0700584 &val) != eSIR_SUCCESS)
585 {
586 /**
587 * Could not get max channel value
588 * from CFG. Log error.
589 */
Abhishek Singh95f7b252015-10-14 14:15:35 +0530590 limLog(pMac, LOGE,
591 FL("could not retrieve passive max chan value, Use Def val"));
592 val= WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME_STADEF;
Jeff Johnson295189b2012-06-20 16:38:30 -0700593 }
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530594
595 val = SYS_MS_TO_TICKS(val);
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530596 if (tx_timer_change(&pMac->lim.limTimers.gLimMaxChannelTimer,
597 val, 0) != TX_SUCCESS)
598 {
599 // Could not change max channel timer.
600 // Log error
Abhishek Singh95f7b252015-10-14 14:15:35 +0530601 limLog(pMac, LOGE, FL("Unable to change max channel timer"));
602 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
603 limSendHalEndScanReq(pMac, channelNum,
604 eLIM_HAL_END_SCAN_WAIT_STATE);
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530605 return;
606 }
Abhishek Singh95f7b252015-10-14 14:15:35 +0530607 else if (tx_timer_activate(&pMac->lim.limTimers.gLimMaxChannelTimer)
608 != TX_SUCCESS)
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530609 {
Abhishek Singh95f7b252015-10-14 14:15:35 +0530610
611 limLog(pMac, LOGE, FL("could not start max channel timer"));
612 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
613 limSendHalEndScanReq(pMac, channelNum,
614 eLIM_HAL_END_SCAN_WAIT_STATE);
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530615 return;
Jeff Johnson295189b2012-06-20 16:38:30 -0700616 }
617 }
618 // Wait for Beacons to arrive
619 } // if (pMac->lim.gLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN)
620
Abhishek Singh95f7b252015-10-14 14:15:35 +0530621 limAddScanChannelInfo(pMac, channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -0700622 return;
623}
624
625
626
627
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530628
629/* limCovertChannelScanType()
630 *
631 *FUNCTION:
632 * This function is called to get the list, change the channel type and set again.
633 *
634 *LOGIC:
635 *
636 *ASSUMPTIONS:
637 * NA
638 *
639 *NOTE: If a channel is ACTIVE, this function will make it as PASSIVE
640 * If a channel is PASSIVE, this fucntion will make it as ACTIVE
641 * NA
642 *
643 * @param pMac - Pointer to Global MAC structure
644 * channelNum - Channel which need to be convert
645 PassiveToActive - Boolean flag to convert channel
646 *
647 * @return None
648 */
649
650
651void limCovertChannelScanType(tpAniSirGlobal pMac,tANI_U8 channelNum, tANI_BOOLEAN passiveToActive)
652{
653
654 tANI_U32 i;
655 tANI_U8 channelPair[WNI_CFG_SCAN_CONTROL_LIST_LEN];
656 tANI_U32 len = WNI_CFG_SCAN_CONTROL_LIST_LEN;
Hanumantha Reddy Pothula97ea0952015-10-09 11:29:39 +0530657
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530658 if (wlan_cfgGetStr(pMac, WNI_CFG_SCAN_CONTROL_LIST, channelPair, &len)
659 != eSIR_SUCCESS)
660 {
661 PELOGE(limLog(pMac, LOGE, FL("Unable to get scan control list"));)
662 return ;
663 }
664 if (len > WNI_CFG_SCAN_CONTROL_LIST_LEN)
665 {
666 limLog(pMac, LOGE, FL("Invalid scan control list length:%d"), len);
667 return ;
668 }
Padma, Santhosh Kumar778d8382015-03-04 17:41:22 +0530669 if (pMac->fActiveScanOnDFSChannels)
670 {
671 limLog(pMac, LOG1, FL("DFS feature triggered,"
672 "block scan type conversion"));
673 return ;
674 }
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530675 for (i=0; (i+1) < len; i+=2)
676 {
677 if (channelPair[i] == channelNum)
678 {
679 if ((eSIR_PASSIVE_SCAN == channelPair[i+1]) && TRUE == passiveToActive)
680 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530681 limLog(pMac, LOG1, FL("Channel %d changed from Passive to Active"),
682 channelNum);
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530683 channelPair[i+1] = eSIR_ACTIVE_SCAN;
684 break ;
685 }
686 if ((eSIR_ACTIVE_SCAN == channelPair[i+1]) && FALSE == passiveToActive)
687 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530688 limLog(pMac, LOG1, FL("Channel %d changed from Active to Passive"),
689 channelNum);
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530690 channelPair[i+1] = eSIR_PASSIVE_SCAN;
691 break ;
692 }
693 }
694 }
695
696 cfgSetStrNotify(pMac, WNI_CFG_SCAN_CONTROL_LIST, (tANI_U8 *)channelPair, len, FALSE);
697 return ;
698}
699
700
701
702
703/* limSetDFSChannelList()
704 *
705 *FUNCTION:
706 * This function is called to convert DFS channel list to active channel list when any
707 * beacon is present on that channel. This function store time for passive channels
708 * which help to know that for how much time channel has been passive.
709 *
710 *LOGIC:
711 *
712 *ASSUMPTIONS:
713 * NA
714 *
715 *NOTE: If a channel is ACTIVE, it won't store any time
716 * If a channel is PAssive, it will store time as timestamp
717 * NA
718 *
719 * @param pMac - Pointer to Global MAC structure
720 * dfsChannelList - DFS channel list.
721 * @return None
722 */
723
724void limSetDFSChannelList(tpAniSirGlobal pMac,tANI_U8 channelNum, tSirDFSChannelList *dfsChannelList)
725{
726
727 tANI_BOOLEAN passiveToActive = TRUE;
Hanumantha Reddy Pothula97ea0952015-10-09 11:29:39 +0530728 tANI_U32 cfgVal;
729
730 if (eSIR_SUCCESS == wlan_cfgGetInt(pMac, WNI_CFG_ACTIVE_PASSIVE_CON,
731 &cfgVal))
732 {
733 limLog(pMac, LOG1, FL("WNI_CFG_ACTIVE_PASSIVE_CON: %d"), cfgVal);
734 if (!cfgVal)
735 return;
736 }
737
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530738 if ((1 <= channelNum) && (165 >= channelNum))
739 {
740 if (eANI_BOOLEAN_TRUE == limIsconnectedOnDFSChannel(channelNum))
741 {
742 if (dfsChannelList->timeStamp[channelNum] == 0)
743 {
744 //Received first beacon; Convert DFS channel to Active channel.
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530745 limLog(pMac, LOG1, FL("Received first beacon on DFS channel: %d"), channelNum);
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530746 limCovertChannelScanType(pMac,channelNum, passiveToActive);
747 }
Abhishek Singh6fcdf652016-11-23 10:59:12 +0530748
749 if (!pMac->fActiveScanOnDFSChannels &&
750 dfsChannelList->timeStamp[channelNum] &&
751 !limActiveScanAllowed(pMac, channelNum))
752 limLog(pMac, LOGE,
753 FL("Received beacon on DFS channel %d with dfs time stamp %lu, but channel is still DFS"),
754 channelNum, dfsChannelList->timeStamp[channelNum]);
755
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530756 dfsChannelList->timeStamp[channelNum] = vos_timer_get_system_time();
757 }
758 else
759 {
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530760 return;
761 }
762 if (!tx_timer_running(&pMac->lim.limTimers.gLimActiveToPassiveChannelTimer))
763 {
764 tx_timer_activate(&pMac->lim.limTimers.gLimActiveToPassiveChannelTimer);
765 }
766 }
767 else
768 {
769 PELOGE(limLog(pMac, LOGE, FL("Invalid Channel: %d"), channelNum);)
770 return;
771 }
772
773 return;
774}
775
776
777
778
Jeff Johnson295189b2012-06-20 16:38:30 -0700779/*
780* Creates a Raw frame to be sent before every Scan, if required.
781* If only infra link is active (mlmState = Link Estb), then send Data Null
782* If only BT-AMP-AP link is active(mlmState = BSS_STARTED), then send CTS2Self frame.
783* If only BT-AMP-STA link is active(mlmState = BSS_STARTED or Link Est) then send CTS2Self
784* If Only IBSS link is active, then send CTS2Self
785* for concurrent scenario: Infra+BT or Infra+IBSS, always send CTS2Self, no need to send Data Null
786*
787*/
788static void __limCreateInitScanRawFrame(tpAniSirGlobal pMac,
789 tpInitScanParams pInitScanParam)
790{
791 tANI_U8 i;
792 pInitScanParam->scanEntry.activeBSScnt = 0;
793
794 /* Don't send CTS to self as we have issue with BTQM queues where BTQM can
795 * not handle transmition of CTS2self frames. Sending CTS 2 self at this
796 * juncture also doesn't serve much purpose as probe request frames go out
797 * immediately, No need to notify BSS in IBSS case.
798 * */
799
800 for(i =0; i < pMac->lim.maxBssId; i++)
801 {
802 if(pMac->lim.gpSession[i].valid == TRUE)
803 {
804 if(pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)
805 {
806 if ((pMac->lim.gpSession[i].limSystemRole != eLIM_BT_AMP_STA_ROLE) &&
807 (pInitScanParam->scanEntry.activeBSScnt < HAL_NUM_BSSID))
808 {
809 pInitScanParam->scanEntry.bssIdx[pInitScanParam->scanEntry.activeBSScnt]
810 = pMac->lim.gpSession[i].bssIdx;
811 pInitScanParam->scanEntry.activeBSScnt++;
812
813 }
814 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700815 else if( (eLIM_AP_ROLE == pMac->lim.gpSession[i].limSystemRole )
816 && ( VOS_P2P_GO_MODE == pMac->lim.gpSession[i].pePersona )
817 )
818 {
819 pInitScanParam->useNoA = TRUE;
820 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700821 }
822 }
823 if (pInitScanParam->scanEntry.activeBSScnt)
824 {
825 pInitScanParam->notifyBss = TRUE;
826 pInitScanParam->frameType = SIR_MAC_DATA_FRAME;
827 pInitScanParam->frameLength = 0;
828 }
829}
830
831/*
832* Creates a Raw frame to be sent during finish scan, if required.
833* Send data null frame, only when there is just one session active and that session is
834* in 'link Estb' state.
835* if more than one session is active, don't send any frame.
836* for concurrent scenario: Infra+BT or Infra+IBSS, no need to send Data Null
837*
838*/
839static void __limCreateFinishScanRawFrame(tpAniSirGlobal pMac,
840 tpFinishScanParams pFinishScanParam)
841{
842 tANI_U8 i;
843 pFinishScanParam->scanEntry.activeBSScnt = 0;
844
845 for(i =0; i < pMac->lim.maxBssId; i++)
846 {
847 if(pMac->lim.gpSession[i].valid == TRUE)
848 {
849 if(pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)
850 {
851 //BT-STA can either be in LINK-ESTB state or BSS_STARTED State
852 //for BT, need to send CTS2Self
853 if ((pMac->lim.gpSession[i].limSystemRole != eLIM_BT_AMP_STA_ROLE) &&
854 (pFinishScanParam->scanEntry.activeBSScnt < HAL_NUM_BSSID))
855 {
856 pFinishScanParam->scanEntry.bssIdx[pFinishScanParam->scanEntry.activeBSScnt]
857 = pMac->lim.gpSession[i].bssIdx;
858 pFinishScanParam->scanEntry.activeBSScnt++;
859 }
860 }
861 }
862 }
863
864 if (pFinishScanParam->scanEntry.activeBSScnt)
865 {
866 pFinishScanParam->notifyBss = TRUE;
867 pFinishScanParam->frameType = SIR_MAC_DATA_FRAME;
868 pFinishScanParam->frameLength = 0;
869 }
870}
871
872void
873limSendHalInitScanReq(tpAniSirGlobal pMac, tLimLimHalScanState nextState, tSirLinkTrafficCheck trafficCheck)
874{
875
876
877 tSirMsgQ msg;
878 tpInitScanParams pInitScanParam;
879 tSirRetStatus rc = eSIR_SUCCESS;
880
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530881 pInitScanParam = vos_mem_malloc(sizeof(*pInitScanParam));
882 if ( NULL == pInitScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -0700883 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530884 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700885 goto error;
886 }
887
888 /*Initialize the pInitScanParam with 0*/
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530889 vos_mem_set((tANI_U8 *)pInitScanParam, sizeof(*pInitScanParam), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700890
891 msg.type = WDA_INIT_SCAN_REQ;
892 msg.bodyptr = pInitScanParam;
893 msg.bodyval = 0;
894
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530895 vos_mem_set((tANI_U8 *)&pInitScanParam->macMgmtHdr, sizeof(tSirMacMgmtHdr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700896 if (nextState == eLIM_HAL_INIT_LEARN_WAIT_STATE)
897 {
898 pInitScanParam->notifyBss = TRUE;
899 pInitScanParam->notifyHost = FALSE;
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700900 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
901 {
902 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SCAN;
903 }
904 else
905 {
906 pInitScanParam->scanMode = eHAL_SYS_MODE_LEARN;
907 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700908
Jeff Johnsone7245742012-09-05 17:12:55 -0700909 pInitScanParam->frameType = SIR_MAC_CTRL_CTS;
910 __limCreateInitScanRawFrame(pMac, pInitScanParam);
911 pInitScanParam->checkLinkTraffic = trafficCheck;
Jeff Johnson295189b2012-06-20 16:38:30 -0700912 }
913 else
914 {
915 if(nextState == eLIM_HAL_SUSPEND_LINK_WAIT_STATE)
916 {
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700917 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
918 {
919 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SUSPEND_LINK;
920 }
921 else
922 {
923 pInitScanParam->scanMode = eHAL_SYS_MODE_SUSPEND_LINK;
924 }
925
Jeff Johnson295189b2012-06-20 16:38:30 -0700926 }
927 else
928 {
Madan Mohan Koyyalamudi94d111d2012-11-19 20:11:26 -0800929 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
930 {
931 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SCAN;
932 }
933 else
934 {
935 pInitScanParam->scanMode = eHAL_SYS_MODE_SCAN;
936 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700937 }
938 __limCreateInitScanRawFrame(pMac, pInitScanParam);
Jeff Johnson295189b2012-06-20 16:38:30 -0700939 if (pInitScanParam->useNoA)
940 {
941 pInitScanParam->scanDuration = pMac->lim.gTotalScanDuration;
942 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700943 /* Inform HAL whether it should check for traffic on the link
944 * prior to performing a background scan
945 */
946 pInitScanParam->checkLinkTraffic = trafficCheck;
947 }
948
949 pMac->lim.gLimHalScanState = nextState;
950 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -0700951 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -0700952
953 rc = wdaPostCtrlMsg(pMac, &msg);
954 if (rc == eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700955 PELOG3(limLog(pMac, LOG3, FL("wdaPostCtrlMsg() return eSIR_SUCCESS pMac=%x nextState=%d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700956 pMac, pMac->lim.gLimHalScanState);)
957 return;
958 }
959
960 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530961 vos_mem_free(pInitScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700962 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700963
964error:
965 switch(nextState)
966 {
967 case eLIM_HAL_START_SCAN_WAIT_STATE:
Padma, Santhosh Kumar9a3eea12015-02-18 14:05:03 +0530968 case eLIM_HAL_INIT_SCAN_WAIT_STATE:
Jeff Johnson295189b2012-06-20 16:38:30 -0700969 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_INIT_FAILED);
970 break;
971
Jeff Johnson295189b2012-06-20 16:38:30 -0700972
973 //WLAN_SUSPEND_LINK Related
974 case eLIM_HAL_SUSPEND_LINK_WAIT_STATE:
975 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
976 if( pMac->lim.gpLimSuspendCallback )
977 {
978 pMac->lim.gpLimSuspendCallback( pMac, rc, pMac->lim.gpLimSuspendData );
979 pMac->lim.gpLimSuspendCallback = NULL;
980 pMac->lim.gpLimSuspendData = NULL;
981 }
982 pMac->lim.gLimSystemInScanLearnMode = 0;
983 break;
984 //end WLAN_SUSPEND_LINK Related
985 default:
986 break;
987 }
988 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
989
990 return ;
991}
992
993void
994limSendHalStartScanReq(tpAniSirGlobal pMac, tANI_U8 channelNum, tLimLimHalScanState nextState)
995{
996 tSirMsgQ msg;
997 tpStartScanParams pStartScanParam;
998 tSirRetStatus rc = eSIR_SUCCESS;
999
1000 /**
1001 * The Start scan request to be sent only if Start Scan is not already requested
1002 */
1003 if(pMac->lim.gLimHalScanState != eLIM_HAL_START_SCAN_WAIT_STATE)
1004 {
1005
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301006 pStartScanParam = vos_mem_malloc(sizeof(*pStartScanParam));
1007 if ( NULL == pStartScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -07001008 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301009 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001010 goto error;
1011 }
1012
1013 msg.type = WDA_START_SCAN_REQ;
1014 msg.bodyptr = pStartScanParam;
1015 msg.bodyval = 0;
1016 pStartScanParam->status = eHAL_STATUS_SUCCESS;
1017 pStartScanParam->scanChannel = (tANI_U8)channelNum;
1018
1019 pMac->lim.gLimHalScanState = nextState;
1020 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
1021
Jeff Johnsone7245742012-09-05 17:12:55 -07001022 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001023
1024 rc = wdaPostCtrlMsg(pMac, &msg);
1025 if (rc == eSIR_SUCCESS) {
1026 return;
1027 }
1028
1029 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301030 vos_mem_free(pStartScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001031 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001032
1033error:
1034 switch(nextState)
1035 {
1036 case eLIM_HAL_START_SCAN_WAIT_STATE:
1037 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_INIT_FAILED);
1038 break;
1039
Jeff Johnson295189b2012-06-20 16:38:30 -07001040
1041 default:
1042 break;
1043 }
1044 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
1045
1046 }
1047 else
1048 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001049 PELOGW(limLog(pMac, LOGW, FL("Invalid state for START_SCAN_REQ message=%d"), pMac->lim.gLimHalScanState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001050 }
1051
1052 return;
1053}
1054
1055void limSendHalEndScanReq(tpAniSirGlobal pMac, tANI_U8 channelNum, tLimLimHalScanState nextState)
1056{
1057 tSirMsgQ msg;
1058 tpEndScanParams pEndScanParam;
1059 tSirRetStatus rc = eSIR_SUCCESS;
1060
1061 /**
1062 * 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 -07001063 * Start scan is not already requestd.
1064 * after finish scan rsp from firmware host is sending endscan request so adding
1065 * check for IDLE SCAN STATE also added to avoid this issue
Jeff Johnson295189b2012-06-20 16:38:30 -07001066 */
1067 if((pMac->lim.gLimHalScanState != eLIM_HAL_END_SCAN_WAIT_STATE) &&
Leela Venkata Kiran Kumar Reddy Chirala66639a62013-08-29 15:38:19 -07001068 (pMac->lim.gLimHalScanState != eLIM_HAL_IDLE_SCAN_STATE) &&
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07001069 (pMac->lim.gLimHalScanState == eLIM_HAL_SCANNING_STATE) &&
1070 (pMac->lim.gLimHalScanState != eLIM_HAL_FINISH_SCAN_WAIT_STATE) &&
1071 (pMac->lim.gLimHalScanState != eLIM_HAL_START_SCAN_WAIT_STATE))
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301072 {
1073 pEndScanParam = vos_mem_malloc(sizeof(*pEndScanParam));
1074 if ( NULL == pEndScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -07001075 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301076 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001077 goto error;
1078 }
1079
1080 msg.type = WDA_END_SCAN_REQ;
1081 msg.bodyptr = pEndScanParam;
1082 msg.bodyval = 0;
1083 pEndScanParam->status = eHAL_STATUS_SUCCESS;
1084 pEndScanParam->scanChannel = (tANI_U8)channelNum;
1085
1086 pMac->lim.gLimHalScanState = nextState;
1087 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -07001088 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001089
1090 rc = wdaPostCtrlMsg(pMac, &msg);
1091 if (rc == eSIR_SUCCESS) {
1092 return;
1093 }
1094
1095 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301096 vos_mem_free(pEndScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001097 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001098
1099 error:
1100 switch(nextState)
1101 {
1102 case eLIM_HAL_END_SCAN_WAIT_STATE:
1103 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_END_FAILED);
1104 break;
1105
Jeff Johnson295189b2012-06-20 16:38:30 -07001106
1107 default:
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001108 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg Rcvd invalid nextState %d"), nextState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001109 break;
1110 }
1111 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001112 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001113 }
1114 else
1115 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001116 PELOGW(limLog(pMac, LOGW, FL("Invalid state for END_SCAN_REQ message=%d"), pMac->lim.gLimHalScanState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001117 }
1118
1119
1120 return;
1121}
1122
Bhargav Shahe3a6ff02016-04-11 16:31:49 +05301123
1124void limSendTLPauseInd(tpAniSirGlobal pMac, uint16_t staId)
1125{
1126 tSirMsgQ msg;
1127 tSirRetStatus rc = eSIR_SUCCESS;
1128
1129 msg.type = WDA_PAUSE_TL_IND;
1130 msg.bodyval = staId;
1131
1132 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
1133
1134 rc = wdaPostCtrlMsg(pMac, &msg);
1135 if (rc == eSIR_SUCCESS) {
1136 return;
1137 }
1138
1139 limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);
1140
1141 return;
1142}
1143
Jeff Johnson295189b2012-06-20 16:38:30 -07001144/**
1145 * limSendHalFinishScanReq()
1146 *
1147 *FUNCTION:
1148 * This function is called to finish scan/learn request..
1149 *
1150 *LOGIC:
1151 *
1152 *ASSUMPTIONS:
1153 * NA
1154 *
1155 *NOTE:
1156 * NA
1157 *
1158 * @param pMac - Pointer to Global MAC structure
1159 * @param nextState - this parameters determines whether this call is for scan or learn
1160 *
1161 * @return None
1162 */
1163void limSendHalFinishScanReq(tpAniSirGlobal pMac, tLimLimHalScanState nextState)
1164{
1165
1166 tSirMsgQ msg;
1167 tpFinishScanParams pFinishScanParam;
1168 tSirRetStatus rc = eSIR_SUCCESS;
1169
1170 if(pMac->lim.gLimHalScanState == nextState)
1171 {
1172 /*
1173 * PE may receive multiple probe responses, while waiting for HAL to send 'FINISH_SCAN_RSP' message
1174 * PE was sending multiple finish scan req messages to HAL
1175 * this check will avoid that.
1176 * If PE is already waiting for the 'finish_scan_rsp' message from HAL, it will ignore this request.
1177 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001178 PELOGW(limLog(pMac, LOGW, FL("Next Scan State is same as the current state: %d "), nextState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001179 return;
1180 }
1181
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301182 pFinishScanParam = vos_mem_malloc(sizeof(*pFinishScanParam));
1183 if ( NULL == pFinishScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -07001184 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301185 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001186 goto error;
1187 }
1188
1189 msg.type = WDA_FINISH_SCAN_REQ;
1190 msg.bodyptr = pFinishScanParam;
1191 msg.bodyval = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001192
1193 peGetResumeChannel(pMac, &pFinishScanParam->currentOperChannel, &pFinishScanParam->cbState);
1194
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301195 vos_mem_set((tANI_U8 *)&pFinishScanParam->macMgmtHdr, sizeof(tSirMacMgmtHdr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001196
1197 if (nextState == eLIM_HAL_FINISH_LEARN_WAIT_STATE)
1198 {
1199 //AP - No pkt need to be transmitted
1200 pFinishScanParam->scanMode = eHAL_SYS_MODE_LEARN;
1201 pFinishScanParam->notifyBss = FALSE;
1202 pFinishScanParam->notifyHost = FALSE;
1203 pFinishScanParam->frameType = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001204
Jeff Johnson295189b2012-06-20 16:38:30 -07001205 pFinishScanParam->frameLength = 0;
1206 pMac->lim.gLimHalScanState = nextState;
1207 }
1208 else
1209 {
1210 /* If STA is associated with an AP (ie. STA is in
1211 * LINK_ESTABLISHED state), then STA need to inform
1212 * the AP via either DATA-NULL
1213 */
1214 if (nextState == eLIM_HAL_RESUME_LINK_WAIT_STATE)
1215 {
1216 pFinishScanParam->scanMode = eHAL_SYS_MODE_SUSPEND_LINK;
1217 }
1218 else
1219 {
1220 pFinishScanParam->scanMode = eHAL_SYS_MODE_SCAN;
1221 }
1222 pFinishScanParam->notifyHost = FALSE;
1223 __limCreateFinishScanRawFrame(pMac, pFinishScanParam);
1224 //WLAN_SUSPEND_LINK Related
1225 pMac->lim.gLimHalScanState = nextState;
1226 //end WLAN_SUSPEND_LINK Related
1227 }
1228
1229 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -07001230 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001231
1232 rc = wdaPostCtrlMsg(pMac, &msg);
1233 if (rc == eSIR_SUCCESS) {
1234 return;
1235 }
1236 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301237 vos_mem_free(pFinishScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001238 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001239
1240 error:
1241 if(nextState == eLIM_HAL_FINISH_SCAN_WAIT_STATE)
1242 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_FINISH_FAILED);
1243 //WLAN_SUSPEND_LINK Related
1244 else if ( nextState == eLIM_HAL_RESUME_LINK_WAIT_STATE )
1245 {
1246 if( pMac->lim.gpLimResumeCallback )
1247 {
1248 pMac->lim.gpLimResumeCallback( pMac, rc, pMac->lim.gpLimResumeData );
1249 pMac->lim.gpLimResumeCallback = NULL;
1250 pMac->lim.gpLimResumeData = NULL;
1251 pMac->lim.gLimSystemInScanLearnMode = 0;
1252 }
1253 }
1254 //end WLAN_SUSPEND_LINK Related
1255 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
1256 return;
1257}
1258
1259/**
1260 * limContinueChannelScan()
1261 *
1262 *FUNCTION:
1263 * This function is called by limPerformChannelScan().
1264 * This function is called to continue channel scanning when
1265 * Beacon/Probe Response frame are received.
1266 *
1267 *LOGIC:
1268 * Scan criteria stored in pMac->lim.gLimMlmScanReq is used
1269 * to perform channel scan. In this function MLM sub module
1270 * makes channel switch, sends PROBE REQUEST frame in case of
1271 * ACTIVE SCANNING, starts min/max channel timers, programs
1272 * NAV to probeDelay timer and waits for Beacon/Probe Response.
1273 * Once all required channels are scanned, LIM_MLM_SCAN_CNF
1274 * primitive is used to send Scan results to SME sub module.
1275 *
1276 *ASSUMPTIONS:
1277 * 1. In case of Active scanning, start MAX channel time iff
1278 * MIN channel timer expired and activity is observed on
1279 * the channel.
1280 *
1281 *NOTE:
1282 * NA
1283 *
1284 * @param pMac Pointer to Global MAC structure
1285 * @return None
1286 */
1287void
1288limContinueChannelScan(tpAniSirGlobal pMac)
1289{
1290 tANI_U8 channelNum;
1291
Jeff Johnson295189b2012-06-20 16:38:30 -07001292 if (pMac->lim.gLimCurrentScanChannelId >
1293 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1)
1294 || pMac->lim.abortScan)
1295 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001296 pMac->lim.abortScan = 0;
1297 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1298 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1299
1300 //Set the resume channel to Any valid channel (invalid).
1301 //This will instruct HAL to set it to any previous valid channel.
1302 peSetResumeChannel(pMac, 0, 0);
1303
1304 /// Done scanning all required channels
1305 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001306 return;
1307 }
1308
1309 /// Atleast one more channel is to be scanned
1310
1311 if ((pMac->lim.gLimReturnAfterFirstMatch & 0x40) ||
1312 (pMac->lim.gLimReturnAfterFirstMatch & 0x80))
1313 {
1314 while (pMac->lim.gLimCurrentScanChannelId <=
1315 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
1316 {
1317 if (((limGetCurrentScanChannel(pMac) <= 14) &&
1318 pMac->lim.gLim24Band11dScanDone) ||
1319 ((limGetCurrentScanChannel(pMac) > 14) &&
1320 pMac->lim.gLim50Band11dScanDone))
1321 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001322 limLog(pMac, LOGW, FL("skipping chan %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001323 limGetCurrentScanChannel(pMac));
1324 pMac->lim.gLimCurrentScanChannelId++;
1325 }
1326 else
1327 break;
1328 }
1329
1330 if (pMac->lim.gLimCurrentScanChannelId >
1331 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
1332 {
1333 pMac->lim.abortScan = 0;
1334 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1335 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1336 /// Done scanning all required channels
1337 //Set the resume channel to Any valid channel (invalid).
1338 //This will instruct HAL to set it to any previous valid channel.
1339 peSetResumeChannel(pMac, 0, 0);
1340 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
1341 return;
1342 }
1343 }
1344
1345 channelNum = limGetCurrentScanChannel(pMac);
Abhishek Singh525045c2014-12-15 17:18:45 +05301346 limLog(pMac, LOG1, FL("Current Channel to be scanned is %d"),
1347 channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -07001348
1349 limSendHalStartScanReq(pMac, channelNum, eLIM_HAL_START_SCAN_WAIT_STATE);
1350 return;
1351} /*** end limContinueChannelScan() ***/
1352
1353
1354
1355/**
1356 * limRestorePreScanState()
1357 *
1358 *FUNCTION:
1359 * This function is called by limContinueChannelScan()
1360 * to restore HW state prior to entering 'scan state'
1361 *
1362 *LOGIC
1363 *
1364 *ASSUMPTIONS:
1365 *
1366 *NOTE:
1367 * NA
1368 *
1369 * @param pMac Pointer to Global MAC structure
1370 * @return None
1371 */
1372void
1373limRestorePreScanState(tpAniSirGlobal pMac)
1374{
1375 int i;
1376
1377 /// Deactivate MIN/MAX channel timers if running
1378 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1379 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1380
1381 /* Re-activate Heartbeat timers for connected sessions as scan
Madan Mohan Koyyalamudi70bb4cb2012-10-18 19:31:25 -07001382 * is done if the DUT is in active mode
1383 * AND it is not a ROAMING ("background") scan */
1384 if(((ePMM_STATE_BMPS_WAKEUP == pMac->pmm.gPmmState) ||
Jeff Johnson295189b2012-06-20 16:38:30 -07001385 (ePMM_STATE_READY == pMac->pmm.gPmmState))
Madan Mohan Koyyalamudi70bb4cb2012-10-18 19:31:25 -07001386 && (pMac->lim.gLimBackgroundScanMode != eSIR_ROAMING_SCAN ))
Jeff Johnson295189b2012-06-20 16:38:30 -07001387 {
1388 for(i=0;i<pMac->lim.maxBssId;i++)
1389 {
Jeff Johnson32d95a32012-09-10 13:15:23 -07001390 if((peFindSessionBySessionId(pMac,i) != NULL) &&
1391 (pMac->lim.gpSession[i].valid == TRUE) &&
Yathish9f22e662012-12-10 14:21:35 -08001392 (eLIM_MLM_LINK_ESTABLISHED_STATE == pMac->lim.gpSession[i].limMlmState) &&
1393 (!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
Jeff Johnson295189b2012-06-20 16:38:30 -07001394 {
1395 limReactivateHeartBeatTimer(pMac, peFindSessionBySessionId(pMac,i));
1396 }
1397 }
1398 }
1399
1400 /**
1401 * clean up message queue.
1402 * If SME messages, redirect to deferred queue.
1403 * The rest will be discarded.
1404 */
1405 //limCleanupMsgQ(pMac);
1406
1407 pMac->lim.gLimSystemInScanLearnMode = 0;
Abhishek Singh3cbf6052014-12-15 16:46:42 +05301408 limLog(pMac, LOG1, FL("Scan ended, took %ld tu"),
1409 (tx_time_get() - pMac->lim.scanStartTime));
Jeff Johnson295189b2012-06-20 16:38:30 -07001410} /*** limRestorePreScanState() ***/
1411
Jeff Johnsone7245742012-09-05 17:12:55 -07001412#ifdef FEATURE_OEM_DATA_SUPPORT
1413
1414void limSendHalOemDataReq(tpAniSirGlobal pMac)
1415{
1416 tSirMsgQ msg;
1417 tpStartOemDataReq pStartOemDataReq = NULL;
1418 tSirRetStatus rc = eSIR_SUCCESS;
1419 tpLimMlmOemDataRsp pMlmOemDataRsp;
1420 tANI_U32 reqLen = 0;
1421 if(NULL == pMac->lim.gpLimMlmOemDataReq)
1422 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001423 PELOGE(limLog(pMac, LOGE, FL("Null pointer"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001424 goto error;
1425 }
1426
1427 reqLen = sizeof(tStartOemDataReq);
1428
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301429 pStartOemDataReq = vos_mem_malloc(reqLen);
1430 if ( NULL == pStartOemDataReq )
Jeff Johnsone7245742012-09-05 17:12:55 -07001431 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001432 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: Could not allocate memory for pStartOemDataReq"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001433 goto error;
1434 }
1435
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301436 vos_mem_set((tANI_U8*)(pStartOemDataReq), reqLen, 0);
Jeff Johnsone7245742012-09-05 17:12:55 -07001437
1438 //Now copy over the information to the OEM DATA REQ to HAL
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301439 vos_mem_copy(pStartOemDataReq->selfMacAddr,
1440 pMac->lim.gpLimMlmOemDataReq->selfMacAddr,
1441 sizeof(tSirMacAddr));
Jeff Johnsone7245742012-09-05 17:12:55 -07001442
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301443 vos_mem_copy(pStartOemDataReq->oemDataReq,
1444 pMac->lim.gpLimMlmOemDataReq->oemDataReq,
1445 OEM_DATA_REQ_SIZE);
Jeff Johnsone7245742012-09-05 17:12:55 -07001446
1447 //Create the message to be passed to HAL
1448 msg.type = WDA_START_OEM_DATA_REQ;
1449 msg.bodyptr = pStartOemDataReq;
1450 msg.bodyval = 0;
1451
1452 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
1453 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
1454
1455 rc = wdaPostCtrlMsg(pMac, &msg);
1456 if(rc == eSIR_SUCCESS)
1457 {
1458 return;
1459 }
1460
1461 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301462 vos_mem_free(pStartOemDataReq);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001463 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: posting WDA_START_OEM_DATA_REQ to HAL failed"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001464
1465error:
1466 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Varun Reddy Yeturue3bbf6e2013-02-08 18:50:55 -08001467 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnsone7245742012-09-05 17:12:55 -07001468
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301469 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
1470 if ( NULL == pMlmOemDataRsp )
Jeff Johnsone7245742012-09-05 17:12:55 -07001471 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001472 limLog(pMac->hHdd, LOGP, FL("OEM_DATA: memory allocation for pMlmOemDataRsp failed under suspend link failure"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001473 return;
1474 }
1475
1476 if(NULL != pMac->lim.gpLimMlmOemDataReq)
1477 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301478 vos_mem_free(pMac->lim.gpLimMlmOemDataReq);
Jeff Johnsone7245742012-09-05 17:12:55 -07001479 pMac->lim.gpLimMlmOemDataReq = NULL;
1480 }
1481
1482 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
1483
1484 return;
1485}
1486/**
1487 * limSetOemDataReqModeFailed()
1488 *
1489 * FUNCTION:
1490 * This function is used as callback to resume link after the suspend fails while
1491 * starting oem data req mode.
1492 * LOGIC:
1493 * NA
1494 *
1495 * ASSUMPTIONS:
1496 * NA
1497 *
1498 * NOTE:
1499 *
1500 * @param pMac - Pointer to Global MAC structure
1501 * @return None
1502 */
1503
1504void limSetOemDataReqModeFailed(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data)
1505{
1506 tpLimMlmOemDataRsp pMlmOemDataRsp;
1507
1508 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Varun Reddy Yeturue3bbf6e2013-02-08 18:50:55 -08001509 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnsone7245742012-09-05 17:12:55 -07001510
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301511 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
1512 if ( NULL == pMlmOemDataRsp )
Jeff Johnsone7245742012-09-05 17:12:55 -07001513 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001514 limLog(pMac->hHdd, LOGP, FL("OEM_DATA: memory allocation for pMlmOemDataRsp failed under suspend link failure"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001515 return;
1516 }
1517
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301518 if (NULL != pMac->lim.gpLimMlmOemDataReq)
Jeff Johnsone7245742012-09-05 17:12:55 -07001519 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301520 vos_mem_free(pMac->lim.gpLimMlmOemDataReq);
Jeff Johnsone7245742012-09-05 17:12:55 -07001521 pMac->lim.gpLimMlmOemDataReq = NULL;
1522 }
1523
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301524 vos_mem_set(pMlmOemDataRsp, sizeof(tLimMlmOemDataRsp), 0);
Jeff Johnsone7245742012-09-05 17:12:55 -07001525
1526 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
1527
1528 return;
1529}
1530
1531/**
1532 * limSetOemDataReqMode()
1533 *
1534 *FUNCTION:
1535 * This function is called to setup system into OEM DATA REQ mode
1536 *
1537 *LOGIC:
1538 * NA
1539 *
1540 *ASSUMPTIONS:
1541 * NA
1542 *
1543 *NOTE:
1544 *
1545 * @param pMac - Pointer to Global MAC structure
1546 * @return None
1547 */
1548
1549void limSetOemDataReqMode(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data)
1550{
1551 if(status != eHAL_STATUS_SUCCESS)
1552 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001553 limLog(pMac, LOGE, FL("OEM_DATA: failed in suspend link"));
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05301554 /* If failed to suspend the link, there is no need
1555 * to resume link. Return failure.
1556 */
1557 limSetOemDataReqModeFailed(pMac, status, data);
Jeff Johnsone7245742012-09-05 17:12:55 -07001558 }
1559 else
1560 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001561 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: Calling limSendHalOemDataReq"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001562 limSendHalOemDataReq(pMac);
Jeff Johnsone7245742012-09-05 17:12:55 -07001563 }
1564
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05301565 return;
Jeff Johnsone7245742012-09-05 17:12:55 -07001566} /*** end limSendHalOemDataReq() ***/
1567
1568#endif //FEATURE_OEM_DATA_SUPPORT
Jeff Johnson295189b2012-06-20 16:38:30 -07001569
1570static void
1571mlm_add_sta(
1572 tpAniSirGlobal pMac,
1573 tpAddStaParams pSta,
1574 tANI_U8 *pBssid,
1575 tANI_U8 htCapable,
1576 tpPESession psessionEntry) //psessionEntry may required in future
1577{
1578 tANI_U32 val;
1579 int i;
1580
1581
1582 pSta->staType = STA_ENTRY_SELF; // Identifying self
1583
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301584 vos_mem_copy(pSta->bssId, pBssid, sizeof( tSirMacAddr ));
1585 vos_mem_copy(pSta->staMac, psessionEntry->selfMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001586
1587 /* Configuration related parameters to be changed to support BT-AMP */
1588
1589 if( eSIR_SUCCESS != wlan_cfgGetInt( pMac, WNI_CFG_LISTEN_INTERVAL, &val ))
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001590 limLog(pMac, LOGP, FL("Couldn't get LISTEN_INTERVAL"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001591
1592 pSta->listenInterval = (tANI_U16) val;
1593
1594 if (eSIR_SUCCESS != wlan_cfgGetInt(pMac, WNI_CFG_SHORT_PREAMBLE, &val) )
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001595 limLog(pMac, LOGP, FL("Couldn't get SHORT_PREAMBLE"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001596 pSta->shortPreambleSupported = (tANI_U8)val;
1597
1598 pSta->assocId = 0; // Is SMAC OK with this?
1599 pSta->wmmEnabled = 0;
1600 pSta->uAPSD = 0;
1601 pSta->maxSPLen = 0;
1602 pSta->us32MaxAmpduDuration = 0;
1603 pSta->maxAmpduSize = 0; // 0: 8k, 1: 16k,2: 32k,3: 64k
1604
1605
Gopichand Nakkalab2d2c312013-01-04 11:41:02 -08001606 /* For Self STA get the LDPC capability from config.ini*/
1607 pSta->htLdpcCapable =
1608 (psessionEntry->txLdpcIniFeatureEnabled & 0x01);
1609 pSta->vhtLdpcCapable =
1610 ((psessionEntry->txLdpcIniFeatureEnabled >> 1)& 0x01);
1611
Jeff Johnson295189b2012-06-20 16:38:30 -07001612 if(IS_DOT11_MODE_HT(psessionEntry->dot11mode))
1613 {
1614 pSta->htCapable = htCapable;
Jeff Johnson295189b2012-06-20 16:38:30 -07001615 pSta->greenFieldCapable = limGetHTCapability( pMac, eHT_GREENFIELD, psessionEntry);
1616 pSta->txChannelWidthSet = limGetHTCapability( pMac, eHT_SUPPORTED_CHANNEL_WIDTH_SET, psessionEntry );
1617 pSta->mimoPS = (tSirMacHTMIMOPowerSaveState)limGetHTCapability( pMac, eHT_MIMO_POWER_SAVE, psessionEntry );
1618 pSta->rifsMode = limGetHTCapability( pMac, eHT_RIFS_MODE, psessionEntry );
1619 pSta->lsigTxopProtection = limGetHTCapability( pMac, eHT_LSIG_TXOP_PROTECTION, psessionEntry );
1620 pSta->delBASupport = limGetHTCapability( pMac, eHT_DELAYED_BA, psessionEntry );
1621 pSta->maxAmpduDensity = limGetHTCapability( pMac, eHT_MPDU_DENSITY, psessionEntry );
1622 pSta->maxAmsduSize = limGetHTCapability( pMac, eHT_MAX_AMSDU_LENGTH, psessionEntry );
1623 pSta->fDsssCckMode40Mhz = limGetHTCapability( pMac, eHT_DSSS_CCK_MODE_40MHZ, psessionEntry);
1624 pSta->fShortGI20Mhz = limGetHTCapability( pMac, eHT_SHORT_GI_20MHZ, psessionEntry);
1625 pSta->fShortGI40Mhz = limGetHTCapability( pMac, eHT_SHORT_GI_40MHZ, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -07001626 }
Jeff Johnsone7245742012-09-05 17:12:55 -07001627#ifdef WLAN_FEATURE_11AC
1628 if (psessionEntry->vhtCapability)
1629 {
1630 pSta->vhtCapable = VOS_TRUE;
Shailender Karmuchi08f87c22013-01-17 12:51:24 -08001631 pSta->vhtTxBFCapable = psessionEntry->txBFIniFeatureEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07001632 }
1633#endif
1634#ifdef WLAN_FEATURE_11AC
1635 limPopulateOwnRateSet(pMac, &pSta->supportedRates, NULL, false,psessionEntry,NULL);
1636#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001637 limPopulateOwnRateSet(pMac, &pSta->supportedRates, NULL, false,psessionEntry);
Jeff Johnsone7245742012-09-05 17:12:55 -07001638#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001639 limFillSupportedRatesInfo(pMac, NULL, &pSta->supportedRates,psessionEntry);
1640
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001641 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 -07001642 pSta->greenFieldCapable, pSta->txChannelWidthSet, pSta->mimoPS, pSta->lsigTxopProtection,
1643 pSta->fDsssCckMode40Mhz,pSta->fShortGI20Mhz, pSta->fShortGI40Mhz);
1644
Jeff Johnson295189b2012-06-20 16:38:30 -07001645 if (VOS_P2P_GO_MODE == psessionEntry->pePersona)
1646 {
1647 pSta->p2pCapableSta = 1;
1648 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001649
1650 //Disable BA. It will be set as part of ADDBA negotiation.
1651 for( i = 0; i < STACFG_MAX_TC; i++ )
1652 {
1653 pSta->staTCParams[i].txUseBA = eBA_DISABLE;
1654 pSta->staTCParams[i].rxUseBA = eBA_DISABLE;
1655 }
1656
1657}
1658
1659//
1660// New HAL interface - WDA_ADD_BSS_REQ
1661// Package WDA_ADD_BSS_REQ to HAL, in order to start a BSS
1662//
1663tSirResultCodes
1664limMlmAddBss (
1665 tpAniSirGlobal pMac,
1666 tLimMlmStartReq *pMlmStartReq,
1667 tpPESession psessionEntry)
1668{
1669 tSirMsgQ msgQ;
1670 tpAddBssParams pAddBssParams = NULL;
1671 tANI_U32 retCode;
1672
Jeff Johnson295189b2012-06-20 16:38:30 -07001673 // Package WDA_ADD_BSS_REQ message parameters
1674
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301675 pAddBssParams = vos_mem_malloc(sizeof( tAddBssParams ));
1676 if ( NULL == pAddBssParams )
Jeff Johnson295189b2012-06-20 16:38:30 -07001677 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301678 limLog( pMac, LOGE, FL( "Unable to allocate memory during ADD_BSS" ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001679 // Respond to SME with LIM_MLM_START_CNF
1680 return eSIR_SME_HAL_SEND_MESSAGE_FAIL;
1681 }
1682
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301683 vos_mem_set(pAddBssParams, sizeof(tAddBssParams), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001684
1685 // Fill in tAddBssParams members
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301686 vos_mem_copy(pAddBssParams->bssId, pMlmStartReq->bssId,
Jeff Johnson295189b2012-06-20 16:38:30 -07001687 sizeof( tSirMacAddr ));
1688
1689 // Fill in tAddBssParams selfMacAddr
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301690 vos_mem_copy (pAddBssParams->selfMacAddr,
1691 psessionEntry->selfMacAddr,
1692 sizeof( tSirMacAddr ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001693
1694 pAddBssParams->bssType = pMlmStartReq->bssType;
1695 if ((pMlmStartReq->bssType == eSIR_IBSS_MODE) ||
1696 (pMlmStartReq->bssType == eSIR_BTAMP_AP_MODE)||
1697 (pMlmStartReq->bssType == eSIR_BTAMP_STA_MODE)) {
1698 pAddBssParams->operMode = BSS_OPERATIONAL_MODE_STA;
1699 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001700 else if (pMlmStartReq->bssType == eSIR_INFRA_AP_MODE){
Jeff Johnson295189b2012-06-20 16:38:30 -07001701 pAddBssParams->operMode = BSS_OPERATIONAL_MODE_AP;
1702 }
1703
Jeff Johnsone7245742012-09-05 17:12:55 -07001704 pAddBssParams->shortSlotTimeSupported = psessionEntry->shortSlotTimeSupported;
Jeff Johnson295189b2012-06-20 16:38:30 -07001705
Jeff Johnson295189b2012-06-20 16:38:30 -07001706 pAddBssParams->beaconInterval = pMlmStartReq->beaconPeriod;
1707 pAddBssParams->dtimPeriod = pMlmStartReq->dtimPeriod;
1708 pAddBssParams->cfParamSet.cfpCount = pMlmStartReq->cfParamSet.cfpCount;
1709 pAddBssParams->cfParamSet.cfpPeriod = pMlmStartReq->cfParamSet.cfpPeriod;
1710 pAddBssParams->cfParamSet.cfpMaxDuration = pMlmStartReq->cfParamSet.cfpMaxDuration;
1711 pAddBssParams->cfParamSet.cfpDurRemaining = pMlmStartReq->cfParamSet.cfpDurRemaining;
1712
1713 pAddBssParams->rateSet.numRates = pMlmStartReq->rateSet.numRates;
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301714 vos_mem_copy(pAddBssParams->rateSet.rate,
1715 pMlmStartReq->rateSet.rate, pMlmStartReq->rateSet.numRates);
Jeff Johnson295189b2012-06-20 16:38:30 -07001716
1717 pAddBssParams->nwType = pMlmStartReq->nwType;
1718
1719 pAddBssParams->htCapable = pMlmStartReq->htCapable;
Jeff Johnsone7245742012-09-05 17:12:55 -07001720#ifdef WLAN_FEATURE_11AC
1721 pAddBssParams->vhtCapable = psessionEntry->vhtCapability;
1722 pAddBssParams->vhtTxChannelWidthSet = psessionEntry->vhtTxChannelWidthSet;
1723#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001724 pAddBssParams->htOperMode = pMlmStartReq->htOperMode;
1725 pAddBssParams->dualCTSProtection = pMlmStartReq->dualCTSProtection;
1726 pAddBssParams->txChannelWidthSet = pMlmStartReq->txChannelWidthSet;
1727
1728 pAddBssParams->currentOperChannel = pMlmStartReq->channelNumber;
Jeff Johnsone7245742012-09-05 17:12:55 -07001729 pAddBssParams->currentExtChannel = pMlmStartReq->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07001730
Chet Lanctot8cecea22014-02-11 19:09:36 -08001731#ifdef WLAN_FEATURE_11W
1732 pAddBssParams->rmfEnabled = psessionEntry->limRmfEnabled;
1733#endif
1734
Jeff Johnson295189b2012-06-20 16:38:30 -07001735 /* Update PE sessionId*/
1736 pAddBssParams->sessionId = pMlmStartReq->sessionId;
1737
1738 //Send the SSID to HAL to enable SSID matching for IBSS
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301739 vos_mem_copy(&(pAddBssParams->ssId.ssId),
1740 pMlmStartReq->ssId.ssId,
1741 pMlmStartReq->ssId.length);
Jeff Johnson295189b2012-06-20 16:38:30 -07001742 pAddBssParams->ssId.length = pMlmStartReq->ssId.length;
Jeff Johnson295189b2012-06-20 16:38:30 -07001743 pAddBssParams->bHiddenSSIDEn = pMlmStartReq->ssidHidden;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001744 limLog( pMac, LOGE, FL( "TRYING TO HIDE SSID %d" ),pAddBssParams->bHiddenSSIDEn);
Jeff Johnson295189b2012-06-20 16:38:30 -07001745 // CR309183. Disable Proxy Probe Rsp. Host handles Probe Requests. Until FW fixed.
1746 pAddBssParams->bProxyProbeRespEn = 0;
1747 pAddBssParams->obssProtEnabled = pMlmStartReq->obssProtEnabled;
1748
Jeff Johnson295189b2012-06-20 16:38:30 -07001749#if defined WLAN_FEATURE_VOWIFI
1750 pAddBssParams->maxTxPower = psessionEntry->maxTxPower;
1751#endif
1752 mlm_add_sta(pMac, &pAddBssParams->staContext,
1753 pAddBssParams->bssId, pAddBssParams->htCapable,psessionEntry);
1754
1755 pAddBssParams->status = eHAL_STATUS_SUCCESS;
1756 pAddBssParams->respReqd = 1;
1757
1758 // Set a new state for MLME
1759 psessionEntry->limMlmState = eLIM_MLM_WT_ADD_BSS_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07001760 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07001761
1762 pAddBssParams->halPersona=psessionEntry->pePersona; //pass on the session persona to hal
1763
1764 pAddBssParams->bSpectrumMgtEnabled = psessionEntry->spectrumMgtEnabled;
1765
1766#if defined WLAN_FEATURE_VOWIFI_11R
1767 pAddBssParams->extSetStaKeyParamValid = 0;
1768#endif
1769
1770 //
1771 // FIXME_GEN4
1772 // A global counter (dialog token) is required to keep track of
1773 // all PE <-> HAL communication(s)
1774 //
1775 msgQ.type = WDA_ADD_BSS_REQ;
1776 msgQ.reserved = 0;
1777 msgQ.bodyptr = pAddBssParams;
1778 msgQ.bodyval = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001779 MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001780
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001781 limLog( pMac, LOGW, FL( "Sending WDA_ADD_BSS_REQ..." ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001782 if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
1783 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001784 limLog( pMac, LOGE, FL("Posting ADD_BSS_REQ to HAL failed, reason=%X"), retCode );
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301785 vos_mem_free(pAddBssParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07001786 return eSIR_SME_HAL_SEND_MESSAGE_FAIL;
1787 }
1788
1789 return eSIR_SME_SUCCESS;
1790}
1791
1792
1793/**
1794 * limProcessMlmStartReq()
1795 *
1796 *FUNCTION:
1797 * This function is called to process MLM_START_REQ message
1798 * from SME
1799 *
1800 *LOGIC:
1801 * 1) MLME receives LIM_MLM_START_REQ from LIM
1802 * 2) MLME sends WDA_ADD_BSS_REQ to HAL
1803 * 3) MLME changes state to eLIM_MLM_WT_ADD_BSS_RSP_STATE
1804 * MLME now waits for HAL to send WDA_ADD_BSS_RSP
1805 *
1806 *ASSUMPTIONS:
1807 *
1808 *NOTE:
1809 *
1810 * @param pMac Pointer to Global MAC structure
1811 * @param *pMsgBuf A pointer to the MLM message buffer
1812 * @return None
1813 */
1814
1815static void
1816limProcessMlmStartReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
1817{
1818 tLimMlmStartReq *pMlmStartReq;
1819 tLimMlmStartCnf mlmStartCnf;
1820 tpPESession psessionEntry = NULL;
1821
1822 if(pMsgBuf == NULL)
1823 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001824 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001825 return;
1826 }
1827
1828 pMlmStartReq = (tLimMlmStartReq *) pMsgBuf;
1829 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmStartReq->sessionId))==NULL)
1830 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001831 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001832 mlmStartCnf.resultCode = eSIR_SME_REFUSED;
1833 goto end;
1834 }
1835
1836 if (psessionEntry->limMlmState != eLIM_MLM_IDLE_STATE)
1837 {
1838 /**
1839 * Should not have received Start req in states other than idle.
1840 * Return Start confirm with failure code.
1841 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001842 PELOGE(limLog(pMac, LOGE, FL("received unexpected MLM_START_REQ in state %X"),psessionEntry->limMlmState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001843 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
1844 mlmStartCnf.resultCode = eSIR_SME_BSS_ALREADY_STARTED_OR_JOINED;
1845 goto end;
1846 }
1847
1848 #if 0
1849 if (cfgSetInt(pMac, WNI_CFG_CURRENT_CHANNEL, pMlmStartReq->channelNumber)!= eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001850 limLog(pMac, LOGP, FL("could not set CURRENT_CHANNEL at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001851
1852 pMac->lim.gLimCurrentChannelId = pMlmStartReq->channelNumber;
1853 #endif //TO SUPPORT BT-AMP
1854
1855
1856 // Update BSSID & SSID at CFG database
1857 #if 0 //We are not using the BSSID and SSID from the config file, instead we are reading form the session table
1858 if (cfgSetStr(pMac, WNI_CFG_BSSID, (tANI_U8 *) pMlmStartReq->bssId, sizeof(tSirMacAddr))
1859 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001860 limLog(pMac, LOGP, FL("could not update BSSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001861
1862
1863
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301864 vos_mem_copy( pMac->lim.gLimCurrentBssId,
Jeff Johnson295189b2012-06-20 16:38:30 -07001865 pMlmStartReq->bssId,
1866 sizeof(tSirMacAddr));
1867 #endif //TO SUPPORT BT-AMP
1868
1869 #if 0
1870 if (cfgSetStr(pMac, WNI_CFG_SSID, (tANI_U8 *) &pMlmStartReq->ssId.ssId, pMlmStartReq->ssId.length)
1871 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001872 limLog(pMac, LOGP, FL("could not update SSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001873 #endif //To SUPPORT BT-AMP
1874
1875
1876 // pMac->lim.gLimCurrentSSID.length = pMlmStartReq->ssId.length;
1877
1878 #if 0
1879 if (cfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET,
1880 (tANI_U8 *) &pMac->lim.gpLimStartBssReq->operationalRateSet.rate,
1881 pMac->lim.gpLimStartBssReq->operationalRateSet.numRates)
1882 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001883 limLog(pMac, LOGP, FL("could not update Operational Rateset at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001884 #endif //TO SUPPORT BT-AMP
1885
1886
Jeff Johnson295189b2012-06-20 16:38:30 -07001887
Jeff Johnson295189b2012-06-20 16:38:30 -07001888#if 0 // Periodic timer for remove WPS PBC proble response entry in PE is disbaled now.
1889 if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
1890 {
1891 if(pMac->lim.limTimers.gLimWPSOverlapTimerObj.isTimerCreated == eANI_BOOLEAN_FALSE)
1892 {
1893 if (tx_timer_create(&pMac->lim.limTimers.gLimWPSOverlapTimerObj.gLimWPSOverlapTimer,
1894 "PS OVERLAP Timer",
1895 limWPSOverlapTimerHandler,
1896 SIR_LIM_WPS_OVERLAP_TIMEOUT, // expiration_input
1897 SYS_MS_TO_TICKS(LIM_WPS_OVERLAP_TIMER_MS), // initial_ticks
1898 SYS_MS_TO_TICKS(LIM_WPS_OVERLAP_TIMER_MS), // reschedule_ticks
1899 TX_AUTO_ACTIVATE /* TX_NO_ACTIVATE*/) != TX_SUCCESS)
1900 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001901 limLog(pMac, LOGP, FL("failed to create WPS overlap Timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001902 }
1903
1904 pMac->lim.limTimers.gLimWPSOverlapTimerObj.sessionId = pMlmStartReq->sessionId;
1905 pMac->lim.limTimers.gLimWPSOverlapTimerObj.isTimerCreated = eANI_BOOLEAN_TRUE;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001906 limLog(pMac, LOGE, FL("Create WPS overlap Timer, session=%d"), pMlmStartReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07001907
1908 if (tx_timer_activate(&pMac->lim.limTimers.gLimWPSOverlapTimerObj.gLimWPSOverlapTimer) != TX_SUCCESS)
1909 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001910 limLog(pMac, LOGP, FL("tx_timer_activate failed"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001911 }
1912 }
1913 }
1914#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001915
1916
1917
1918 mlmStartCnf.resultCode = limMlmAddBss(pMac, pMlmStartReq,psessionEntry);
1919
1920end:
1921 /* Update PE session Id */
1922 mlmStartCnf.sessionId = pMlmStartReq->sessionId;
1923
1924 /// Free up buffer allocated for LimMlmScanReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301925 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07001926
1927 //
1928 // Respond immediately to LIM, only if MLME has not been
1929 // successfully able to send WDA_ADD_BSS_REQ to HAL.
1930 // Else, LIM_MLM_START_CNF will be sent after receiving
1931 // WDA_ADD_BSS_RSP from HAL
1932 //
1933 if( eSIR_SME_SUCCESS != mlmStartCnf.resultCode )
1934 limPostSmeMessage(pMac, LIM_MLM_START_CNF, (tANI_U32 *) &mlmStartCnf);
1935} /*** limProcessMlmStartReq() ***/
1936
1937
1938/*
1939* This function checks if Scan is allowed or not.
1940* It checks each session and if any session is not in the normal state,
1941* it will return false.
1942* Note: BTAMP_STA can be in LINK_EST as well as BSS_STARTED State, so
1943* both cases are handled below.
1944*/
1945
1946static tANI_U8 __limMlmScanAllowed(tpAniSirGlobal pMac)
1947{
1948 int i;
1949
Jeff Johnson43971f52012-07-17 12:26:56 -07001950 if(pMac->lim.gLimMlmState != eLIM_MLM_IDLE_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07001951 {
1952 return FALSE;
1953 }
1954 for(i =0; i < pMac->lim.maxBssId; i++)
1955 {
1956 if(pMac->lim.gpSession[i].valid == TRUE)
1957 {
1958 if(!( ( ( (pMac->lim.gpSession[i].bssType == eSIR_INFRASTRUCTURE_MODE) ||
1959 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_STA_ROLE))&&
1960 (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE) )||
1961
1962 ( ( (pMac->lim.gpSession[i].bssType == eSIR_IBSS_MODE)||
1963 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_AP_ROLE)||
1964 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_STA_ROLE) )&&
1965 (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_BSS_STARTED_STATE) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001966 || ( ( ( (pMac->lim.gpSession[i].bssType == eSIR_INFRA_AP_MODE)
1967 && ( pMac->lim.gpSession[i].pePersona == VOS_P2P_GO_MODE) )
1968 || (pMac->lim.gpSession[i].limSystemRole == eLIM_AP_ROLE) )
1969 && (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_BSS_STARTED_STATE) )
Jeff Johnson295189b2012-06-20 16:38:30 -07001970 ))
1971 {
1972 return FALSE;
1973
1974 }
1975 }
1976 }
1977
1978 return TRUE;
1979}
1980
1981
1982
1983/**
1984 * limProcessMlmScanReq()
1985 *
1986 *FUNCTION:
1987 * This function is called to process MLM_SCAN_REQ message
1988 * from SME
1989 *
1990 *LOGIC:
1991 *
1992 *ASSUMPTIONS:
1993 *
1994 *NOTE:
1995 *
1996 * @param pMac Pointer to Global MAC structure
1997 * @param *pMsgBuf A pointer to the MLM message buffer
1998 * @return None
1999 */
2000
2001static void
2002limProcessMlmScanReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2003{
2004 tLimMlmScanCnf mlmScanCnf;
Maleka Vinayd500cd42012-12-10 12:37:09 -08002005 tANI_U8 i = 0;
2006 tANI_U32 val = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002007
2008 if (pMac->lim.gLimSystemInScanLearnMode)
2009 {
2010 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002011 FL("Sending START_SCAN from LIM while one req is pending"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302012 vos_mem_free(pMsgBuf);
Madan Mohan Koyyalamudid4b301b2012-10-11 14:15:54 -07002013 /*Send back a failure*/
2014 mlmScanCnf.resultCode = eSIR_SME_SCAN_FAILED;
2015 mlmScanCnf.scanResultLength = 0;
2016 limPostSmeMessage(pMac,
2017 LIM_MLM_SCAN_CNF,
2018 (tANI_U32 *) &mlmScanCnf);
Jeff Johnson295189b2012-06-20 16:38:30 -07002019 return;
2020 }
2021
2022 if(__limMlmScanAllowed(pMac) &&
2023 (((tLimMlmScanReq *) pMsgBuf)->channelList.numChannels != 0))
2024
2025 {
2026 /// Hold onto SCAN REQ criteria
2027 pMac->lim.gpLimMlmScanReq = (tLimMlmScanReq *) pMsgBuf;
2028
Abhishek Singh127a8442014-12-15 17:31:27 +05302029 limLog(pMac, LOG1, FL("Number of channels to scan are %d "),
2030 pMac->lim.gpLimMlmScanReq->channelList.numChannels);
Jeff Johnson295189b2012-06-20 16:38:30 -07002031
2032 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
2033
2034 if (pMac->lim.gpLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN)
2035 pMac->lim.gLimMlmState = eLIM_MLM_WT_PROBE_RESP_STATE;
2036 else // eSIR_PASSIVE_SCAN
2037 pMac->lim.gLimMlmState = eLIM_MLM_PASSIVE_SCAN_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002038 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002039
2040 pMac->lim.gLimSystemInScanLearnMode = 1;
2041
Maleka Vinayd500cd42012-12-10 12:37:09 -08002042 /* temporary fix to handle case where NOA duration calculation is incorrect
2043 * for scanning on DFS channels */
2044
2045 pMac->lim.gTotalScanDuration = 0;
2046
2047 if (wlan_cfgGetInt(pMac, WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME, &val) != eSIR_SUCCESS)
2048 {
2049 /*
2050 * Could not get max channel value
2051 * from CFG. Log error.
2052 */
Abhishek Singh95f7b252015-10-14 14:15:35 +05302053 limLog(pMac, LOGP,
2054 FL("could not retrieve passive max channel value use def"));
2055 /* use a default value */
2056 val= WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME_STADEF;
Maleka Vinayd500cd42012-12-10 12:37:09 -08002057 }
2058
2059 for (i = 0; i < pMac->lim.gpLimMlmScanReq->channelList.numChannels; i++) {
2060 tANI_U8 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[i];
2061
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +05302062 if (pMac->miracast_mode) {
2063 pMac->lim.gTotalScanDuration += (DEFAULT_MIN_CHAN_TIME_DURING_MIRACAST +
2064 DEFAULT_MAX_CHAN_TIME_DURING_MIRACAST);
2065 } else if (limActiveScanAllowed(pMac, channelNum)) {
Maleka Vinayd500cd42012-12-10 12:37:09 -08002066 /* Use min + max channel time to calculate the total duration of scan */
2067 pMac->lim.gTotalScanDuration += pMac->lim.gpLimMlmScanReq->minChannelTime + pMac->lim.gpLimMlmScanReq->maxChannelTime;
2068 } else {
2069 /* using the value from WNI_CFG_PASSIVE_MINIMUM_CHANNEL_TIME as is done in
2070 * void limContinuePostChannelScan(tpAniSirGlobal pMac)
2071 */
2072 pMac->lim.gTotalScanDuration += val;
2073 }
2074 }
2075
2076 /* Adding an overhead of 5ms to account for the scan messaging delays */
2077 pMac->lim.gTotalScanDuration += 5;
Jeff Johnson295189b2012-06-20 16:38:30 -07002078 limSetScanMode(pMac);
2079 }
2080 else
2081 {
2082 /**
2083 * Should not have received SCAN req in other states
2084 * OR should not have received LIM_MLM_SCAN_REQ with
2085 * zero number of channels
2086 * Log error
2087 */
2088 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05302089 FL("received unexpected MLM_SCAN_REQ in state %d OR zero number of channels: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002090 pMac->lim.gLimMlmState, ((tLimMlmScanReq *) pMsgBuf)->channelList.numChannels);
2091 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
2092
2093 /// Free up buffer allocated for
2094 /// pMac->lim.gLimMlmScanReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302095 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07002096
2097 /// Return Scan confirm with INVALID_PARAMETERS
2098
2099 mlmScanCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2100 mlmScanCnf.scanResultLength = 0;
2101 limPostSmeMessage(pMac,
2102 LIM_MLM_SCAN_CNF,
2103 (tANI_U32 *) &mlmScanCnf);
2104 }
2105} /*** limProcessMlmScanReq() ***/
2106
Jeff Johnsone7245742012-09-05 17:12:55 -07002107#ifdef FEATURE_OEM_DATA_SUPPORT
2108static void limProcessMlmOemDataReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2109{
2110 tLimMlmOemDataRsp* pMlmOemDataRsp;
2111
2112 if (((pMac->lim.gLimMlmState == eLIM_MLM_IDLE_STATE) ||
2113 (pMac->lim.gLimMlmState == eLIM_MLM_JOINED_STATE) ||
2114 (pMac->lim.gLimMlmState == eLIM_MLM_AUTHENTICATED_STATE) ||
2115 (pMac->lim.gLimMlmState == eLIM_MLM_BSS_STARTED_STATE) ||
2116 (pMac->lim.gLimMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)))
2117 {
2118 //Hold onto the oem data request criteria
2119 pMac->lim.gpLimMlmOemDataReq = (tLimMlmOemDataReq*)pMsgBuf;
2120
2121 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
2122
2123 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
2124
2125 //Now request for link suspension
2126 limSuspendLink(pMac, eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN, limSetOemDataReqMode, NULL);
2127 }
2128 else
2129 {
2130 /**
2131 * Should not have received oem data req in other states
2132 * Log error
2133 */
2134
Sushant Kaushik1b645382014-10-13 16:39:36 +05302135 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 -07002136
2137 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
2138
2139 /// Free up buffer allocated
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302140 vos_mem_free(pMsgBuf);
Jeff Johnsone7245742012-09-05 17:12:55 -07002141
2142 /// Return Meas confirm with INVALID_PARAMETERS
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302143 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
2144 if ( pMlmOemDataRsp != NULL)
Jeff Johnsone7245742012-09-05 17:12:55 -07002145 {
2146 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302147 vos_mem_free(pMlmOemDataRsp);
Jeff Johnsone7245742012-09-05 17:12:55 -07002148 }
2149 else
2150 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002151 limLog(pMac, LOGP, FL("Could not allocate memory for pMlmOemDataRsp"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002152 return;
2153 }
2154 }
2155
2156 return;
2157}
2158#endif //FEATURE_OEM_DATA_SUPPORT
Jeff Johnson295189b2012-06-20 16:38:30 -07002159
2160
2161/**
2162 * limProcessMlmPostJoinSuspendLink()
2163 *
2164 *FUNCTION:
2165 * This function is called after the suspend link while joining
2166 * off channel.
2167 *
2168 *LOGIC:
2169 * Check for suspend state.
2170 * If success, proceed with setting link state to recieve the
2171 * probe response/beacon from intended AP.
2172 * Switch to the APs channel.
2173 * On an error case, send the MLM_JOIN_CNF with error status.
2174 *
2175 *ASSUMPTIONS:
2176 *
2177 *NOTE:
2178 *
2179 * @param pMac Pointer to Global MAC structure
2180 * @param status status of suspend link.
2181 * @param ctx passed while calling suspend link(psessionEntry)
2182 * @return None
2183 */
2184static void
2185limProcessMlmPostJoinSuspendLink(tpAniSirGlobal pMac, eHalStatus status, tANI_U32 *ctx)
2186{
Jeff Johnsone7245742012-09-05 17:12:55 -07002187 tANI_U8 chanNum, secChanOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002188 tLimMlmJoinCnf mlmJoinCnf;
2189 tpPESession psessionEntry = (tpPESession)ctx;
2190 tSirLinkState linkState;
2191
2192 if( eHAL_STATUS_SUCCESS != status )
2193 {
Abhishek Singhdcbd8272014-01-09 14:16:01 +05302194 limLog(pMac, LOGE, FL("Sessionid %d Suspend link(NOTIFY_BSS) failed. "
2195 "still proceeding with join"),psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002196 }
2197 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2198 psessionEntry->limMlmState = eLIM_MLM_WT_JOIN_BEACON_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002199 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002200
Abhishek Singhdcbd8272014-01-09 14:16:01 +05302201 limLog(pMac, LOG1, FL("Sessionid %d prev lim state %d new lim state %d "
2202 "systemrole = %d"), psessionEntry->peSessionId,
2203 psessionEntry->limPrevMlmState,
2204 psessionEntry->limMlmState,psessionEntry->limSystemRole);
2205
Jeff Johnson295189b2012-06-20 16:38:30 -07002206 limDeactivateAndChangeTimer(pMac, eLIM_JOIN_FAIL_TIMER);
2207
2208 //assign appropriate sessionId to the timer object
2209 pMac->lim.limTimers.gLimJoinFailureTimer.sessionId = psessionEntry->peSessionId;
2210
2211 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 -07002212 limLog(pMac, LOG1, FL("[limProcessMlmJoinReq]: linkState:%d"),linkState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002213
2214 if (limSetLinkState(pMac, linkState,
2215 psessionEntry->pLimMlmJoinReq->bssDescription.bssId,
2216 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS )
2217 {
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302218 limLog(pMac, LOGE,
2219 FL("SessionId:%d limSetLinkState to eSIR_LINK_PREASSOC_STATE"
2220 " Failed!!"),psessionEntry->peSessionId);
2221 limPrintMacAddr(pMac,
2222 psessionEntry->pLimMlmJoinReq->bssDescription.bssId,LOGE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002223 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002224 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
2225 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002226 goto error;
2227 }
2228
2229 /** Derive channel from BSS description and store it in the CFG */
2230 // chanNum = pMac->lim.gpLimMlmJoinReq->bssDescription.channelId;
2231
2232 chanNum = psessionEntry->currentOperChannel;
Jeff Johnsone7245742012-09-05 17:12:55 -07002233 secChanOffset = psessionEntry->htSecondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002234 //store the channel switch sessionEntry in the lim global var
2235 psessionEntry->channelChangeReasonCode = LIM_SWITCH_CHANNEL_JOIN;
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08002236#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
Madan Mohan Koyyalamudi61bc5662012-11-02 14:33:10 -07002237 psessionEntry->pLimMlmReassocRetryReq = NULL;
2238#endif
Sushant Kaushikb97a0082015-08-31 12:36:45 +05302239
2240#ifdef FEATURE_WLAN_DIAG_SUPPORT
2241 limDiagEventReport(pMac, WLAN_PE_DIAG_CHANNEL_SWITCH_ANOUNCEMENT,
2242 psessionEntry, eSIR_SUCCESS, LIM_SWITCH_CHANNEL_JOIN);
2243#endif
2244
Dino Myclea7f18452014-04-24 08:55:31 +05302245 limLog(pMac, LOG1, FL("[limProcessMlmJoinReq]: suspend link success(%d) "
2246 "on sessionid: %d setting channel to: %d with secChanOffset:%d "
Abhishek Singhdcbd8272014-01-09 14:16:01 +05302247 "and maxtxPower: %d"), status, psessionEntry->peSessionId,
2248 chanNum, secChanOffset, psessionEntry->maxTxPower);
Jeff Johnsone7245742012-09-05 17:12:55 -07002249 limSetChannel(pMac, chanNum, secChanOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002250
2251 return;
2252error:
2253 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2254 mlmJoinCnf.sessionId = psessionEntry->peSessionId;
2255 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2256 limPostSmeMessage(pMac, LIM_MLM_JOIN_CNF, (tANI_U32 *) &mlmJoinCnf);
2257
2258}
2259
2260
2261
2262/**
2263 * limProcessMlmJoinReq()
2264 *
2265 *FUNCTION:
2266 * This function is called to process MLM_JOIN_REQ message
2267 * from SME
2268 *
2269 *LOGIC:
2270 * 1) Initialize LIM, HAL, DPH
2271 * 2) Configure the BSS for which the JOIN REQ was received
2272 * a) Send WDA_ADD_BSS_REQ to HAL -
2273 * This will identify the BSS that we are interested in
2274 * --AND--
2275 * Add a STA entry for the AP (in a STA context)
2276 * b) Wait for WDA_ADD_BSS_RSP
2277 * c) Send WDA_ADD_STA_REQ to HAL
2278 * This will add the "local STA" entry to the STA table
2279 * 3) Continue as before, i.e,
2280 * a) Send a PROBE REQ
2281 * b) Wait for PROBE RSP/BEACON containing the SSID that
2282 * we are interested in
2283 * c) Then start an AUTH seq
2284 * d) Followed by the ASSOC seq
2285 *
2286 *ASSUMPTIONS:
2287 *
2288 *NOTE:
2289 *
2290 * @param pMac Pointer to Global MAC structure
2291 * @param *pMsgBuf A pointer to the MLM message buffer
2292 * @return None
2293 */
2294
2295static void
2296limProcessMlmJoinReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2297{
2298 tLimMlmJoinCnf mlmJoinCnf;
2299 tANI_U8 sessionId;
2300 tpPESession psessionEntry;
2301
2302 sessionId = ((tpLimMlmJoinReq)pMsgBuf)->sessionId;
2303
2304 if((psessionEntry = peFindSessionBySessionId(pMac,sessionId))== NULL)
2305 {
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302306 limLog(pMac, LOGE, FL("SessionId:%d session does not exist"),sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002307 goto error;
2308 }
2309
2310 if (( (psessionEntry->limSystemRole != eLIM_AP_ROLE ) && (psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE )) &&
2311 ( (psessionEntry->limMlmState == eLIM_MLM_IDLE_STATE) ||
2312 (psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE)) &&
2313 (SIR_MAC_GET_ESS( ((tpLimMlmJoinReq) pMsgBuf)->bssDescription.capabilityInfo) !=
2314 SIR_MAC_GET_IBSS( ((tpLimMlmJoinReq) pMsgBuf)->bssDescription.capabilityInfo)))
2315 {
2316 #if 0
2317 if (pMac->lim.gpLimMlmJoinReq)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302318 vos_mem_free(pMac->lim.gpLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002319 #endif //TO SUPPORT BT-AMP , review 23sep
2320
2321 /// Hold onto Join request parameters
2322
2323 psessionEntry->pLimMlmJoinReq =(tpLimMlmJoinReq) pMsgBuf;
2324
2325 if( isLimSessionOffChannel(pMac, sessionId) )
2326 {
2327 //suspend link
Abhishek Singhdcbd8272014-01-09 14:16:01 +05302328 limLog(pMac, LOG1, FL("Suspend link as LimSession on sessionid %d"
2329 "is off channel"),sessionId);
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302330 if (limIsLinkSuspended(pMac))
2331 {
2332 limLog(pMac, LOGE, FL("Link is already suspended for some other"
2333 " reason. Return failure on sessionId:%d"), sessionId);
2334 goto error;
2335 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002336 limSuspendLink(pMac, eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN,
2337 limProcessMlmPostJoinSuspendLink, (tANI_U32*)psessionEntry );
2338 }
2339 else
2340 {
2341 //No need to suspend link.
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302342 limLog(pMac,LOG1,"SessionId:%d Join request on current channel",
2343 sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002344 limProcessMlmPostJoinSuspendLink( pMac, eHAL_STATUS_SUCCESS,
2345 (tANI_U32*) psessionEntry );
2346 }
2347
2348 return;
2349 }
2350 else
2351 {
2352 /**
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302353 * Should not have received JOIN req in states other than
2354 * Idle state or on AP.
2355 * Return join confirm with invalid parameters code.
2356 */
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302357 limLog(pMac, LOGE,
Sushant Kaushik1b645382014-10-13 16:39:36 +05302358 FL("SessionId:%d Unexpected Join request for role %d state %d "),
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302359 psessionEntry->peSessionId,psessionEntry->limSystemRole,
2360 psessionEntry->limMlmState);
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302361 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002362 }
2363
2364error:
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302365 vos_mem_free(pMsgBuf);
2366 if (psessionEntry != NULL)
2367 psessionEntry->pLimMlmJoinReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002368
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302369 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2370 mlmJoinCnf.sessionId = sessionId;
2371 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2372 limPostSmeMessage(pMac, LIM_MLM_JOIN_CNF, (tANI_U32 *) &mlmJoinCnf);
Jeff Johnson295189b2012-06-20 16:38:30 -07002373} /*** limProcessMlmJoinReq() ***/
2374
2375
2376
2377/**
2378 * limProcessMlmAuthReq()
2379 *
2380 *FUNCTION:
2381 * This function is called to process MLM_AUTH_REQ message
2382 * from SME
2383 *
2384 *LOGIC:
2385 *
2386 *ASSUMPTIONS:
2387 *
2388 *NOTE:
2389 *
2390 * @param pMac Pointer to Global MAC structure
2391 * @param *pMsgBuf A pointer to the MLM message buffer
2392 * @return None
2393 */
2394
2395static void
2396limProcessMlmAuthReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2397{
2398 tANI_U32 numPreAuthContexts;
2399 tSirMacAddr currentBssId;
2400 tSirMacAuthFrameBody authFrameBody;
2401 tLimMlmAuthCnf mlmAuthCnf;
2402 struct tLimPreAuthNode *preAuthNode;
2403 tpDphHashNode pStaDs;
2404 tANI_U8 sessionId;
2405 tpPESession psessionEntry;
2406
2407 if(pMsgBuf == NULL)
2408 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002409 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002410 return;
2411 }
2412
2413 pMac->lim.gpLimMlmAuthReq = (tLimMlmAuthReq *) pMsgBuf;
2414 sessionId = pMac->lim.gpLimMlmAuthReq->sessionId;
2415 if((psessionEntry= peFindSessionBySessionId(pMac,sessionId) )== NULL)
2416 {
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302417 limLog(pMac, LOGP, FL("SessionId:%d Session Does not exist"),sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002418 return;
2419 }
2420
Abhishek Singhcd09b562013-12-24 16:02:20 +05302421 limLog(pMac, LOG1,FL("Process Auth Req on sessionID %d Systemrole %d"
2422 "mlmstate %d from: "MAC_ADDRESS_STR" with authtype %d"), sessionId,
2423 psessionEntry->limSystemRole,psessionEntry->limMlmState,
2424 MAC_ADDR_ARRAY(pMac->lim.gpLimMlmAuthReq->peerMacAddr),
2425 pMac->lim.gpLimMlmAuthReq->authType);
2426
2427
Jeff Johnson295189b2012-06-20 16:38:30 -07002428 /**
2429 * Expect Auth request only when:
2430 * 1. STA joined/associated with a BSS or
2431 * 2. STA is in IBSS mode
2432 * and STA is going to authenticate with a unicast
2433 * adress and requested authentication algorithm is
2434 * supported.
2435 */
2436 #if 0
2437 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2438 eSIR_SUCCESS)
2439 {
2440 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002441 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002442 }
2443 #endif //To SuppoRT BT-AMP
2444
2445 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2446
2447 if (((((psessionEntry->limSystemRole== eLIM_STA_ROLE) || (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)) &&
2448 ((psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE) ||
2449 (psessionEntry->limMlmState ==
2450 eLIM_MLM_LINK_ESTABLISHED_STATE))) ||
2451 ((psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE) &&
2452 (psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE))) &&
2453 (limIsGroupAddr(pMac->lim.gpLimMlmAuthReq->peerMacAddr)
2454 == false) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07002455 (limIsAuthAlgoSupported(
2456 pMac,
2457 pMac->lim.gpLimMlmAuthReq->authType,
2458 psessionEntry) == true)
Jeff Johnson295189b2012-06-20 16:38:30 -07002459 )
2460 {
2461 /**
2462 * This is a request for pre-authentication.
2463 * Check if there exists context already for
Jeff Johnson1250df42012-12-10 14:31:52 -08002464 * the requested peer OR
Jeff Johnson295189b2012-06-20 16:38:30 -07002465 * if this request is for the AP we're currently
2466 * associated with.
2467 * If yes, return auth confirm immediately when
2468 * requested auth type is same as the one used before.
2469 */
2470 if ((((psessionEntry->limSystemRole == eLIM_STA_ROLE) ||(psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE) )&&
2471 (psessionEntry->limMlmState ==
2472 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
2473 (((pStaDs = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable)) != NULL) &&
2474 (pMac->lim.gpLimMlmAuthReq->authType ==
2475 pStaDs->mlmStaContext.authType)) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302476 (vos_mem_compare(pMac->lim.gpLimMlmAuthReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002477 currentBssId,
2478 sizeof(tSirMacAddr)) )) ||
2479 (((preAuthNode =
2480 limSearchPreAuthList(
2481 pMac,
2482 pMac->lim.gpLimMlmAuthReq->peerMacAddr)) != NULL) &&
2483 (preAuthNode->authType ==
2484 pMac->lim.gpLimMlmAuthReq->authType)))
2485 {
Abhishek Singhcd09b562013-12-24 16:02:20 +05302486 limLog(pMac, LOG2,
2487 FL("Already have pre-auth context with peer: "MAC_ADDRESS_STR),
2488 MAC_ADDR_ARRAY(pMac->lim.gpLimMlmAuthReq->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002489
2490 mlmAuthCnf.resultCode = (tSirResultCodes)
2491 eSIR_MAC_SUCCESS_STATUS;
2492
2493
2494 goto end;
2495 }
2496 else
2497 {
2498 if (wlan_cfgGetInt(pMac, WNI_CFG_MAX_NUM_PRE_AUTH,
2499 (tANI_U32 *) &numPreAuthContexts) != eSIR_SUCCESS)
2500 {
2501 limLog(pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002502 FL("Could not retrieve NumPreAuthLimit from CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002503 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002504
2505 if (pMac->lim.gLimNumPreAuthContexts == numPreAuthContexts)
2506 {
2507 PELOGW(limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002508 FL("Number of pre-auth reached max limit"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002509
2510 /// Return Auth confirm with reject code
2511 mlmAuthCnf.resultCode =
2512 eSIR_SME_MAX_NUM_OF_PRE_AUTH_REACHED;
2513
2514 goto end;
2515 }
2516 }
2517
2518 // Delete pre-auth node if exists
2519 if (preAuthNode)
2520 limDeletePreAuthNode(pMac,
2521 pMac->lim.gpLimMlmAuthReq->peerMacAddr);
2522
Jeff Johnson295189b2012-06-20 16:38:30 -07002523 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2524 psessionEntry->limMlmState = eLIM_MLM_WT_AUTH_FRAME2_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002525 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002526
2527 /// Prepare & send Authentication frame
2528 authFrameBody.authAlgoNumber =
2529 (tANI_U8) pMac->lim.gpLimMlmAuthReq->authType;
2530 authFrameBody.authTransactionSeqNumber = SIR_MAC_AUTH_FRAME_1;
2531 authFrameBody.authStatusCode = 0;
Sushant Kaushik9e923872015-04-02 17:09:31 +05302532 pMac->authAckStatus = LIM_AUTH_ACK_NOT_RCD;
Jeff Johnson295189b2012-06-20 16:38:30 -07002533 limSendAuthMgmtFrame(pMac,
2534 &authFrameBody,
2535 pMac->lim.gpLimMlmAuthReq->peerMacAddr,
Sushant Kaushik9e923872015-04-02 17:09:31 +05302536 LIM_NO_WEP_IN_FC, psessionEntry, eSIR_TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002537
Jeff Johnsone7245742012-09-05 17:12:55 -07002538 //assign appropriate sessionId to the timer object
2539 pMac->lim.limTimers.gLimAuthFailureTimer.sessionId = sessionId;
Sushant Kaushik9e923872015-04-02 17:09:31 +05302540 /* assign appropriate sessionId to the timer object */
2541 pMac->lim.limTimers.gLimPeriodicAuthRetryTimer.sessionId = sessionId;
2542 limDeactivateAndChangeTimer(pMac, eLIM_AUTH_RETRY_TIMER);
Jeff Johnsone7245742012-09-05 17:12:55 -07002543 // Activate Auth failure timer
2544 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_AUTH_FAIL_TIMER));
2545 if (tx_timer_activate(&pMac->lim.limTimers.gLimAuthFailureTimer)
2546 != TX_SUCCESS)
2547 {
2548 /// Could not start Auth failure timer.
2549 // Log error
2550 limLog(pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002551 FL("could not start Auth failure timer"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002552 // Cleanup as if auth timer expired
2553 limProcessAuthFailureTimeout(pMac);
2554 }
Sushant Kaushik9e923872015-04-02 17:09:31 +05302555 else
2556 {
2557 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE,
2558 psessionEntry->peSessionId, eLIM_AUTH_RETRY_TIMER));
2559 // Activate Auth Retry timer
2560 if (tx_timer_activate(&pMac->lim.limTimers.gLimPeriodicAuthRetryTimer)
2561 != TX_SUCCESS)
2562 {
2563 limLog(pMac, LOGP, FL("could not activate Auth Retry timer"));
2564 }
2565 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002566 return;
2567 }
2568 else
2569 {
2570 /**
2571 * Unexpected auth request.
2572 * Return Auth confirm with Invalid parameters code.
2573 */
2574 mlmAuthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2575
2576 goto end;
2577 }
2578
2579end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302580 vos_mem_copy((tANI_U8 *) &mlmAuthCnf.peerMacAddr,
2581 (tANI_U8 *) &pMac->lim.gpLimMlmAuthReq->peerMacAddr,
2582 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002583
2584 mlmAuthCnf.authType = pMac->lim.gpLimMlmAuthReq->authType;
2585 mlmAuthCnf.sessionId = sessionId;
2586
2587 /// Free up buffer allocated
2588 /// for pMac->lim.gLimMlmAuthReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302589 vos_mem_free( pMac->lim.gpLimMlmAuthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002590 pMac->lim.gpLimMlmAuthReq = NULL;
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302591 limLog(pMac,LOG1,"SessionId:%d LimPostSme LIM_MLM_AUTH_CNF ",sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002592 limPostSmeMessage(pMac, LIM_MLM_AUTH_CNF, (tANI_U32 *) &mlmAuthCnf);
2593} /*** limProcessMlmAuthReq() ***/
2594
2595
2596
2597/**
2598 * limProcessMlmAssocReq()
2599 *
2600 *FUNCTION:
2601 * This function is called to process MLM_ASSOC_REQ message
2602 * from SME
2603 *
2604 *LOGIC:
2605 *
2606 *ASSUMPTIONS:
2607 *
2608 *NOTE:
2609 *
2610 * @param pMac Pointer to Global MAC structure
2611 * @param *pMsgBuf A pointer to the MLM message buffer
2612 * @return None
2613 */
2614
2615static void
2616limProcessMlmAssocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2617{
2618 tSirMacAddr currentBssId;
2619 tLimMlmAssocReq *pMlmAssocReq;
2620 tLimMlmAssocCnf mlmAssocCnf;
2621 tpPESession psessionEntry;
2622 // tANI_U8 sessionId;
2623
2624 if(pMsgBuf == NULL)
2625 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002626 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002627 return;
2628 }
2629 pMlmAssocReq = (tLimMlmAssocReq *) pMsgBuf;
2630
2631 if( (psessionEntry = peFindSessionBySessionId(pMac,pMlmAssocReq->sessionId) )== NULL)
2632 {
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302633 limLog(pMac, LOGP,FL("SessionId:%d Session Does not exist"),
2634 pMlmAssocReq->sessionId);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302635 vos_mem_free(pMlmAssocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002636 return;
2637 }
2638
Abhishek Singhcd09b562013-12-24 16:02:20 +05302639 limLog(pMac, LOG1,FL("Process Assoc Req on sessionID %d Systemrole %d"
2640 "mlmstate %d from: "MAC_ADDRESS_STR), pMlmAssocReq->sessionId,
2641 psessionEntry->limSystemRole, psessionEntry->limMlmState,
2642 MAC_ADDR_ARRAY(pMlmAssocReq->peerMacAddr));
2643
Jeff Johnson295189b2012-06-20 16:38:30 -07002644 #if 0
2645 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2646 eSIR_SUCCESS)
2647 {
2648 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002649 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002650 }
2651 #endif //TO SUPPORT BT-AMP
2652 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2653
2654 if ( (psessionEntry->limSystemRole != eLIM_AP_ROLE && psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE) &&
2655 (psessionEntry->limMlmState == eLIM_MLM_AUTHENTICATED_STATE || psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302656 (vos_mem_compare(pMlmAssocReq->peerMacAddr, currentBssId, sizeof(tSirMacAddr))) )
Jeff Johnson295189b2012-06-20 16:38:30 -07002657 {
Jeff Johnsone7245742012-09-05 17:12:55 -07002658
Jeff Johnson295189b2012-06-20 16:38:30 -07002659 /// map the session entry pointer to the AssocFailureTimer
2660 pMac->lim.limTimers.gLimAssocFailureTimer.sessionId = pMlmAssocReq->sessionId;
2661
Jeff Johnson295189b2012-06-20 16:38:30 -07002662 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2663 psessionEntry->limMlmState = eLIM_MLM_WT_ASSOC_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002664 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302665 limLog(pMac,LOG1,"SessionId:%d Sending Assoc_Req Frame",
2666 psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002667
2668 /// Prepare and send Association request frame
2669 limSendAssocReqMgmtFrame(pMac, pMlmAssocReq,psessionEntry);
Sushant Kaushikb97a0082015-08-31 12:36:45 +05302670#ifdef FEATURE_WLAN_DIAG_SUPPORT
2671 limDiagEventReport(pMac, WLAN_PE_DIAG_ASSOC_REQ_EVENT, psessionEntry,
2672 eSIR_SUCCESS, eSIR_SUCCESS);
2673#endif
2674
Jeff Johnson295189b2012-06-20 16:38:30 -07002675
2676 //Set the link state to postAssoc, so HW can start receiving frames from AP.
2677 if ((psessionEntry->bssType == eSIR_BTAMP_STA_MODE)||
2678 ((psessionEntry->bssType == eSIR_BTAMP_AP_MODE) && (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)))
2679 {
2680 if(limSetLinkState(pMac, eSIR_LINK_BTAMP_POSTASSOC_STATE, currentBssId,
2681 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002682 PELOGE(limLog(pMac, LOGE, FL("Failed to set the LinkState"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002683 }
Jeff Johnsone7245742012-09-05 17:12:55 -07002684 /// Start association failure timer
2685 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_ASSOC_FAIL_TIMER));
2686 if (tx_timer_activate(&pMac->lim.limTimers.gLimAssocFailureTimer)
2687 != TX_SUCCESS)
2688 {
2689 /// Could not start Assoc failure timer.
2690 // Log error
2691 limLog(pMac, LOGP,
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302692 FL("SessionId:%d could not start Association failure timer"),
2693 psessionEntry->peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07002694 // Cleanup as if assoc timer expired
2695 limProcessAssocFailureTimeout(pMac,LIM_ASSOC );
2696
2697 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002698
2699 return;
2700 }
2701 else
2702 {
2703 /**
2704 * Received Association request either in invalid state
2705 * or to a peer MAC entity whose address is different
2706 * from one that STA is currently joined with or on AP.
2707 * Return Assoc confirm with Invalid parameters code.
2708 */
2709
2710 // Log error
2711 PELOGW(limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05302712 FL("received unexpected MLM_ASSOC_CNF in state %d for role=%d, MAC addr= "
Abhishek Singhcd09b562013-12-24 16:02:20 +05302713 MAC_ADDRESS_STR), psessionEntry->limMlmState,
2714 psessionEntry->limSystemRole, MAC_ADDR_ARRAY(pMlmAssocReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002715 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
2716
2717 mlmAssocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2718 mlmAssocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2719
2720 goto end;
2721 }
2722
2723end:
2724 /* Update PE session Id*/
2725 mlmAssocCnf.sessionId = pMlmAssocReq->sessionId;
2726
2727 /// Free up buffer allocated for assocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302728 vos_mem_free(pMlmAssocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002729
2730 limPostSmeMessage(pMac, LIM_MLM_ASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
2731} /*** limProcessMlmAssocReq() ***/
2732
2733
2734
2735/**
2736 * limProcessMlmReassocReq()
2737 *
2738 *FUNCTION:
2739 * This function is called to process MLM_REASSOC_REQ message
2740 * from SME
2741 *
2742 *LOGIC:
2743 *
2744 *ASSUMPTIONS:
2745 *
2746 *NOTE:
2747 *
2748 * @param pMac Pointer to Global MAC structure
2749 * @param *pMsgBuf A pointer to the MLM message buffer
2750 * @return None
2751 */
2752
2753static void
2754limProcessMlmReassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2755{
Jeff Johnsone7245742012-09-05 17:12:55 -07002756 tANI_U8 chanNum, secChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002757 struct tLimPreAuthNode *pAuthNode;
2758 tLimMlmReassocReq *pMlmReassocReq;
2759 tLimMlmReassocCnf mlmReassocCnf;
2760 tpPESession psessionEntry;
2761
2762 if(pMsgBuf == NULL)
2763 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002764 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002765 return;
2766 }
2767
2768 pMlmReassocReq = (tLimMlmReassocReq *) pMsgBuf;
Abhishek Singhcd09b562013-12-24 16:02:20 +05302769
Jeff Johnson295189b2012-06-20 16:38:30 -07002770 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmReassocReq->sessionId)) == NULL)
2771 {
Abhishek Singhcd09b562013-12-24 16:02:20 +05302772 limLog(pMac, LOGE,FL("Session Does not exist for given sessionId %d"),
2773 pMlmReassocReq->sessionId);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302774 vos_mem_free(pMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002775 return;
2776 }
Abhishek Singhcd09b562013-12-24 16:02:20 +05302777
2778 limLog(pMac, LOG1,FL("Process ReAssoc Req on sessionID %d Systemrole %d"
2779 "mlmstate %d from: "MAC_ADDRESS_STR), pMlmReassocReq->sessionId,
2780 psessionEntry->limSystemRole, psessionEntry->limMlmState,
2781 MAC_ADDR_ARRAY(pMlmReassocReq->peerMacAddr));
2782
Jeff Johnson295189b2012-06-20 16:38:30 -07002783 if (((psessionEntry->limSystemRole != eLIM_AP_ROLE) && (psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE)) &&
2784 (psessionEntry->limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE))
2785 {
2786 if (psessionEntry->pLimMlmReassocReq)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302787 vos_mem_free(psessionEntry->pLimMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002788
2789 /* Hold Re-Assoc request as part of Session, knock-out pMac */
2790 /// Hold onto Reassoc request parameters
2791 psessionEntry->pLimMlmReassocReq = pMlmReassocReq;
2792
2793 // See if we have pre-auth context with new AP
2794 pAuthNode = limSearchPreAuthList(pMac, psessionEntry->limReAssocbssId);
2795
2796 if (!pAuthNode &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302797 (!vos_mem_compare(pMlmReassocReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002798 psessionEntry->bssId,
2799 sizeof(tSirMacAddr)) ))
2800 {
2801 // Either pre-auth context does not exist AND
2802 // we are not reassociating with currently
2803 // associated AP.
2804 // Return Reassoc confirm with not authenticated
2805 mlmReassocCnf.resultCode = eSIR_SME_STA_NOT_AUTHENTICATED;
2806 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2807
2808 goto end;
2809 }
2810
2811 //assign the sessionId to the timer object
2812 pMac->lim.limTimers.gLimReassocFailureTimer.sessionId = pMlmReassocReq->sessionId;
2813
2814 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2815 psessionEntry->limMlmState = eLIM_MLM_WT_REASSOC_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002816 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002817
2818#if 0
2819 // Update BSSID at CFG database
2820 if (wlan_cfgSetStr(pMac, WNI_CFG_BSSID,
2821 pMac->lim.gLimReassocBssId,
2822 sizeof(tSirMacAddr)) != eSIR_SUCCESS)
2823 {
2824 /// Could not update BSSID at CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002825 limLog(pMac, LOGP, FL("could not update BSSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002826 }
2827#endif //TO SUPPORT BT-AMP
2828
2829 /* Copy Global Reassoc ID*/
2830 // sirCopyMacAddr(psessionEntry->reassocbssId,pMac->lim.gLimReAssocBssId);
2831
2832 /**
2833 * Derive channel from BSS description and
2834 * store it at CFG.
2835 */
2836
2837 chanNum = psessionEntry->limReassocChannelId;
Jeff Johnsone7245742012-09-05 17:12:55 -07002838 secChannelOffset = psessionEntry->reAssocHtSecondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002839
2840 /* To Support BT-AMP .. read channel number from psessionEntry*/
2841 //chanNum = psessionEntry->currentOperChannel;
2842
2843 // Apply previously set configuration at HW
2844 limApplyConfiguration(pMac,psessionEntry);
2845
2846 //store the channel switch sessionEntry in the lim global var
2847 /* We have already saved the ReAssocreq Pointer abobe */
2848 //psessionEntry->pLimReAssocReq = (void *)pMlmReassocReq;
2849 psessionEntry->channelChangeReasonCode = LIM_SWITCH_CHANNEL_REASSOC;
2850
Jeff Johnsone7245742012-09-05 17:12:55 -07002851 /** Switch channel to the new Operating channel for Reassoc*/
Sushant Kaushikb97a0082015-08-31 12:36:45 +05302852
2853#ifdef FEATURE_WLAN_DIAG_SUPPORT
2854 limDiagEventReport(pMac, WLAN_PE_DIAG_CHANNEL_SWITCH_ANOUNCEMENT,
2855 psessionEntry, eSIR_SUCCESS, LIM_SWITCH_CHANNEL_REASSOC);
2856#endif
2857
Jeff Johnsone7245742012-09-05 17:12:55 -07002858 limSetChannel(pMac, chanNum, secChannelOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002859
2860 return;
2861 }
2862 else
2863 {
2864 /**
2865 * Received Reassoc request in invalid state or
2866 * in AP role.Return Reassoc confirm with Invalid
2867 * parameters code.
2868 */
2869
2870 // Log error
Abhishek Singhcd09b562013-12-24 16:02:20 +05302871 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05302872 FL("received unexpected MLM_REASSOC_CNF in state %d for role=%d, "
Abhishek Singhcd09b562013-12-24 16:02:20 +05302873 "MAC addr= "
2874 MAC_ADDRESS_STR), psessionEntry->limMlmState,
2875 psessionEntry->limSystemRole,
2876 MAC_ADDR_ARRAY(pMlmReassocReq->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002877 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
2878
2879 mlmReassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2880 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2881
2882 goto end;
2883 }
2884
2885end:
2886 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2887 /* Update PE sessio Id*/
2888 mlmReassocCnf.sessionId = pMlmReassocReq->sessionId;
2889 /// Free up buffer allocated for reassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302890 vos_mem_free(pMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002891 psessionEntry->pLimReAssocReq = NULL;
2892
2893 limPostSmeMessage(pMac, LIM_MLM_REASSOC_CNF, (tANI_U32 *) &mlmReassocCnf);
2894} /*** limProcessMlmReassocReq() ***/
2895
2896
2897static void
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08002898limProcessMlmDisassocReqNtf(tpAniSirGlobal pMac, eHalStatus suspendStatus, tANI_U32 *pMsgBuf)
Jeff Johnson295189b2012-06-20 16:38:30 -07002899{
2900 tANI_U16 aid;
2901 tSirMacAddr currentBssId;
2902 tpDphHashNode pStaDs;
2903 tLimMlmDisassocReq *pMlmDisassocReq;
2904 tLimMlmDisassocCnf mlmDisassocCnf;
2905 tpPESession psessionEntry;
2906 extern tANI_BOOLEAN sendDisassocFrame;
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05302907 tSirSmeDisassocRsp *pSirSmeDisassocRsp;
2908 tANI_U32 *pMsg;
2909 tANI_U8 *pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07002910
2911 if(eHAL_STATUS_SUCCESS != suspendStatus)
2912 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002913 PELOGE(limLog(pMac, LOGE,FL("Suspend Status is not success %X"), suspendStatus);)
Jeff Johnson295189b2012-06-20 16:38:30 -07002914#if 0
2915 //It can ignore the status and proceed with the disassoc processing.
2916 mlmDisassocCnf.resultCode = eSIR_SME_REFUSED;
2917 goto end;
2918#endif
2919 }
2920
2921 pMlmDisassocReq = (tLimMlmDisassocReq *) pMsgBuf;
2922
Jeff Johnson295189b2012-06-20 16:38:30 -07002923 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDisassocReq->sessionId))== NULL)
2924 {
2925
Abhishek Singhcd09b562013-12-24 16:02:20 +05302926 limLog(pMac, LOGE,
2927 FL("session does not exist for given sessionId %d"),
2928 pMlmDisassocReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002929 mlmDisassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2930 goto end;
2931 }
Abhishek Singhcd09b562013-12-24 16:02:20 +05302932 limLog(pMac, LOG1,FL("Process DisAssoc Req on sessionID %d Systemrole %d"
2933 "mlmstate %d from: "MAC_ADDRESS_STR), pMlmDisassocReq->sessionId,
2934 psessionEntry->limSystemRole, psessionEntry->limMlmState,
2935 MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));
2936
Jeff Johnson295189b2012-06-20 16:38:30 -07002937 #if 0
2938 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2939 eSIR_SUCCESS)
2940 {
2941 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002942 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002943 }
2944 #endif //BT-AMP Support
2945 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2946
2947 switch (psessionEntry->limSystemRole)
2948 {
2949 case eLIM_STA_ROLE:
2950 case eLIM_BT_AMP_STA_ROLE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302951 if ( !vos_mem_compare(pMlmDisassocReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002952 currentBssId,
2953 sizeof(tSirMacAddr)) )
2954 {
2955 PELOGW(limLog(pMac, LOGW,
Abhishek Singhcd09b562013-12-24 16:02:20 +05302956 FL("received MLM_DISASSOC_REQ with invalid BSS id from: "
2957 MAC_ADDRESS_STR),
2958 MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002959
2960 /// Prepare and Send LIM_MLM_DISASSOC_CNF
2961
2962 mlmDisassocCnf.resultCode =
2963 eSIR_SME_INVALID_PARAMETERS;
2964
2965 goto end;
2966 }
2967
2968 break;
2969
2970 case eLIM_STA_IN_IBSS_ROLE:
2971
2972 break;
2973
2974 default: // eLIM_AP_ROLE
2975
2976 // Fall through
2977 break;
2978
2979 } // end switch (psessionEntry->limSystemRole)
2980
2981 /**
2982 * Check if there exists a context for the peer entity
2983 * to be disassociated with.
2984 */
2985 pStaDs = dphLookupHashEntry(pMac, pMlmDisassocReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable);
2986 if ((pStaDs == NULL) ||
2987 (pStaDs &&
2988 ((pStaDs->mlmStaContext.mlmState !=
2989 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
2990 (pStaDs->mlmStaContext.mlmState !=
2991 eLIM_MLM_WT_ASSOC_CNF_STATE) &&
2992 (pStaDs->mlmStaContext.mlmState !=
2993 eLIM_MLM_ASSOCIATED_STATE))))
2994 {
2995 /**
2996 * Received LIM_MLM_DISASSOC_REQ for STA that does not
2997 * have context or in some transit state.
2998 * Log error
2999 */
Sachin Ahuja2fea3d12014-12-18 17:31:31 +05303000 limLog(pMac, LOGE,
Abhishek Singhcd09b562013-12-24 16:02:20 +05303001 FL("received MLM_DISASSOC_REQ for STA that either has no context "
3002 "or in some transit state, Addr= "
Sachin Ahuja2fea3d12014-12-18 17:31:31 +05303003 MAC_ADDRESS_STR),MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));
3004 if (pStaDs != NULL)
3005 limLog(pMac, LOGE, FL("Sta MlmState : %d"),
3006 pStaDs->mlmStaContext.mlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -07003007
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303008 /*
3009 * Disassociation response due to
3010 * host triggered disassociation
3011 */
Jeff Johnson295189b2012-06-20 16:38:30 -07003012
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303013 pSirSmeDisassocRsp = vos_mem_malloc(sizeof(tSirSmeDisassocRsp));
3014 if ( NULL == pSirSmeDisassocRsp )
3015 {
3016 // Log error
3017 limLog(pMac, LOGP,
3018 FL("call to AllocateMemory failed for eWNI_SME_DISASSOC_RSP"));
3019 return;
3020 }
3021 limLog(pMac, LOG1, FL("send eWNI_SME_DISASSOC_RSP with "
3022 "retCode: %d for "MAC_ADDRESS_STR),eSIR_SME_DEAUTH_STATUS,
3023 MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));
3024 pSirSmeDisassocRsp->messageType = eWNI_SME_DISASSOC_RSP;
3025 pSirSmeDisassocRsp->length = sizeof(tSirSmeDisassocRsp);
3026 pSirSmeDisassocRsp->sessionId = pMlmDisassocReq->sessionId;
3027 pSirSmeDisassocRsp->transactionId = 0;
3028 pSirSmeDisassocRsp->statusCode = eSIR_SME_DEAUTH_STATUS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003029
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303030 pBuf = (tANI_U8 *) pSirSmeDisassocRsp->peerMacAddr;
3031 vos_mem_copy( pBuf, pMlmDisassocReq->peerMacAddr, sizeof(tSirMacAddr));
3032
3033 pMsg = (tANI_U32*) pSirSmeDisassocRsp;
3034
3035 limSendSmeDisassocDeauthNtf( pMac, eHAL_STATUS_SUCCESS,
3036 (tANI_U32*) pMsg );
3037 return;
3038
Jeff Johnson295189b2012-06-20 16:38:30 -07003039 }
3040
3041 //pStaDs->mlmStaContext.rxPurgeReq = 1;
3042 pStaDs->mlmStaContext.disassocReason = (tSirMacReasonCodes)
3043 pMlmDisassocReq->reasonCode;
3044 pStaDs->mlmStaContext.cleanupTrigger = pMlmDisassocReq->disassocTrigger;
Mukul Sharma91947a22014-06-09 11:07:51 +05303045 /** Set state to mlm State to eLIM_MLM_WT_DEL_STA_RSP_STATE
3046 * This is to address the issue of race condition between
3047 * disconnect request from the HDD and deauth from AP
3048 */
3049 pStaDs->mlmStaContext.mlmState = eLIM_MLM_WT_DEL_STA_RSP_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003050
3051 /// Send Disassociate frame to peer entity
Jeff Johnsone7245742012-09-05 17:12:55 -07003052 if (sendDisassocFrame && (pMlmDisassocReq->reasonCode != eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON))
Jeff Johnson295189b2012-06-20 16:38:30 -07003053 {
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003054 pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq = pMlmDisassocReq;
Edhar, Mahesh Kumar03cf7ff2015-11-26 17:59:29 +05303055 if (IS_FW_IN_TX_PATH_FEATURE_ENABLE)
Sandeep Puligilla25728282013-12-01 19:44:14 +05303056 {
Edhar, Mahesh Kumar03cf7ff2015-11-26 17:59:29 +05303057 limSendDisassocMgmtFrame(pMac, pMlmDisassocReq->reasonCode,
Sandeep Puligilla25728282013-12-01 19:44:14 +05303058 pMlmDisassocReq->peerMacAddr,
3059 psessionEntry, FALSE);
Edhar, Mahesh Kumar03cf7ff2015-11-26 17:59:29 +05303060 /* Send Disassoc CNF and receive path cleanup */
3061 limSendDisassocCnf(pMac);
Sandeep Puligilla25728282013-12-01 19:44:14 +05303062 }
3063 else
3064 {
Edhar, Mahesh Kumar03cf7ff2015-11-26 17:59:29 +05303065 limSendDisassocMgmtFrame(pMac, pMlmDisassocReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003066 pMlmDisassocReq->peerMacAddr,
3067 psessionEntry, TRUE);
Sandeep Puligilla25728282013-12-01 19:44:14 +05303068 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003069 }
3070 else
3071 {
Madan Mohan Koyyalamudib6af0612012-11-19 13:45:45 -08003072 /* Disassoc frame is not sent OTA */
3073 sendDisassocFrame = 1;
3074 // Receive path cleanup with dummy packet
3075 if(eSIR_SUCCESS != limCleanupRxPath(pMac, pStaDs,psessionEntry))
3076 {
3077 mlmDisassocCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
3078 goto end;
3079 }
3080 // Free up buffer allocated for mlmDisassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303081 vos_mem_free(pMlmDisassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003082 }
3083
Jeff Johnson295189b2012-06-20 16:38:30 -07003084 return;
3085
3086end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303087 vos_mem_copy((tANI_U8 *) &mlmDisassocCnf.peerMacAddr,
3088 (tANI_U8 *) pMlmDisassocReq->peerMacAddr,
3089 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003090 mlmDisassocCnf.aid = pMlmDisassocReq->aid;
3091 mlmDisassocCnf.disassocTrigger = pMlmDisassocReq->disassocTrigger;
3092
3093 /* Update PE session ID*/
3094 mlmDisassocCnf.sessionId = pMlmDisassocReq->sessionId;
3095
3096 /// Free up buffer allocated for mlmDisassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303097 vos_mem_free(pMlmDisassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003098
3099 limPostSmeMessage(pMac,
3100 LIM_MLM_DISASSOC_CNF,
3101 (tANI_U32 *) &mlmDisassocCnf);
3102}
3103
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003104tANI_BOOLEAN limCheckDisassocDeauthAckPending(tpAniSirGlobal pMac,
3105 tANI_U8 *staMac
3106 )
3107{
3108 tLimMlmDisassocReq *pMlmDisassocReq;
3109 tLimMlmDeauthReq *pMlmDeauthReq;
3110 pMlmDisassocReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq;
3111 pMlmDeauthReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq;
3112 if (
3113 (pMlmDisassocReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303114 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003115 (tANI_U8 *) &pMlmDisassocReq->peerMacAddr,
3116 sizeof(tSirMacAddr))))
3117 ||
3118 (pMlmDeauthReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303119 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003120 (tANI_U8 *) &pMlmDeauthReq->peerMacAddr,
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303121 sizeof(tSirMacAddr))))
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003122 )
3123 {
Srinivas Girigowdac03c5a82013-07-01 13:44:54 -07003124 PELOG1(limLog(pMac, LOG1, FL("Disassoc/Deauth ack pending"));)
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003125 return eANI_BOOLEAN_TRUE;
3126 }
3127 else
3128 {
Srinivas Girigowdac03c5a82013-07-01 13:44:54 -07003129 PELOG1(limLog(pMac, LOG1, FL("Disassoc/Deauth Ack not pending"));)
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003130 return eANI_BOOLEAN_FALSE;
3131 }
3132}
3133
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003134void limCleanUpDisassocDeauthReq(tpAniSirGlobal pMac,
3135 tANI_U8 *staMac,
3136 tANI_BOOLEAN cleanRxPath)
3137{
3138 tLimMlmDisassocReq *pMlmDisassocReq;
3139 tLimMlmDeauthReq *pMlmDeauthReq;
3140 pMlmDisassocReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq;
3141 if (pMlmDisassocReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303142 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003143 (tANI_U8 *) &pMlmDisassocReq->peerMacAddr,
3144 sizeof(tSirMacAddr))))
3145 {
3146 if (cleanRxPath)
3147 {
3148 limProcessDisassocAckTimeout(pMac);
3149 }
3150 else
3151 {
3152 if (tx_timer_running(&pMac->lim.limTimers.gLimDisassocAckTimer))
3153 {
3154 limDeactivateAndChangeTimer(pMac, eLIM_DISASSOC_ACK_TIMER);
3155 }
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303156 vos_mem_free(pMlmDisassocReq);
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003157 pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq = NULL;
3158 }
3159 }
3160
3161 pMlmDeauthReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq;
3162 if (pMlmDeauthReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303163 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003164 (tANI_U8 *) &pMlmDeauthReq->peerMacAddr,
3165 sizeof(tSirMacAddr))))
3166 {
3167 if (cleanRxPath)
3168 {
3169 limProcessDeauthAckTimeout(pMac);
3170 }
3171 else
3172 {
3173 if (tx_timer_running(&pMac->lim.limTimers.gLimDeauthAckTimer))
3174 {
3175 limDeactivateAndChangeTimer(pMac, eLIM_DEAUTH_ACK_TIMER);
3176 }
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303177 vos_mem_free(pMlmDeauthReq);
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003178 pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = NULL;
3179 }
3180 }
3181}
3182
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003183void limProcessDisassocAckTimeout(tpAniSirGlobal pMac)
3184{
Abhishek Singhcd09b562013-12-24 16:02:20 +05303185 limLog(pMac, LOG1, FL(""));
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003186 limSendDisassocCnf(pMac);
3187}
3188
Jeff Johnson295189b2012-06-20 16:38:30 -07003189/**
3190 * limProcessMlmDisassocReq()
3191 *
3192 *FUNCTION:
3193 * This function is called to process MLM_DISASSOC_REQ message
3194 * from SME
3195 *
3196 *LOGIC:
3197 *
3198 *ASSUMPTIONS:
3199 *
3200 *NOTE:
3201 *
3202 * @param pMac Pointer to Global MAC structure
3203 * @param *pMsgBuf A pointer to the MLM message buffer
3204 * @return None
3205 */
3206
3207static void
3208limProcessMlmDisassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3209{
Jeff Johnson295189b2012-06-20 16:38:30 -07003210 tLimMlmDisassocReq *pMlmDisassocReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07003211
3212 if(pMsgBuf == NULL)
3213 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003214 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003215 return;
3216 }
3217
3218 pMlmDisassocReq = (tLimMlmDisassocReq *) pMsgBuf;
Kanchanapally, Vidyullathac796fc62015-03-17 10:45:28 +05303219
Abhishek Singhcd09b562013-12-24 16:02:20 +05303220 limLog(pMac, LOG1,FL("Process DisAssoc Req on sessionID %d "
3221 "from: "MAC_ADDRESS_STR), pMlmDisassocReq->sessionId,
3222 MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003223
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003224 limProcessMlmDisassocReqNtf( pMac, eHAL_STATUS_SUCCESS, (tANI_U32*) pMsgBuf );
Madan Mohan Koyyalamudib6af0612012-11-19 13:45:45 -08003225
Jeff Johnson295189b2012-06-20 16:38:30 -07003226} /*** limProcessMlmDisassocReq() ***/
3227
3228static void
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003229limProcessMlmDeauthReqNtf(tpAniSirGlobal pMac, eHalStatus suspendStatus, tANI_U32 *pMsgBuf)
Jeff Johnson295189b2012-06-20 16:38:30 -07003230{
3231 tANI_U16 aid;
3232 tSirMacAddr currentBssId;
3233 tpDphHashNode pStaDs;
3234 struct tLimPreAuthNode *pAuthNode;
3235 tLimMlmDeauthReq *pMlmDeauthReq;
3236 tLimMlmDeauthCnf mlmDeauthCnf;
3237 tpPESession psessionEntry;
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303238 tSirSmeDeauthRsp *pSirSmeDeauthRsp;
3239 tANI_U8 *pBuf;
3240 tANI_U32 *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -07003241
3242
3243 if(eHAL_STATUS_SUCCESS != suspendStatus)
3244 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003245 PELOGE(limLog(pMac, LOGE,FL("Suspend Status is not success %X"), suspendStatus);)
Jeff Johnson295189b2012-06-20 16:38:30 -07003246#if 0
3247 //It can ignore the status and proceed with the disassoc processing.
3248 mlmDisassocCnf.resultCode = eSIR_SME_REFUSED;
3249 goto end;
3250#endif
3251 }
3252
3253 pMlmDeauthReq = (tLimMlmDeauthReq *) pMsgBuf;
3254
3255 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDeauthReq->sessionId))== NULL)
3256 {
3257
Abhishek Singhcd09b562013-12-24 16:02:20 +05303258 limLog(pMac, LOGE, FL("session does not exist for given sessionId %d"),
3259 pMlmDeauthReq->sessionId);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303260 vos_mem_free(pMlmDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003261 return;
3262 }
Abhishek Singhcd09b562013-12-24 16:02:20 +05303263 limLog(pMac, LOG1,FL("Process Deauth Req on sessionID %d Systemrole %d"
3264 "mlmstate %d from: "MAC_ADDRESS_STR), pMlmDeauthReq->sessionId,
3265 psessionEntry->limSystemRole, psessionEntry->limMlmState,
3266 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003267 #if 0
3268 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
3269 eSIR_SUCCESS)
3270 {
3271 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003272 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003273 }
3274 #endif //SUPPORT BT-AMP
3275 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3276
3277 switch (psessionEntry->limSystemRole)
3278 {
3279 case eLIM_STA_ROLE:
3280 case eLIM_BT_AMP_STA_ROLE:
3281 switch (psessionEntry->limMlmState)
3282 {
3283 case eLIM_MLM_IDLE_STATE:
3284 // Attempting to Deauthenticate
3285 // with a pre-authenticated peer.
3286 // Deauthetiate with peer if there
3287 // exists a pre-auth context below.
3288 break;
3289
3290 case eLIM_MLM_AUTHENTICATED_STATE:
3291 case eLIM_MLM_WT_ASSOC_RSP_STATE:
3292 case eLIM_MLM_LINK_ESTABLISHED_STATE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303293 if (!vos_mem_compare(pMlmDeauthReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07003294 currentBssId,
3295 sizeof(tSirMacAddr)) )
3296 {
Abhishek Singhcd09b562013-12-24 16:02:20 +05303297 limLog(pMac, LOGE,
3298 FL("received MLM_DEAUTH_REQ with invalid BSS id "
3299 "Peer MAC: "MAC_ADDRESS_STR " CFG BSSID Addr : "
3300 MAC_ADDRESS_STR),
3301 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr),
3302 MAC_ADDR_ARRAY(currentBssId));
Jeff Johnson295189b2012-06-20 16:38:30 -07003303
3304 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3305
3306 mlmDeauthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3307
3308 goto end;
3309 }
3310
3311 if ((psessionEntry->limMlmState ==
3312 eLIM_MLM_AUTHENTICATED_STATE) ||
3313 (psessionEntry->limMlmState ==
3314 eLIM_MLM_WT_ASSOC_RSP_STATE))
3315 {
3316 // Send Deauthentication frame
3317 // to peer entity
3318 limSendDeauthMgmtFrame(
3319 pMac,
3320 pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003321 pMlmDeauthReq->peerMacAddr,
3322 psessionEntry, FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003323
3324 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3325 mlmDeauthCnf.resultCode = eSIR_SME_SUCCESS;
3326 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003327 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003328 goto end;
3329 }
3330 else
3331 {
3332 // LINK_ESTABLISED_STATE
3333 // Cleanup RX & TX paths
3334 // below
3335 }
3336
3337 break;
3338
3339 default:
3340
3341 PELOGW(limLog(pMac, LOGW,
Abhishek Singhcd09b562013-12-24 16:02:20 +05303342 FL("received MLM_DEAUTH_REQ with in state %d for peer "MAC_ADDRESS_STR),
3343 psessionEntry->limMlmState,MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003344 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
3345
3346 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3347 mlmDeauthCnf.resultCode =
3348 eSIR_SME_STA_NOT_AUTHENTICATED;
3349
3350 goto end;
3351 }
3352
3353 break;
3354
3355 case eLIM_STA_IN_IBSS_ROLE:
Abhishek Singh92fbac22015-03-24 17:57:36 +05303356 limLog(pMac, LOGE,
3357 FL("received MLM_DEAUTH_REQ IBSS Mode "));
3358 mlmDeauthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3359 goto end;
Jeff Johnson295189b2012-06-20 16:38:30 -07003360 default: // eLIM_AP_ROLE
3361 break;
3362
3363 } // end switch (psessionEntry->limSystemRole)
3364
3365 /**
3366 * Check if there exists a context for the peer entity
3367 * to be deauthenticated with.
3368 */
3369 pStaDs = dphLookupHashEntry(pMac, pMlmDeauthReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable);
3370
3371 if (pStaDs == NULL)
3372 {
3373 /// Check if there exists pre-auth context for this STA
3374 pAuthNode = limSearchPreAuthList(pMac,
3375 pMlmDeauthReq->peerMacAddr);
3376
3377 if (pAuthNode == NULL)
3378 {
3379 /**
3380 * Received DEAUTH REQ for a STA that is neither
3381 * Associated nor Pre-authenticated. Log error,
3382 * Prepare and Send LIM_MLM_DEAUTH_CNF
3383 */
3384 PELOGW(limLog(pMac, LOGW,
Abhishek Singhcd09b562013-12-24 16:02:20 +05303385 FL("received MLM_DEAUTH_REQ in mlme state %d for STA that "
3386 "does not have context, Addr="MAC_ADDRESS_STR),
3387 psessionEntry->limMlmState,
3388 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003389
3390 mlmDeauthCnf.resultCode =
3391 eSIR_SME_STA_NOT_AUTHENTICATED;
3392 }
3393 else
3394 {
3395 mlmDeauthCnf.resultCode = eSIR_SME_SUCCESS;
3396
3397 /// Delete STA from pre-auth STA list
3398 limDeletePreAuthNode(pMac, pMlmDeauthReq->peerMacAddr);
3399
3400 /// Send Deauthentication frame to peer entity
3401 limSendDeauthMgmtFrame(pMac,
3402 pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003403 pMlmDeauthReq->peerMacAddr,
3404 psessionEntry, FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003405 }
3406
3407 goto end;
3408 }
3409 else if ((pStaDs->mlmStaContext.mlmState !=
3410 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
3411 (pStaDs->mlmStaContext.mlmState !=
3412 eLIM_MLM_WT_ASSOC_CNF_STATE))
3413 {
3414 /**
3415 * Received LIM_MLM_DEAUTH_REQ for STA that is n
3416 * some transit state. Log error.
3417 */
3418 PELOGW(limLog(pMac, LOGW,
Abhishek Singhcd09b562013-12-24 16:02:20 +05303419 FL("received MLM_DEAUTH_REQ for STA that either has no context or in some transit state, Addr="
3420 MAC_ADDRESS_STR),MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003421
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303422 /*
3423 * Deauthentication response to host triggered
3424 * deauthentication.
3425 */
3426 pSirSmeDeauthRsp = vos_mem_malloc(sizeof(tSirSmeDeauthRsp));
3427 if ( NULL == pSirSmeDeauthRsp )
3428 {
3429 // Log error
3430 limLog(pMac, LOGP,
3431 FL("call to AllocateMemory failed for eWNI_SME_DEAUTH_RSP"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003432
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303433 return;
3434 }
3435 limLog(pMac, LOG1, FL("send eWNI_SME_DEAUTH_RSP with "
3436 "retCode: %d for"MAC_ADDRESS_STR),eSIR_SME_DEAUTH_STATUS,
3437 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));
3438 pSirSmeDeauthRsp->messageType = eWNI_SME_DEAUTH_RSP;
3439 pSirSmeDeauthRsp->length = sizeof(tSirSmeDeauthRsp);
3440 pSirSmeDeauthRsp->statusCode = eSIR_SME_DEAUTH_STATUS;
3441 pSirSmeDeauthRsp->sessionId = pMlmDeauthReq->sessionId;
3442 pSirSmeDeauthRsp->transactionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003443
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303444 pBuf = (tANI_U8 *) pSirSmeDeauthRsp->peerMacAddr;
3445 vos_mem_copy( pBuf, pMlmDeauthReq->peerMacAddr, sizeof(tSirMacAddr));
3446
3447 pMsg = (tANI_U32*)pSirSmeDeauthRsp;
3448
3449 limSendSmeDisassocDeauthNtf( pMac, eHAL_STATUS_SUCCESS,
3450 (tANI_U32*) pMsg );
3451
3452 return;
3453
Jeff Johnson295189b2012-06-20 16:38:30 -07003454 }
3455
3456 //pStaDs->mlmStaContext.rxPurgeReq = 1;
3457 pStaDs->mlmStaContext.disassocReason = (tSirMacReasonCodes)
3458 pMlmDeauthReq->reasonCode;
3459 pStaDs->mlmStaContext.cleanupTrigger = pMlmDeauthReq->deauthTrigger;
3460
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003461 pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = pMlmDeauthReq;
Abhishek Singh94152932014-01-16 19:04:51 +05303462
3463 /* Set state to mlm State to eLIM_MLM_WT_DEL_STA_RSP_STATE
3464 * This is to address the issue of race condition between
3465 * disconnect request from the HDD and disassoc from
3466 * inactivity timer. This will make sure that we will not
3467 * process disassoc if deauth is in progress for the station
3468 * and thus mlmStaContext.cleanupTrigger will not be overwritten.
3469 */
3470 pStaDs->mlmStaContext.mlmState = eLIM_MLM_WT_DEL_STA_RSP_STATE;
3471
Jeff Johnson295189b2012-06-20 16:38:30 -07003472 /// Send Deauthentication frame to peer entity
Kanchanapally, Vidyullathaf9426e52013-12-24 17:28:54 +05303473 /* If FW_IN_TX_PATH feature is enabled
3474 do not wait for ACK */
3475 if( IS_FW_IN_TX_PATH_FEATURE_ENABLE )
3476 {
3477 limSendDeauthMgmtFrame(pMac, pMlmDeauthReq->reasonCode,
3478 pMlmDeauthReq->peerMacAddr,
3479 psessionEntry, FALSE);
3480
3481 /* Send Deauth CNF and receive path cleanup */
3482 limSendDeauthCnf(pMac);
3483 }
3484 else
3485 {
3486 limSendDeauthMgmtFrame(pMac, pMlmDeauthReq->reasonCode,
3487 pMlmDeauthReq->peerMacAddr,
3488 psessionEntry, TRUE);
3489 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003490
3491 return;
3492
3493end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303494 vos_mem_copy((tANI_U8 *) &mlmDeauthCnf.peerMacAddr,
3495 (tANI_U8 *) pMlmDeauthReq->peerMacAddr,
3496 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003497 mlmDeauthCnf.deauthTrigger = pMlmDeauthReq->deauthTrigger;
3498 mlmDeauthCnf.aid = pMlmDeauthReq->aid;
3499 mlmDeauthCnf.sessionId = pMlmDeauthReq->sessionId;
3500
3501 // Free up buffer allocated
3502 // for mlmDeauthReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303503 vos_mem_free(pMlmDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003504
3505 limPostSmeMessage(pMac,
3506 LIM_MLM_DEAUTH_CNF,
3507 (tANI_U32 *) &mlmDeauthCnf);
3508
3509}
3510
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003511
3512void limProcessDeauthAckTimeout(tpAniSirGlobal pMac)
3513{
Abhishek Singhcd09b562013-12-24 16:02:20 +05303514 limLog(pMac, LOG1, FL(""));
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003515 limSendDeauthCnf(pMac);
3516}
3517
Jeff Johnson295189b2012-06-20 16:38:30 -07003518/**
3519 * limProcessMlmDeauthReq()
3520 *
3521 *FUNCTION:
3522 * This function is called to process MLM_DEAUTH_REQ message
3523 * from SME
3524 *
3525 *LOGIC:
3526 *
3527 *ASSUMPTIONS:
3528 *
3529 *NOTE:
3530 *
3531 * @param pMac Pointer to Global MAC structure
3532 * @param *pMsgBuf A pointer to the MLM message buffer
3533 * @return None
3534 */
3535
3536static void
3537limProcessMlmDeauthReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3538{
3539// tANI_U16 aid;
3540// tSirMacAddr currentBssId;
3541// tpDphHashNode pStaDs;
3542// struct tLimPreAuthNode *pAuthNode;
3543 tLimMlmDeauthReq *pMlmDeauthReq;
3544// tLimMlmDeauthCnf mlmDeauthCnf;
3545 tpPESession psessionEntry;
3546
3547 if(pMsgBuf == NULL)
3548 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003549 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003550 return;
3551 }
3552
3553 pMlmDeauthReq = (tLimMlmDeauthReq *) pMsgBuf;
3554
Abhishek Singhcd09b562013-12-24 16:02:20 +05303555 limLog(pMac, LOG1,FL("Process Deauth Req on sessionID %d "
3556 "from: "MAC_ADDRESS_STR), pMlmDeauthReq->sessionId,
3557 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));
3558
Jeff Johnson295189b2012-06-20 16:38:30 -07003559 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDeauthReq->sessionId))== NULL)
3560 {
3561
Abhishek Singhcd09b562013-12-24 16:02:20 +05303562 limLog(pMac, LOGE, FL("session does not exist for given sessionId %d"),
3563 pMlmDeauthReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07003564 return;
3565 }
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003566 limProcessMlmDeauthReqNtf( pMac, eHAL_STATUS_SUCCESS, (tANI_U32*) pMsgBuf );
3567
Jeff Johnson295189b2012-06-20 16:38:30 -07003568} /*** limProcessMlmDeauthReq() ***/
3569
3570
3571
3572/**
3573 * @function : limProcessMlmSetKeysReq()
3574 *
3575 * @brief : This function is called to process MLM_SETKEYS_REQ message
3576 * from SME
3577 *
3578 *LOGIC:
3579 *
3580 *ASSUMPTIONS:
3581 *
3582 *NOTE:
3583 *
3584 * @param pMac Pointer to Global MAC structure
3585 * @param *pMsgBuf A pointer to the MLM message buffer
3586 * @return None
3587 */
3588
3589static void
3590limProcessMlmSetKeysReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3591{
3592tANI_U16 aid;
3593tANI_U16 staIdx = 0;
3594tANI_U32 defaultKeyId = 0;
3595tSirMacAddr currentBssId;
3596tpDphHashNode pStaDs;
3597tLimMlmSetKeysReq *pMlmSetKeysReq;
3598tLimMlmSetKeysCnf mlmSetKeysCnf;
3599tpPESession psessionEntry;
3600
3601 if(pMsgBuf == NULL)
3602 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003603 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003604 return;
3605 }
3606
3607
3608 pMlmSetKeysReq = (tLimMlmSetKeysReq *) pMsgBuf;
3609 // Hold onto the SetKeys request parameters
3610 pMac->lim.gpLimMlmSetKeysReq = (void *) pMlmSetKeysReq;
3611
3612 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmSetKeysReq->sessionId))== NULL)
3613 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003614 PELOGE(limLog(pMac, LOGE,FL("session does not exist for given sessionId"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003615 return;
3616 }
3617
3618 limLog( pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003619 FL( "Received MLM_SETKEYS_REQ with parameters:"
Jeff Johnson295189b2012-06-20 16:38:30 -07003620 "AID [%d], ED Type [%d], # Keys [%d] & Peer MAC Addr - "),
3621 pMlmSetKeysReq->aid,
3622 pMlmSetKeysReq->edType,
3623 pMlmSetKeysReq->numKeys );
3624 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3625
3626 #if 0
3627 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac, WNI_CFG_BSSID, currentBssId, &cfg )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003628 limLog( pMac, LOGP, FL("Could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003629 return;
3630 }
3631 #endif //TO SUPPORT BT-AMP
3632 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3633
3634 switch( psessionEntry->limSystemRole ) {
3635 case eLIM_STA_ROLE:
3636 case eLIM_BT_AMP_STA_ROLE:
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003637 //In case of TDLS, peerMac address need not be BssId. Skip this check
3638 //if TDLS is enabled.
3639#ifndef FEATURE_WLAN_TDLS
Jeff Johnson295189b2012-06-20 16:38:30 -07003640 if((!limIsAddrBC( pMlmSetKeysReq->peerMacAddr ) ) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303641 (!vos_mem_compare(pMlmSetKeysReq->peerMacAddr,
3642 currentBssId, sizeof(tSirMacAddr))) ){
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003643 limLog( pMac, LOGW, FL("Received MLM_SETKEYS_REQ with invalid BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003644 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3645
3646 // Prepare and Send LIM_MLM_SETKEYS_CNF with error code
3647 mlmSetKeysCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3648 goto end;
3649 }
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003650#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003651 // Fall thru' & 'Plumb' keys below
3652 break;
3653 case eLIM_STA_IN_IBSS_ROLE:
3654 default: // others
3655 // Fall thru...
3656 break;
3657 }
3658
3659 /**
3660 * Use the "unicast" parameter to determine if the "Group Keys"
3661 * are being set.
3662 * pMlmSetKeysReq->key.unicast = 0 -> Multicast/broadcast
3663 * pMlmSetKeysReq->key.unicast - 1 -> Unicast keys are being set
3664 */
3665 if( limIsAddrBC( pMlmSetKeysReq->peerMacAddr )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003666 limLog( pMac, LOG1, FL("Trying to set Group Keys...%d "), pMlmSetKeysReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07003667 /** When trying to set Group Keys for any
3668 * security mode other than WEP, use the
3669 * STA Index corresponding to the AP...
3670 */
3671 switch( pMlmSetKeysReq->edType ) {
3672 case eSIR_ED_CCMP:
3673
3674#ifdef WLAN_FEATURE_11W
3675 case eSIR_ED_AES_128_CMAC:
3676#endif
3677 staIdx = psessionEntry->staId;
3678 break;
3679
3680 default:
3681 break;
3682 }
3683 }else {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003684 limLog( pMac, LOG1, FL("Trying to set Unicast Keys..."));
Jeff Johnson295189b2012-06-20 16:38:30 -07003685 /**
3686 * Check if there exists a context for the
3687 * peer entity for which keys need to be set.
3688 */
3689
3690
3691 pStaDs = dphLookupHashEntry( pMac, pMlmSetKeysReq->peerMacAddr, &aid , &psessionEntry->dph.dphHashTable);
3692
Jeff Johnson295189b2012-06-20 16:38:30 -07003693 if ((pStaDs == NULL) ||
3694 ((pStaDs->mlmStaContext.mlmState != eLIM_MLM_LINK_ESTABLISHED_STATE) && (psessionEntry->limSystemRole != eLIM_AP_ROLE))) {
Jeff Johnson295189b2012-06-20 16:38:30 -07003695 /**
3696 * Received LIM_MLM_SETKEYS_REQ for STA
3697 * that does not have context or in some
3698 * transit state. Log error.
3699 */
3700 limLog( pMac, LOG1,
3701 FL("Received MLM_SETKEYS_REQ for STA that either has no context or in some transit state, Addr = "));
3702 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3703
3704 // Prepare and Send LIM_MLM_SETKEYS_CNF
3705 mlmSetKeysCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3706 goto end;
3707 } else
3708 staIdx = pStaDs->staIndex;
3709 }
3710
3711 if ((pMlmSetKeysReq->numKeys == 0) && (pMlmSetKeysReq->edType != eSIR_ED_NONE)) {
Jeff Johnsone7245742012-09-05 17:12:55 -07003712 //
3713 // Broadcast/Multicast Keys (for WEP!!) are NOT sent
3714 // via this interface!!
3715 //
3716 // This indicates to HAL that the WEP Keys need to be
3717 // extracted from the CFG and applied to hardware
3718 defaultKeyId = 0xff;
3719 }else if(pMlmSetKeysReq->key[0].keyId &&
3720 ((pMlmSetKeysReq->edType == eSIR_ED_WEP40) ||
3721 (pMlmSetKeysReq->edType == eSIR_ED_WEP104))){
3722 /* If the Key Id is non zero and encryption mode is WEP,
3723 * the key index is coming from the upper layers so that key only
3724 * need to be used as the default tx key, This is being used only
3725 * in case of WEP mode in HAL */
3726 defaultKeyId = pMlmSetKeysReq->key[0].keyId;
3727 }else
3728 defaultKeyId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003729
3730 limLog( pMac, LOG1,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003731 FL( "Trying to set keys for STA Index [%d], using defaultKeyId [%d]" ),
Jeff Johnson295189b2012-06-20 16:38:30 -07003732 staIdx,
3733 defaultKeyId );
3734
3735 if(limIsAddrBC( pMlmSetKeysReq->peerMacAddr )) {
3736 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
3737 psessionEntry->limMlmState = eLIM_MLM_WT_SET_BSS_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003738 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003739 limLog( pMac, LOG1, FL("Trying to set Group Keys...%d "),
Jeff Johnson295189b2012-06-20 16:38:30 -07003740 psessionEntry->peSessionId);
3741
3742 // Package WDA_SET_BSSKEY_REQ message parameters
3743 limSendSetBssKeyReq(pMac, pMlmSetKeysReq,psessionEntry);
3744 return;
3745 }else {
3746 // Package WDA_SET_STAKEY_REQ / WDA_SET_STA_BCASTKEY_REQ message parameters
3747 limSendSetStaKeyReq(pMac, pMlmSetKeysReq, staIdx, (tANI_U8) defaultKeyId,psessionEntry);
3748 return;
3749 }
3750
3751end:
3752 mlmSetKeysCnf.sessionId= pMlmSetKeysReq->sessionId;
3753 limPostSmeSetKeysCnf( pMac, pMlmSetKeysReq, &mlmSetKeysCnf );
3754
3755} /*** limProcessMlmSetKeysReq() ***/
3756
3757/**
3758 * limProcessMlmRemoveKeyReq()
3759 *
3760 *FUNCTION:
3761 * This function is called to process MLM_REMOVEKEY_REQ message
3762 * from SME
3763 *
3764 *LOGIC:
3765 *
3766 *ASSUMPTIONS:
3767 *
3768 *NOTE:
3769 *
3770 * @param pMac Pointer to Global MAC structure
3771 * @param *pMsgBuf A pointer to the MLM message buffer
3772 * @return None
3773 */
3774
3775static void
3776limProcessMlmRemoveKeyReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3777{
3778tANI_U16 aid;
3779tANI_U16 staIdx = 0;
3780tSirMacAddr currentBssId;
3781tpDphHashNode pStaDs;
3782tLimMlmRemoveKeyReq *pMlmRemoveKeyReq;
3783tLimMlmRemoveKeyCnf mlmRemoveKeyCnf;
3784 tpPESession psessionEntry;
3785
3786 if(pMsgBuf == NULL)
3787 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003788 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003789 return;
3790 }
3791
3792 pMlmRemoveKeyReq = (tLimMlmRemoveKeyReq *) pMsgBuf;
3793
3794
3795 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmRemoveKeyReq->sessionId))== NULL)
3796 {
3797 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003798 FL("session does not exist for given sessionId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303799 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07003800 return;
3801 }
3802
3803
3804 if( pMac->lim.gpLimMlmRemoveKeyReq != NULL )
3805 {
3806 // Free any previous requests.
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303807 vos_mem_free(pMac->lim.gpLimMlmRemoveKeyReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003808 pMac->lim.gpLimMlmRemoveKeyReq = NULL;
3809 }
3810 // Hold onto the RemoveKeys request parameters
3811 pMac->lim.gpLimMlmRemoveKeyReq = (void *) pMlmRemoveKeyReq;
3812
3813 #if 0
3814 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac,
3815 WNI_CFG_BSSID,
3816 currentBssId,
3817 &cfg ))
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003818 limLog( pMac, LOGP, FL("Could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003819 #endif //TO-SUPPORT BT-AMP
3820 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3821
3822 switch( psessionEntry->limSystemRole )
3823 {
3824 case eLIM_STA_ROLE:
3825 case eLIM_BT_AMP_STA_ROLE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303826 if (( limIsAddrBC( pMlmRemoveKeyReq->peerMacAddr ) != true ) &&
3827 (!vos_mem_compare(pMlmRemoveKeyReq->peerMacAddr,
3828 currentBssId,
3829 sizeof(tSirMacAddr))))
Jeff Johnson295189b2012-06-20 16:38:30 -07003830 {
3831 limLog( pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003832 FL("Received MLM_REMOVEKEY_REQ with invalid BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003833 limPrintMacAddr( pMac, pMlmRemoveKeyReq->peerMacAddr, LOGW );
3834
3835 // Prepare and Send LIM_MLM_REMOVEKEY_CNF with error code
3836 mlmRemoveKeyCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3837 goto end;
3838 }
3839 break;
3840
3841 case eLIM_STA_IN_IBSS_ROLE:
3842 default: // eLIM_AP_ROLE
3843 // Fall thru...
3844 break;
3845 }
3846
3847
3848 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
3849 if(limIsAddrBC( pMlmRemoveKeyReq->peerMacAddr )) //Second condition for IBSS or AP role.
3850 {
3851 psessionEntry->limMlmState = eLIM_MLM_WT_REMOVE_BSS_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003852 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003853 // Package WDA_REMOVE_BSSKEY_REQ message parameters
3854 limSendRemoveBssKeyReq( pMac,pMlmRemoveKeyReq,psessionEntry);
3855 return;
3856 }
3857
3858 /**
3859 * Check if there exists a context for the
3860 * peer entity for which keys need to be removed.
3861 */
3862 pStaDs = dphLookupHashEntry( pMac, pMlmRemoveKeyReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable );
3863 if ((pStaDs == NULL) ||
3864 (pStaDs &&
3865 (pStaDs->mlmStaContext.mlmState !=
3866 eLIM_MLM_LINK_ESTABLISHED_STATE)))
3867 {
3868 /**
3869 * Received LIM_MLM_REMOVEKEY_REQ for STA
3870 * that does not have context or in some
3871 * transit state. Log error.
3872 */
3873 limLog( pMac, LOGW,
3874 FL("Received MLM_REMOVEKEYS_REQ for STA that either has no context or in some transit state, Addr = "));
3875 limPrintMacAddr( pMac, pMlmRemoveKeyReq->peerMacAddr, LOGW );
3876
3877 // Prepare and Send LIM_MLM_REMOVEKEY_CNF
3878 mlmRemoveKeyCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3879 mlmRemoveKeyCnf.sessionId = pMlmRemoveKeyReq->sessionId;
3880
3881
3882 goto end;
3883 }
3884 else
3885 staIdx = pStaDs->staIndex;
3886
3887
3888
3889 psessionEntry->limMlmState = eLIM_MLM_WT_REMOVE_STA_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003890 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003891
3892 // Package WDA_REMOVE_STAKEY_REQ message parameters
3893 limSendRemoveStaKeyReq( pMac,pMlmRemoveKeyReq,staIdx,psessionEntry);
3894 return;
3895
3896end:
3897 limPostSmeRemoveKeyCnf( pMac,
Jeff Johnsone7245742012-09-05 17:12:55 -07003898 psessionEntry,
Jeff Johnson295189b2012-06-20 16:38:30 -07003899 pMlmRemoveKeyReq,
3900 &mlmRemoveKeyCnf );
3901
3902} /*** limProcessMlmRemoveKeyReq() ***/
3903
3904
3905/**
3906 * limProcessMinChannelTimeout()
3907 *
3908 *FUNCTION:
3909 * This function is called to process Min Channel Timeout
3910 * during channel scan.
3911 *
3912 *LOGIC:
3913 *
3914 *ASSUMPTIONS:
3915 *
3916 *NOTE:
3917 *
3918 * @param pMac Pointer to Global MAC structure
3919 * @return None
3920 */
3921
3922static void
3923limProcessMinChannelTimeout(tpAniSirGlobal pMac)
3924{
3925 tANI_U8 channelNum;
3926
3927#ifdef GEN6_TODO
3928 //if the min Channel is maintained per session, then use the below seesionEntry
3929 //priority - LOW/might not be needed
3930
3931 //TBD-RAJESH HOW TO GET sessionEntry?????
3932 tpPESession psessionEntry;
3933
3934 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimMinChannelTimer.sessionId))== NULL)
3935 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003936 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003937 return;
3938 }
3939#endif
3940
Abhishek Singh89e1d672013-11-28 15:13:42 +05303941 /*do not process if we are in finish scan wait state i.e.
3942 scan is aborted or finished*/
3943 if (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE &&
3944 pMac->lim.gLimHalScanState != eLIM_HAL_FINISH_SCAN_WAIT_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07003945 {
Jeff Johnson295189b2012-06-20 16:38:30 -07003946 /// Min channel timer timed out
3947 pMac->lim.limTimers.gLimPeriodicProbeReqTimer.sessionId = 0xff;
3948 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
3949 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -08003950 pMac->lim.probeCounter = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003951 if (pMac->lim.gLimCurrentScanChannelId <=
3952 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
3953 {
3954 channelNum = (tANI_U8)limGetCurrentScanChannel(pMac);
3955 }
3956 else
3957 {
3958 // This shouldn't be the case, but when this happens, this timeout should be for the last channelId.
3959 // Get the channelNum as close to correct as possible.
3960 if(pMac->lim.gpLimMlmScanReq->channelList.channelNumber)
3961 {
3962 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1];
3963 }
3964 else
3965 {
3966 channelNum = 1;
3967 }
3968 }
3969
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07003970 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05303971 FL("Sending End Scan req from MIN_CH_TIMEOUT in state %d ch-%d"),
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07003972 pMac->lim.gLimMlmState,channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -07003973 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
3974 }
3975 else
3976 {
3977 /**
3978 * MIN channel timer should not have timed out
3979 * in states other than wait_probe_response.
3980 * Log error.
3981 */
3982 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05303983 FL("received unexpected MIN channel timeout in mlme state %d and hal scan State %d"),
Abhishek Singh89e1d672013-11-28 15:13:42 +05303984 pMac->lim.gLimMlmState,pMac->lim.gLimHalScanState);
Jeff Johnson295189b2012-06-20 16:38:30 -07003985 limPrintMlmState(pMac, LOGE, pMac->lim.gLimMlmState);
3986 }
3987} /*** limProcessMinChannelTimeout() ***/
3988
3989
3990
3991/**
3992 * limProcessMaxChannelTimeout()
3993 *
3994 *FUNCTION:
3995 * This function is called to process Max Channel Timeout
3996 * during channel scan.
3997 *
3998 *LOGIC:
3999 *
4000 *ASSUMPTIONS:
4001 *
4002 *NOTE:
4003 *
4004 * @param pMac Pointer to Global MAC structure
4005 * @return None
4006 */
4007
4008static void
4009limProcessMaxChannelTimeout(tpAniSirGlobal pMac)
4010{
4011 tANI_U8 channelNum;
4012
Abhishek Singh89e1d672013-11-28 15:13:42 +05304013 /*do not process if we are in finish scan wait state i.e.
4014 scan is aborted or finished*/
4015 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE ||
4016 pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) &&
4017 pMac->lim.gLimHalScanState != eLIM_HAL_FINISH_SCAN_WAIT_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004018 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304019 limLog(pMac, LOG1, FL("Scanning : Max channel timed out"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004020 /**
4021 * MAX channel timer timed out
4022 * Continue channel scan.
4023 */
4024 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
4025 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
4026 pMac->lim.limTimers.gLimPeriodicProbeReqTimer.sessionId = 0xff;
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -08004027 pMac->lim.probeCounter = 0;
4028
Kiet Lamaa8e15a2014-02-11 23:30:06 -08004029 if (pMac->lim.gLimCurrentScanChannelId <=
Jeff Johnson295189b2012-06-20 16:38:30 -07004030 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
4031 {
4032 channelNum = limGetCurrentScanChannel(pMac);
4033 }
4034 else
4035 {
4036 if(pMac->lim.gpLimMlmScanReq->channelList.channelNumber)
4037 {
4038 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1];
4039 }
4040 else
4041 {
4042 channelNum = 1;
4043 }
4044 }
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07004045 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304046 FL("Sending End Scan req from MAX_CH_TIMEOUT in state %d on ch-%d"),
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07004047 pMac->lim.gLimMlmState,channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -07004048 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
4049 }
4050 else
4051 {
4052 /**
4053 * MAX channel timer should not have timed out
4054 * in states other than wait_scan.
4055 * Log error.
4056 */
4057 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304058 FL("received unexpected MAX channel timeout in mlme state %d and hal scan state %d"),
Abhishek Singh89e1d672013-11-28 15:13:42 +05304059 pMac->lim.gLimMlmState, pMac->lim.gLimHalScanState);
Jeff Johnson295189b2012-06-20 16:38:30 -07004060 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
4061 }
4062} /*** limProcessMaxChannelTimeout() ***/
4063
4064/**
4065 * limProcessPeriodicProbeReqTimer()
4066 *
4067 *FUNCTION:
4068 * This function is called to process periodic probe request
4069 * to send during scan.
4070 *
4071 *LOGIC:
4072 *
4073 *ASSUMPTIONS:
4074 *
4075 *NOTE:
4076 *
4077 * @param pMac Pointer to Global MAC structure
4078 * @return None
4079 */
4080
4081static void
4082limProcessPeriodicProbeReqTimer(tpAniSirGlobal pMac)
4083{
4084 tANI_U8 channelNum;
4085 tANI_U8 i = 0;
4086 tSirRetStatus status = eSIR_SUCCESS;
4087 TX_TIMER *pPeriodicProbeReqTimer;
4088 pPeriodicProbeReqTimer = &pMac->lim.limTimers.gLimPeriodicProbeReqTimer;
4089
4090 if(vos_timer_getCurrentState(&pPeriodicProbeReqTimer->vosTimer)
4091 != VOS_TIMER_STATE_STOPPED)
4092 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304093 limLog(pMac, LOG1, FL("Invalid state of timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004094 return;
4095 }
4096
4097 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) &&
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -08004098 (pPeriodicProbeReqTimer->sessionId != 0xff) && (pMac->lim.probeCounter < pMac->lim.maxProbe))
Jeff Johnson295189b2012-06-20 16:38:30 -07004099 {
4100 tLimMlmScanReq *pLimMlmScanReq = pMac->lim.gpLimMlmScanReq;
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -08004101 pMac->lim.probeCounter++;
Jeff Johnson295189b2012-06-20 16:38:30 -07004102 /**
4103 * Periodic channel timer timed out
4104 * to send probe request.
4105 */
4106 channelNum = limGetCurrentScanChannel(pMac);
Abhishek Singh795e1b82015-09-25 15:35:03 +05304107 /* Prepare and send Probe Request frame for all the SSIDs
4108 * present in the saved MLM
4109 */
Jeff Johnson295189b2012-06-20 16:38:30 -07004110 do
4111 {
Siddharth Bhal4f3187c2014-10-09 21:38:08 +05304112 tSirMacAddr gSelfMacAddr;
4113
Abhishek Singh795e1b82015-09-25 15:35:03 +05304114 /* Send self MAC as src address if
4115 * MAC spoof is not enabled OR
4116 * spoofMacAddr is all 0 OR
4117 * disableP2PMacSpoof is enabled and scan is P2P scan
4118 * else use the spoofMac as src address
Jeff Johnson295189b2012-06-20 16:38:30 -07004119 */
Abhishek Singh795e1b82015-09-25 15:35:03 +05304120 if ((pMac->lim.isSpoofingEnabled != TRUE) ||
4121 (TRUE ==
4122 vos_is_macaddr_zero((v_MACADDR_t *)&pMac->lim.spoofMacAddr)) ||
4123 (pMac->roam.configParam.disableP2PMacSpoofing &&
4124 pMac->lim.gpLimMlmScanReq->p2pSearch)) {
Siddharth Bhal4f3187c2014-10-09 21:38:08 +05304125 vos_mem_copy(gSelfMacAddr, pMac->lim.gSelfMacAddr, VOS_MAC_ADDRESS_LEN);
4126 } else {
4127 vos_mem_copy(gSelfMacAddr, pMac->lim.spoofMacAddr, VOS_MAC_ADDRESS_LEN);
4128 }
4129 limLog( pMac, LOG1, FL("Mac Addr used in Probe Req is :"MAC_ADDRESS_STR),
4130 MAC_ADDR_ARRAY(gSelfMacAddr));
4131
Jeff Johnson295189b2012-06-20 16:38:30 -07004132 /*
4133 * PELOGE(limLog(pMac, LOGW, FL("sending ProbeReq number %d,"
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004134 * " for SSID %s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004135 * i, pLimMlmScanReq->ssId[i].ssId,
4136 * channelNum);)
4137 */
4138 status = limSendProbeReqMgmtFrame( pMac, &pLimMlmScanReq->ssId[i],
Siddharth Bhal4f3187c2014-10-09 21:38:08 +05304139 pLimMlmScanReq->bssId, channelNum, gSelfMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07004140 pLimMlmScanReq->dot11mode, pLimMlmScanReq->uIEFieldLen,
4141 (tANI_U8 *)(pLimMlmScanReq) + pLimMlmScanReq->uIEFieldOffset);
4142
4143
4144 if ( status != eSIR_SUCCESS)
4145 {
4146 PELOGE(limLog(pMac, LOGE, FL("send ProbeReq failed for SSID "
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004147 "%s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004148 pLimMlmScanReq->ssId[i].ssId,
4149 channelNum);)
4150 return;
4151 }
4152 i++;
4153 } while (i < pLimMlmScanReq->numSsid);
4154
4155 /* Activate timer again */
4156 if (tx_timer_activate(pPeriodicProbeReqTimer) != TX_SUCCESS)
4157 {
4158 limLog(pMac, LOGP, FL("could not start periodic probe"
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004159 " req timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004160 return;
4161 }
4162 }
4163 else
4164 {
4165 /**
4166 * Periodic scan is timeout is happening in
4167 * in states other than wait_scan.
4168 * Log error.
4169 */
Mohit Khanna23863762012-09-11 17:40:09 -07004170 limLog(pMac, LOG1,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304171 FL("received unexpected Periodic scan timeout in state %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004172 pMac->lim.gLimMlmState);
4173 }
4174} /*** limProcessPeriodicProbeReqTimer() ***/
4175
4176/**
4177 * limProcessJoinFailureTimeout()
4178 *
4179 *FUNCTION:
4180 * This function is called to process JoinFailureTimeout
4181 *
4182 *LOGIC:
4183 *
4184 *ASSUMPTIONS:
4185 *
4186 *NOTE:
4187 *
4188 * @param pMac Pointer to Global MAC structure
4189 * @return None
4190 */
4191
4192static void
4193limProcessJoinFailureTimeout(tpAniSirGlobal pMac)
4194{
4195 tLimMlmJoinCnf mlmJoinCnf;
4196 tSirMacAddr bssid;
4197 tANI_U32 len;
krunal soni8d13b092013-07-19 13:23:29 -07004198#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4199 vos_log_rssi_pkt_type *pRssiLog = NULL;
4200#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07004201
4202 //fetch the sessionEntry based on the sessionId
4203 tpPESession psessionEntry;
4204
4205 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimJoinFailureTimer.sessionId))== NULL)
4206 {
Srinivas Girigowda2a69dcf2013-09-13 14:48:34 -07004207 limLog(pMac, LOGE, FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004208 return;
4209 }
krunal soni8d13b092013-07-19 13:23:29 -07004210
4211#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4212 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
4213 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
4214 if (pRssiLog)
4215 {
4216 pRssiLog->rssi = psessionEntry->rssi;
4217 }
4218 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
4219#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
4220
Jeff Johnson295189b2012-06-20 16:38:30 -07004221 if (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE)
4222 {
4223 len = sizeof(tSirMacAddr);
4224
4225 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, bssid, &len) !=
4226 eSIR_SUCCESS)
4227 {
4228 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004229 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004230 return;
4231 }
4232
4233 // 'Change' timer for future activations
4234 limDeactivateAndChangeTimer(pMac, eLIM_JOIN_FAIL_TIMER);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004235 // Change Periodic probe req timer for future activation
4236 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_JOIN_PROBE_REQ_TIMER);
Jeff Johnson295189b2012-06-20 16:38:30 -07004237 /**
4238 * Issue MLM join confirm with timeout reason code
4239 */
Kiet Lam82004c62013-11-11 13:24:28 +05304240 PELOGE(limLog(pMac, LOGE, FL(" In state eLIM_MLM_WT_JOIN_BEACON_STATE."));)
4241 PELOGE(limLog(pMac, LOGE, FL(" Join Failure Timeout occurred for session %d with BSS "),
4242 psessionEntry->peSessionId);
4243 limPrintMacAddr(pMac, psessionEntry->bssId, LOGE);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004244
4245 mlmJoinCnf.resultCode = eSIR_SME_JOIN_TIMEOUT_RESULT_CODE;
4246 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
4247
4248 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07004249 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004250 if(limSetLinkState(pMac, eSIR_LINK_IDLE_STATE, psessionEntry->bssId,
4251 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004252 PELOGE(limLog(pMac, LOGE, FL("Failed to set the LinkState"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004253 /* Update PE session Id */
4254 mlmJoinCnf.sessionId = psessionEntry->peSessionId;
4255
4256
4257 // Freeup buffer allocated to join request
4258 if (psessionEntry->pLimMlmJoinReq)
4259 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304260 vos_mem_free(psessionEntry->pLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004261 psessionEntry->pLimMlmJoinReq = NULL;
4262 }
4263
4264 limPostSmeMessage(pMac,
4265 LIM_MLM_JOIN_CNF,
4266 (tANI_U32 *) &mlmJoinCnf);
4267
4268 return;
4269 }
4270 else
4271 {
4272 /**
4273 * Join failure timer should not have timed out
4274 * in states other than wait_join_beacon state.
4275 * Log error.
4276 */
4277 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304278 FL("received unexpected JOIN failure timeout in state %d"),psessionEntry->limMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -07004279 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
4280 }
4281} /*** limProcessJoinFailureTimeout() ***/
4282
4283
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004284/**
4285 * limProcessPeriodicJoinProbeReqTimer()
4286 *
4287 *FUNCTION:
4288 * This function is called to process periodic probe request
4289 * send during joining process.
4290 *
4291 *LOGIC:
4292 *
4293 *ASSUMPTIONS:
4294 *
4295 *NOTE:
4296 *
4297 * @param pMac Pointer to Global MAC structure
4298 * @return None
4299 */
4300
4301static void limProcessPeriodicJoinProbeReqTimer(tpAniSirGlobal pMac)
4302{
4303 tpPESession psessionEntry;
4304 tSirMacSSid ssId;
4305
4306 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer.sessionId))== NULL)
4307 {
Kiet Lam82004c62013-11-11 13:24:28 +05304308 limLog(pMac, LOGE,FL("session does not exist for given SessionId : %d"),
4309 pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer.sessionId);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004310 return;
4311 }
4312
4313 if((VOS_TRUE == tx_timer_running(&pMac->lim.limTimers.gLimJoinFailureTimer)) &&
4314 (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE))
4315 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304316 vos_mem_copy(ssId.ssId,
4317 psessionEntry->ssId.ssId,
4318 psessionEntry->ssId.length);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004319 ssId.length = psessionEntry->ssId.length;
4320
4321 limSendProbeReqMgmtFrame( pMac, &ssId,
4322 psessionEntry->pLimMlmJoinReq->bssDescription.bssId, psessionEntry->currentOperChannel/*chanNum*/,
4323 psessionEntry->selfMacAddr, psessionEntry->dot11mode,
4324 psessionEntry->pLimJoinReq->addIEScan.length, psessionEntry->pLimJoinReq->addIEScan.addIEdata);
4325
4326 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_JOIN_PROBE_REQ_TIMER);
4327
4328 // Activate Join Periodic Probe Req timer
4329 if (tx_timer_activate(&pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer) != TX_SUCCESS)
4330 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004331 limLog(pMac, LOGP, FL("could not activate Periodic Join req failure timer"));
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004332 return;
4333 }
4334 }
4335 return;
4336} /*** limProcessPeriodicJoinProbeReqTimer() ***/
4337
Sushant Kaushik9e923872015-04-02 17:09:31 +05304338/**
4339 * limProcessAuthRetryTimer()
4340 *
4341 *FUNCTION:
4342 * This function is called to process Auth Retry request
4343 * send during joining process.
4344 *
4345 *LOGIC:
4346 *
4347 *ASSUMPTIONS:
4348 *
4349 *NOTE:
4350 *
4351 * @param pMac Pointer to Global MAC structure
4352 * @return None
4353 */
4354
4355static void limProcessAuthRetryTimer(tpAniSirGlobal pMac)
4356{
4357 tpPESession psessionEntry;
4358 limLog(pMac, LOG1, FL(" ENTER "));
4359 if ((psessionEntry =
4360 peFindSessionBySessionId(pMac,
4361 pMac->lim.limTimers.gLimPeriodicAuthRetryTimer.sessionId)) == NULL)
4362 {
4363 limLog(pMac, LOGE,FL("session does not exist for given SessionId : %d"),
4364 pMac->lim.limTimers.gLimPeriodicAuthRetryTimer.sessionId);
4365 return;
4366 }
4367
4368 if ((VOS_TRUE ==
4369 tx_timer_running(&pMac->lim.limTimers.gLimAuthFailureTimer)) &&
4370 (psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME2_STATE) &&
4371 (LIM_AUTH_ACK_RCD_SUCCESS != pMac->authAckStatus))
4372 {
4373 tSirMacAuthFrameBody authFrameBody;
4374
4375 /* Send the auth retry only in case we have received ack failure
4376 * else just restart the retry timer.
4377 */
4378 if (LIM_AUTH_ACK_RCD_FAILURE == pMac->authAckStatus)
4379 {
4380 /// Prepare & send Authentication frame
4381 authFrameBody.authAlgoNumber =
4382 (tANI_U8) pMac->lim.gpLimMlmAuthReq->authType;
4383 authFrameBody.authTransactionSeqNumber = SIR_MAC_AUTH_FRAME_1;
4384 authFrameBody.authStatusCode = 0;
4385 limLog(pMac, LOGW, FL("Retry Auth "));
4386 pMac->authAckStatus = LIM_AUTH_ACK_NOT_RCD;
4387 limSendAuthMgmtFrame(pMac,
4388 &authFrameBody,
4389 pMac->lim.gpLimMlmAuthReq->peerMacAddr,
4390 LIM_NO_WEP_IN_FC, psessionEntry, eSIR_TRUE);
4391 }
4392
4393 limDeactivateAndChangeTimer(pMac, eLIM_AUTH_RETRY_TIMER);
4394
4395 // Activate Auth Retry timer
4396 if (tx_timer_activate(&pMac->lim.limTimers.gLimPeriodicAuthRetryTimer)
4397 != TX_SUCCESS)
4398 {
4399 limLog(pMac, LOGE,
4400 FL("could not activate Auth Retry failure timer"));
4401 return;
4402 }
4403 }
4404 return;
4405} /*** limProcessAuthRetryTimer() ***/
4406
Jeff Johnson295189b2012-06-20 16:38:30 -07004407
4408/**
4409 * limProcessAuthFailureTimeout()
4410 *
4411 *FUNCTION:
4412 * This function is called to process Min Channel Timeout
4413 * during channel scan.
4414 *
4415 *LOGIC:
4416 *
4417 *ASSUMPTIONS:
4418 *
4419 *NOTE:
4420 *
4421 * @param pMac Pointer to Global MAC structure
4422 * @return None
4423 */
4424
4425static void
4426limProcessAuthFailureTimeout(tpAniSirGlobal pMac)
4427{
4428 //fetch the sessionEntry based on the sessionId
4429 tpPESession psessionEntry;
krunal soni8d13b092013-07-19 13:23:29 -07004430#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4431 vos_log_rssi_pkt_type *pRssiLog = NULL;
4432#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07004433 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimAuthFailureTimer.sessionId))== NULL)
4434 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004435 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004436 return;
4437 }
Abhishek Singhdcbd8272014-01-09 14:16:01 +05304438 limLog(pMac, LOGE, FL("received AUTH failure timeout in sessionid %d "
Sushant Kaushik1b645382014-10-13 16:39:36 +05304439 "limMlmstate %d limSmeState %d"), psessionEntry->peSessionId,
Abhishek Singhdcbd8272014-01-09 14:16:01 +05304440 psessionEntry->limMlmState, psessionEntry->limSmeState);
krunal soni8d13b092013-07-19 13:23:29 -07004441#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4442 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
4443 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
4444 if (pRssiLog)
4445 {
4446 pRssiLog->rssi = psessionEntry->rssi;
4447 }
4448 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
4449#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
4450
Jeff Johnson295189b2012-06-20 16:38:30 -07004451 switch (psessionEntry->limMlmState)
4452 {
4453 case eLIM_MLM_WT_AUTH_FRAME2_STATE:
4454 case eLIM_MLM_WT_AUTH_FRAME4_STATE:
4455 /**
4456 * Requesting STA did not receive next auth frame
4457 * before Auth Failure timeout.
4458 * Issue MLM auth confirm with timeout reason code
4459 */
Madan Mohan Koyyalamudi666d33a2012-11-29 11:32:59 -08004460 //Restore default failure timeout
4461 if (VOS_P2P_CLIENT_MODE == psessionEntry->pePersona && psessionEntry->defaultAuthFailureTimeout)
4462 {
4463 ccmCfgSetInt(pMac,WNI_CFG_AUTHENTICATE_FAILURE_TIMEOUT ,
4464 psessionEntry->defaultAuthFailureTimeout, NULL, eANI_BOOLEAN_FALSE);
4465 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004466 limRestoreFromAuthState(pMac,eSIR_SME_AUTH_TIMEOUT_RESULT_CODE,eSIR_MAC_UNSPEC_FAILURE_REASON,psessionEntry);
4467 break;
4468
4469 default:
4470 /**
4471 * Auth failure timer should not have timed out
4472 * in states other than wt_auth_frame2/4
4473 * Log error.
4474 */
Sushant Kaushik1b645382014-10-13 16:39:36 +05304475 PELOGE(limLog(pMac, LOGE, FL("received unexpected AUTH failure timeout in state %d"), psessionEntry->limMlmState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004476 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
4477
4478 break;
4479 }
Abhishek Singhbfb3c9e2016-07-22 11:25:43 +05304480 /* Reinit scan results to remove the unreachable BSS */
4481 limReInitScanResults(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07004482} /*** limProcessAuthFailureTimeout() ***/
4483
4484
4485
4486/**
4487 * limProcessAuthRspTimeout()
4488 *
4489 *FUNCTION:
4490 * This function is called to process Min Channel Timeout
4491 * during channel scan.
4492 *
4493 *LOGIC:
4494 *
4495 *ASSUMPTIONS:
4496 *
4497 *NOTE:
4498 *
4499 * @param pMac Pointer to Global MAC structure
4500 * @return None
4501 */
4502
4503static void
4504limProcessAuthRspTimeout(tpAniSirGlobal pMac, tANI_U32 authIndex)
4505{
4506 struct tLimPreAuthNode *pAuthNode;
4507 tpPESession psessionEntry;
4508 tANI_U8 sessionId;
4509
4510 pAuthNode = limGetPreAuthNodeFromIndex(pMac, &pMac->lim.gLimPreAuthTimerTable, authIndex);
4511
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304512 if (NULL == pAuthNode)
4513 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004514 limLog(pMac, LOGW, FL("Invalid auth node"));
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304515 return;
4516 }
4517
4518 if ((psessionEntry = peFindSessionByBssid(pMac, pAuthNode->peerMacAddr, &sessionId)) == NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -07004519 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004520 limLog(pMac, LOGW, FL("session does not exist for given BSSID "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004521 return;
4522 }
4523
4524 if (psessionEntry->limSystemRole == eLIM_AP_ROLE ||
4525 psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE)
4526 {
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304527 if (pAuthNode->mlmState != eLIM_MLM_WT_AUTH_FRAME3_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004528 {
4529 /**
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304530 * Authentication response timer timedout
4531 * in unexpected state. Log error
Jeff Johnson295189b2012-06-20 16:38:30 -07004532 */
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304533 PELOGE(limLog(pMac, LOGE,
Abhishek Singhcd09b562013-12-24 16:02:20 +05304534 FL("received AUTH rsp timeout in unexpected state "
4535 "for MAC address: "MAC_ADDRESS_STR),
4536 MAC_ADDR_ARRAY(pAuthNode->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004537 }
4538 else
4539 {
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304540 // Authentication response timer
4541 // timedout for an STA.
4542 pAuthNode->mlmState = eLIM_MLM_AUTH_RSP_TIMEOUT_STATE;
4543 pAuthNode->fTimerStarted = 0;
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304544 limLog(pMac, LOG1,
Abhishek Singhcd09b562013-12-24 16:02:20 +05304545 FL("AUTH rsp timedout for MAC address "MAC_ADDRESS_STR),
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304546 MAC_ADDR_ARRAY(pAuthNode->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004547
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304548 // Change timer to reactivate it in future
4549 limDeactivateAndChangePerStaIdTimer(pMac,
4550 eLIM_AUTH_RSP_TIMER,
4551 pAuthNode->authNodeIdx);
Jeff Johnson295189b2012-06-20 16:38:30 -07004552
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304553 limDeletePreAuthNode(pMac, pAuthNode->peerMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -07004554 }
4555 }
4556} /*** limProcessAuthRspTimeout() ***/
4557
4558
4559/**
4560 * limProcessAssocFailureTimeout()
4561 *
4562 *FUNCTION:
4563 * This function is called to process Min Channel Timeout
4564 * during channel scan.
4565 *
4566 *LOGIC:
4567 *
4568 *ASSUMPTIONS:
4569 *
4570 *NOTE:
4571 *
4572 * @param pMac Pointer to Global MAC structure
4573 * @return None
4574 */
4575
4576static void
4577limProcessAssocFailureTimeout(tpAniSirGlobal pMac, tANI_U32 MsgType)
4578{
4579
4580 tLimMlmAssocCnf mlmAssocCnf;
4581 tpPESession psessionEntry;
krunal soni8d13b092013-07-19 13:23:29 -07004582#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4583 vos_log_rssi_pkt_type *pRssiLog = NULL;
4584#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07004585
4586 //to fetch the lim/mlm state based on the sessionId, use the below sessionEntry
4587 tANI_U8 sessionId;
4588
4589 if(MsgType == LIM_ASSOC)
4590 {
4591 sessionId = pMac->lim.limTimers.gLimAssocFailureTimer.sessionId;
4592 }
4593 else
4594 {
4595 sessionId = pMac->lim.limTimers.gLimReassocFailureTimer.sessionId;
4596 }
4597
4598 if((psessionEntry = peFindSessionBySessionId(pMac, sessionId))== NULL)
4599 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004600 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004601 return;
4602 }
krunal soni8d13b092013-07-19 13:23:29 -07004603#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4604 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
4605 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
4606 if (pRssiLog)
4607 {
4608 pRssiLog->rssi = psessionEntry->rssi;
4609 }
4610 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
4611#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
4612
Jeff Johnson295189b2012-06-20 16:38:30 -07004613 /**
4614 * Expected Re/Association Response frame
4615 * not received within Re/Association Failure Timeout.
4616 */
4617
4618
4619
4620
Abhishek Singh70af9c72016-03-09 17:23:30 +05304621 /*
4622 * CR: vos packet memory is leaked when assoc rsp timeouted/failed.
4623 * notify TL that association is failed so that TL can flush the
4624 * cached frame
4625 */
Jeff Johnson295189b2012-06-20 16:38:30 -07004626 WLANTL_AssocFailed (psessionEntry->staId);
4627
Abhishek Singh70af9c72016-03-09 17:23:30 +05304628 /* Log error */
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304629 limLog(pMac, LOG1,
4630 FL("Re/Association Response not received before timeout "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004631
Abhishek Singh70af9c72016-03-09 17:23:30 +05304632 /*
4633 * Send Deauth to handle the scenareo where association timeout happened
4634 * when device has missed the assoc resp sent by peer.
4635 * By sending deauth try to clear the session created on peer device.
4636 */
4637 limLog(pMac, LOGE,
4638 FL("Sessionid: %d try sending Send deauth on channel %d to BSSID: "
4639 MAC_ADDRESS_STR ), psessionEntry->peSessionId,
4640 psessionEntry->currentOperChannel,
4641 MAC_ADDR_ARRAY(psessionEntry->bssId));
4642
4643 limSendDeauthMgmtFrame(pMac, eSIR_MAC_UNSPEC_FAILURE_REASON,
4644 psessionEntry->bssId,
4645 psessionEntry, FALSE);
4646
4647 if (((psessionEntry->limSystemRole == eLIM_AP_ROLE) ||
4648 (psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE) )||
4649 ((psessionEntry->limMlmState != eLIM_MLM_WT_ASSOC_RSP_STATE) &&
4650 (psessionEntry->limMlmState != eLIM_MLM_WT_REASSOC_RSP_STATE) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07004651 (psessionEntry->limMlmState != eLIM_MLM_WT_FT_REASSOC_RSP_STATE)))
4652 {
4653 /**
4654 * Re/Assoc failure timer should not have timedout on AP
4655 * or in a state other than wt_re/assoc_response.
4656 */
4657
4658 // Log error
4659 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304660 FL("received unexpected REASSOC failure timeout in state %d for role %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004661 psessionEntry->limMlmState, psessionEntry->limSystemRole);
4662 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
4663 }
4664 else
4665 {
4666
4667 if ((MsgType == LIM_ASSOC) ||
4668 ((MsgType == LIM_REASSOC) && (psessionEntry->limMlmState == eLIM_MLM_WT_FT_REASSOC_RSP_STATE)))
4669 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004670 PELOGE(limLog(pMac, LOGE, FL("(Re)Assoc Failure Timeout occurred."));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004671
4672 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07004673 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
4674
Jeff Johnson295189b2012-06-20 16:38:30 -07004675 // 'Change' timer for future activations
4676 limDeactivateAndChangeTimer(pMac, eLIM_ASSOC_FAIL_TIMER);
4677
4678 // Free up buffer allocated for JoinReq held by
4679 // MLM state machine
4680 if (psessionEntry->pLimMlmJoinReq)
4681 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304682 vos_mem_free(psessionEntry->pLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004683 psessionEntry->pLimMlmJoinReq = NULL;
4684 }
4685
Jeff Johnson295189b2012-06-20 16:38:30 -07004686 //To remove the preauth node in case of fail to associate
4687 if (limSearchPreAuthList(pMac, psessionEntry->bssId))
4688 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304689 limLog(pMac, LOG1, FL(" delete pre auth node for "
4690 MAC_ADDRESS_STR), MAC_ADDR_ARRAY(psessionEntry->bssId));
Jeff Johnson295189b2012-06-20 16:38:30 -07004691 limDeletePreAuthNode(pMac, psessionEntry->bssId);
4692 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004693
4694 mlmAssocCnf.resultCode =
4695 eSIR_SME_ASSOC_TIMEOUT_RESULT_CODE;
4696 mlmAssocCnf.protStatusCode =
4697 eSIR_MAC_UNSPEC_FAILURE_STATUS;
4698
4699 /* Update PE session Id*/
4700 mlmAssocCnf.sessionId = psessionEntry->peSessionId;
4701 if (MsgType == LIM_ASSOC)
4702 limPostSmeMessage(pMac, LIM_MLM_ASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
4703 else
4704 {
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004705 /* Will come here only in case of 11r, ESE, FT when reassoc rsp
Jeff Johnson295189b2012-06-20 16:38:30 -07004706 is not received and we receive a reassoc - timesout */
4707 mlmAssocCnf.resultCode = eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE;
4708 limPostSmeMessage(pMac, LIM_MLM_REASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
4709 }
4710 }
4711 else
4712 {
4713 /**
4714 * Restore pre-reassoc req state.
4715 * Set BSSID to currently associated AP address.
4716 */
4717 psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004718 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004719
4720 limRestorePreReassocState(pMac,
4721 eSIR_SME_REASSOC_TIMEOUT_RESULT_CODE, eSIR_MAC_UNSPEC_FAILURE_STATUS,psessionEntry);
4722 }
4723 }
Abhishek Singhbfb3c9e2016-07-22 11:25:43 +05304724 /* Reinit scan results to remove the unreachable BSS */
4725 limReInitScanResults(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07004726} /*** limProcessAssocFailureTimeout() ***/
4727
4728
4729
4730/**
4731 * limCompleteMlmScan()
4732 *
4733 *FUNCTION:
4734 * This function is called to send MLM_SCAN_CNF message
4735 * to SME state machine.
4736 *
4737 *LOGIC:
4738 *
4739 *ASSUMPTIONS:
4740 *
4741 *NOTE:
4742 *
4743 * @param pMac Pointer to Global MAC structure
4744 * @param retCode Result code to be sent
4745 * @return None
4746 */
4747
4748void
4749limCompleteMlmScan(tpAniSirGlobal pMac, tSirResultCodes retCode)
4750{
4751 tLimMlmScanCnf mlmScanCnf;
4752
4753 /// Restore previous MLM state
4754 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004755 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004756 limRestorePreScanState(pMac);
4757
4758 // Free up pMac->lim.gLimMlmScanReq
4759 if( NULL != pMac->lim.gpLimMlmScanReq )
4760 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304761 vos_mem_free(pMac->lim.gpLimMlmScanReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004762 pMac->lim.gpLimMlmScanReq = NULL;
4763 }
4764
4765 mlmScanCnf.resultCode = retCode;
4766 mlmScanCnf.scanResultLength = pMac->lim.gLimMlmScanResultLength;
4767
4768 limPostSmeMessage(pMac, LIM_MLM_SCAN_CNF, (tANI_U32 *) &mlmScanCnf);
4769
4770} /*** limCompleteMlmScan() ***/
4771
4772/**
4773 * \brief Setup an A-MPDU/BA session
4774 *
4775 * \sa limProcessMlmAddBAReq
4776 *
4777 * \param pMac The global tpAniSirGlobal object
4778 *
4779 * \param pMsgBuf The MLME ADDBA Req message buffer
4780 *
4781 * \return none
4782 */
4783void limProcessMlmAddBAReq( tpAniSirGlobal pMac,
4784 tANI_U32 *pMsgBuf )
4785{
4786tSirRetStatus status = eSIR_SUCCESS;
4787tpLimMlmAddBAReq pMlmAddBAReq;
4788tpLimMlmAddBACnf pMlmAddBACnf;
4789 tpPESession psessionEntry;
4790
4791 if(pMsgBuf == NULL)
4792 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004793 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004794 return;
4795 }
4796
4797 pMlmAddBAReq = (tpLimMlmAddBAReq) pMsgBuf;
4798 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmAddBAReq->sessionId))== NULL)
4799 {
4800 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004801 FL("session does not exist for given sessionId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304802 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004803 return;
4804 }
4805
4806
4807 // Send ADDBA Req over the air
4808 status = limSendAddBAReq( pMac, pMlmAddBAReq,psessionEntry);
4809
4810 //
4811 // Respond immediately to LIM, only if MLME has not been
4812 // successfully able to send WDA_ADDBA_REQ to HAL.
4813 // Else, LIM_MLM_ADDBA_CNF will be sent after receiving
4814 // ADDBA Rsp from peer entity
4815 //
4816 if( eSIR_SUCCESS != status )
4817 {
4818 // Allocate for LIM_MLM_ADDBA_CNF
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304819
4820 pMlmAddBACnf = vos_mem_malloc(sizeof( tLimMlmAddBACnf ));
4821 if ( NULL == pMlmAddBACnf )
Jeff Johnson295189b2012-06-20 16:38:30 -07004822 {
4823 limLog( pMac, LOGP,
Jeff Johnson0f4d0bc2013-11-03 17:48:50 -08004824 FL("AllocateMemory failed"));
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304825 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004826 return;
4827 }
4828 else
4829 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304830 vos_mem_set((void *) pMlmAddBACnf, sizeof( tLimMlmAddBACnf ), 0);
4831 vos_mem_copy((void *) pMlmAddBACnf->peerMacAddr,
4832 (void *) pMlmAddBAReq->peerMacAddr,
4833 sizeof( tSirMacAddr ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004834
4835 pMlmAddBACnf->baDialogToken = pMlmAddBAReq->baDialogToken;
4836 pMlmAddBACnf->baTID = pMlmAddBAReq->baTID;
4837 pMlmAddBACnf->baPolicy = pMlmAddBAReq->baPolicy;
4838 pMlmAddBACnf->baBufferSize = pMlmAddBAReq->baBufferSize;
4839 pMlmAddBACnf->baTimeout = pMlmAddBAReq->baTimeout;
4840 pMlmAddBACnf->sessionId = pMlmAddBAReq->sessionId;
4841
4842 // Update the result code
4843 pMlmAddBACnf->addBAResultCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
4844
4845 limPostSmeMessage( pMac,
4846 LIM_MLM_ADDBA_CNF,
4847 (tANI_U32 *) pMlmAddBACnf );
4848 }
4849
4850 // Restore MLME state
4851 psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004852 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004853
4854 }
4855
4856 // Free the buffer allocated for tLimMlmAddBAReq
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 Send an ADDBA Rsp to peer STA in response
4863 * to an ADDBA Req received earlier
4864 *
4865 * \sa limProcessMlmAddBARsp
4866 *
4867 * \param pMac The global tpAniSirGlobal object
4868 *
4869 * \param pMsgBuf The MLME ADDBA Rsp message buffer
4870 *
4871 * \return none
4872 */
4873void limProcessMlmAddBARsp( tpAniSirGlobal pMac,
4874 tANI_U32 *pMsgBuf )
4875{
4876tpLimMlmAddBARsp pMlmAddBARsp;
4877 tANI_U16 aid;
4878 tpDphHashNode pSta;
4879 tpPESession psessionEntry;
4880
4881
4882 if(pMsgBuf == NULL)
4883 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004884 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004885 return;
4886 }
4887
4888 pMlmAddBARsp = (tpLimMlmAddBARsp) pMsgBuf;
4889
4890 if(( psessionEntry = peFindSessionBySessionId(pMac,pMlmAddBARsp->sessionId))== NULL)
4891 {
4892 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004893 FL("session does not exist for given session ID"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304894 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004895 return;
4896 }
4897
4898
4899 // Send ADDBA Rsp over the air
4900 if( eSIR_SUCCESS != limSendAddBARsp( pMac,pMlmAddBARsp,psessionEntry))
4901 {
4902 limLog( pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004903 FL("Failed to send ADDBA Rsp to peer "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004904 limPrintMacAddr( pMac, pMlmAddBARsp->peerMacAddr, LOGE );
4905 /* Clean the BA context maintained by HAL and TL on failure */
4906 pSta = dphLookupHashEntry( pMac, pMlmAddBARsp->peerMacAddr, &aid,
4907 &psessionEntry->dph.dphHashTable);
4908 if( NULL != pSta )
4909 {
4910 limPostMsgDelBAInd( pMac, pSta, pMlmAddBARsp->baTID, eBA_RECIPIENT,
4911 psessionEntry);
4912 }
4913 }
4914
4915 // Time to post a WDA_DELBA_IND to HAL in order
4916 // to cleanup the HAL and SoftMAC entries
4917
4918
4919 // Free the buffer allocated for tLimMlmAddBARsp
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304920 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004921
4922}
4923
4924/**
4925 * \brief Setup an A-MPDU/BA session
4926 *
4927 * \sa limProcessMlmDelBAReq
4928 *
4929 * \param pMac The global tpAniSirGlobal object
4930 *
4931 * \param pMsgBuf The MLME DELBA Req message buffer
4932 *
4933 * \return none
4934 */
4935void limProcessMlmDelBAReq( tpAniSirGlobal pMac,
4936 tANI_U32 *pMsgBuf )
4937{
4938 tSirRetStatus status = eSIR_SUCCESS;
4939 tpLimMlmDelBAReq pMlmDelBAReq;
4940 tpLimMlmDelBACnf pMlmDelBACnf;
4941 tpPESession psessionEntry;
4942
4943
4944 if(pMsgBuf == NULL)
4945 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004946 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004947 return;
4948 }
4949
4950 // TODO - Need to validate MLME state
4951 pMlmDelBAReq = (tpLimMlmDelBAReq) pMsgBuf;
4952
4953 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDelBAReq->sessionId))== NULL)
4954 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004955 PELOGE(limLog(pMac, LOGE,FL("session does not exist for given bssId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304956 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004957 return;
4958 }
4959
4960 // Send DELBA Ind over the air
4961 if( eSIR_SUCCESS !=
4962 (status = limSendDelBAInd( pMac, pMlmDelBAReq,psessionEntry)))
4963 status = eSIR_SME_HAL_SEND_MESSAGE_FAIL;
4964 else
4965 {
4966 tANI_U16 aid;
4967 tpDphHashNode pSta;
4968
4969 // Time to post a WDA_DELBA_IND to HAL in order
4970 // to cleanup the HAL and SoftMAC entries
4971 pSta = dphLookupHashEntry( pMac, pMlmDelBAReq->peerMacAddr, &aid , &psessionEntry->dph.dphHashTable);
4972 if( NULL != pSta )
4973 {
4974 status = limPostMsgDelBAInd( pMac,
4975 pSta,
4976 pMlmDelBAReq->baTID,
4977 pMlmDelBAReq->baDirection,psessionEntry);
4978
4979 }
4980 }
4981
4982 //
4983 // Respond immediately to SME with DELBA CNF using
4984 // LIM_MLM_DELBA_CNF with appropriate status
4985 //
4986
4987 // Allocate for LIM_MLM_DELBA_CNF
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304988
4989 pMlmDelBACnf = vos_mem_malloc(sizeof( tLimMlmDelBACnf ));
4990 if ( NULL == pMlmDelBACnf )
Jeff Johnson295189b2012-06-20 16:38:30 -07004991 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304992 limLog( pMac, LOGP, FL("AllocateMemory failed"));
4993 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004994 return;
4995 }
4996 else
4997 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304998 vos_mem_set((void *) pMlmDelBACnf, sizeof( tLimMlmDelBACnf ), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07004999
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05305000 vos_mem_copy((void *) pMlmDelBACnf,
5001 (void *) pMlmDelBAReq,
5002 sizeof( tLimMlmDelBAReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -07005003
5004 // Update DELBA result code
5005 pMlmDelBACnf->delBAReasonCode = pMlmDelBAReq->delBAReasonCode;
5006
5007 /* Update PE session Id*/
5008 pMlmDelBACnf->sessionId = pMlmDelBAReq->sessionId;
5009
5010 limPostSmeMessage( pMac,
5011 LIM_MLM_DELBA_CNF,
5012 (tANI_U32 *) pMlmDelBACnf );
5013 }
5014
5015 // Free the buffer allocated for tLimMlmDelBAReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05305016 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07005017
5018}
5019
5020/**
5021 * @function : limSMPowerSaveStateInd( )
5022 *
5023 * @brief : This function is called upon receiving the PMC Indication to update the STA's MimoPs State.
5024 *
5025 * LOGIC:
5026 *
5027 * ASSUMPTIONS:
5028 * NA
5029 *
5030 * NOTE:
5031 * NA
5032 *
5033 * @param pMac - Pointer to Global MAC structure
5034 * @param limMsg - Lim Message structure object with the MimoPSparam in body
5035 * @return None
5036 */
5037
5038tSirRetStatus
5039limSMPowerSaveStateInd(tpAniSirGlobal pMac, tSirMacHTMIMOPowerSaveState state)
5040{
5041#if 0
5042 tSirRetStatus retStatus = eSIR_SUCCESS;
5043#if 0
5044 tANI_U32 cfgVal1;
5045 tANI_U16 cfgVal2;
5046 tSirMacHTCapabilityInfo *pHTCapabilityInfo;
5047 tpDphHashNode pSta = NULL;
5048
5049 tpPESession psessionEntry = &pMac->lim.gpSession[0]; //TBD-RAJESH HOW TO GET sessionEntry?????
5050 /** Verify the Mode of operation */
5051 if (pMac->lim.gLimSystemRole != eSYSTEM_STA_ROLE) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005052 PELOGE(limLog(pMac, LOGE, FL("Got PMC indication when System not in the STA Role"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07005053 return eSIR_FAILURE;
5054 }
5055
5056 if ((pMac->lim.gHTMIMOPSState == state) || (state == eSIR_HT_MIMO_PS_NA )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005057 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 -07005058 return eSIR_FAILURE;
5059 }
5060
5061 if (!pMac->lim.htCapability){
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005062 PELOGW(limLog(pMac, LOGW, FL(" Not in 11n or HT capable mode"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07005063 return eSIR_FAILURE;
5064 }
5065
5066 /** Update the CFG about the default MimoPS State */
5067 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &cfgVal1) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005068 limLog(pMac, LOGP, FL("could not retrieve HT Cap CFG "));
Jeff Johnson295189b2012-06-20 16:38:30 -07005069 return eSIR_FAILURE;
5070 }
5071
5072 cfgVal2 = (tANI_U16)cfgVal1;
5073 pHTCapabilityInfo = (tSirMacHTCapabilityInfo *) &cfgVal2;
5074 pHTCapabilityInfo->mimoPowerSave = state;
5075
5076 if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005077 limLog(pMac, LOGP, FL("could not update HT Cap Info CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005078 return eSIR_FAILURE;
5079 }
5080
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005081 PELOG2(limLog(pMac, LOG2, FL(" The HT Capability for Mimo Pwr is updated to State: %u "),state);)
Jeff Johnson295189b2012-06-20 16:38:30 -07005082 if (pMac->lim.gLimSmeState != eLIM_SME_LINK_EST_STATE) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005083 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 -07005084 /** Update in the LIM the MIMO PS state of the SELF */
5085 pMac->lim.gHTMIMOPSState = state;
5086 return eSIR_SUCCESS;
5087 }
5088
5089 pSta = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable);
5090 if (!pSta->mlmStaContext.htCapability) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005091 limLog( pMac, LOGE,FL( "limSendSMPowerState: Peer is not HT Capable " ));
Jeff Johnson295189b2012-06-20 16:38:30 -07005092 return eSIR_FAILURE;
5093 }
5094
5095 if (isEnteringMimoPS(pMac->lim.gHTMIMOPSState, state)) {
5096 tSirMacAddr macAddr;
5097 /** Obtain the AP's Mac Address */
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05305098 vos_mem_copy((tANI_U8 *)macAddr, psessionEntry->bssId, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005099 /** Send Action Frame with the corresponding mode */
5100 retStatus = limSendSMPowerStateFrame(pMac, macAddr, state);
5101 if (retStatus != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005102 PELOGE(limLog(pMac, LOGE, "Update SM POWER: Sending Action Frame has failed");)
Jeff Johnson295189b2012-06-20 16:38:30 -07005103 return retStatus;
5104 }
5105 }
5106
5107 /** Update MlmState about the SetMimoPS State */
5108 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
5109 pMac->lim.gLimMlmState = eLIM_MLM_WT_SET_MIMOPS_STATE;
5110 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
5111
5112 /** Update the HAL and s/w mac about the mode to be set */
5113 retStatus = limPostSMStateUpdate( pMac,psessionEntry->staId, state);
5114
5115 PELOG2(limLog(pMac, LOG2, " Updated the New SMPS State");)
5116 /** Update in the LIM the MIMO PS state of the SELF */
5117 pMac->lim.gHTMIMOPSState = state;
5118#endif
5119 return retStatus;
5120#endif
5121return eSIR_SUCCESS;
5122}
5123
Jeff Johnsone7245742012-09-05 17:12:55 -07005124#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005125ePhyChanBondState limGet11ACPhyCBState(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 htSecondaryChannelOffset,tANI_U8 peerCenterChan, tpPESession psessionEntry)
Jeff Johnsone7245742012-09-05 17:12:55 -07005126{
5127 ePhyChanBondState cbState = PHY_SINGLE_CHANNEL_CENTERED;
5128
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005129 if(!psessionEntry->apChanWidth)
Jeff Johnsone7245742012-09-05 17:12:55 -07005130 {
5131 return htSecondaryChannelOffset;
5132 }
5133
5134 if ( (htSecondaryChannelOffset
5135 == PHY_DOUBLE_CHANNEL_LOW_PRIMARY)
5136 )
5137 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005138 if ((channel + 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005139 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005140 else if ((channel + 6 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005141 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005142 else if ((channel - 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005143 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
5144 else
5145 limLog (pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005146 FL("Invalid Channel Number = %d Center Chan = %d "),
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005147 channel, peerCenterChan);
Jeff Johnsone7245742012-09-05 17:12:55 -07005148 }
5149 if ( (htSecondaryChannelOffset
5150 == PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
5151 )
5152 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005153 if ((channel - 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005154 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005155 else if ((channel + 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005156 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005157 else if ((channel - 6 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005158 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
5159 else
5160 limLog (pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005161 FL("Invalid Channel Number = %d Center Chan = %d "),
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005162 channel, peerCenterChan);
Jeff Johnsone7245742012-09-05 17:12:55 -07005163 }
5164 return cbState;
5165}
5166
5167#endif
5168
Jeff Johnson295189b2012-06-20 16:38:30 -07005169void
Jeff Johnsone7245742012-09-05 17:12:55 -07005170limSetChannel(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 secChannelOffset, tPowerdBm maxTxPower, tANI_U8 peSessionId)
Jeff Johnson295189b2012-06-20 16:38:30 -07005171{
5172#if !defined WLAN_FEATURE_VOWIFI
5173 tANI_U32 localPwrConstraint;
5174#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07005175 tpPESession peSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07005176
Jeff Johnsone7245742012-09-05 17:12:55 -07005177 peSession = peFindSessionBySessionId (pMac, peSessionId);
5178
5179 if ( NULL == peSession)
5180 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005181 limLog (pMac, LOGP, FL("Invalid PE session = %d"), peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07005182 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07005183 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005184#if defined WLAN_FEATURE_VOWIFI
Jeff Johnsone7245742012-09-05 17:12:55 -07005185#ifdef WLAN_FEATURE_11AC
5186 if ( peSession->vhtCapability )
5187 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005188 limSendSwitchChnlParams( pMac, channel, limGet11ACPhyCBState( pMac,channel,secChannelOffset,peSession->apCenterChan, peSession), maxTxPower, peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07005189 }
5190 else
5191#endif
5192 {
5193 limSendSwitchChnlParams( pMac, channel, secChannelOffset, maxTxPower, peSessionId);
5194 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005195#else
5196 if (wlan_cfgGetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, &localPwrConstraint) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005197 limLog(pMac, LOGP, FL("could not read WNI_CFG_LOCAL_POWER_CONSTRAINT from CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005198 return;
5199 }
5200 // Send WDA_CHNL_SWITCH_IND to HAL
Jeff Johnsone7245742012-09-05 17:12:55 -07005201#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005202 if ( peSession->vhtCapability && peSession->vhtCapabilityPresentInBeacon)
Jeff Johnsone7245742012-09-05 17:12:55 -07005203 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005204 limSendSwitchChnlParams( pMac, channel, limGet11ACPhyCBState( pMac,channel,secChannelOffset,peSession->apCenterChan, peSession), maxTxPower, peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07005205 }
5206 else
Jeff Johnson295189b2012-06-20 16:38:30 -07005207#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07005208 {
5209 limSendSwitchChnlParams( pMac, channel, secChannelOffset, (tPowerdBm)localPwrConstraint, peSessionId);
5210 }
5211#endif
5212
Jeff Johnson295189b2012-06-20 16:38:30 -07005213 }