blob: 6af70367d08213ca1d7ec125ef07647a9f332bb6 [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;
Abhishek Singh550aa8c2017-10-30 17:34:53 +0530179 case SIR_LIM_SAP_ECSA_TIMEOUT: lim_process_ap_ecsa_timeout(pMac);break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700180 case LIM_MLM_ADDBA_REQ: limProcessMlmAddBAReq( pMac, Msg->bodyptr ); break;
181 case LIM_MLM_ADDBA_RSP: limProcessMlmAddBARsp( pMac, Msg->bodyptr ); break;
182 case LIM_MLM_DELBA_REQ: limProcessMlmDelBAReq( pMac, Msg->bodyptr ); break;
183 case LIM_MLM_TSPEC_REQ:
184 default:
185 break;
186 } // switch (msgType)
187} /*** end limProcessMlmReqMessages() ***/
188
189
190/**
191 * limSetScanMode()
192 *
193 *FUNCTION:
194 * This function is called to setup system into Scan mode
195 *
196 *LOGIC:
197 * NA
198 *
199 *ASSUMPTIONS:
200 * NA
201 *
202 *NOTE:
203 *
204 * @param pMac - Pointer to Global MAC structure
205 * @return None
206 */
207
208void
209limSetScanMode(tpAniSirGlobal pMac)
210{
211 tSirLinkTrafficCheck checkTraffic;
212
213 /// Set current scan channel id to the first in the channel list
214 pMac->lim.gLimCurrentScanChannelId = 0;
215
Jeff Johnson62c27982013-02-27 17:53:55 -0800216 if ( IS_MLM_SCAN_REQ_BACKGROUND_SCAN_AGGRESSIVE(pMac) )
217 {
218 checkTraffic = eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN;
219 }
220 else if (IS_MLM_SCAN_REQ_BACKGROUND_SCAN_NORMAL(pMac))
221 {
222 checkTraffic = eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN;
223 }
224 else
225 checkTraffic = eSIR_CHECK_ROAMING_SCAN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700226
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530227 limLog(pMac, LOG1, FL("Calling limSendHalInitScanReq"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700228 limSendHalInitScanReq(pMac, eLIM_HAL_INIT_SCAN_WAIT_STATE, checkTraffic);
229
230 return ;
231} /*** end limSetScanMode() ***/
232
233//WLAN_SUSPEND_LINK Related
234
235/* limIsLinkSuspended()
236 *
237 *FUNCTION:
238 * This function returns is link is suspended or not.
239 *
240 *LOGIC:
Jeff Johnson62c27982013-02-27 17:53:55 -0800241 * Since Suspend link uses init scan, it just returns
242 * gLimSystemInScanLearnMode flag.
Jeff Johnson295189b2012-06-20 16:38:30 -0700243 *
244 *ASSUMPTIONS:
245 * NA
246 *
247 *NOTE:
248 *
249 * @param pMac - Pointer to Global MAC structure
250 * @return None
251 */
252tANI_U8
253limIsLinkSuspended(tpAniSirGlobal pMac)
254{
255 return pMac->lim.gLimSystemInScanLearnMode;
256}
257/**
258 * limSuspendLink()
259 *
260 *FUNCTION:
261 * This function is called to suspend traffic. Internally this function uses WDA_INIT_SCAN_REQ.
262 *
263 *LOGIC:
264 * NA
265 *
266 *ASSUMPTIONS:
267 * NA
268 *
269 *NOTE:
270 *
271 * @param pMac - Pointer to Global MAC structure
Jeff Johnson62c27982013-02-27 17:53:55 -0800272 * @param trafficCheck - Takes value from enum tSirLinkTrafficCheck.
Jeff Johnson295189b2012-06-20 16:38:30 -0700273 * @param callback - Callback function to be called after suspending the link.
274 * @param data - Pointer to any buffer that will be passed to callback.
275 * @return None
276 */
277void
278limSuspendLink(tpAniSirGlobal pMac, tSirLinkTrafficCheck trafficCheck, SUSPEND_RESUME_LINK_CALLBACK callback, tANI_U32 *data)
279{
280 if( NULL == callback )
281 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700282 limLog( pMac, LOGE, "%s:%d: Invalid parameters", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700283 return;
284 }
285
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +0530286 if( pMac->lim.gpLimSuspendCallback ||
287 pMac->lim.gLimSystemInScanLearnMode )
Jeff Johnson295189b2012-06-20 16:38:30 -0700288 {
Jeff Johnson0fe596e2017-09-19 08:36:48 -0700289 limLog( pMac, LOGE, FL("Something is wrong, SuspendLinkCbk:%pK "
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +0530290 "IsSystemInScanLearnMode:%d"), pMac->lim.gpLimSuspendCallback,
291 pMac->lim.gLimSystemInScanLearnMode );
Jeff Johnson295189b2012-06-20 16:38:30 -0700292 callback( pMac, eHAL_STATUS_FAILURE, data );
293 return;
294 }
295
296 pMac->lim.gLimSystemInScanLearnMode = 1;
297 pMac->lim.gpLimSuspendCallback = callback;
298 pMac->lim.gpLimSuspendData = data;
299 limSendHalInitScanReq(pMac, eLIM_HAL_SUSPEND_LINK_WAIT_STATE, trafficCheck );
Madan Mohan Koyyalamudi01cba042013-01-10 21:56:05 -0800300
301 WDA_TrafficStatsTimerActivate(FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700302}
303
304/**
305 * limResumeLink()
306 *
307 *FUNCTION:
308 * This function is called to Resume traffic after a suspend. Internally this function uses WDA_FINISH_SCAN_REQ.
309 *
310 *LOGIC:
311 * NA
312 *
313 *ASSUMPTIONS:
314 * NA
315 *
316 *NOTE:
317 *
318 * @param pMac - Pointer to Global MAC structure
319 * @param callback - Callback function to be called after Resuming the link.
320 * @param data - Pointer to any buffer that will be passed to callback.
321 * @return None
322 */
323void
324limResumeLink(tpAniSirGlobal pMac, SUSPEND_RESUME_LINK_CALLBACK callback, tANI_U32 *data)
325{
326 if( NULL == callback )
327 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700328 limLog( pMac, LOGE, "%s:%d: Invalid parameters", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700329 return;
330 }
331
332 if( pMac->lim.gpLimResumeCallback )
333 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700334 limLog( pMac, LOGE, "%s:%d: gLimResumeLink callback is not NULL...something is wrong", __func__, __LINE__ );
Jeff Johnson295189b2012-06-20 16:38:30 -0700335 callback( pMac, eHAL_STATUS_FAILURE, data );
336 return;
337 }
338
339 pMac->lim.gpLimResumeCallback = callback;
340 pMac->lim.gpLimResumeData = data;
Abhishek Singh53bfb332013-12-12 18:03:29 +0530341
342 /* eLIM_HAL_IDLE_SCAN_STATE state indicate limSendHalInitScanReq failed.
343 * In case limSendHalInitScanReq is success, Scanstate would be
344 * eLIM_HAL_SUSPEND_LINK_STATE
345 */
346 if( eLIM_HAL_IDLE_SCAN_STATE != pMac->lim.gLimHalScanState )
347 {
348 limSendHalFinishScanReq(pMac, eLIM_HAL_RESUME_LINK_WAIT_STATE );
349 }
350 else
351 {
352 limLog(pMac, LOGW, FL("Init Scan failed, we will not call finish scan."
353 " calling the callback with failure status"));
354 pMac->lim.gpLimResumeCallback( pMac, eSIR_FAILURE, pMac->lim.gpLimResumeData);
355 pMac->lim.gpLimResumeCallback = NULL;
356 pMac->lim.gpLimResumeData = NULL;
357 pMac->lim.gLimSystemInScanLearnMode = 0;
358 }
Madan Mohan Koyyalamudi01cba042013-01-10 21:56:05 -0800359
360 if(limIsInMCC(pMac))
361 {
362 WDA_TrafficStatsTimerActivate(TRUE);
363 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700364}
365//end WLAN_SUSPEND_LINK Related
366
367
368/**
369 *
370 * limChangeChannelWithCallback()
371 *
372 * FUNCTION:
373 * This function is called to change channel and perform off channel operation
374 * if required. The caller registers a callback to be called at the end of the
Jeff Johnson62c27982013-02-27 17:53:55 -0800375 * channel change.
Jeff Johnson295189b2012-06-20 16:38:30 -0700376 *
377 */
378void
379limChangeChannelWithCallback(tpAniSirGlobal pMac, tANI_U8 newChannel,
380 CHANGE_CHANNEL_CALLBACK callback,
381 tANI_U32 *cbdata, tpPESession psessionEntry)
382{
383 // Sanity checks for the current and new channel
384#if defined WLAN_VOWIFI_DEBUG
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700385 PELOGE(limLog( pMac, LOGE, "Switching channel to %d", newChannel);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700386#endif
387 psessionEntry->channelChangeReasonCode=LIM_SWITCH_CHANNEL_OPERATION;
388
389 pMac->lim.gpchangeChannelCallback = callback;
390 pMac->lim.gpchangeChannelData = cbdata;
391
392 limSendSwitchChnlParams(pMac, newChannel,
Jeff Johnsone7245742012-09-05 17:12:55 -0700393 PHY_SINGLE_CHANNEL_CENTERED,
Jeff Johnson295189b2012-06-20 16:38:30 -0700394 psessionEntry->maxTxPower, psessionEntry->peSessionId);
395
396 return;
397}
398
399
400/**
401 * limContinuePostChannelScan()
402 *
403 *FUNCTION:
404 * This function is called to scan the current channel.
405 *
406 *LOGIC:
407 *
408 *ASSUMPTIONS:
409 * NA
410 *
411 *NOTE:
412 * NA
413 *
414 * @param pMac - Pointer to Global MAC structure
415 *
416 * @return None
417 */
418
419void limContinuePostChannelScan(tpAniSirGlobal pMac)
420{
421 tANI_U8 channelNum;
Jeff Johnson295189b2012-06-20 16:38:30 -0700422 tANI_U8 i = 0;
423 tSirRetStatus status = eSIR_SUCCESS;
Abhishek Singh95f7b252015-10-14 14:15:35 +0530424
Jeff Johnson295189b2012-06-20 16:38:30 -0700425 if( pMac->lim.abortScan || (NULL == pMac->lim.gpLimMlmScanReq ) ||
426 (pMac->lim.gLimCurrentScanChannelId >
427 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1)))
428 {
429 pMac->lim.abortScan = 0;
430 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
431 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
432 //Set the resume channel to Any valid channel (invalid).
433 //This will instruct HAL to set it to any previous valid channel.
434 peSetResumeChannel(pMac, 0, 0);
435
436 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
437 return;
438 }
439
440 channelNum = limGetCurrentScanChannel(pMac);
Agarwal Ashish7fed3812014-04-14 15:17:31 +0530441
442 if (channelNum == limGetCurrentOperatingChannel(pMac) &&
443 limIsconnectedOnDFSChannel(channelNum))
444 {
445 limCovertChannelScanType(pMac, channelNum, true);
446 }
447
Jeff Johnson295189b2012-06-20 16:38:30 -0700448 if ((pMac->lim.gpLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN) &&
449 (limActiveScanAllowed(pMac, channelNum)))
450 {
451 TX_TIMER *periodicScanTimer;
Jeff Johnson295189b2012-06-20 16:38:30 -0700452
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -0800453 pMac->lim.probeCounter++;
Abhishek Singh795e1b82015-09-25 15:35:03 +0530454 /* Prepare and send Probe Request frame for all
455 * the SSIDs present in the saved MLM
456 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700457 do
458 {
Siddharth Bhal4f3187c2014-10-09 21:38:08 +0530459 tSirMacAddr gSelfMacAddr;
Abhishek Singh795e1b82015-09-25 15:35:03 +0530460
461 /* Send self MAC as src address if
462 * MAC spoof is not enabled OR
463 * spoofMacAddr is all 0 OR
464 * disableP2PMacSpoof is enabled and scan is P2P scan
465 * else use the spoofMac as src address
466 */
467 if ((pMac->lim.isSpoofingEnabled != TRUE) ||
468 (TRUE ==
469 vos_is_macaddr_zero((v_MACADDR_t *)&pMac->lim.spoofMacAddr)) ||
470 (pMac->roam.configParam.disableP2PMacSpoofing &&
471 pMac->lim.gpLimMlmScanReq->p2pSearch)) {
Siddharth Bhal4f3187c2014-10-09 21:38:08 +0530472 vos_mem_copy(gSelfMacAddr, pMac->lim.gSelfMacAddr, VOS_MAC_ADDRESS_LEN);
473 } else {
474 vos_mem_copy(gSelfMacAddr, pMac->lim.spoofMacAddr, VOS_MAC_ADDRESS_LEN);
475 }
Abhishek Singh525045c2014-12-15 17:18:45 +0530476 limLog(pMac, LOG1,
Agarwal Ashishfb3b1c82015-08-18 16:57:31 +0530477 FL(" Mac Addr "MAC_ADDRESS_STR " used in sending ProbeReq number %d, for SSID %s on channel: %d"),
478 MAC_ADDR_ARRAY(gSelfMacAddr) ,i, pMac->lim.gpLimMlmScanReq->ssId[i].ssId, channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -0700479 // include additional IE if there is
480 status = limSendProbeReqMgmtFrame( pMac, &pMac->lim.gpLimMlmScanReq->ssId[i],
Siddharth Bhal4f3187c2014-10-09 21:38:08 +0530481 pMac->lim.gpLimMlmScanReq->bssId, channelNum, gSelfMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -0700482 pMac->lim.gpLimMlmScanReq->dot11mode,
483 pMac->lim.gpLimMlmScanReq->uIEFieldLen,
484 (tANI_U8 *)(pMac->lim.gpLimMlmScanReq)+pMac->lim.gpLimMlmScanReq->uIEFieldOffset);
485
486 if ( status != eSIR_SUCCESS)
487 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700488 PELOGE(limLog(pMac, LOGE, FL("send ProbeReq failed for SSID %s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700489 pMac->lim.gpLimMlmScanReq->ssId[i].ssId, channelNum);)
490 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
491 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
492 return;
493 }
494 i++;
495 } while (i < pMac->lim.gpLimMlmScanReq->numSsid);
496
497 {
498#if defined WLAN_FEATURE_VOWIFI
499 //If minChannelTime is set to zero, SME is requesting scan to not use min channel timer.
500 //This is used in 11k to request for beacon measurement request with a fixed duration in
501 //max channel time.
502 if( pMac->lim.gpLimMlmScanReq->minChannelTime != 0 )
503 {
504#endif
505 /// TXP has sent Probe Request
506 /// Activate minChannelTimer
507 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
508
509#ifdef GEN6_TODO
Abhishek Singh95f7b252015-10-14 14:15:35 +0530510 /* revisit this piece of code to assign the appropriate sessionId
511 * below priority - LOW/might not be needed
512 */
Jeff Johnson295189b2012-06-20 16:38:30 -0700513 pMac->lim.limTimers.gLimMinChannelTimer.sessionId = sessionId;
Abhishek Singh95f7b252015-10-14 14:15:35 +0530514#endif
515 if (tx_timer_activate(&pMac->lim.limTimers.gLimMinChannelTimer) !=
516 TX_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700517 {
Abhishek Singh95f7b252015-10-14 14:15:35 +0530518 limLog(pMac, LOGE, FL("could not start min channel timer"));
519 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
520 limSendHalEndScanReq(pMac, channelNum,
521 eLIM_HAL_END_SCAN_WAIT_STATE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700522 return;
523 }
524
525 // Initialize max timer too
526 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
527#if defined WLAN_FEATURE_VOWIFI
528 }
529 else
530 {
531#if defined WLAN_VOWIFI_DEBUG
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700532 PELOGE(limLog( pMac, LOGE, "Min channel time == 0, Use only max chan timer" );)
Jeff Johnson295189b2012-06-20 16:38:30 -0700533#endif
534 //No Need to start Min channel timer. Start Max Channel timer.
535 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
536 if (tx_timer_activate(&pMac->lim.limTimers.gLimMaxChannelTimer)
537 == TX_TIMER_ERROR)
538 {
539 /// Could not activate max channel timer.
540 // Log error
Abhishek Singh95f7b252015-10-14 14:15:35 +0530541 limLog(pMac,LOGE, FL("could not start max channel timer"));
542 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
543 limSendHalEndScanReq(pMac,
544 channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
545 return;
Jeff Johnson295189b2012-06-20 16:38:30 -0700546 }
547
548 }
549#endif
550 }
551 /* Start peridic timer which will trigger probe req based on min/max
552 channel timer */
553 periodicScanTimer = &pMac->lim.limTimers.gLimPeriodicProbeReqTimer;
Sachin Ahuja49dedd72014-11-24 16:35:24 +0530554 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
Jeff Johnson295189b2012-06-20 16:38:30 -0700555 if (tx_timer_activate(periodicScanTimer) != TX_SUCCESS)
556 {
Abhishek Singh95f7b252015-10-14 14:15:35 +0530557 limLog(pMac, LOGE, FL("could not start periodic probe req "
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700558 "timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700559 }
560 periodicScanTimer->sessionId = channelNum;
561 }
562 else
563 {
564 tANI_U32 val;
Abhishek Singh525045c2014-12-15 17:18:45 +0530565 limLog(pMac, LOG1, FL("START PASSIVE Scan chan %d"), channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -0700566
567 /// Passive Scanning. Activate maxChannelTimer
Jeff Johnson295189b2012-06-20 16:38:30 -0700568 if (tx_timer_deactivate(&pMac->lim.limTimers.gLimMaxChannelTimer)
569 != TX_SUCCESS)
570 {
571 // Could not deactivate max channel timer.
572 // Log error
Abhishek Singh95f7b252015-10-14 14:15:35 +0530573 limLog(pMac, LOGE, FL("Unable to deactivate max channel timer"));
574 limSendHalEndScanReq(pMac, channelNum,
575 eLIM_HAL_END_SCAN_WAIT_STATE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700576 }
577 else
578 {
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530579 if (pMac->miracast_mode)
580 {
581 val = DEFAULT_MIN_CHAN_TIME_DURING_MIRACAST +
582 DEFAULT_MAX_CHAN_TIME_DURING_MIRACAST;
583 }
584 else if (wlan_cfgGetInt(pMac, WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME,
Jeff Johnson295189b2012-06-20 16:38:30 -0700585 &val) != eSIR_SUCCESS)
586 {
587 /**
588 * Could not get max channel value
589 * from CFG. Log error.
590 */
Abhishek Singh95f7b252015-10-14 14:15:35 +0530591 limLog(pMac, LOGE,
592 FL("could not retrieve passive max chan value, Use Def val"));
593 val= WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME_STADEF;
Jeff Johnson295189b2012-06-20 16:38:30 -0700594 }
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530595
596 val = SYS_MS_TO_TICKS(val);
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530597 if (tx_timer_change(&pMac->lim.limTimers.gLimMaxChannelTimer,
598 val, 0) != TX_SUCCESS)
599 {
600 // Could not change max channel timer.
601 // Log error
Abhishek Singh95f7b252015-10-14 14:15:35 +0530602 limLog(pMac, LOGE, FL("Unable to change max channel timer"));
603 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
604 limSendHalEndScanReq(pMac, channelNum,
605 eLIM_HAL_END_SCAN_WAIT_STATE);
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530606 return;
607 }
Abhishek Singh95f7b252015-10-14 14:15:35 +0530608 else if (tx_timer_activate(&pMac->lim.limTimers.gLimMaxChannelTimer)
609 != TX_SUCCESS)
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530610 {
Abhishek Singh95f7b252015-10-14 14:15:35 +0530611
612 limLog(pMac, LOGE, FL("could not start max channel timer"));
613 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
614 limSendHalEndScanReq(pMac, channelNum,
615 eLIM_HAL_END_SCAN_WAIT_STATE);
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +0530616 return;
Jeff Johnson295189b2012-06-20 16:38:30 -0700617 }
618 }
619 // Wait for Beacons to arrive
620 } // if (pMac->lim.gLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN)
621
Abhishek Singh95f7b252015-10-14 14:15:35 +0530622 limAddScanChannelInfo(pMac, channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -0700623 return;
624}
625
626
627
628
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530629
630/* limCovertChannelScanType()
631 *
632 *FUNCTION:
633 * This function is called to get the list, change the channel type and set again.
634 *
635 *LOGIC:
636 *
637 *ASSUMPTIONS:
638 * NA
639 *
640 *NOTE: If a channel is ACTIVE, this function will make it as PASSIVE
641 * If a channel is PASSIVE, this fucntion will make it as ACTIVE
642 * NA
643 *
644 * @param pMac - Pointer to Global MAC structure
645 * channelNum - Channel which need to be convert
646 PassiveToActive - Boolean flag to convert channel
647 *
648 * @return None
649 */
650
651
652void limCovertChannelScanType(tpAniSirGlobal pMac,tANI_U8 channelNum, tANI_BOOLEAN passiveToActive)
653{
654
655 tANI_U32 i;
656 tANI_U8 channelPair[WNI_CFG_SCAN_CONTROL_LIST_LEN];
657 tANI_U32 len = WNI_CFG_SCAN_CONTROL_LIST_LEN;
Hanumantha Reddy Pothula97ea0952015-10-09 11:29:39 +0530658
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530659 if (wlan_cfgGetStr(pMac, WNI_CFG_SCAN_CONTROL_LIST, channelPair, &len)
660 != eSIR_SUCCESS)
661 {
662 PELOGE(limLog(pMac, LOGE, FL("Unable to get scan control list"));)
663 return ;
664 }
665 if (len > WNI_CFG_SCAN_CONTROL_LIST_LEN)
666 {
667 limLog(pMac, LOGE, FL("Invalid scan control list length:%d"), len);
668 return ;
669 }
Padma, Santhosh Kumar778d8382015-03-04 17:41:22 +0530670 if (pMac->fActiveScanOnDFSChannels)
671 {
672 limLog(pMac, LOG1, FL("DFS feature triggered,"
673 "block scan type conversion"));
674 return ;
675 }
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530676 for (i=0; (i+1) < len; i+=2)
677 {
678 if (channelPair[i] == channelNum)
679 {
680 if ((eSIR_PASSIVE_SCAN == channelPair[i+1]) && TRUE == passiveToActive)
681 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530682 limLog(pMac, LOG1, FL("Channel %d changed from Passive to Active"),
683 channelNum);
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530684 channelPair[i+1] = eSIR_ACTIVE_SCAN;
685 break ;
686 }
687 if ((eSIR_ACTIVE_SCAN == channelPair[i+1]) && FALSE == passiveToActive)
688 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530689 limLog(pMac, LOG1, FL("Channel %d changed from Active to Passive"),
690 channelNum);
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530691 channelPair[i+1] = eSIR_PASSIVE_SCAN;
692 break ;
693 }
694 }
695 }
696
697 cfgSetStrNotify(pMac, WNI_CFG_SCAN_CONTROL_LIST, (tANI_U8 *)channelPair, len, FALSE);
698 return ;
699}
700
701
702
703
704/* limSetDFSChannelList()
705 *
706 *FUNCTION:
707 * This function is called to convert DFS channel list to active channel list when any
708 * beacon is present on that channel. This function store time for passive channels
709 * which help to know that for how much time channel has been passive.
710 *
711 *LOGIC:
712 *
713 *ASSUMPTIONS:
714 * NA
715 *
716 *NOTE: If a channel is ACTIVE, it won't store any time
717 * If a channel is PAssive, it will store time as timestamp
718 * NA
719 *
720 * @param pMac - Pointer to Global MAC structure
721 * dfsChannelList - DFS channel list.
722 * @return None
723 */
724
725void limSetDFSChannelList(tpAniSirGlobal pMac,tANI_U8 channelNum, tSirDFSChannelList *dfsChannelList)
726{
727
728 tANI_BOOLEAN passiveToActive = TRUE;
Hanumantha Reddy Pothula97ea0952015-10-09 11:29:39 +0530729 tANI_U32 cfgVal;
730
731 if (eSIR_SUCCESS == wlan_cfgGetInt(pMac, WNI_CFG_ACTIVE_PASSIVE_CON,
732 &cfgVal))
733 {
734 limLog(pMac, LOG1, FL("WNI_CFG_ACTIVE_PASSIVE_CON: %d"), cfgVal);
735 if (!cfgVal)
736 return;
737 }
738
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530739 if ((1 <= channelNum) && (165 >= channelNum))
740 {
741 if (eANI_BOOLEAN_TRUE == limIsconnectedOnDFSChannel(channelNum))
742 {
743 if (dfsChannelList->timeStamp[channelNum] == 0)
744 {
745 //Received first beacon; Convert DFS channel to Active channel.
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530746 limLog(pMac, LOG1, FL("Received first beacon on DFS channel: %d"), channelNum);
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530747 limCovertChannelScanType(pMac,channelNum, passiveToActive);
748 }
Abhishek Singh6fcdf652016-11-23 10:59:12 +0530749
750 if (!pMac->fActiveScanOnDFSChannels &&
751 dfsChannelList->timeStamp[channelNum] &&
752 !limActiveScanAllowed(pMac, channelNum))
753 limLog(pMac, LOGE,
754 FL("Received beacon on DFS channel %d with dfs time stamp %lu, but channel is still DFS"),
755 channelNum, dfsChannelList->timeStamp[channelNum]);
756
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530757 dfsChannelList->timeStamp[channelNum] = vos_timer_get_system_time();
758 }
759 else
760 {
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530761 return;
762 }
763 if (!tx_timer_running(&pMac->lim.limTimers.gLimActiveToPassiveChannelTimer))
764 {
765 tx_timer_activate(&pMac->lim.limTimers.gLimActiveToPassiveChannelTimer);
766 }
767 }
768 else
769 {
770 PELOGE(limLog(pMac, LOGE, FL("Invalid Channel: %d"), channelNum);)
771 return;
772 }
773
774 return;
775}
776
Paul Zhang83289792017-02-28 18:58:52 +0800777void limDoSendAuthMgmtFrame(tpAniSirGlobal pMac, tpPESession psessionEntry)
778{
779 tSirMacAuthFrameBody authFrameBody;
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530780
Paul Zhang83289792017-02-28 18:58:52 +0800781 //Prepare & send Authentication frame
782 authFrameBody.authAlgoNumber =
783 (tANI_U8) pMac->lim.gpLimMlmAuthReq->authType;
784 authFrameBody.authTransactionSeqNumber = SIR_MAC_AUTH_FRAME_1;
785 authFrameBody.authStatusCode = 0;
786 pMac->authAckStatus = LIM_AUTH_ACK_NOT_RCD;
787 limSendAuthMgmtFrame(pMac,
788 &authFrameBody,
789 pMac->lim.gpLimMlmAuthReq->peerMacAddr,
790 LIM_NO_WEP_IN_FC, psessionEntry, eSIR_TRUE);
791 if (tx_timer_activate(&pMac->lim.limTimers.gLimAuthFailureTimer)
792 != TX_SUCCESS) {
793 //Could not start Auth failure timer.
794 //Log error
795 limLog(pMac, LOGP,
796 FL("could not start Auth failure timer"));
797 //Cleanup as if auth timer expired
798 limProcessAuthFailureTimeout(pMac);
799 } else {
800 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE,
801 psessionEntry->peSessionId, eLIM_AUTH_RETRY_TIMER));
802 //Activate Auth Retry timer
803 if (tx_timer_activate
804 (&pMac->lim.limTimers.gLimPeriodicAuthRetryTimer)
805 != TX_SUCCESS) {
806 limLog(pMac, LOGP,
807 FL("could not activate Auth Retry timer"));
808 }
809 }
810 return;
811}
Gopichand Nakkalad492d202013-05-10 02:50:47 +0530812
Jeff Johnson295189b2012-06-20 16:38:30 -0700813/*
814* Creates a Raw frame to be sent before every Scan, if required.
815* If only infra link is active (mlmState = Link Estb), then send Data Null
816* If only BT-AMP-AP link is active(mlmState = BSS_STARTED), then send CTS2Self frame.
817* If only BT-AMP-STA link is active(mlmState = BSS_STARTED or Link Est) then send CTS2Self
818* If Only IBSS link is active, then send CTS2Self
819* for concurrent scenario: Infra+BT or Infra+IBSS, always send CTS2Self, no need to send Data Null
820*
821*/
822static void __limCreateInitScanRawFrame(tpAniSirGlobal pMac,
823 tpInitScanParams pInitScanParam)
824{
825 tANI_U8 i;
826 pInitScanParam->scanEntry.activeBSScnt = 0;
827
828 /* Don't send CTS to self as we have issue with BTQM queues where BTQM can
829 * not handle transmition of CTS2self frames. Sending CTS 2 self at this
830 * juncture also doesn't serve much purpose as probe request frames go out
831 * immediately, No need to notify BSS in IBSS case.
832 * */
833
834 for(i =0; i < pMac->lim.maxBssId; i++)
835 {
836 if(pMac->lim.gpSession[i].valid == TRUE)
837 {
838 if(pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)
839 {
840 if ((pMac->lim.gpSession[i].limSystemRole != eLIM_BT_AMP_STA_ROLE) &&
841 (pInitScanParam->scanEntry.activeBSScnt < HAL_NUM_BSSID))
842 {
843 pInitScanParam->scanEntry.bssIdx[pInitScanParam->scanEntry.activeBSScnt]
844 = pMac->lim.gpSession[i].bssIdx;
845 pInitScanParam->scanEntry.activeBSScnt++;
846
847 }
848 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700849 else if( (eLIM_AP_ROLE == pMac->lim.gpSession[i].limSystemRole )
850 && ( VOS_P2P_GO_MODE == pMac->lim.gpSession[i].pePersona )
851 )
852 {
853 pInitScanParam->useNoA = TRUE;
854 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700855 }
856 }
857 if (pInitScanParam->scanEntry.activeBSScnt)
858 {
859 pInitScanParam->notifyBss = TRUE;
860 pInitScanParam->frameType = SIR_MAC_DATA_FRAME;
861 pInitScanParam->frameLength = 0;
862 }
863}
864
865/*
866* Creates a Raw frame to be sent during finish scan, if required.
867* Send data null frame, only when there is just one session active and that session is
868* in 'link Estb' state.
869* if more than one session is active, don't send any frame.
870* for concurrent scenario: Infra+BT or Infra+IBSS, no need to send Data Null
871*
872*/
873static void __limCreateFinishScanRawFrame(tpAniSirGlobal pMac,
874 tpFinishScanParams pFinishScanParam)
875{
876 tANI_U8 i;
877 pFinishScanParam->scanEntry.activeBSScnt = 0;
878
879 for(i =0; i < pMac->lim.maxBssId; i++)
880 {
881 if(pMac->lim.gpSession[i].valid == TRUE)
882 {
883 if(pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)
884 {
885 //BT-STA can either be in LINK-ESTB state or BSS_STARTED State
886 //for BT, need to send CTS2Self
887 if ((pMac->lim.gpSession[i].limSystemRole != eLIM_BT_AMP_STA_ROLE) &&
888 (pFinishScanParam->scanEntry.activeBSScnt < HAL_NUM_BSSID))
889 {
890 pFinishScanParam->scanEntry.bssIdx[pFinishScanParam->scanEntry.activeBSScnt]
891 = pMac->lim.gpSession[i].bssIdx;
892 pFinishScanParam->scanEntry.activeBSScnt++;
893 }
894 }
895 }
896 }
897
898 if (pFinishScanParam->scanEntry.activeBSScnt)
899 {
900 pFinishScanParam->notifyBss = TRUE;
901 pFinishScanParam->frameType = SIR_MAC_DATA_FRAME;
902 pFinishScanParam->frameLength = 0;
903 }
904}
905
906void
907limSendHalInitScanReq(tpAniSirGlobal pMac, tLimLimHalScanState nextState, tSirLinkTrafficCheck trafficCheck)
908{
909
910
911 tSirMsgQ msg;
912 tpInitScanParams pInitScanParam;
913 tSirRetStatus rc = eSIR_SUCCESS;
914
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530915 pInitScanParam = vos_mem_malloc(sizeof(*pInitScanParam));
916 if ( NULL == pInitScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -0700917 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530918 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700919 goto error;
920 }
921
922 /*Initialize the pInitScanParam with 0*/
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530923 vos_mem_set((tANI_U8 *)pInitScanParam, sizeof(*pInitScanParam), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700924
925 msg.type = WDA_INIT_SCAN_REQ;
926 msg.bodyptr = pInitScanParam;
927 msg.bodyval = 0;
928
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530929 vos_mem_set((tANI_U8 *)&pInitScanParam->macMgmtHdr, sizeof(tSirMacMgmtHdr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700930 if (nextState == eLIM_HAL_INIT_LEARN_WAIT_STATE)
931 {
932 pInitScanParam->notifyBss = TRUE;
933 pInitScanParam->notifyHost = FALSE;
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700934 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
935 {
936 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SCAN;
937 }
938 else
939 {
940 pInitScanParam->scanMode = eHAL_SYS_MODE_LEARN;
941 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700942
Jeff Johnsone7245742012-09-05 17:12:55 -0700943 pInitScanParam->frameType = SIR_MAC_CTRL_CTS;
944 __limCreateInitScanRawFrame(pMac, pInitScanParam);
945 pInitScanParam->checkLinkTraffic = trafficCheck;
Jeff Johnson295189b2012-06-20 16:38:30 -0700946 }
947 else
948 {
949 if(nextState == eLIM_HAL_SUSPEND_LINK_WAIT_STATE)
950 {
Madan Mohan Koyyalamudi9b876782012-10-11 16:22:51 -0700951 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
952 {
953 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SUSPEND_LINK;
954 }
955 else
956 {
957 pInitScanParam->scanMode = eHAL_SYS_MODE_SUSPEND_LINK;
958 }
959
Jeff Johnson295189b2012-06-20 16:38:30 -0700960 }
961 else
962 {
Madan Mohan Koyyalamudi94d111d2012-11-19 20:11:26 -0800963 if (eSIR_CHECK_ROAMING_SCAN == trafficCheck)
964 {
965 pInitScanParam->scanMode = eHAL_SYS_MODE_ROAM_SCAN;
966 }
967 else
968 {
969 pInitScanParam->scanMode = eHAL_SYS_MODE_SCAN;
970 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700971 }
972 __limCreateInitScanRawFrame(pMac, pInitScanParam);
Jeff Johnson295189b2012-06-20 16:38:30 -0700973 if (pInitScanParam->useNoA)
974 {
975 pInitScanParam->scanDuration = pMac->lim.gTotalScanDuration;
976 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700977 /* Inform HAL whether it should check for traffic on the link
978 * prior to performing a background scan
979 */
980 pInitScanParam->checkLinkTraffic = trafficCheck;
981 }
982
983 pMac->lim.gLimHalScanState = nextState;
984 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -0700985 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -0700986
987 rc = wdaPostCtrlMsg(pMac, &msg);
988 if (rc == eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700989 PELOG3(limLog(pMac, LOG3, FL("wdaPostCtrlMsg() return eSIR_SUCCESS pMac=%x nextState=%d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700990 pMac, pMac->lim.gLimHalScanState);)
991 return;
992 }
993
994 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530995 vos_mem_free(pInitScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700996 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700997
998error:
999 switch(nextState)
1000 {
1001 case eLIM_HAL_START_SCAN_WAIT_STATE:
Padma, Santhosh Kumar9a3eea12015-02-18 14:05:03 +05301002 case eLIM_HAL_INIT_SCAN_WAIT_STATE:
Jeff Johnson295189b2012-06-20 16:38:30 -07001003 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_INIT_FAILED);
1004 break;
1005
Jeff Johnson295189b2012-06-20 16:38:30 -07001006
1007 //WLAN_SUSPEND_LINK Related
1008 case eLIM_HAL_SUSPEND_LINK_WAIT_STATE:
1009 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
1010 if( pMac->lim.gpLimSuspendCallback )
1011 {
1012 pMac->lim.gpLimSuspendCallback( pMac, rc, pMac->lim.gpLimSuspendData );
1013 pMac->lim.gpLimSuspendCallback = NULL;
1014 pMac->lim.gpLimSuspendData = NULL;
1015 }
1016 pMac->lim.gLimSystemInScanLearnMode = 0;
1017 break;
1018 //end WLAN_SUSPEND_LINK Related
1019 default:
1020 break;
1021 }
1022 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
1023
1024 return ;
1025}
1026
1027void
1028limSendHalStartScanReq(tpAniSirGlobal pMac, tANI_U8 channelNum, tLimLimHalScanState nextState)
1029{
1030 tSirMsgQ msg;
1031 tpStartScanParams pStartScanParam;
1032 tSirRetStatus rc = eSIR_SUCCESS;
1033
1034 /**
1035 * The Start scan request to be sent only if Start Scan is not already requested
1036 */
1037 if(pMac->lim.gLimHalScanState != eLIM_HAL_START_SCAN_WAIT_STATE)
1038 {
1039
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301040 pStartScanParam = vos_mem_malloc(sizeof(*pStartScanParam));
1041 if ( NULL == pStartScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -07001042 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301043 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001044 goto error;
1045 }
1046
1047 msg.type = WDA_START_SCAN_REQ;
1048 msg.bodyptr = pStartScanParam;
1049 msg.bodyval = 0;
1050 pStartScanParam->status = eHAL_STATUS_SUCCESS;
1051 pStartScanParam->scanChannel = (tANI_U8)channelNum;
1052
1053 pMac->lim.gLimHalScanState = nextState;
1054 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
1055
Jeff Johnsone7245742012-09-05 17:12:55 -07001056 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001057
1058 rc = wdaPostCtrlMsg(pMac, &msg);
1059 if (rc == eSIR_SUCCESS) {
1060 return;
1061 }
1062
1063 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301064 vos_mem_free(pStartScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001065 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001066
1067error:
1068 switch(nextState)
1069 {
1070 case eLIM_HAL_START_SCAN_WAIT_STATE:
1071 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_INIT_FAILED);
1072 break;
1073
Jeff Johnson295189b2012-06-20 16:38:30 -07001074
1075 default:
1076 break;
1077 }
1078 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
1079
1080 }
1081 else
1082 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001083 PELOGW(limLog(pMac, LOGW, FL("Invalid state for START_SCAN_REQ message=%d"), pMac->lim.gLimHalScanState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001084 }
1085
1086 return;
1087}
1088
1089void limSendHalEndScanReq(tpAniSirGlobal pMac, tANI_U8 channelNum, tLimLimHalScanState nextState)
1090{
1091 tSirMsgQ msg;
1092 tpEndScanParams pEndScanParam;
1093 tSirRetStatus rc = eSIR_SUCCESS;
1094
1095 /**
1096 * 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 -07001097 * Start scan is not already requestd.
1098 * after finish scan rsp from firmware host is sending endscan request so adding
1099 * check for IDLE SCAN STATE also added to avoid this issue
Jeff Johnson295189b2012-06-20 16:38:30 -07001100 */
1101 if((pMac->lim.gLimHalScanState != eLIM_HAL_END_SCAN_WAIT_STATE) &&
Leela Venkata Kiran Kumar Reddy Chirala66639a62013-08-29 15:38:19 -07001102 (pMac->lim.gLimHalScanState != eLIM_HAL_IDLE_SCAN_STATE) &&
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07001103 (pMac->lim.gLimHalScanState == eLIM_HAL_SCANNING_STATE) &&
1104 (pMac->lim.gLimHalScanState != eLIM_HAL_FINISH_SCAN_WAIT_STATE) &&
1105 (pMac->lim.gLimHalScanState != eLIM_HAL_START_SCAN_WAIT_STATE))
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301106 {
1107 pEndScanParam = vos_mem_malloc(sizeof(*pEndScanParam));
1108 if ( NULL == pEndScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -07001109 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301110 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001111 goto error;
1112 }
1113
1114 msg.type = WDA_END_SCAN_REQ;
1115 msg.bodyptr = pEndScanParam;
1116 msg.bodyval = 0;
1117 pEndScanParam->status = eHAL_STATUS_SUCCESS;
1118 pEndScanParam->scanChannel = (tANI_U8)channelNum;
1119
1120 pMac->lim.gLimHalScanState = nextState;
1121 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -07001122 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001123
1124 rc = wdaPostCtrlMsg(pMac, &msg);
1125 if (rc == eSIR_SUCCESS) {
1126 return;
1127 }
1128
1129 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301130 vos_mem_free(pEndScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001131 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001132
1133 error:
1134 switch(nextState)
1135 {
1136 case eLIM_HAL_END_SCAN_WAIT_STATE:
1137 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_END_FAILED);
1138 break;
1139
Jeff Johnson295189b2012-06-20 16:38:30 -07001140
1141 default:
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001142 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg Rcvd invalid nextState %d"), nextState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001143 break;
1144 }
1145 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001146 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001147 }
1148 else
1149 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001150 PELOGW(limLog(pMac, LOGW, FL("Invalid state for END_SCAN_REQ message=%d"), pMac->lim.gLimHalScanState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001151 }
1152
1153
1154 return;
1155}
1156
Bhargav Shahe3a6ff02016-04-11 16:31:49 +05301157
1158void limSendTLPauseInd(tpAniSirGlobal pMac, uint16_t staId)
1159{
1160 tSirMsgQ msg;
1161 tSirRetStatus rc = eSIR_SUCCESS;
1162
1163 msg.type = WDA_PAUSE_TL_IND;
1164 msg.bodyval = staId;
1165
1166 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
1167
1168 rc = wdaPostCtrlMsg(pMac, &msg);
1169 if (rc == eSIR_SUCCESS) {
1170 return;
1171 }
1172
1173 limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);
1174
1175 return;
1176}
1177
Jeff Johnson295189b2012-06-20 16:38:30 -07001178/**
1179 * limSendHalFinishScanReq()
1180 *
1181 *FUNCTION:
1182 * This function is called to finish scan/learn request..
1183 *
1184 *LOGIC:
1185 *
1186 *ASSUMPTIONS:
1187 * NA
1188 *
1189 *NOTE:
1190 * NA
1191 *
1192 * @param pMac - Pointer to Global MAC structure
1193 * @param nextState - this parameters determines whether this call is for scan or learn
1194 *
1195 * @return None
1196 */
1197void limSendHalFinishScanReq(tpAniSirGlobal pMac, tLimLimHalScanState nextState)
1198{
1199
1200 tSirMsgQ msg;
1201 tpFinishScanParams pFinishScanParam;
1202 tSirRetStatus rc = eSIR_SUCCESS;
1203
1204 if(pMac->lim.gLimHalScanState == nextState)
1205 {
1206 /*
1207 * PE may receive multiple probe responses, while waiting for HAL to send 'FINISH_SCAN_RSP' message
1208 * PE was sending multiple finish scan req messages to HAL
1209 * this check will avoid that.
1210 * If PE is already waiting for the 'finish_scan_rsp' message from HAL, it will ignore this request.
1211 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001212 PELOGW(limLog(pMac, LOGW, FL("Next Scan State is same as the current state: %d "), nextState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001213 return;
1214 }
1215
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301216 pFinishScanParam = vos_mem_malloc(sizeof(*pFinishScanParam));
1217 if ( NULL == pFinishScanParam )
Jeff Johnson295189b2012-06-20 16:38:30 -07001218 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301219 PELOGW(limLog(pMac, LOGW, FL("AllocateMemory() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001220 goto error;
1221 }
1222
1223 msg.type = WDA_FINISH_SCAN_REQ;
1224 msg.bodyptr = pFinishScanParam;
1225 msg.bodyval = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001226
1227 peGetResumeChannel(pMac, &pFinishScanParam->currentOperChannel, &pFinishScanParam->cbState);
1228
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301229 vos_mem_set((tANI_U8 *)&pFinishScanParam->macMgmtHdr, sizeof(tSirMacMgmtHdr), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001230
1231 if (nextState == eLIM_HAL_FINISH_LEARN_WAIT_STATE)
1232 {
1233 //AP - No pkt need to be transmitted
1234 pFinishScanParam->scanMode = eHAL_SYS_MODE_LEARN;
1235 pFinishScanParam->notifyBss = FALSE;
1236 pFinishScanParam->notifyHost = FALSE;
1237 pFinishScanParam->frameType = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001238
Jeff Johnson295189b2012-06-20 16:38:30 -07001239 pFinishScanParam->frameLength = 0;
1240 pMac->lim.gLimHalScanState = nextState;
1241 }
1242 else
1243 {
1244 /* If STA is associated with an AP (ie. STA is in
1245 * LINK_ESTABLISHED state), then STA need to inform
1246 * the AP via either DATA-NULL
1247 */
1248 if (nextState == eLIM_HAL_RESUME_LINK_WAIT_STATE)
1249 {
1250 pFinishScanParam->scanMode = eHAL_SYS_MODE_SUSPEND_LINK;
1251 }
1252 else
1253 {
1254 pFinishScanParam->scanMode = eHAL_SYS_MODE_SCAN;
1255 }
1256 pFinishScanParam->notifyHost = FALSE;
1257 __limCreateFinishScanRawFrame(pMac, pFinishScanParam);
1258 //WLAN_SUSPEND_LINK Related
1259 pMac->lim.gLimHalScanState = nextState;
1260 //end WLAN_SUSPEND_LINK Related
1261 }
1262
1263 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
Jeff Johnsone7245742012-09-05 17:12:55 -07001264 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001265
1266 rc = wdaPostCtrlMsg(pMac, &msg);
1267 if (rc == eSIR_SUCCESS) {
1268 return;
1269 }
1270 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301271 vos_mem_free(pFinishScanParam);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001272 PELOGW(limLog(pMac, LOGW, FL("wdaPostCtrlMsg failed, error code %d"), rc);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001273
1274 error:
1275 if(nextState == eLIM_HAL_FINISH_SCAN_WAIT_STATE)
1276 limCompleteMlmScan(pMac, eSIR_SME_HAL_SCAN_FINISH_FAILED);
1277 //WLAN_SUSPEND_LINK Related
1278 else if ( nextState == eLIM_HAL_RESUME_LINK_WAIT_STATE )
1279 {
1280 if( pMac->lim.gpLimResumeCallback )
1281 {
1282 pMac->lim.gpLimResumeCallback( pMac, rc, pMac->lim.gpLimResumeData );
1283 pMac->lim.gpLimResumeCallback = NULL;
1284 pMac->lim.gpLimResumeData = NULL;
1285 pMac->lim.gLimSystemInScanLearnMode = 0;
1286 }
1287 }
1288 //end WLAN_SUSPEND_LINK Related
1289 pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
1290 return;
1291}
1292
1293/**
1294 * limContinueChannelScan()
1295 *
1296 *FUNCTION:
1297 * This function is called by limPerformChannelScan().
1298 * This function is called to continue channel scanning when
1299 * Beacon/Probe Response frame are received.
1300 *
1301 *LOGIC:
1302 * Scan criteria stored in pMac->lim.gLimMlmScanReq is used
1303 * to perform channel scan. In this function MLM sub module
1304 * makes channel switch, sends PROBE REQUEST frame in case of
1305 * ACTIVE SCANNING, starts min/max channel timers, programs
1306 * NAV to probeDelay timer and waits for Beacon/Probe Response.
1307 * Once all required channels are scanned, LIM_MLM_SCAN_CNF
1308 * primitive is used to send Scan results to SME sub module.
1309 *
1310 *ASSUMPTIONS:
1311 * 1. In case of Active scanning, start MAX channel time iff
1312 * MIN channel timer expired and activity is observed on
1313 * the channel.
1314 *
1315 *NOTE:
1316 * NA
1317 *
1318 * @param pMac Pointer to Global MAC structure
1319 * @return None
1320 */
1321void
1322limContinueChannelScan(tpAniSirGlobal pMac)
1323{
1324 tANI_U8 channelNum;
1325
Jeff Johnson295189b2012-06-20 16:38:30 -07001326 if (pMac->lim.gLimCurrentScanChannelId >
1327 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1)
1328 || pMac->lim.abortScan)
1329 {
Jeff Johnson295189b2012-06-20 16:38:30 -07001330 pMac->lim.abortScan = 0;
1331 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1332 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1333
1334 //Set the resume channel to Any valid channel (invalid).
1335 //This will instruct HAL to set it to any previous valid channel.
1336 peSetResumeChannel(pMac, 0, 0);
1337
1338 /// Done scanning all required channels
1339 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
Jeff Johnson295189b2012-06-20 16:38:30 -07001340 return;
1341 }
1342
1343 /// Atleast one more channel is to be scanned
1344
1345 if ((pMac->lim.gLimReturnAfterFirstMatch & 0x40) ||
1346 (pMac->lim.gLimReturnAfterFirstMatch & 0x80))
1347 {
1348 while (pMac->lim.gLimCurrentScanChannelId <=
1349 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
1350 {
1351 if (((limGetCurrentScanChannel(pMac) <= 14) &&
1352 pMac->lim.gLim24Band11dScanDone) ||
1353 ((limGetCurrentScanChannel(pMac) > 14) &&
1354 pMac->lim.gLim50Band11dScanDone))
1355 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001356 limLog(pMac, LOGW, FL("skipping chan %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07001357 limGetCurrentScanChannel(pMac));
1358 pMac->lim.gLimCurrentScanChannelId++;
1359 }
1360 else
1361 break;
1362 }
1363
1364 if (pMac->lim.gLimCurrentScanChannelId >
1365 (tANI_U32) (pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
1366 {
1367 pMac->lim.abortScan = 0;
1368 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1369 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1370 /// Done scanning all required channels
1371 //Set the resume channel to Any valid channel (invalid).
1372 //This will instruct HAL to set it to any previous valid channel.
1373 peSetResumeChannel(pMac, 0, 0);
1374 limSendHalFinishScanReq(pMac, eLIM_HAL_FINISH_SCAN_WAIT_STATE);
1375 return;
1376 }
1377 }
1378
1379 channelNum = limGetCurrentScanChannel(pMac);
Abhishek Singh525045c2014-12-15 17:18:45 +05301380 limLog(pMac, LOG1, FL("Current Channel to be scanned is %d"),
1381 channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -07001382
1383 limSendHalStartScanReq(pMac, channelNum, eLIM_HAL_START_SCAN_WAIT_STATE);
1384 return;
1385} /*** end limContinueChannelScan() ***/
1386
1387
1388
1389/**
1390 * limRestorePreScanState()
1391 *
1392 *FUNCTION:
1393 * This function is called by limContinueChannelScan()
1394 * to restore HW state prior to entering 'scan state'
1395 *
1396 *LOGIC
1397 *
1398 *ASSUMPTIONS:
1399 *
1400 *NOTE:
1401 * NA
1402 *
1403 * @param pMac Pointer to Global MAC structure
1404 * @return None
1405 */
1406void
1407limRestorePreScanState(tpAniSirGlobal pMac)
1408{
1409 int i;
1410
1411 /// Deactivate MIN/MAX channel timers if running
1412 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
1413 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
1414
1415 /* Re-activate Heartbeat timers for connected sessions as scan
Madan Mohan Koyyalamudi70bb4cb2012-10-18 19:31:25 -07001416 * is done if the DUT is in active mode
1417 * AND it is not a ROAMING ("background") scan */
1418 if(((ePMM_STATE_BMPS_WAKEUP == pMac->pmm.gPmmState) ||
Jeff Johnson295189b2012-06-20 16:38:30 -07001419 (ePMM_STATE_READY == pMac->pmm.gPmmState))
Madan Mohan Koyyalamudi70bb4cb2012-10-18 19:31:25 -07001420 && (pMac->lim.gLimBackgroundScanMode != eSIR_ROAMING_SCAN ))
Jeff Johnson295189b2012-06-20 16:38:30 -07001421 {
1422 for(i=0;i<pMac->lim.maxBssId;i++)
1423 {
Jeff Johnson32d95a32012-09-10 13:15:23 -07001424 if((peFindSessionBySessionId(pMac,i) != NULL) &&
1425 (pMac->lim.gpSession[i].valid == TRUE) &&
Yathish9f22e662012-12-10 14:21:35 -08001426 (eLIM_MLM_LINK_ESTABLISHED_STATE == pMac->lim.gpSession[i].limMlmState) &&
1427 (!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
Jeff Johnson295189b2012-06-20 16:38:30 -07001428 {
1429 limReactivateHeartBeatTimer(pMac, peFindSessionBySessionId(pMac,i));
1430 }
1431 }
1432 }
1433
1434 /**
1435 * clean up message queue.
1436 * If SME messages, redirect to deferred queue.
1437 * The rest will be discarded.
1438 */
1439 //limCleanupMsgQ(pMac);
1440
1441 pMac->lim.gLimSystemInScanLearnMode = 0;
Abhishek Singh3cbf6052014-12-15 16:46:42 +05301442 limLog(pMac, LOG1, FL("Scan ended, took %ld tu"),
1443 (tx_time_get() - pMac->lim.scanStartTime));
Jeff Johnson295189b2012-06-20 16:38:30 -07001444} /*** limRestorePreScanState() ***/
1445
Jeff Johnsone7245742012-09-05 17:12:55 -07001446#ifdef FEATURE_OEM_DATA_SUPPORT
1447
1448void limSendHalOemDataReq(tpAniSirGlobal pMac)
1449{
1450 tSirMsgQ msg;
1451 tpStartOemDataReq pStartOemDataReq = NULL;
1452 tSirRetStatus rc = eSIR_SUCCESS;
1453 tpLimMlmOemDataRsp pMlmOemDataRsp;
1454 tANI_U32 reqLen = 0;
1455 if(NULL == pMac->lim.gpLimMlmOemDataReq)
1456 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001457 PELOGE(limLog(pMac, LOGE, FL("Null pointer"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001458 goto error;
1459 }
1460
1461 reqLen = sizeof(tStartOemDataReq);
1462
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301463 pStartOemDataReq = vos_mem_malloc(reqLen);
1464 if ( NULL == pStartOemDataReq )
Jeff Johnsone7245742012-09-05 17:12:55 -07001465 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001466 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: Could not allocate memory for pStartOemDataReq"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001467 goto error;
1468 }
1469
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301470 vos_mem_set((tANI_U8*)(pStartOemDataReq), reqLen, 0);
Jeff Johnsone7245742012-09-05 17:12:55 -07001471
1472 //Now copy over the information to the OEM DATA REQ to HAL
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301473 vos_mem_copy(pStartOemDataReq->selfMacAddr,
1474 pMac->lim.gpLimMlmOemDataReq->selfMacAddr,
1475 sizeof(tSirMacAddr));
Jeff Johnsone7245742012-09-05 17:12:55 -07001476
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301477 vos_mem_copy(pStartOemDataReq->oemDataReq,
1478 pMac->lim.gpLimMlmOemDataReq->oemDataReq,
1479 OEM_DATA_REQ_SIZE);
Jeff Johnsone7245742012-09-05 17:12:55 -07001480
1481 //Create the message to be passed to HAL
1482 msg.type = WDA_START_OEM_DATA_REQ;
1483 msg.bodyptr = pStartOemDataReq;
1484 msg.bodyval = 0;
1485
1486 SET_LIM_PROCESS_DEFD_MESGS(pMac, false);
1487 MTRACE(macTraceMsgTx(pMac, NO_SESSION, msg.type));
1488
1489 rc = wdaPostCtrlMsg(pMac, &msg);
1490 if(rc == eSIR_SUCCESS)
1491 {
1492 return;
1493 }
1494
1495 SET_LIM_PROCESS_DEFD_MESGS(pMac, true);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301496 vos_mem_free(pStartOemDataReq);
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001497 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: posting WDA_START_OEM_DATA_REQ to HAL failed"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001498
1499error:
1500 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Varun Reddy Yeturue3bbf6e2013-02-08 18:50:55 -08001501 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnsone7245742012-09-05 17:12:55 -07001502
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301503 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
1504 if ( NULL == pMlmOemDataRsp )
Jeff Johnsone7245742012-09-05 17:12:55 -07001505 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001506 limLog(pMac->hHdd, LOGP, FL("OEM_DATA: memory allocation for pMlmOemDataRsp failed under suspend link failure"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001507 return;
1508 }
1509
1510 if(NULL != pMac->lim.gpLimMlmOemDataReq)
1511 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301512 vos_mem_free(pMac->lim.gpLimMlmOemDataReq);
Jeff Johnsone7245742012-09-05 17:12:55 -07001513 pMac->lim.gpLimMlmOemDataReq = NULL;
1514 }
1515
1516 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
1517
1518 return;
1519}
1520/**
1521 * limSetOemDataReqModeFailed()
1522 *
1523 * FUNCTION:
1524 * This function is used as callback to resume link after the suspend fails while
1525 * starting oem data req mode.
1526 * LOGIC:
1527 * NA
1528 *
1529 * ASSUMPTIONS:
1530 * NA
1531 *
1532 * NOTE:
1533 *
1534 * @param pMac - Pointer to Global MAC structure
1535 * @return None
1536 */
1537
1538void limSetOemDataReqModeFailed(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data)
1539{
1540 tpLimMlmOemDataRsp pMlmOemDataRsp;
1541
1542 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Varun Reddy Yeturue3bbf6e2013-02-08 18:50:55 -08001543 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnsone7245742012-09-05 17:12:55 -07001544
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301545 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
1546 if ( NULL == pMlmOemDataRsp )
Jeff Johnsone7245742012-09-05 17:12:55 -07001547 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001548 limLog(pMac->hHdd, LOGP, FL("OEM_DATA: memory allocation for pMlmOemDataRsp failed under suspend link failure"));
Jeff Johnsone7245742012-09-05 17:12:55 -07001549 return;
1550 }
1551
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301552 if (NULL != pMac->lim.gpLimMlmOemDataReq)
Jeff Johnsone7245742012-09-05 17:12:55 -07001553 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301554 vos_mem_free(pMac->lim.gpLimMlmOemDataReq);
Jeff Johnsone7245742012-09-05 17:12:55 -07001555 pMac->lim.gpLimMlmOemDataReq = NULL;
1556 }
1557
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301558 vos_mem_set(pMlmOemDataRsp, sizeof(tLimMlmOemDataRsp), 0);
Jeff Johnsone7245742012-09-05 17:12:55 -07001559
1560 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
1561
1562 return;
1563}
1564
1565/**
1566 * limSetOemDataReqMode()
1567 *
1568 *FUNCTION:
1569 * This function is called to setup system into OEM DATA REQ mode
1570 *
1571 *LOGIC:
1572 * NA
1573 *
1574 *ASSUMPTIONS:
1575 * NA
1576 *
1577 *NOTE:
1578 *
1579 * @param pMac - Pointer to Global MAC structure
1580 * @return None
1581 */
1582
1583void limSetOemDataReqMode(tpAniSirGlobal pMac, eHalStatus status, tANI_U32* data)
1584{
1585 if(status != eHAL_STATUS_SUCCESS)
1586 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001587 limLog(pMac, LOGE, FL("OEM_DATA: failed in suspend link"));
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05301588 /* If failed to suspend the link, there is no need
1589 * to resume link. Return failure.
1590 */
1591 limSetOemDataReqModeFailed(pMac, status, data);
Jeff Johnsone7245742012-09-05 17:12:55 -07001592 }
1593 else
1594 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001595 PELOGE(limLog(pMac, LOGE, FL("OEM_DATA: Calling limSendHalOemDataReq"));)
Jeff Johnsone7245742012-09-05 17:12:55 -07001596 limSendHalOemDataReq(pMac);
Jeff Johnsone7245742012-09-05 17:12:55 -07001597 }
1598
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05301599 return;
Jeff Johnsone7245742012-09-05 17:12:55 -07001600} /*** end limSendHalOemDataReq() ***/
1601
1602#endif //FEATURE_OEM_DATA_SUPPORT
Jeff Johnson295189b2012-06-20 16:38:30 -07001603
1604static void
1605mlm_add_sta(
1606 tpAniSirGlobal pMac,
1607 tpAddStaParams pSta,
1608 tANI_U8 *pBssid,
1609 tANI_U8 htCapable,
1610 tpPESession psessionEntry) //psessionEntry may required in future
1611{
1612 tANI_U32 val;
1613 int i;
1614
1615
1616 pSta->staType = STA_ENTRY_SELF; // Identifying self
1617
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301618 vos_mem_copy(pSta->bssId, pBssid, sizeof( tSirMacAddr ));
1619 vos_mem_copy(pSta->staMac, psessionEntry->selfMacAddr, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001620
1621 /* Configuration related parameters to be changed to support BT-AMP */
1622
1623 if( eSIR_SUCCESS != wlan_cfgGetInt( pMac, WNI_CFG_LISTEN_INTERVAL, &val ))
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001624 limLog(pMac, LOGP, FL("Couldn't get LISTEN_INTERVAL"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001625
1626 pSta->listenInterval = (tANI_U16) val;
1627
1628 if (eSIR_SUCCESS != wlan_cfgGetInt(pMac, WNI_CFG_SHORT_PREAMBLE, &val) )
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001629 limLog(pMac, LOGP, FL("Couldn't get SHORT_PREAMBLE"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001630 pSta->shortPreambleSupported = (tANI_U8)val;
1631
1632 pSta->assocId = 0; // Is SMAC OK with this?
1633 pSta->wmmEnabled = 0;
1634 pSta->uAPSD = 0;
1635 pSta->maxSPLen = 0;
1636 pSta->us32MaxAmpduDuration = 0;
1637 pSta->maxAmpduSize = 0; // 0: 8k, 1: 16k,2: 32k,3: 64k
1638
1639
Gopichand Nakkalab2d2c312013-01-04 11:41:02 -08001640 /* For Self STA get the LDPC capability from config.ini*/
1641 pSta->htLdpcCapable =
1642 (psessionEntry->txLdpcIniFeatureEnabled & 0x01);
1643 pSta->vhtLdpcCapable =
1644 ((psessionEntry->txLdpcIniFeatureEnabled >> 1)& 0x01);
1645
Jeff Johnson295189b2012-06-20 16:38:30 -07001646 if(IS_DOT11_MODE_HT(psessionEntry->dot11mode))
1647 {
1648 pSta->htCapable = htCapable;
Jeff Johnson295189b2012-06-20 16:38:30 -07001649 pSta->greenFieldCapable = limGetHTCapability( pMac, eHT_GREENFIELD, psessionEntry);
1650 pSta->txChannelWidthSet = limGetHTCapability( pMac, eHT_SUPPORTED_CHANNEL_WIDTH_SET, psessionEntry );
1651 pSta->mimoPS = (tSirMacHTMIMOPowerSaveState)limGetHTCapability( pMac, eHT_MIMO_POWER_SAVE, psessionEntry );
1652 pSta->rifsMode = limGetHTCapability( pMac, eHT_RIFS_MODE, psessionEntry );
1653 pSta->lsigTxopProtection = limGetHTCapability( pMac, eHT_LSIG_TXOP_PROTECTION, psessionEntry );
1654 pSta->delBASupport = limGetHTCapability( pMac, eHT_DELAYED_BA, psessionEntry );
1655 pSta->maxAmpduDensity = limGetHTCapability( pMac, eHT_MPDU_DENSITY, psessionEntry );
1656 pSta->maxAmsduSize = limGetHTCapability( pMac, eHT_MAX_AMSDU_LENGTH, psessionEntry );
1657 pSta->fDsssCckMode40Mhz = limGetHTCapability( pMac, eHT_DSSS_CCK_MODE_40MHZ, psessionEntry);
1658 pSta->fShortGI20Mhz = limGetHTCapability( pMac, eHT_SHORT_GI_20MHZ, psessionEntry);
1659 pSta->fShortGI40Mhz = limGetHTCapability( pMac, eHT_SHORT_GI_40MHZ, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -07001660 }
Jeff Johnsone7245742012-09-05 17:12:55 -07001661#ifdef WLAN_FEATURE_11AC
1662 if (psessionEntry->vhtCapability)
1663 {
1664 pSta->vhtCapable = VOS_TRUE;
Shailender Karmuchi08f87c22013-01-17 12:51:24 -08001665 pSta->vhtTxBFCapable = psessionEntry->txBFIniFeatureEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07001666 }
1667#endif
1668#ifdef WLAN_FEATURE_11AC
1669 limPopulateOwnRateSet(pMac, &pSta->supportedRates, NULL, false,psessionEntry,NULL);
1670#else
Jeff Johnson295189b2012-06-20 16:38:30 -07001671 limPopulateOwnRateSet(pMac, &pSta->supportedRates, NULL, false,psessionEntry);
Jeff Johnsone7245742012-09-05 17:12:55 -07001672#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001673 limFillSupportedRatesInfo(pMac, NULL, &pSta->supportedRates,psessionEntry);
1674
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001675 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 -07001676 pSta->greenFieldCapable, pSta->txChannelWidthSet, pSta->mimoPS, pSta->lsigTxopProtection,
1677 pSta->fDsssCckMode40Mhz,pSta->fShortGI20Mhz, pSta->fShortGI40Mhz);
1678
Jeff Johnson295189b2012-06-20 16:38:30 -07001679 if (VOS_P2P_GO_MODE == psessionEntry->pePersona)
1680 {
1681 pSta->p2pCapableSta = 1;
1682 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001683
1684 //Disable BA. It will be set as part of ADDBA negotiation.
1685 for( i = 0; i < STACFG_MAX_TC; i++ )
1686 {
1687 pSta->staTCParams[i].txUseBA = eBA_DISABLE;
1688 pSta->staTCParams[i].rxUseBA = eBA_DISABLE;
1689 }
1690
1691}
1692
1693//
1694// New HAL interface - WDA_ADD_BSS_REQ
1695// Package WDA_ADD_BSS_REQ to HAL, in order to start a BSS
1696//
1697tSirResultCodes
1698limMlmAddBss (
1699 tpAniSirGlobal pMac,
1700 tLimMlmStartReq *pMlmStartReq,
1701 tpPESession psessionEntry)
1702{
1703 tSirMsgQ msgQ;
1704 tpAddBssParams pAddBssParams = NULL;
1705 tANI_U32 retCode;
1706
Jeff Johnson295189b2012-06-20 16:38:30 -07001707 // Package WDA_ADD_BSS_REQ message parameters
1708
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301709 pAddBssParams = vos_mem_malloc(sizeof( tAddBssParams ));
1710 if ( NULL == pAddBssParams )
Jeff Johnson295189b2012-06-20 16:38:30 -07001711 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301712 limLog( pMac, LOGE, FL( "Unable to allocate memory during ADD_BSS" ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001713 // Respond to SME with LIM_MLM_START_CNF
1714 return eSIR_SME_HAL_SEND_MESSAGE_FAIL;
1715 }
1716
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301717 vos_mem_set(pAddBssParams, sizeof(tAddBssParams), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001718
1719 // Fill in tAddBssParams members
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301720 vos_mem_copy(pAddBssParams->bssId, pMlmStartReq->bssId,
Jeff Johnson295189b2012-06-20 16:38:30 -07001721 sizeof( tSirMacAddr ));
1722
1723 // Fill in tAddBssParams selfMacAddr
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301724 vos_mem_copy (pAddBssParams->selfMacAddr,
1725 psessionEntry->selfMacAddr,
1726 sizeof( tSirMacAddr ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001727
1728 pAddBssParams->bssType = pMlmStartReq->bssType;
1729 if ((pMlmStartReq->bssType == eSIR_IBSS_MODE) ||
1730 (pMlmStartReq->bssType == eSIR_BTAMP_AP_MODE)||
1731 (pMlmStartReq->bssType == eSIR_BTAMP_STA_MODE)) {
1732 pAddBssParams->operMode = BSS_OPERATIONAL_MODE_STA;
1733 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001734 else if (pMlmStartReq->bssType == eSIR_INFRA_AP_MODE){
Jeff Johnson295189b2012-06-20 16:38:30 -07001735 pAddBssParams->operMode = BSS_OPERATIONAL_MODE_AP;
1736 }
1737
Jeff Johnsone7245742012-09-05 17:12:55 -07001738 pAddBssParams->shortSlotTimeSupported = psessionEntry->shortSlotTimeSupported;
Jeff Johnson295189b2012-06-20 16:38:30 -07001739
Jeff Johnson295189b2012-06-20 16:38:30 -07001740 pAddBssParams->beaconInterval = pMlmStartReq->beaconPeriod;
1741 pAddBssParams->dtimPeriod = pMlmStartReq->dtimPeriod;
1742 pAddBssParams->cfParamSet.cfpCount = pMlmStartReq->cfParamSet.cfpCount;
1743 pAddBssParams->cfParamSet.cfpPeriod = pMlmStartReq->cfParamSet.cfpPeriod;
1744 pAddBssParams->cfParamSet.cfpMaxDuration = pMlmStartReq->cfParamSet.cfpMaxDuration;
1745 pAddBssParams->cfParamSet.cfpDurRemaining = pMlmStartReq->cfParamSet.cfpDurRemaining;
1746
1747 pAddBssParams->rateSet.numRates = pMlmStartReq->rateSet.numRates;
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301748 vos_mem_copy(pAddBssParams->rateSet.rate,
1749 pMlmStartReq->rateSet.rate, pMlmStartReq->rateSet.numRates);
Jeff Johnson295189b2012-06-20 16:38:30 -07001750
1751 pAddBssParams->nwType = pMlmStartReq->nwType;
1752
1753 pAddBssParams->htCapable = pMlmStartReq->htCapable;
Jeff Johnsone7245742012-09-05 17:12:55 -07001754#ifdef WLAN_FEATURE_11AC
1755 pAddBssParams->vhtCapable = psessionEntry->vhtCapability;
1756 pAddBssParams->vhtTxChannelWidthSet = psessionEntry->vhtTxChannelWidthSet;
1757#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001758 pAddBssParams->htOperMode = pMlmStartReq->htOperMode;
1759 pAddBssParams->dualCTSProtection = pMlmStartReq->dualCTSProtection;
1760 pAddBssParams->txChannelWidthSet = pMlmStartReq->txChannelWidthSet;
1761
1762 pAddBssParams->currentOperChannel = pMlmStartReq->channelNumber;
Jeff Johnsone7245742012-09-05 17:12:55 -07001763 pAddBssParams->currentExtChannel = pMlmStartReq->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07001764
Chet Lanctot8cecea22014-02-11 19:09:36 -08001765#ifdef WLAN_FEATURE_11W
1766 pAddBssParams->rmfEnabled = psessionEntry->limRmfEnabled;
1767#endif
1768
Jeff Johnson295189b2012-06-20 16:38:30 -07001769 /* Update PE sessionId*/
1770 pAddBssParams->sessionId = pMlmStartReq->sessionId;
1771
1772 //Send the SSID to HAL to enable SSID matching for IBSS
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301773 vos_mem_copy(&(pAddBssParams->ssId.ssId),
1774 pMlmStartReq->ssId.ssId,
1775 pMlmStartReq->ssId.length);
Jeff Johnson295189b2012-06-20 16:38:30 -07001776 pAddBssParams->ssId.length = pMlmStartReq->ssId.length;
Jeff Johnson295189b2012-06-20 16:38:30 -07001777 pAddBssParams->bHiddenSSIDEn = pMlmStartReq->ssidHidden;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001778 limLog( pMac, LOGE, FL( "TRYING TO HIDE SSID %d" ),pAddBssParams->bHiddenSSIDEn);
Jeff Johnson295189b2012-06-20 16:38:30 -07001779 // CR309183. Disable Proxy Probe Rsp. Host handles Probe Requests. Until FW fixed.
1780 pAddBssParams->bProxyProbeRespEn = 0;
1781 pAddBssParams->obssProtEnabled = pMlmStartReq->obssProtEnabled;
1782
Jeff Johnson295189b2012-06-20 16:38:30 -07001783#if defined WLAN_FEATURE_VOWIFI
1784 pAddBssParams->maxTxPower = psessionEntry->maxTxPower;
1785#endif
1786 mlm_add_sta(pMac, &pAddBssParams->staContext,
1787 pAddBssParams->bssId, pAddBssParams->htCapable,psessionEntry);
1788
1789 pAddBssParams->status = eHAL_STATUS_SUCCESS;
1790 pAddBssParams->respReqd = 1;
1791
1792 // Set a new state for MLME
1793 psessionEntry->limMlmState = eLIM_MLM_WT_ADD_BSS_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07001794 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07001795
1796 pAddBssParams->halPersona=psessionEntry->pePersona; //pass on the session persona to hal
1797
1798 pAddBssParams->bSpectrumMgtEnabled = psessionEntry->spectrumMgtEnabled;
1799
1800#if defined WLAN_FEATURE_VOWIFI_11R
1801 pAddBssParams->extSetStaKeyParamValid = 0;
1802#endif
1803
1804 //
1805 // FIXME_GEN4
1806 // A global counter (dialog token) is required to keep track of
1807 // all PE <-> HAL communication(s)
1808 //
1809 msgQ.type = WDA_ADD_BSS_REQ;
1810 msgQ.reserved = 0;
1811 msgQ.bodyptr = pAddBssParams;
1812 msgQ.bodyval = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001813 MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
Jeff Johnson295189b2012-06-20 16:38:30 -07001814
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001815 limLog( pMac, LOGW, FL( "Sending WDA_ADD_BSS_REQ..." ));
Jeff Johnson295189b2012-06-20 16:38:30 -07001816 if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ )))
1817 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001818 limLog( pMac, LOGE, FL("Posting ADD_BSS_REQ to HAL failed, reason=%X"), retCode );
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301819 vos_mem_free(pAddBssParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07001820 return eSIR_SME_HAL_SEND_MESSAGE_FAIL;
1821 }
1822
1823 return eSIR_SME_SUCCESS;
1824}
1825
1826
1827/**
1828 * limProcessMlmStartReq()
1829 *
1830 *FUNCTION:
1831 * This function is called to process MLM_START_REQ message
1832 * from SME
1833 *
1834 *LOGIC:
1835 * 1) MLME receives LIM_MLM_START_REQ from LIM
1836 * 2) MLME sends WDA_ADD_BSS_REQ to HAL
1837 * 3) MLME changes state to eLIM_MLM_WT_ADD_BSS_RSP_STATE
1838 * MLME now waits for HAL to send WDA_ADD_BSS_RSP
1839 *
1840 *ASSUMPTIONS:
1841 *
1842 *NOTE:
1843 *
1844 * @param pMac Pointer to Global MAC structure
1845 * @param *pMsgBuf A pointer to the MLM message buffer
1846 * @return None
1847 */
1848
1849static void
1850limProcessMlmStartReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
1851{
1852 tLimMlmStartReq *pMlmStartReq;
1853 tLimMlmStartCnf mlmStartCnf;
1854 tpPESession psessionEntry = NULL;
1855
1856 if(pMsgBuf == NULL)
1857 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001858 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07001859 return;
1860 }
1861
1862 pMlmStartReq = (tLimMlmStartReq *) pMsgBuf;
1863 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmStartReq->sessionId))==NULL)
1864 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001865 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001866 mlmStartCnf.resultCode = eSIR_SME_REFUSED;
1867 goto end;
1868 }
1869
1870 if (psessionEntry->limMlmState != eLIM_MLM_IDLE_STATE)
1871 {
1872 /**
1873 * Should not have received Start req in states other than idle.
1874 * Return Start confirm with failure code.
1875 */
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001876 PELOGE(limLog(pMac, LOGE, FL("received unexpected MLM_START_REQ in state %X"),psessionEntry->limMlmState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07001877 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
1878 mlmStartCnf.resultCode = eSIR_SME_BSS_ALREADY_STARTED_OR_JOINED;
1879 goto end;
1880 }
1881
1882 #if 0
1883 if (cfgSetInt(pMac, WNI_CFG_CURRENT_CHANNEL, pMlmStartReq->channelNumber)!= eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001884 limLog(pMac, LOGP, FL("could not set CURRENT_CHANNEL at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001885
1886 pMac->lim.gLimCurrentChannelId = pMlmStartReq->channelNumber;
1887 #endif //TO SUPPORT BT-AMP
1888
1889
1890 // Update BSSID & SSID at CFG database
1891 #if 0 //We are not using the BSSID and SSID from the config file, instead we are reading form the session table
1892 if (cfgSetStr(pMac, WNI_CFG_BSSID, (tANI_U8 *) pMlmStartReq->bssId, sizeof(tSirMacAddr))
1893 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001894 limLog(pMac, LOGP, FL("could not update BSSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001895
1896
1897
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301898 vos_mem_copy( pMac->lim.gLimCurrentBssId,
Jeff Johnson295189b2012-06-20 16:38:30 -07001899 pMlmStartReq->bssId,
1900 sizeof(tSirMacAddr));
1901 #endif //TO SUPPORT BT-AMP
1902
1903 #if 0
1904 if (cfgSetStr(pMac, WNI_CFG_SSID, (tANI_U8 *) &pMlmStartReq->ssId.ssId, pMlmStartReq->ssId.length)
1905 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001906 limLog(pMac, LOGP, FL("could not update SSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001907 #endif //To SUPPORT BT-AMP
1908
1909
1910 // pMac->lim.gLimCurrentSSID.length = pMlmStartReq->ssId.length;
1911
1912 #if 0
1913 if (cfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET,
1914 (tANI_U8 *) &pMac->lim.gpLimStartBssReq->operationalRateSet.rate,
1915 pMac->lim.gpLimStartBssReq->operationalRateSet.numRates)
1916 != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001917 limLog(pMac, LOGP, FL("could not update Operational Rateset at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001918 #endif //TO SUPPORT BT-AMP
1919
1920
Jeff Johnson295189b2012-06-20 16:38:30 -07001921
Jeff Johnson295189b2012-06-20 16:38:30 -07001922#if 0 // Periodic timer for remove WPS PBC proble response entry in PE is disbaled now.
1923 if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
1924 {
1925 if(pMac->lim.limTimers.gLimWPSOverlapTimerObj.isTimerCreated == eANI_BOOLEAN_FALSE)
1926 {
1927 if (tx_timer_create(&pMac->lim.limTimers.gLimWPSOverlapTimerObj.gLimWPSOverlapTimer,
1928 "PS OVERLAP Timer",
1929 limWPSOverlapTimerHandler,
1930 SIR_LIM_WPS_OVERLAP_TIMEOUT, // expiration_input
1931 SYS_MS_TO_TICKS(LIM_WPS_OVERLAP_TIMER_MS), // initial_ticks
1932 SYS_MS_TO_TICKS(LIM_WPS_OVERLAP_TIMER_MS), // reschedule_ticks
1933 TX_AUTO_ACTIVATE /* TX_NO_ACTIVATE*/) != TX_SUCCESS)
1934 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001935 limLog(pMac, LOGP, FL("failed to create WPS overlap Timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001936 }
1937
1938 pMac->lim.limTimers.gLimWPSOverlapTimerObj.sessionId = pMlmStartReq->sessionId;
1939 pMac->lim.limTimers.gLimWPSOverlapTimerObj.isTimerCreated = eANI_BOOLEAN_TRUE;
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001940 limLog(pMac, LOGE, FL("Create WPS overlap Timer, session=%d"), pMlmStartReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07001941
1942 if (tx_timer_activate(&pMac->lim.limTimers.gLimWPSOverlapTimerObj.gLimWPSOverlapTimer) != TX_SUCCESS)
1943 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07001944 limLog(pMac, LOGP, FL("tx_timer_activate failed"));
Jeff Johnson295189b2012-06-20 16:38:30 -07001945 }
1946 }
1947 }
1948#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001949
1950
1951
1952 mlmStartCnf.resultCode = limMlmAddBss(pMac, pMlmStartReq,psessionEntry);
1953
1954end:
1955 /* Update PE session Id */
1956 mlmStartCnf.sessionId = pMlmStartReq->sessionId;
1957
1958 /// Free up buffer allocated for LimMlmScanReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05301959 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07001960
1961 //
1962 // Respond immediately to LIM, only if MLME has not been
1963 // successfully able to send WDA_ADD_BSS_REQ to HAL.
1964 // Else, LIM_MLM_START_CNF will be sent after receiving
1965 // WDA_ADD_BSS_RSP from HAL
1966 //
1967 if( eSIR_SME_SUCCESS != mlmStartCnf.resultCode )
1968 limPostSmeMessage(pMac, LIM_MLM_START_CNF, (tANI_U32 *) &mlmStartCnf);
1969} /*** limProcessMlmStartReq() ***/
1970
1971
1972/*
1973* This function checks if Scan is allowed or not.
1974* It checks each session and if any session is not in the normal state,
1975* it will return false.
1976* Note: BTAMP_STA can be in LINK_EST as well as BSS_STARTED State, so
1977* both cases are handled below.
1978*/
1979
1980static tANI_U8 __limMlmScanAllowed(tpAniSirGlobal pMac)
1981{
1982 int i;
1983
Jeff Johnson43971f52012-07-17 12:26:56 -07001984 if(pMac->lim.gLimMlmState != eLIM_MLM_IDLE_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07001985 {
1986 return FALSE;
1987 }
1988 for(i =0; i < pMac->lim.maxBssId; i++)
1989 {
1990 if(pMac->lim.gpSession[i].valid == TRUE)
1991 {
1992 if(!( ( ( (pMac->lim.gpSession[i].bssType == eSIR_INFRASTRUCTURE_MODE) ||
1993 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_STA_ROLE))&&
1994 (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE) )||
1995
1996 ( ( (pMac->lim.gpSession[i].bssType == eSIR_IBSS_MODE)||
1997 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_AP_ROLE)||
1998 (pMac->lim.gpSession[i].limSystemRole == eLIM_BT_AMP_STA_ROLE) )&&
1999 (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_BSS_STARTED_STATE) )
Jeff Johnson295189b2012-06-20 16:38:30 -07002000 || ( ( ( (pMac->lim.gpSession[i].bssType == eSIR_INFRA_AP_MODE)
2001 && ( pMac->lim.gpSession[i].pePersona == VOS_P2P_GO_MODE) )
2002 || (pMac->lim.gpSession[i].limSystemRole == eLIM_AP_ROLE) )
2003 && (pMac->lim.gpSession[i].limMlmState == eLIM_MLM_BSS_STARTED_STATE) )
Jeff Johnson295189b2012-06-20 16:38:30 -07002004 ))
2005 {
2006 return FALSE;
2007
2008 }
2009 }
2010 }
2011
2012 return TRUE;
2013}
2014
2015
2016
2017/**
2018 * limProcessMlmScanReq()
2019 *
2020 *FUNCTION:
2021 * This function is called to process MLM_SCAN_REQ message
2022 * from SME
2023 *
2024 *LOGIC:
2025 *
2026 *ASSUMPTIONS:
2027 *
2028 *NOTE:
2029 *
2030 * @param pMac Pointer to Global MAC structure
2031 * @param *pMsgBuf A pointer to the MLM message buffer
2032 * @return None
2033 */
2034
2035static void
2036limProcessMlmScanReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2037{
2038 tLimMlmScanCnf mlmScanCnf;
Maleka Vinayd500cd42012-12-10 12:37:09 -08002039 tANI_U8 i = 0;
2040 tANI_U32 val = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002041
2042 if (pMac->lim.gLimSystemInScanLearnMode)
2043 {
2044 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002045 FL("Sending START_SCAN from LIM while one req is pending"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302046 vos_mem_free(pMsgBuf);
Madan Mohan Koyyalamudid4b301b2012-10-11 14:15:54 -07002047 /*Send back a failure*/
2048 mlmScanCnf.resultCode = eSIR_SME_SCAN_FAILED;
2049 mlmScanCnf.scanResultLength = 0;
2050 limPostSmeMessage(pMac,
2051 LIM_MLM_SCAN_CNF,
2052 (tANI_U32 *) &mlmScanCnf);
Jeff Johnson295189b2012-06-20 16:38:30 -07002053 return;
2054 }
2055
2056 if(__limMlmScanAllowed(pMac) &&
2057 (((tLimMlmScanReq *) pMsgBuf)->channelList.numChannels != 0))
2058
2059 {
2060 /// Hold onto SCAN REQ criteria
2061 pMac->lim.gpLimMlmScanReq = (tLimMlmScanReq *) pMsgBuf;
2062
Abhishek Singh127a8442014-12-15 17:31:27 +05302063 limLog(pMac, LOG1, FL("Number of channels to scan are %d "),
2064 pMac->lim.gpLimMlmScanReq->channelList.numChannels);
Jeff Johnson295189b2012-06-20 16:38:30 -07002065
2066 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
2067
2068 if (pMac->lim.gpLimMlmScanReq->scanType == eSIR_ACTIVE_SCAN)
2069 pMac->lim.gLimMlmState = eLIM_MLM_WT_PROBE_RESP_STATE;
2070 else // eSIR_PASSIVE_SCAN
2071 pMac->lim.gLimMlmState = eLIM_MLM_PASSIVE_SCAN_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002072 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002073
2074 pMac->lim.gLimSystemInScanLearnMode = 1;
2075
Maleka Vinayd500cd42012-12-10 12:37:09 -08002076 /* temporary fix to handle case where NOA duration calculation is incorrect
2077 * for scanning on DFS channels */
2078
2079 pMac->lim.gTotalScanDuration = 0;
2080
2081 if (wlan_cfgGetInt(pMac, WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME, &val) != eSIR_SUCCESS)
2082 {
2083 /*
2084 * Could not get max channel value
2085 * from CFG. Log error.
2086 */
Abhishek Singh95f7b252015-10-14 14:15:35 +05302087 limLog(pMac, LOGP,
2088 FL("could not retrieve passive max channel value use def"));
2089 /* use a default value */
2090 val= WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME_STADEF;
Maleka Vinayd500cd42012-12-10 12:37:09 -08002091 }
2092
2093 for (i = 0; i < pMac->lim.gpLimMlmScanReq->channelList.numChannels; i++) {
2094 tANI_U8 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[i];
2095
Ganesh Kondabattini8f6e3b32014-08-25 16:07:54 +05302096 if (pMac->miracast_mode) {
2097 pMac->lim.gTotalScanDuration += (DEFAULT_MIN_CHAN_TIME_DURING_MIRACAST +
2098 DEFAULT_MAX_CHAN_TIME_DURING_MIRACAST);
2099 } else if (limActiveScanAllowed(pMac, channelNum)) {
Maleka Vinayd500cd42012-12-10 12:37:09 -08002100 /* Use min + max channel time to calculate the total duration of scan */
2101 pMac->lim.gTotalScanDuration += pMac->lim.gpLimMlmScanReq->minChannelTime + pMac->lim.gpLimMlmScanReq->maxChannelTime;
2102 } else {
2103 /* using the value from WNI_CFG_PASSIVE_MINIMUM_CHANNEL_TIME as is done in
2104 * void limContinuePostChannelScan(tpAniSirGlobal pMac)
2105 */
2106 pMac->lim.gTotalScanDuration += val;
2107 }
2108 }
2109
2110 /* Adding an overhead of 5ms to account for the scan messaging delays */
2111 pMac->lim.gTotalScanDuration += 5;
Jeff Johnson295189b2012-06-20 16:38:30 -07002112 limSetScanMode(pMac);
2113 }
2114 else
2115 {
2116 /**
2117 * Should not have received SCAN req in other states
2118 * OR should not have received LIM_MLM_SCAN_REQ with
2119 * zero number of channels
2120 * Log error
2121 */
2122 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05302123 FL("received unexpected MLM_SCAN_REQ in state %d OR zero number of channels: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07002124 pMac->lim.gLimMlmState, ((tLimMlmScanReq *) pMsgBuf)->channelList.numChannels);
2125 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
2126
2127 /// Free up buffer allocated for
2128 /// pMac->lim.gLimMlmScanReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302129 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07002130
2131 /// Return Scan confirm with INVALID_PARAMETERS
2132
2133 mlmScanCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2134 mlmScanCnf.scanResultLength = 0;
2135 limPostSmeMessage(pMac,
2136 LIM_MLM_SCAN_CNF,
2137 (tANI_U32 *) &mlmScanCnf);
2138 }
2139} /*** limProcessMlmScanReq() ***/
2140
Jeff Johnsone7245742012-09-05 17:12:55 -07002141#ifdef FEATURE_OEM_DATA_SUPPORT
2142static void limProcessMlmOemDataReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2143{
2144 tLimMlmOemDataRsp* pMlmOemDataRsp;
2145
2146 if (((pMac->lim.gLimMlmState == eLIM_MLM_IDLE_STATE) ||
2147 (pMac->lim.gLimMlmState == eLIM_MLM_JOINED_STATE) ||
2148 (pMac->lim.gLimMlmState == eLIM_MLM_AUTHENTICATED_STATE) ||
2149 (pMac->lim.gLimMlmState == eLIM_MLM_BSS_STARTED_STATE) ||
2150 (pMac->lim.gLimMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)))
2151 {
2152 //Hold onto the oem data request criteria
2153 pMac->lim.gpLimMlmOemDataReq = (tLimMlmOemDataReq*)pMsgBuf;
2154
2155 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
2156
2157 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
2158
2159 //Now request for link suspension
2160 limSuspendLink(pMac, eSIR_CHECK_LINK_TRAFFIC_BEFORE_SCAN, limSetOemDataReqMode, NULL);
2161 }
2162 else
2163 {
2164 /**
2165 * Should not have received oem data req in other states
2166 * Log error
2167 */
2168
Sushant Kaushik1b645382014-10-13 16:39:36 +05302169 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 -07002170
2171 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
2172
2173 /// Free up buffer allocated
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302174 vos_mem_free(pMsgBuf);
Jeff Johnsone7245742012-09-05 17:12:55 -07002175
2176 /// Return Meas confirm with INVALID_PARAMETERS
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302177 pMlmOemDataRsp = vos_mem_malloc(sizeof(tLimMlmOemDataRsp));
2178 if ( pMlmOemDataRsp != NULL)
Jeff Johnsone7245742012-09-05 17:12:55 -07002179 {
2180 limPostSmeMessage(pMac, LIM_MLM_OEM_DATA_CNF, (tANI_U32*)pMlmOemDataRsp);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302181 vos_mem_free(pMlmOemDataRsp);
Jeff Johnsone7245742012-09-05 17:12:55 -07002182 }
2183 else
2184 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002185 limLog(pMac, LOGP, FL("Could not allocate memory for pMlmOemDataRsp"));
Jeff Johnsone7245742012-09-05 17:12:55 -07002186 return;
2187 }
2188 }
2189
2190 return;
2191}
2192#endif //FEATURE_OEM_DATA_SUPPORT
Jeff Johnson295189b2012-06-20 16:38:30 -07002193
2194
2195/**
2196 * limProcessMlmPostJoinSuspendLink()
2197 *
2198 *FUNCTION:
2199 * This function is called after the suspend link while joining
2200 * off channel.
2201 *
2202 *LOGIC:
2203 * Check for suspend state.
2204 * If success, proceed with setting link state to recieve the
2205 * probe response/beacon from intended AP.
2206 * Switch to the APs channel.
2207 * On an error case, send the MLM_JOIN_CNF with error status.
2208 *
2209 *ASSUMPTIONS:
2210 *
2211 *NOTE:
2212 *
2213 * @param pMac Pointer to Global MAC structure
2214 * @param status status of suspend link.
2215 * @param ctx passed while calling suspend link(psessionEntry)
2216 * @return None
2217 */
2218static void
2219limProcessMlmPostJoinSuspendLink(tpAniSirGlobal pMac, eHalStatus status, tANI_U32 *ctx)
2220{
Jeff Johnsone7245742012-09-05 17:12:55 -07002221 tANI_U8 chanNum, secChanOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002222 tLimMlmJoinCnf mlmJoinCnf;
2223 tpPESession psessionEntry = (tpPESession)ctx;
2224 tSirLinkState linkState;
2225
2226 if( eHAL_STATUS_SUCCESS != status )
2227 {
Abhishek Singhdcbd8272014-01-09 14:16:01 +05302228 limLog(pMac, LOGE, FL("Sessionid %d Suspend link(NOTIFY_BSS) failed. "
2229 "still proceeding with join"),psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002230 }
2231 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2232 psessionEntry->limMlmState = eLIM_MLM_WT_JOIN_BEACON_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002233 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002234
Abhishek Singhdcbd8272014-01-09 14:16:01 +05302235 limLog(pMac, LOG1, FL("Sessionid %d prev lim state %d new lim state %d "
2236 "systemrole = %d"), psessionEntry->peSessionId,
2237 psessionEntry->limPrevMlmState,
2238 psessionEntry->limMlmState,psessionEntry->limSystemRole);
2239
Jeff Johnson295189b2012-06-20 16:38:30 -07002240 limDeactivateAndChangeTimer(pMac, eLIM_JOIN_FAIL_TIMER);
2241
2242 //assign appropriate sessionId to the timer object
2243 pMac->lim.limTimers.gLimJoinFailureTimer.sessionId = psessionEntry->peSessionId;
2244
2245 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 -07002246 limLog(pMac, LOG1, FL("[limProcessMlmJoinReq]: linkState:%d"),linkState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002247
2248 if (limSetLinkState(pMac, linkState,
2249 psessionEntry->pLimMlmJoinReq->bssDescription.bssId,
2250 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS )
2251 {
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302252 limLog(pMac, LOGE,
2253 FL("SessionId:%d limSetLinkState to eSIR_LINK_PREASSOC_STATE"
2254 " Failed!!"),psessionEntry->peSessionId);
2255 limPrintMacAddr(pMac,
2256 psessionEntry->pLimMlmJoinReq->bssDescription.bssId,LOGE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002257 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002258 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
2259 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002260 goto error;
2261 }
2262
2263 /** Derive channel from BSS description and store it in the CFG */
2264 // chanNum = pMac->lim.gpLimMlmJoinReq->bssDescription.channelId;
2265
2266 chanNum = psessionEntry->currentOperChannel;
Jeff Johnsone7245742012-09-05 17:12:55 -07002267 secChanOffset = psessionEntry->htSecondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002268 //store the channel switch sessionEntry in the lim global var
2269 psessionEntry->channelChangeReasonCode = LIM_SWITCH_CHANNEL_JOIN;
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08002270#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
Madan Mohan Koyyalamudi61bc5662012-11-02 14:33:10 -07002271 psessionEntry->pLimMlmReassocRetryReq = NULL;
2272#endif
Sushant Kaushikb97a0082015-08-31 12:36:45 +05302273
2274#ifdef FEATURE_WLAN_DIAG_SUPPORT
2275 limDiagEventReport(pMac, WLAN_PE_DIAG_CHANNEL_SWITCH_ANOUNCEMENT,
2276 psessionEntry, eSIR_SUCCESS, LIM_SWITCH_CHANNEL_JOIN);
2277#endif
2278
Dino Myclea7f18452014-04-24 08:55:31 +05302279 limLog(pMac, LOG1, FL("[limProcessMlmJoinReq]: suspend link success(%d) "
2280 "on sessionid: %d setting channel to: %d with secChanOffset:%d "
Abhishek Singhdcbd8272014-01-09 14:16:01 +05302281 "and maxtxPower: %d"), status, psessionEntry->peSessionId,
2282 chanNum, secChanOffset, psessionEntry->maxTxPower);
Jeff Johnsone7245742012-09-05 17:12:55 -07002283 limSetChannel(pMac, chanNum, secChanOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002284
2285 return;
2286error:
2287 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2288 mlmJoinCnf.sessionId = psessionEntry->peSessionId;
2289 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2290 limPostSmeMessage(pMac, LIM_MLM_JOIN_CNF, (tANI_U32 *) &mlmJoinCnf);
2291
2292}
2293
2294
2295
2296/**
2297 * limProcessMlmJoinReq()
2298 *
2299 *FUNCTION:
2300 * This function is called to process MLM_JOIN_REQ message
2301 * from SME
2302 *
2303 *LOGIC:
2304 * 1) Initialize LIM, HAL, DPH
2305 * 2) Configure the BSS for which the JOIN REQ was received
2306 * a) Send WDA_ADD_BSS_REQ to HAL -
2307 * This will identify the BSS that we are interested in
2308 * --AND--
2309 * Add a STA entry for the AP (in a STA context)
2310 * b) Wait for WDA_ADD_BSS_RSP
2311 * c) Send WDA_ADD_STA_REQ to HAL
2312 * This will add the "local STA" entry to the STA table
2313 * 3) Continue as before, i.e,
2314 * a) Send a PROBE REQ
2315 * b) Wait for PROBE RSP/BEACON containing the SSID that
2316 * we are interested in
2317 * c) Then start an AUTH seq
2318 * d) Followed by the ASSOC seq
2319 *
2320 *ASSUMPTIONS:
2321 *
2322 *NOTE:
2323 *
2324 * @param pMac Pointer to Global MAC structure
2325 * @param *pMsgBuf A pointer to the MLM message buffer
2326 * @return None
2327 */
2328
2329static void
2330limProcessMlmJoinReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2331{
2332 tLimMlmJoinCnf mlmJoinCnf;
2333 tANI_U8 sessionId;
2334 tpPESession psessionEntry;
2335
2336 sessionId = ((tpLimMlmJoinReq)pMsgBuf)->sessionId;
2337
2338 if((psessionEntry = peFindSessionBySessionId(pMac,sessionId))== NULL)
2339 {
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302340 limLog(pMac, LOGE, FL("SessionId:%d session does not exist"),sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002341 goto error;
2342 }
2343
2344 if (( (psessionEntry->limSystemRole != eLIM_AP_ROLE ) && (psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE )) &&
2345 ( (psessionEntry->limMlmState == eLIM_MLM_IDLE_STATE) ||
2346 (psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE)) &&
2347 (SIR_MAC_GET_ESS( ((tpLimMlmJoinReq) pMsgBuf)->bssDescription.capabilityInfo) !=
2348 SIR_MAC_GET_IBSS( ((tpLimMlmJoinReq) pMsgBuf)->bssDescription.capabilityInfo)))
2349 {
2350 #if 0
2351 if (pMac->lim.gpLimMlmJoinReq)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302352 vos_mem_free(pMac->lim.gpLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002353 #endif //TO SUPPORT BT-AMP , review 23sep
2354
2355 /// Hold onto Join request parameters
2356
2357 psessionEntry->pLimMlmJoinReq =(tpLimMlmJoinReq) pMsgBuf;
2358
2359 if( isLimSessionOffChannel(pMac, sessionId) )
2360 {
2361 //suspend link
Abhishek Singhdcbd8272014-01-09 14:16:01 +05302362 limLog(pMac, LOG1, FL("Suspend link as LimSession on sessionid %d"
2363 "is off channel"),sessionId);
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302364 if (limIsLinkSuspended(pMac))
2365 {
2366 limLog(pMac, LOGE, FL("Link is already suspended for some other"
2367 " reason. Return failure on sessionId:%d"), sessionId);
2368 goto error;
2369 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002370 limSuspendLink(pMac, eSIR_DONT_CHECK_LINK_TRAFFIC_BEFORE_SCAN,
2371 limProcessMlmPostJoinSuspendLink, (tANI_U32*)psessionEntry );
2372 }
2373 else
2374 {
2375 //No need to suspend link.
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302376 limLog(pMac,LOG1,"SessionId:%d Join request on current channel",
2377 sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002378 limProcessMlmPostJoinSuspendLink( pMac, eHAL_STATUS_SUCCESS,
2379 (tANI_U32*) psessionEntry );
2380 }
2381
2382 return;
2383 }
2384 else
2385 {
2386 /**
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302387 * Should not have received JOIN req in states other than
2388 * Idle state or on AP.
2389 * Return join confirm with invalid parameters code.
2390 */
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302391 limLog(pMac, LOGE,
Sushant Kaushik1b645382014-10-13 16:39:36 +05302392 FL("SessionId:%d Unexpected Join request for role %d state %d "),
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302393 psessionEntry->peSessionId,psessionEntry->limSystemRole,
2394 psessionEntry->limMlmState);
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302395 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -07002396 }
2397
2398error:
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302399 vos_mem_free(pMsgBuf);
2400 if (psessionEntry != NULL)
2401 psessionEntry->pLimMlmJoinReq = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07002402
Kanchanapally, Vidyullatha35570872015-03-18 17:26:57 +05302403 mlmJoinCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
2404 mlmJoinCnf.sessionId = sessionId;
2405 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2406 limPostSmeMessage(pMac, LIM_MLM_JOIN_CNF, (tANI_U32 *) &mlmJoinCnf);
Jeff Johnson295189b2012-06-20 16:38:30 -07002407} /*** limProcessMlmJoinReq() ***/
2408
2409
2410
2411/**
2412 * limProcessMlmAuthReq()
2413 *
2414 *FUNCTION:
2415 * This function is called to process MLM_AUTH_REQ message
2416 * from SME
2417 *
2418 *LOGIC:
2419 *
2420 *ASSUMPTIONS:
2421 *
2422 *NOTE:
2423 *
2424 * @param pMac Pointer to Global MAC structure
2425 * @param *pMsgBuf A pointer to the MLM message buffer
2426 * @return None
2427 */
2428
2429static void
2430limProcessMlmAuthReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2431{
2432 tANI_U32 numPreAuthContexts;
2433 tSirMacAddr currentBssId;
Jeff Johnson295189b2012-06-20 16:38:30 -07002434 tLimMlmAuthCnf mlmAuthCnf;
2435 struct tLimPreAuthNode *preAuthNode;
2436 tpDphHashNode pStaDs;
2437 tANI_U8 sessionId;
2438 tpPESession psessionEntry;
2439
2440 if(pMsgBuf == NULL)
2441 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002442 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002443 return;
2444 }
2445
2446 pMac->lim.gpLimMlmAuthReq = (tLimMlmAuthReq *) pMsgBuf;
2447 sessionId = pMac->lim.gpLimMlmAuthReq->sessionId;
2448 if((psessionEntry= peFindSessionBySessionId(pMac,sessionId) )== NULL)
2449 {
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302450 limLog(pMac, LOGP, FL("SessionId:%d Session Does not exist"),sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002451 return;
2452 }
2453
Abhishek Singhcd09b562013-12-24 16:02:20 +05302454 limLog(pMac, LOG1,FL("Process Auth Req on sessionID %d Systemrole %d"
2455 "mlmstate %d from: "MAC_ADDRESS_STR" with authtype %d"), sessionId,
2456 psessionEntry->limSystemRole,psessionEntry->limMlmState,
2457 MAC_ADDR_ARRAY(pMac->lim.gpLimMlmAuthReq->peerMacAddr),
2458 pMac->lim.gpLimMlmAuthReq->authType);
2459
2460
Jeff Johnson295189b2012-06-20 16:38:30 -07002461 /**
2462 * Expect Auth request only when:
2463 * 1. STA joined/associated with a BSS or
2464 * 2. STA is in IBSS mode
2465 * and STA is going to authenticate with a unicast
2466 * adress and requested authentication algorithm is
2467 * supported.
2468 */
2469 #if 0
2470 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2471 eSIR_SUCCESS)
2472 {
2473 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002474 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002475 }
2476 #endif //To SuppoRT BT-AMP
2477
2478 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2479
2480 if (((((psessionEntry->limSystemRole== eLIM_STA_ROLE) || (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)) &&
2481 ((psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE) ||
2482 (psessionEntry->limMlmState ==
2483 eLIM_MLM_LINK_ESTABLISHED_STATE))) ||
2484 ((psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE) &&
2485 (psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE))) &&
2486 (limIsGroupAddr(pMac->lim.gpLimMlmAuthReq->peerMacAddr)
2487 == false) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07002488 (limIsAuthAlgoSupported(
2489 pMac,
2490 pMac->lim.gpLimMlmAuthReq->authType,
2491 psessionEntry) == true)
Jeff Johnson295189b2012-06-20 16:38:30 -07002492 )
2493 {
2494 /**
2495 * This is a request for pre-authentication.
2496 * Check if there exists context already for
Jeff Johnson1250df42012-12-10 14:31:52 -08002497 * the requested peer OR
Jeff Johnson295189b2012-06-20 16:38:30 -07002498 * if this request is for the AP we're currently
2499 * associated with.
2500 * If yes, return auth confirm immediately when
2501 * requested auth type is same as the one used before.
2502 */
2503 if ((((psessionEntry->limSystemRole == eLIM_STA_ROLE) ||(psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE) )&&
2504 (psessionEntry->limMlmState ==
2505 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
2506 (((pStaDs = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable)) != NULL) &&
2507 (pMac->lim.gpLimMlmAuthReq->authType ==
2508 pStaDs->mlmStaContext.authType)) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302509 (vos_mem_compare(pMac->lim.gpLimMlmAuthReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002510 currentBssId,
2511 sizeof(tSirMacAddr)) )) ||
2512 (((preAuthNode =
2513 limSearchPreAuthList(
2514 pMac,
2515 pMac->lim.gpLimMlmAuthReq->peerMacAddr)) != NULL) &&
2516 (preAuthNode->authType ==
2517 pMac->lim.gpLimMlmAuthReq->authType)))
2518 {
Abhishek Singhcd09b562013-12-24 16:02:20 +05302519 limLog(pMac, LOG2,
2520 FL("Already have pre-auth context with peer: "MAC_ADDRESS_STR),
2521 MAC_ADDR_ARRAY(pMac->lim.gpLimMlmAuthReq->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002522
2523 mlmAuthCnf.resultCode = (tSirResultCodes)
2524 eSIR_MAC_SUCCESS_STATUS;
2525
2526
2527 goto end;
2528 }
2529 else
2530 {
2531 if (wlan_cfgGetInt(pMac, WNI_CFG_MAX_NUM_PRE_AUTH,
2532 (tANI_U32 *) &numPreAuthContexts) != eSIR_SUCCESS)
2533 {
2534 limLog(pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002535 FL("Could not retrieve NumPreAuthLimit from CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002536 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002537
2538 if (pMac->lim.gLimNumPreAuthContexts == numPreAuthContexts)
2539 {
2540 PELOGW(limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002541 FL("Number of pre-auth reached max limit"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002542
2543 /// Return Auth confirm with reject code
2544 mlmAuthCnf.resultCode =
2545 eSIR_SME_MAX_NUM_OF_PRE_AUTH_REACHED;
2546
2547 goto end;
2548 }
2549 }
2550
2551 // Delete pre-auth node if exists
2552 if (preAuthNode)
2553 limDeletePreAuthNode(pMac,
2554 pMac->lim.gpLimMlmAuthReq->peerMacAddr);
2555
Jeff Johnson295189b2012-06-20 16:38:30 -07002556 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2557 psessionEntry->limMlmState = eLIM_MLM_WT_AUTH_FRAME2_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002558 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002559
Jeff Johnsone7245742012-09-05 17:12:55 -07002560 //assign appropriate sessionId to the timer object
2561 pMac->lim.limTimers.gLimAuthFailureTimer.sessionId = sessionId;
Sushant Kaushik9e923872015-04-02 17:09:31 +05302562 /* assign appropriate sessionId to the timer object */
2563 pMac->lim.limTimers.gLimPeriodicAuthRetryTimer.sessionId = sessionId;
2564 limDeactivateAndChangeTimer(pMac, eLIM_AUTH_RETRY_TIMER);
Jeff Johnsone7245742012-09-05 17:12:55 -07002565 // Activate Auth failure timer
2566 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_AUTH_FAIL_TIMER));
Paul Zhang83289792017-02-28 18:58:52 +08002567
2568 limDoSendAuthMgmtFrame(pMac, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -07002569 return;
2570 }
2571 else
2572 {
2573 /**
2574 * Unexpected auth request.
2575 * Return Auth confirm with Invalid parameters code.
2576 */
2577 mlmAuthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2578
2579 goto end;
2580 }
2581
2582end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302583 vos_mem_copy((tANI_U8 *) &mlmAuthCnf.peerMacAddr,
2584 (tANI_U8 *) &pMac->lim.gpLimMlmAuthReq->peerMacAddr,
2585 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002586
2587 mlmAuthCnf.authType = pMac->lim.gpLimMlmAuthReq->authType;
2588 mlmAuthCnf.sessionId = sessionId;
2589
2590 /// Free up buffer allocated
2591 /// for pMac->lim.gLimMlmAuthReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302592 vos_mem_free( pMac->lim.gpLimMlmAuthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002593 pMac->lim.gpLimMlmAuthReq = NULL;
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302594 limLog(pMac,LOG1,"SessionId:%d LimPostSme LIM_MLM_AUTH_CNF ",sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002595 limPostSmeMessage(pMac, LIM_MLM_AUTH_CNF, (tANI_U32 *) &mlmAuthCnf);
2596} /*** limProcessMlmAuthReq() ***/
2597
2598
2599
2600/**
2601 * limProcessMlmAssocReq()
2602 *
2603 *FUNCTION:
2604 * This function is called to process MLM_ASSOC_REQ message
2605 * from SME
2606 *
2607 *LOGIC:
2608 *
2609 *ASSUMPTIONS:
2610 *
2611 *NOTE:
2612 *
2613 * @param pMac Pointer to Global MAC structure
2614 * @param *pMsgBuf A pointer to the MLM message buffer
2615 * @return None
2616 */
2617
2618static void
2619limProcessMlmAssocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2620{
2621 tSirMacAddr currentBssId;
2622 tLimMlmAssocReq *pMlmAssocReq;
2623 tLimMlmAssocCnf mlmAssocCnf;
2624 tpPESession psessionEntry;
2625 // tANI_U8 sessionId;
2626
2627 if(pMsgBuf == NULL)
2628 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002629 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002630 return;
2631 }
2632 pMlmAssocReq = (tLimMlmAssocReq *) pMsgBuf;
2633
2634 if( (psessionEntry = peFindSessionBySessionId(pMac,pMlmAssocReq->sessionId) )== NULL)
2635 {
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302636 limLog(pMac, LOGP,FL("SessionId:%d Session Does not exist"),
2637 pMlmAssocReq->sessionId);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302638 vos_mem_free(pMlmAssocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002639 return;
2640 }
2641
Abhishek Singhcd09b562013-12-24 16:02:20 +05302642 limLog(pMac, LOG1,FL("Process Assoc Req on sessionID %d Systemrole %d"
2643 "mlmstate %d from: "MAC_ADDRESS_STR), pMlmAssocReq->sessionId,
2644 psessionEntry->limSystemRole, psessionEntry->limMlmState,
2645 MAC_ADDR_ARRAY(pMlmAssocReq->peerMacAddr));
2646
Jeff Johnson295189b2012-06-20 16:38:30 -07002647 #if 0
2648 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2649 eSIR_SUCCESS)
2650 {
2651 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002652 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002653 }
2654 #endif //TO SUPPORT BT-AMP
2655 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2656
2657 if ( (psessionEntry->limSystemRole != eLIM_AP_ROLE && psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE) &&
2658 (psessionEntry->limMlmState == eLIM_MLM_AUTHENTICATED_STATE || psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302659 (vos_mem_compare(pMlmAssocReq->peerMacAddr, currentBssId, sizeof(tSirMacAddr))) )
Jeff Johnson295189b2012-06-20 16:38:30 -07002660 {
Jeff Johnsone7245742012-09-05 17:12:55 -07002661
Jeff Johnson295189b2012-06-20 16:38:30 -07002662 /// map the session entry pointer to the AssocFailureTimer
2663 pMac->lim.limTimers.gLimAssocFailureTimer.sessionId = pMlmAssocReq->sessionId;
2664
Jeff Johnson295189b2012-06-20 16:38:30 -07002665 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2666 psessionEntry->limMlmState = eLIM_MLM_WT_ASSOC_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002667 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302668 limLog(pMac,LOG1,"SessionId:%d Sending Assoc_Req Frame",
2669 psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002670
2671 /// Prepare and send Association request frame
2672 limSendAssocReqMgmtFrame(pMac, pMlmAssocReq,psessionEntry);
Sushant Kaushikb97a0082015-08-31 12:36:45 +05302673#ifdef FEATURE_WLAN_DIAG_SUPPORT
2674 limDiagEventReport(pMac, WLAN_PE_DIAG_ASSOC_REQ_EVENT, psessionEntry,
2675 eSIR_SUCCESS, eSIR_SUCCESS);
2676#endif
2677
Jeff Johnson295189b2012-06-20 16:38:30 -07002678
2679 //Set the link state to postAssoc, so HW can start receiving frames from AP.
2680 if ((psessionEntry->bssType == eSIR_BTAMP_STA_MODE)||
2681 ((psessionEntry->bssType == eSIR_BTAMP_AP_MODE) && (psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE)))
2682 {
2683 if(limSetLinkState(pMac, eSIR_LINK_BTAMP_POSTASSOC_STATE, currentBssId,
2684 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002685 PELOGE(limLog(pMac, LOGE, FL("Failed to set the LinkState"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002686 }
Jeff Johnsone7245742012-09-05 17:12:55 -07002687 /// Start association failure timer
2688 MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_ASSOC_FAIL_TIMER));
2689 if (tx_timer_activate(&pMac->lim.limTimers.gLimAssocFailureTimer)
2690 != TX_SUCCESS)
2691 {
2692 /// Could not start Assoc failure timer.
2693 // Log error
2694 limLog(pMac, LOGP,
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +05302695 FL("SessionId:%d could not start Association failure timer"),
2696 psessionEntry->peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07002697 // Cleanup as if assoc timer expired
2698 limProcessAssocFailureTimeout(pMac,LIM_ASSOC );
2699
2700 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002701
2702 return;
2703 }
2704 else
2705 {
2706 /**
2707 * Received Association request either in invalid state
2708 * or to a peer MAC entity whose address is different
2709 * from one that STA is currently joined with or on AP.
2710 * Return Assoc confirm with Invalid parameters code.
2711 */
2712
2713 // Log error
2714 PELOGW(limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05302715 FL("received unexpected MLM_ASSOC_CNF in state %d for role=%d, MAC addr= "
Abhishek Singhcd09b562013-12-24 16:02:20 +05302716 MAC_ADDRESS_STR), psessionEntry->limMlmState,
2717 psessionEntry->limSystemRole, MAC_ADDR_ARRAY(pMlmAssocReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002718 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
2719
2720 mlmAssocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2721 mlmAssocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2722
2723 goto end;
2724 }
2725
2726end:
2727 /* Update PE session Id*/
2728 mlmAssocCnf.sessionId = pMlmAssocReq->sessionId;
2729
2730 /// Free up buffer allocated for assocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302731 vos_mem_free(pMlmAssocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002732
2733 limPostSmeMessage(pMac, LIM_MLM_ASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
2734} /*** limProcessMlmAssocReq() ***/
2735
2736
2737
2738/**
2739 * limProcessMlmReassocReq()
2740 *
2741 *FUNCTION:
2742 * This function is called to process MLM_REASSOC_REQ message
2743 * from SME
2744 *
2745 *LOGIC:
2746 *
2747 *ASSUMPTIONS:
2748 *
2749 *NOTE:
2750 *
2751 * @param pMac Pointer to Global MAC structure
2752 * @param *pMsgBuf A pointer to the MLM message buffer
2753 * @return None
2754 */
2755
2756static void
2757limProcessMlmReassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
2758{
Jeff Johnsone7245742012-09-05 17:12:55 -07002759 tANI_U8 chanNum, secChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002760 struct tLimPreAuthNode *pAuthNode;
2761 tLimMlmReassocReq *pMlmReassocReq;
2762 tLimMlmReassocCnf mlmReassocCnf;
2763 tpPESession psessionEntry;
2764
2765 if(pMsgBuf == NULL)
2766 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002767 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002768 return;
2769 }
2770
2771 pMlmReassocReq = (tLimMlmReassocReq *) pMsgBuf;
Abhishek Singhcd09b562013-12-24 16:02:20 +05302772
Jeff Johnson295189b2012-06-20 16:38:30 -07002773 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmReassocReq->sessionId)) == NULL)
2774 {
Abhishek Singhcd09b562013-12-24 16:02:20 +05302775 limLog(pMac, LOGE,FL("Session Does not exist for given sessionId %d"),
2776 pMlmReassocReq->sessionId);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302777 vos_mem_free(pMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002778 return;
2779 }
Abhishek Singhcd09b562013-12-24 16:02:20 +05302780
2781 limLog(pMac, LOG1,FL("Process ReAssoc Req on sessionID %d Systemrole %d"
2782 "mlmstate %d from: "MAC_ADDRESS_STR), pMlmReassocReq->sessionId,
2783 psessionEntry->limSystemRole, psessionEntry->limMlmState,
2784 MAC_ADDR_ARRAY(pMlmReassocReq->peerMacAddr));
2785
Jeff Johnson295189b2012-06-20 16:38:30 -07002786 if (((psessionEntry->limSystemRole != eLIM_AP_ROLE) && (psessionEntry->limSystemRole != eLIM_BT_AMP_AP_ROLE)) &&
2787 (psessionEntry->limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE))
2788 {
2789 if (psessionEntry->pLimMlmReassocReq)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302790 vos_mem_free(psessionEntry->pLimMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002791
2792 /* Hold Re-Assoc request as part of Session, knock-out pMac */
2793 /// Hold onto Reassoc request parameters
2794 psessionEntry->pLimMlmReassocReq = pMlmReassocReq;
2795
2796 // See if we have pre-auth context with new AP
2797 pAuthNode = limSearchPreAuthList(pMac, psessionEntry->limReAssocbssId);
2798
2799 if (!pAuthNode &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302800 (!vos_mem_compare(pMlmReassocReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002801 psessionEntry->bssId,
2802 sizeof(tSirMacAddr)) ))
2803 {
2804 // Either pre-auth context does not exist AND
2805 // we are not reassociating with currently
2806 // associated AP.
2807 // Return Reassoc confirm with not authenticated
2808 mlmReassocCnf.resultCode = eSIR_SME_STA_NOT_AUTHENTICATED;
2809 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2810
2811 goto end;
2812 }
2813
2814 //assign the sessionId to the timer object
2815 pMac->lim.limTimers.gLimReassocFailureTimer.sessionId = pMlmReassocReq->sessionId;
2816
2817 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
2818 psessionEntry->limMlmState = eLIM_MLM_WT_REASSOC_RSP_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07002819 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07002820
2821#if 0
2822 // Update BSSID at CFG database
2823 if (wlan_cfgSetStr(pMac, WNI_CFG_BSSID,
2824 pMac->lim.gLimReassocBssId,
2825 sizeof(tSirMacAddr)) != eSIR_SUCCESS)
2826 {
2827 /// Could not update BSSID at CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002828 limLog(pMac, LOGP, FL("could not update BSSID at CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002829 }
2830#endif //TO SUPPORT BT-AMP
2831
2832 /* Copy Global Reassoc ID*/
2833 // sirCopyMacAddr(psessionEntry->reassocbssId,pMac->lim.gLimReAssocBssId);
2834
2835 /**
2836 * Derive channel from BSS description and
2837 * store it at CFG.
2838 */
2839
2840 chanNum = psessionEntry->limReassocChannelId;
Jeff Johnsone7245742012-09-05 17:12:55 -07002841 secChannelOffset = psessionEntry->reAssocHtSecondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07002842
2843 /* To Support BT-AMP .. read channel number from psessionEntry*/
2844 //chanNum = psessionEntry->currentOperChannel;
2845
2846 // Apply previously set configuration at HW
2847 limApplyConfiguration(pMac,psessionEntry);
2848
2849 //store the channel switch sessionEntry in the lim global var
2850 /* We have already saved the ReAssocreq Pointer abobe */
2851 //psessionEntry->pLimReAssocReq = (void *)pMlmReassocReq;
2852 psessionEntry->channelChangeReasonCode = LIM_SWITCH_CHANNEL_REASSOC;
2853
Jeff Johnsone7245742012-09-05 17:12:55 -07002854 /** Switch channel to the new Operating channel for Reassoc*/
Sushant Kaushikb97a0082015-08-31 12:36:45 +05302855
2856#ifdef FEATURE_WLAN_DIAG_SUPPORT
2857 limDiagEventReport(pMac, WLAN_PE_DIAG_CHANNEL_SWITCH_ANOUNCEMENT,
2858 psessionEntry, eSIR_SUCCESS, LIM_SWITCH_CHANNEL_REASSOC);
2859#endif
2860
Jeff Johnsone7245742012-09-05 17:12:55 -07002861 limSetChannel(pMac, chanNum, secChannelOffset, psessionEntry->maxTxPower, psessionEntry->peSessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002862
2863 return;
2864 }
2865 else
2866 {
2867 /**
2868 * Received Reassoc request in invalid state or
2869 * in AP role.Return Reassoc confirm with Invalid
2870 * parameters code.
2871 */
2872
2873 // Log error
Abhishek Singhcd09b562013-12-24 16:02:20 +05302874 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05302875 FL("received unexpected MLM_REASSOC_CNF in state %d for role=%d, "
Abhishek Singhcd09b562013-12-24 16:02:20 +05302876 "MAC addr= "
2877 MAC_ADDRESS_STR), psessionEntry->limMlmState,
2878 psessionEntry->limSystemRole,
2879 MAC_ADDR_ARRAY(pMlmReassocReq->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002880 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
2881
2882 mlmReassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2883 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2884
2885 goto end;
2886 }
2887
2888end:
2889 mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
2890 /* Update PE sessio Id*/
2891 mlmReassocCnf.sessionId = pMlmReassocReq->sessionId;
2892 /// Free up buffer allocated for reassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302893 vos_mem_free(pMlmReassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07002894 psessionEntry->pLimReAssocReq = NULL;
2895
2896 limPostSmeMessage(pMac, LIM_MLM_REASSOC_CNF, (tANI_U32 *) &mlmReassocCnf);
2897} /*** limProcessMlmReassocReq() ***/
2898
2899
2900static void
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08002901limProcessMlmDisassocReqNtf(tpAniSirGlobal pMac, eHalStatus suspendStatus, tANI_U32 *pMsgBuf)
Jeff Johnson295189b2012-06-20 16:38:30 -07002902{
2903 tANI_U16 aid;
2904 tSirMacAddr currentBssId;
2905 tpDphHashNode pStaDs;
2906 tLimMlmDisassocReq *pMlmDisassocReq;
2907 tLimMlmDisassocCnf mlmDisassocCnf;
2908 tpPESession psessionEntry;
2909 extern tANI_BOOLEAN sendDisassocFrame;
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05302910 tSirSmeDisassocRsp *pSirSmeDisassocRsp;
2911 tANI_U32 *pMsg;
2912 tANI_U8 *pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07002913
2914 if(eHAL_STATUS_SUCCESS != suspendStatus)
2915 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002916 PELOGE(limLog(pMac, LOGE,FL("Suspend Status is not success %X"), suspendStatus);)
Jeff Johnson295189b2012-06-20 16:38:30 -07002917#if 0
2918 //It can ignore the status and proceed with the disassoc processing.
2919 mlmDisassocCnf.resultCode = eSIR_SME_REFUSED;
2920 goto end;
2921#endif
2922 }
2923
2924 pMlmDisassocReq = (tLimMlmDisassocReq *) pMsgBuf;
2925
Jeff Johnson295189b2012-06-20 16:38:30 -07002926 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDisassocReq->sessionId))== NULL)
2927 {
2928
Abhishek Singhcd09b562013-12-24 16:02:20 +05302929 limLog(pMac, LOGE,
2930 FL("session does not exist for given sessionId %d"),
2931 pMlmDisassocReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002932 mlmDisassocCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
2933 goto end;
2934 }
Abhishek Singhcd09b562013-12-24 16:02:20 +05302935 limLog(pMac, LOG1,FL("Process DisAssoc Req on sessionID %d Systemrole %d"
2936 "mlmstate %d from: "MAC_ADDRESS_STR), pMlmDisassocReq->sessionId,
2937 psessionEntry->limSystemRole, psessionEntry->limMlmState,
2938 MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));
2939
Jeff Johnson295189b2012-06-20 16:38:30 -07002940 #if 0
2941 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
2942 eSIR_SUCCESS)
2943 {
2944 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07002945 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07002946 }
2947 #endif //BT-AMP Support
2948 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
2949
2950 switch (psessionEntry->limSystemRole)
2951 {
2952 case eLIM_STA_ROLE:
2953 case eLIM_BT_AMP_STA_ROLE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05302954 if ( !vos_mem_compare(pMlmDisassocReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07002955 currentBssId,
2956 sizeof(tSirMacAddr)) )
2957 {
2958 PELOGW(limLog(pMac, LOGW,
Abhishek Singhcd09b562013-12-24 16:02:20 +05302959 FL("received MLM_DISASSOC_REQ with invalid BSS id from: "
2960 MAC_ADDRESS_STR),
2961 MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07002962
2963 /// Prepare and Send LIM_MLM_DISASSOC_CNF
2964
2965 mlmDisassocCnf.resultCode =
2966 eSIR_SME_INVALID_PARAMETERS;
2967
2968 goto end;
2969 }
2970
2971 break;
2972
2973 case eLIM_STA_IN_IBSS_ROLE:
2974
2975 break;
2976
2977 default: // eLIM_AP_ROLE
2978
2979 // Fall through
2980 break;
2981
2982 } // end switch (psessionEntry->limSystemRole)
2983
2984 /**
2985 * Check if there exists a context for the peer entity
2986 * to be disassociated with.
2987 */
2988 pStaDs = dphLookupHashEntry(pMac, pMlmDisassocReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable);
2989 if ((pStaDs == NULL) ||
2990 (pStaDs &&
2991 ((pStaDs->mlmStaContext.mlmState !=
2992 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
2993 (pStaDs->mlmStaContext.mlmState !=
2994 eLIM_MLM_WT_ASSOC_CNF_STATE) &&
2995 (pStaDs->mlmStaContext.mlmState !=
2996 eLIM_MLM_ASSOCIATED_STATE))))
2997 {
2998 /**
2999 * Received LIM_MLM_DISASSOC_REQ for STA that does not
3000 * have context or in some transit state.
3001 * Log error
3002 */
Sachin Ahuja2fea3d12014-12-18 17:31:31 +05303003 limLog(pMac, LOGE,
Abhishek Singhcd09b562013-12-24 16:02:20 +05303004 FL("received MLM_DISASSOC_REQ for STA that either has no context "
3005 "or in some transit state, Addr= "
Sachin Ahuja2fea3d12014-12-18 17:31:31 +05303006 MAC_ADDRESS_STR),MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));
3007 if (pStaDs != NULL)
3008 limLog(pMac, LOGE, FL("Sta MlmState : %d"),
3009 pStaDs->mlmStaContext.mlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -07003010
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303011 /*
3012 * Disassociation response due to
3013 * host triggered disassociation
3014 */
Jeff Johnson295189b2012-06-20 16:38:30 -07003015
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303016 pSirSmeDisassocRsp = vos_mem_malloc(sizeof(tSirSmeDisassocRsp));
3017 if ( NULL == pSirSmeDisassocRsp )
3018 {
3019 // Log error
3020 limLog(pMac, LOGP,
3021 FL("call to AllocateMemory failed for eWNI_SME_DISASSOC_RSP"));
3022 return;
3023 }
3024 limLog(pMac, LOG1, FL("send eWNI_SME_DISASSOC_RSP with "
3025 "retCode: %d for "MAC_ADDRESS_STR),eSIR_SME_DEAUTH_STATUS,
3026 MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));
3027 pSirSmeDisassocRsp->messageType = eWNI_SME_DISASSOC_RSP;
3028 pSirSmeDisassocRsp->length = sizeof(tSirSmeDisassocRsp);
3029 pSirSmeDisassocRsp->sessionId = pMlmDisassocReq->sessionId;
3030 pSirSmeDisassocRsp->transactionId = 0;
3031 pSirSmeDisassocRsp->statusCode = eSIR_SME_DEAUTH_STATUS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003032
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303033 pBuf = (tANI_U8 *) pSirSmeDisassocRsp->peerMacAddr;
3034 vos_mem_copy( pBuf, pMlmDisassocReq->peerMacAddr, sizeof(tSirMacAddr));
3035
3036 pMsg = (tANI_U32*) pSirSmeDisassocRsp;
3037
3038 limSendSmeDisassocDeauthNtf( pMac, eHAL_STATUS_SUCCESS,
3039 (tANI_U32*) pMsg );
3040 return;
3041
Jeff Johnson295189b2012-06-20 16:38:30 -07003042 }
3043
3044 //pStaDs->mlmStaContext.rxPurgeReq = 1;
3045 pStaDs->mlmStaContext.disassocReason = (tSirMacReasonCodes)
3046 pMlmDisassocReq->reasonCode;
3047 pStaDs->mlmStaContext.cleanupTrigger = pMlmDisassocReq->disassocTrigger;
Mukul Sharma91947a22014-06-09 11:07:51 +05303048 /** Set state to mlm State to eLIM_MLM_WT_DEL_STA_RSP_STATE
3049 * This is to address the issue of race condition between
3050 * disconnect request from the HDD and deauth from AP
3051 */
3052 pStaDs->mlmStaContext.mlmState = eLIM_MLM_WT_DEL_STA_RSP_STATE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003053
3054 /// Send Disassociate frame to peer entity
Jeff Johnsone7245742012-09-05 17:12:55 -07003055 if (sendDisassocFrame && (pMlmDisassocReq->reasonCode != eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON))
Jeff Johnson295189b2012-06-20 16:38:30 -07003056 {
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003057 pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq = pMlmDisassocReq;
Edhar, Mahesh Kumar03cf7ff2015-11-26 17:59:29 +05303058 if (IS_FW_IN_TX_PATH_FEATURE_ENABLE)
Sandeep Puligilla25728282013-12-01 19:44:14 +05303059 {
Edhar, Mahesh Kumar03cf7ff2015-11-26 17:59:29 +05303060 limSendDisassocMgmtFrame(pMac, pMlmDisassocReq->reasonCode,
Sandeep Puligilla25728282013-12-01 19:44:14 +05303061 pMlmDisassocReq->peerMacAddr,
3062 psessionEntry, FALSE);
Edhar, Mahesh Kumar03cf7ff2015-11-26 17:59:29 +05303063 /* Send Disassoc CNF and receive path cleanup */
3064 limSendDisassocCnf(pMac);
Sandeep Puligilla25728282013-12-01 19:44:14 +05303065 }
3066 else
3067 {
Edhar, Mahesh Kumar03cf7ff2015-11-26 17:59:29 +05303068 limSendDisassocMgmtFrame(pMac, pMlmDisassocReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003069 pMlmDisassocReq->peerMacAddr,
3070 psessionEntry, TRUE);
Sandeep Puligilla25728282013-12-01 19:44:14 +05303071 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003072 }
3073 else
3074 {
Madan Mohan Koyyalamudib6af0612012-11-19 13:45:45 -08003075 /* Disassoc frame is not sent OTA */
3076 sendDisassocFrame = 1;
3077 // Receive path cleanup with dummy packet
3078 if(eSIR_SUCCESS != limCleanupRxPath(pMac, pStaDs,psessionEntry))
3079 {
3080 mlmDisassocCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
3081 goto end;
3082 }
3083 // Free up buffer allocated for mlmDisassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303084 vos_mem_free(pMlmDisassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003085 }
3086
Jeff Johnson295189b2012-06-20 16:38:30 -07003087 return;
3088
3089end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303090 vos_mem_copy((tANI_U8 *) &mlmDisassocCnf.peerMacAddr,
3091 (tANI_U8 *) pMlmDisassocReq->peerMacAddr,
3092 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003093 mlmDisassocCnf.aid = pMlmDisassocReq->aid;
3094 mlmDisassocCnf.disassocTrigger = pMlmDisassocReq->disassocTrigger;
3095
3096 /* Update PE session ID*/
3097 mlmDisassocCnf.sessionId = pMlmDisassocReq->sessionId;
3098
3099 /// Free up buffer allocated for mlmDisassocReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303100 vos_mem_free(pMlmDisassocReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003101
3102 limPostSmeMessage(pMac,
3103 LIM_MLM_DISASSOC_CNF,
3104 (tANI_U32 *) &mlmDisassocCnf);
3105}
3106
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003107tANI_BOOLEAN limCheckDisassocDeauthAckPending(tpAniSirGlobal pMac,
3108 tANI_U8 *staMac
3109 )
3110{
3111 tLimMlmDisassocReq *pMlmDisassocReq;
3112 tLimMlmDeauthReq *pMlmDeauthReq;
3113 pMlmDisassocReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq;
3114 pMlmDeauthReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq;
3115 if (
3116 (pMlmDisassocReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303117 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003118 (tANI_U8 *) &pMlmDisassocReq->peerMacAddr,
3119 sizeof(tSirMacAddr))))
3120 ||
3121 (pMlmDeauthReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303122 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003123 (tANI_U8 *) &pMlmDeauthReq->peerMacAddr,
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303124 sizeof(tSirMacAddr))))
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003125 )
3126 {
Srinivas Girigowdac03c5a82013-07-01 13:44:54 -07003127 PELOG1(limLog(pMac, LOG1, FL("Disassoc/Deauth ack pending"));)
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003128 return eANI_BOOLEAN_TRUE;
3129 }
3130 else
3131 {
Srinivas Girigowdac03c5a82013-07-01 13:44:54 -07003132 PELOG1(limLog(pMac, LOG1, FL("Disassoc/Deauth Ack not pending"));)
Madan Mohan Koyyalamudi25b6f8b2012-12-04 16:17:31 -08003133 return eANI_BOOLEAN_FALSE;
3134 }
3135}
3136
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003137void limCleanUpDisassocDeauthReq(tpAniSirGlobal pMac,
3138 tANI_U8 *staMac,
3139 tANI_BOOLEAN cleanRxPath)
3140{
3141 tLimMlmDisassocReq *pMlmDisassocReq;
3142 tLimMlmDeauthReq *pMlmDeauthReq;
3143 pMlmDisassocReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq;
3144 if (pMlmDisassocReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303145 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003146 (tANI_U8 *) &pMlmDisassocReq->peerMacAddr,
3147 sizeof(tSirMacAddr))))
3148 {
3149 if (cleanRxPath)
3150 {
3151 limProcessDisassocAckTimeout(pMac);
3152 }
3153 else
3154 {
3155 if (tx_timer_running(&pMac->lim.limTimers.gLimDisassocAckTimer))
3156 {
3157 limDeactivateAndChangeTimer(pMac, eLIM_DISASSOC_ACK_TIMER);
3158 }
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303159 vos_mem_free(pMlmDisassocReq);
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003160 pMac->lim.limDisassocDeauthCnfReq.pMlmDisassocReq = NULL;
3161 }
3162 }
3163
3164 pMlmDeauthReq = pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq;
3165 if (pMlmDeauthReq &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303166 (vos_mem_compare((tANI_U8 *) staMac,
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003167 (tANI_U8 *) &pMlmDeauthReq->peerMacAddr,
3168 sizeof(tSirMacAddr))))
3169 {
3170 if (cleanRxPath)
3171 {
3172 limProcessDeauthAckTimeout(pMac);
3173 }
3174 else
3175 {
3176 if (tx_timer_running(&pMac->lim.limTimers.gLimDeauthAckTimer))
3177 {
3178 limDeactivateAndChangeTimer(pMac, eLIM_DEAUTH_ACK_TIMER);
3179 }
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303180 vos_mem_free(pMlmDeauthReq);
Madan Mohan Koyyalamudia67d4332012-11-29 11:35:23 -08003181 pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = NULL;
3182 }
3183 }
3184}
3185
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003186void limProcessDisassocAckTimeout(tpAniSirGlobal pMac)
3187{
Abhishek Singhcd09b562013-12-24 16:02:20 +05303188 limLog(pMac, LOG1, FL(""));
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003189 limSendDisassocCnf(pMac);
3190}
3191
Jeff Johnson295189b2012-06-20 16:38:30 -07003192/**
3193 * limProcessMlmDisassocReq()
3194 *
3195 *FUNCTION:
3196 * This function is called to process MLM_DISASSOC_REQ message
3197 * from SME
3198 *
3199 *LOGIC:
3200 *
3201 *ASSUMPTIONS:
3202 *
3203 *NOTE:
3204 *
3205 * @param pMac Pointer to Global MAC structure
3206 * @param *pMsgBuf A pointer to the MLM message buffer
3207 * @return None
3208 */
3209
3210static void
3211limProcessMlmDisassocReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3212{
Jeff Johnson295189b2012-06-20 16:38:30 -07003213 tLimMlmDisassocReq *pMlmDisassocReq;
Jeff Johnson295189b2012-06-20 16:38:30 -07003214
3215 if(pMsgBuf == NULL)
3216 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003217 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003218 return;
3219 }
3220
3221 pMlmDisassocReq = (tLimMlmDisassocReq *) pMsgBuf;
Kanchanapally, Vidyullathac796fc62015-03-17 10:45:28 +05303222
Abhishek Singhcd09b562013-12-24 16:02:20 +05303223 limLog(pMac, LOG1,FL("Process DisAssoc Req on sessionID %d "
3224 "from: "MAC_ADDRESS_STR), pMlmDisassocReq->sessionId,
3225 MAC_ADDR_ARRAY(pMlmDisassocReq->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003226
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003227 limProcessMlmDisassocReqNtf( pMac, eHAL_STATUS_SUCCESS, (tANI_U32*) pMsgBuf );
Madan Mohan Koyyalamudib6af0612012-11-19 13:45:45 -08003228
Jeff Johnson295189b2012-06-20 16:38:30 -07003229} /*** limProcessMlmDisassocReq() ***/
3230
3231static void
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003232limProcessMlmDeauthReqNtf(tpAniSirGlobal pMac, eHalStatus suspendStatus, tANI_U32 *pMsgBuf)
Jeff Johnson295189b2012-06-20 16:38:30 -07003233{
3234 tANI_U16 aid;
3235 tSirMacAddr currentBssId;
3236 tpDphHashNode pStaDs;
3237 struct tLimPreAuthNode *pAuthNode;
3238 tLimMlmDeauthReq *pMlmDeauthReq;
3239 tLimMlmDeauthCnf mlmDeauthCnf;
3240 tpPESession psessionEntry;
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303241 tSirSmeDeauthRsp *pSirSmeDeauthRsp;
3242 tANI_U8 *pBuf;
3243 tANI_U32 *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -07003244
3245
3246 if(eHAL_STATUS_SUCCESS != suspendStatus)
3247 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003248 PELOGE(limLog(pMac, LOGE,FL("Suspend Status is not success %X"), suspendStatus);)
Jeff Johnson295189b2012-06-20 16:38:30 -07003249#if 0
3250 //It can ignore the status and proceed with the disassoc processing.
3251 mlmDisassocCnf.resultCode = eSIR_SME_REFUSED;
3252 goto end;
3253#endif
3254 }
3255
3256 pMlmDeauthReq = (tLimMlmDeauthReq *) pMsgBuf;
3257
3258 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDeauthReq->sessionId))== NULL)
3259 {
3260
Abhishek Singhcd09b562013-12-24 16:02:20 +05303261 limLog(pMac, LOGE, FL("session does not exist for given sessionId %d"),
3262 pMlmDeauthReq->sessionId);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303263 vos_mem_free(pMlmDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003264 return;
3265 }
Abhishek Singhcd09b562013-12-24 16:02:20 +05303266 limLog(pMac, LOG1,FL("Process Deauth Req on sessionID %d Systemrole %d"
3267 "mlmstate %d from: "MAC_ADDRESS_STR), pMlmDeauthReq->sessionId,
3268 psessionEntry->limSystemRole, psessionEntry->limMlmState,
3269 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003270 #if 0
3271 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, currentBssId, &cfg) !=
3272 eSIR_SUCCESS)
3273 {
3274 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003275 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003276 }
3277 #endif //SUPPORT BT-AMP
3278 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3279
3280 switch (psessionEntry->limSystemRole)
3281 {
3282 case eLIM_STA_ROLE:
3283 case eLIM_BT_AMP_STA_ROLE:
3284 switch (psessionEntry->limMlmState)
3285 {
3286 case eLIM_MLM_IDLE_STATE:
3287 // Attempting to Deauthenticate
3288 // with a pre-authenticated peer.
3289 // Deauthetiate with peer if there
3290 // exists a pre-auth context below.
3291 break;
3292
3293 case eLIM_MLM_AUTHENTICATED_STATE:
3294 case eLIM_MLM_WT_ASSOC_RSP_STATE:
3295 case eLIM_MLM_LINK_ESTABLISHED_STATE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303296 if (!vos_mem_compare(pMlmDeauthReq->peerMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07003297 currentBssId,
3298 sizeof(tSirMacAddr)) )
3299 {
Abhishek Singhcd09b562013-12-24 16:02:20 +05303300 limLog(pMac, LOGE,
3301 FL("received MLM_DEAUTH_REQ with invalid BSS id "
3302 "Peer MAC: "MAC_ADDRESS_STR " CFG BSSID Addr : "
3303 MAC_ADDRESS_STR),
3304 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr),
3305 MAC_ADDR_ARRAY(currentBssId));
Jeff Johnson295189b2012-06-20 16:38:30 -07003306
3307 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3308
3309 mlmDeauthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3310
3311 goto end;
3312 }
3313
3314 if ((psessionEntry->limMlmState ==
3315 eLIM_MLM_AUTHENTICATED_STATE) ||
3316 (psessionEntry->limMlmState ==
3317 eLIM_MLM_WT_ASSOC_RSP_STATE))
3318 {
3319 // Send Deauthentication frame
3320 // to peer entity
3321 limSendDeauthMgmtFrame(
3322 pMac,
3323 pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003324 pMlmDeauthReq->peerMacAddr,
3325 psessionEntry, FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003326
3327 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3328 mlmDeauthCnf.resultCode = eSIR_SME_SUCCESS;
3329 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003330 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003331 goto end;
3332 }
3333 else
3334 {
3335 // LINK_ESTABLISED_STATE
3336 // Cleanup RX & TX paths
3337 // below
3338 }
3339
3340 break;
3341
3342 default:
3343
3344 PELOGW(limLog(pMac, LOGW,
Abhishek Singhcd09b562013-12-24 16:02:20 +05303345 FL("received MLM_DEAUTH_REQ with in state %d for peer "MAC_ADDRESS_STR),
3346 psessionEntry->limMlmState,MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003347 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
3348
3349 /// Prepare and Send LIM_MLM_DEAUTH_CNF
3350 mlmDeauthCnf.resultCode =
3351 eSIR_SME_STA_NOT_AUTHENTICATED;
3352
3353 goto end;
3354 }
3355
3356 break;
3357
3358 case eLIM_STA_IN_IBSS_ROLE:
Abhishek Singh92fbac22015-03-24 17:57:36 +05303359 limLog(pMac, LOGE,
3360 FL("received MLM_DEAUTH_REQ IBSS Mode "));
3361 mlmDeauthCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3362 goto end;
Jeff Johnson295189b2012-06-20 16:38:30 -07003363 default: // eLIM_AP_ROLE
3364 break;
3365
3366 } // end switch (psessionEntry->limSystemRole)
3367
3368 /**
3369 * Check if there exists a context for the peer entity
3370 * to be deauthenticated with.
3371 */
3372 pStaDs = dphLookupHashEntry(pMac, pMlmDeauthReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable);
3373
3374 if (pStaDs == NULL)
3375 {
3376 /// Check if there exists pre-auth context for this STA
3377 pAuthNode = limSearchPreAuthList(pMac,
3378 pMlmDeauthReq->peerMacAddr);
3379
3380 if (pAuthNode == NULL)
3381 {
3382 /**
3383 * Received DEAUTH REQ for a STA that is neither
3384 * Associated nor Pre-authenticated. Log error,
3385 * Prepare and Send LIM_MLM_DEAUTH_CNF
3386 */
3387 PELOGW(limLog(pMac, LOGW,
Abhishek Singhcd09b562013-12-24 16:02:20 +05303388 FL("received MLM_DEAUTH_REQ in mlme state %d for STA that "
3389 "does not have context, Addr="MAC_ADDRESS_STR),
3390 psessionEntry->limMlmState,
3391 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003392
3393 mlmDeauthCnf.resultCode =
3394 eSIR_SME_STA_NOT_AUTHENTICATED;
3395 }
3396 else
3397 {
3398 mlmDeauthCnf.resultCode = eSIR_SME_SUCCESS;
3399
3400 /// Delete STA from pre-auth STA list
3401 limDeletePreAuthNode(pMac, pMlmDeauthReq->peerMacAddr);
3402
3403 /// Send Deauthentication frame to peer entity
3404 limSendDeauthMgmtFrame(pMac,
3405 pMlmDeauthReq->reasonCode,
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003406 pMlmDeauthReq->peerMacAddr,
3407 psessionEntry, FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003408 }
3409
3410 goto end;
3411 }
3412 else if ((pStaDs->mlmStaContext.mlmState !=
3413 eLIM_MLM_LINK_ESTABLISHED_STATE) &&
3414 (pStaDs->mlmStaContext.mlmState !=
3415 eLIM_MLM_WT_ASSOC_CNF_STATE))
3416 {
3417 /**
3418 * Received LIM_MLM_DEAUTH_REQ for STA that is n
3419 * some transit state. Log error.
3420 */
3421 PELOGW(limLog(pMac, LOGW,
Abhishek Singhcd09b562013-12-24 16:02:20 +05303422 FL("received MLM_DEAUTH_REQ for STA that either has no context or in some transit state, Addr="
3423 MAC_ADDRESS_STR),MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003424
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303425 /*
3426 * Deauthentication response to host triggered
3427 * deauthentication.
3428 */
3429 pSirSmeDeauthRsp = vos_mem_malloc(sizeof(tSirSmeDeauthRsp));
3430 if ( NULL == pSirSmeDeauthRsp )
3431 {
3432 // Log error
3433 limLog(pMac, LOGP,
3434 FL("call to AllocateMemory failed for eWNI_SME_DEAUTH_RSP"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003435
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303436 return;
3437 }
3438 limLog(pMac, LOG1, FL("send eWNI_SME_DEAUTH_RSP with "
3439 "retCode: %d for"MAC_ADDRESS_STR),eSIR_SME_DEAUTH_STATUS,
3440 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));
3441 pSirSmeDeauthRsp->messageType = eWNI_SME_DEAUTH_RSP;
3442 pSirSmeDeauthRsp->length = sizeof(tSirSmeDeauthRsp);
3443 pSirSmeDeauthRsp->statusCode = eSIR_SME_DEAUTH_STATUS;
3444 pSirSmeDeauthRsp->sessionId = pMlmDeauthReq->sessionId;
3445 pSirSmeDeauthRsp->transactionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003446
Padma, Santhosh Kumar05600d32015-07-24 13:00:57 +05303447 pBuf = (tANI_U8 *) pSirSmeDeauthRsp->peerMacAddr;
3448 vos_mem_copy( pBuf, pMlmDeauthReq->peerMacAddr, sizeof(tSirMacAddr));
3449
3450 pMsg = (tANI_U32*)pSirSmeDeauthRsp;
3451
3452 limSendSmeDisassocDeauthNtf( pMac, eHAL_STATUS_SUCCESS,
3453 (tANI_U32*) pMsg );
3454
3455 return;
3456
Jeff Johnson295189b2012-06-20 16:38:30 -07003457 }
3458
3459 //pStaDs->mlmStaContext.rxPurgeReq = 1;
3460 pStaDs->mlmStaContext.disassocReason = (tSirMacReasonCodes)
3461 pMlmDeauthReq->reasonCode;
3462 pStaDs->mlmStaContext.cleanupTrigger = pMlmDeauthReq->deauthTrigger;
3463
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003464 pMac->lim.limDisassocDeauthCnfReq.pMlmDeauthReq = pMlmDeauthReq;
Abhishek Singh94152932014-01-16 19:04:51 +05303465
3466 /* Set state to mlm State to eLIM_MLM_WT_DEL_STA_RSP_STATE
3467 * This is to address the issue of race condition between
3468 * disconnect request from the HDD and disassoc from
3469 * inactivity timer. This will make sure that we will not
3470 * process disassoc if deauth is in progress for the station
3471 * and thus mlmStaContext.cleanupTrigger will not be overwritten.
3472 */
3473 pStaDs->mlmStaContext.mlmState = eLIM_MLM_WT_DEL_STA_RSP_STATE;
3474
Jeff Johnson295189b2012-06-20 16:38:30 -07003475 /// Send Deauthentication frame to peer entity
Kanchanapally, Vidyullathaf9426e52013-12-24 17:28:54 +05303476 /* If FW_IN_TX_PATH feature is enabled
3477 do not wait for ACK */
3478 if( IS_FW_IN_TX_PATH_FEATURE_ENABLE )
3479 {
3480 limSendDeauthMgmtFrame(pMac, pMlmDeauthReq->reasonCode,
3481 pMlmDeauthReq->peerMacAddr,
3482 psessionEntry, FALSE);
3483
3484 /* Send Deauth CNF and receive path cleanup */
3485 limSendDeauthCnf(pMac);
3486 }
3487 else
3488 {
3489 limSendDeauthMgmtFrame(pMac, pMlmDeauthReq->reasonCode,
3490 pMlmDeauthReq->peerMacAddr,
3491 psessionEntry, TRUE);
3492 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003493
3494 return;
3495
3496end:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303497 vos_mem_copy((tANI_U8 *) &mlmDeauthCnf.peerMacAddr,
3498 (tANI_U8 *) pMlmDeauthReq->peerMacAddr,
3499 sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07003500 mlmDeauthCnf.deauthTrigger = pMlmDeauthReq->deauthTrigger;
3501 mlmDeauthCnf.aid = pMlmDeauthReq->aid;
3502 mlmDeauthCnf.sessionId = pMlmDeauthReq->sessionId;
3503
3504 // Free up buffer allocated
3505 // for mlmDeauthReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303506 vos_mem_free(pMlmDeauthReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003507
3508 limPostSmeMessage(pMac,
3509 LIM_MLM_DEAUTH_CNF,
3510 (tANI_U32 *) &mlmDeauthCnf);
3511
3512}
3513
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003514
3515void limProcessDeauthAckTimeout(tpAniSirGlobal pMac)
3516{
Abhishek Singhcd09b562013-12-24 16:02:20 +05303517 limLog(pMac, LOG1, FL(""));
Madan Mohan Koyyalamudi521ff192012-11-15 17:13:08 -08003518 limSendDeauthCnf(pMac);
3519}
3520
Abhishek Singh550aa8c2017-10-30 17:34:53 +05303521void lim_process_ap_ecsa_timeout(tpAniSirGlobal mac_ctx)
3522{
3523 tSirMsgQ msg = {0};
3524 struct sir_ecsa_ie_complete_ind *ecsa_ie_cmp_ind;
3525 tpPESession session;
3526
3527 session = peFindSessionBySessionId(mac_ctx,
3528 mac_ctx->lim.limTimers.g_lim_ap_ecsa_timer.sessionId);
3529
3530 if(!session)
3531 {
3532 limLog(mac_ctx, LOGE, FL("session does not exist for given sessionId %d"),
3533 mac_ctx->lim.limTimers.g_lim_ap_ecsa_timer.sessionId);
3534 return;
3535 }
3536 limLog(mac_ctx, LOG1, FL("session id %d switch count %d"),
3537 mac_ctx->lim.limTimers.g_lim_ap_ecsa_timer.sessionId,
3538 session->gLimChannelSwitch.switchCount);
3539 /*
3540 * For each beacon interval decrement switch count to use proper value
3541 * in probe resp sent by host. Once it becomes 0 send tx complete
3542 * indication to SME.
3543 */
3544 if (session->gLimChannelSwitch.switchCount > 0) {
3545 session->gLimChannelSwitch.switchCount--;
Abhishek Singh449c5372017-12-19 17:21:20 +05303546 lim_send_chan_switch_action_frame(mac_ctx,
3547 session->gLimChannelSwitch.primaryChannel, session);
Abhishek Singh550aa8c2017-10-30 17:34:53 +05303548 mac_ctx->lim.limTimers.g_lim_ap_ecsa_timer.sessionId =
3549 session->peSessionId;
3550 limDeactivateAndChangeTimer(mac_ctx, eLIM_AP_ECSA_TIMER);
3551
3552 if (tx_timer_activate(&mac_ctx->lim.limTimers.g_lim_ap_ecsa_timer) !=
3553 TX_SUCCESS)
3554 {
3555 limLog(mac_ctx, LOGE, FL("Couldn't activate g_lim_ap_ecsa_timer"));
3556 lim_process_ap_ecsa_timeout(mac_ctx);
3557 }
3558 return;
3559 }
3560
3561 session->include_ecsa_ie = false;
3562 session->include_wide_ch_bw_ie = false;
3563
3564 ecsa_ie_cmp_ind = vos_mem_malloc(sizeof(*ecsa_ie_cmp_ind));
3565 if(!ecsa_ie_cmp_ind)
3566 {
3567 limLog(mac_ctx, LOGE, FL("failed to allocate ecsa_ie_cmp_ind"));
3568 return;
3569 }
3570 ecsa_ie_cmp_ind->session_id = session->smeSessionId;
3571
3572 msg.type = eWNI_SME_ECSA_IE_BEACON_COMP_IND;
3573 msg.bodyptr = ecsa_ie_cmp_ind;
3574 limSysProcessMmhMsgApi(mac_ctx, &msg, ePROT);
3575 return;
3576}
3577
3578void lim_send_sme_ap_channel_switch_resp(tpAniSirGlobal mac_ctx,
3579 tpPESession session, tpSwitchChannelParams chan_params)
3580{
3581 tSirMsgQ msg = {0};
3582 struct sir_channel_chanege_rsp *params;
3583
3584 params = vos_mem_malloc(sizeof(*params));
3585 if (!params) {
3586 limLog(mac_ctx, LOGE, FL("AllocateMemory failed for pSmeSwithChnlParams"));
3587 return;
3588 }
3589
3590 params->sme_session_id = session->smeSessionId;
3591 params->new_channel = chan_params->channelNumber;
3592 params->status = chan_params->status;
3593
3594 msg.type = eWNI_SME_ECSA_CHAN_CHANGE_RSP;
3595 msg.bodyptr = params;
3596 msg.bodyval = 0;
3597 limSysProcessMmhMsgApi(mac_ctx, &msg, ePROT);
3598
3599 if (chan_params->channelNumber == session->currentOperChannel) {
3600 limApplyConfiguration(mac_ctx, session);
3601 limSendBeaconInd(mac_ctx, session);
3602 } else {
3603 limLog(mac_ctx, LOGE, FL("channel switch resp chan %d and session channel doesnt match %d"),
3604 chan_params->channelNumber, session->currentOperChannel);
3605 }
3606
3607 return;
3608}
3609
3610
Jeff Johnson295189b2012-06-20 16:38:30 -07003611/**
3612 * limProcessMlmDeauthReq()
3613 *
3614 *FUNCTION:
3615 * This function is called to process MLM_DEAUTH_REQ message
3616 * from SME
3617 *
3618 *LOGIC:
3619 *
3620 *ASSUMPTIONS:
3621 *
3622 *NOTE:
3623 *
3624 * @param pMac Pointer to Global MAC structure
3625 * @param *pMsgBuf A pointer to the MLM message buffer
3626 * @return None
3627 */
3628
3629static void
3630limProcessMlmDeauthReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3631{
3632// tANI_U16 aid;
3633// tSirMacAddr currentBssId;
3634// tpDphHashNode pStaDs;
3635// struct tLimPreAuthNode *pAuthNode;
3636 tLimMlmDeauthReq *pMlmDeauthReq;
3637// tLimMlmDeauthCnf mlmDeauthCnf;
3638 tpPESession psessionEntry;
3639
3640 if(pMsgBuf == NULL)
3641 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003642 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003643 return;
3644 }
3645
3646 pMlmDeauthReq = (tLimMlmDeauthReq *) pMsgBuf;
3647
Abhishek Singhcd09b562013-12-24 16:02:20 +05303648 limLog(pMac, LOG1,FL("Process Deauth Req on sessionID %d "
3649 "from: "MAC_ADDRESS_STR), pMlmDeauthReq->sessionId,
3650 MAC_ADDR_ARRAY(pMlmDeauthReq->peerMacAddr));
3651
Jeff Johnson295189b2012-06-20 16:38:30 -07003652 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDeauthReq->sessionId))== NULL)
3653 {
3654
Abhishek Singhcd09b562013-12-24 16:02:20 +05303655 limLog(pMac, LOGE, FL("session does not exist for given sessionId %d"),
3656 pMlmDeauthReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07003657 return;
3658 }
Madan Mohan Koyyalamudi27ecc282012-11-06 15:07:28 -08003659 limProcessMlmDeauthReqNtf( pMac, eHAL_STATUS_SUCCESS, (tANI_U32*) pMsgBuf );
3660
Jeff Johnson295189b2012-06-20 16:38:30 -07003661} /*** limProcessMlmDeauthReq() ***/
3662
3663
3664
3665/**
3666 * @function : limProcessMlmSetKeysReq()
3667 *
3668 * @brief : This function is called to process MLM_SETKEYS_REQ message
3669 * from SME
3670 *
3671 *LOGIC:
3672 *
3673 *ASSUMPTIONS:
3674 *
3675 *NOTE:
3676 *
3677 * @param pMac Pointer to Global MAC structure
3678 * @param *pMsgBuf A pointer to the MLM message buffer
3679 * @return None
3680 */
3681
3682static void
3683limProcessMlmSetKeysReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3684{
3685tANI_U16 aid;
3686tANI_U16 staIdx = 0;
3687tANI_U32 defaultKeyId = 0;
3688tSirMacAddr currentBssId;
3689tpDphHashNode pStaDs;
3690tLimMlmSetKeysReq *pMlmSetKeysReq;
3691tLimMlmSetKeysCnf mlmSetKeysCnf;
3692tpPESession psessionEntry;
3693
3694 if(pMsgBuf == NULL)
3695 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003696 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003697 return;
3698 }
3699
3700
3701 pMlmSetKeysReq = (tLimMlmSetKeysReq *) pMsgBuf;
3702 // Hold onto the SetKeys request parameters
3703 pMac->lim.gpLimMlmSetKeysReq = (void *) pMlmSetKeysReq;
3704
3705 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmSetKeysReq->sessionId))== NULL)
3706 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003707 PELOGE(limLog(pMac, LOGE,FL("session does not exist for given sessionId"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003708 return;
3709 }
3710
3711 limLog( pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003712 FL( "Received MLM_SETKEYS_REQ with parameters:"
Jeff Johnson295189b2012-06-20 16:38:30 -07003713 "AID [%d], ED Type [%d], # Keys [%d] & Peer MAC Addr - "),
3714 pMlmSetKeysReq->aid,
3715 pMlmSetKeysReq->edType,
3716 pMlmSetKeysReq->numKeys );
3717 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3718
3719 #if 0
3720 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac, WNI_CFG_BSSID, currentBssId, &cfg )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003721 limLog( pMac, LOGP, FL("Could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003722 return;
3723 }
3724 #endif //TO SUPPORT BT-AMP
3725 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3726
3727 switch( psessionEntry->limSystemRole ) {
3728 case eLIM_STA_ROLE:
3729 case eLIM_BT_AMP_STA_ROLE:
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003730 //In case of TDLS, peerMac address need not be BssId. Skip this check
3731 //if TDLS is enabled.
3732#ifndef FEATURE_WLAN_TDLS
Jeff Johnson295189b2012-06-20 16:38:30 -07003733 if((!limIsAddrBC( pMlmSetKeysReq->peerMacAddr ) ) &&
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303734 (!vos_mem_compare(pMlmSetKeysReq->peerMacAddr,
3735 currentBssId, sizeof(tSirMacAddr))) ){
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003736 limLog( pMac, LOGW, FL("Received MLM_SETKEYS_REQ with invalid BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003737 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3738
3739 // Prepare and Send LIM_MLM_SETKEYS_CNF with error code
3740 mlmSetKeysCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3741 goto end;
3742 }
Mohit Khanna698ba2a2012-12-04 15:08:18 -08003743#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003744 // Fall thru' & 'Plumb' keys below
3745 break;
3746 case eLIM_STA_IN_IBSS_ROLE:
3747 default: // others
3748 // Fall thru...
3749 break;
3750 }
3751
3752 /**
3753 * Use the "unicast" parameter to determine if the "Group Keys"
3754 * are being set.
3755 * pMlmSetKeysReq->key.unicast = 0 -> Multicast/broadcast
3756 * pMlmSetKeysReq->key.unicast - 1 -> Unicast keys are being set
3757 */
3758 if( limIsAddrBC( pMlmSetKeysReq->peerMacAddr )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003759 limLog( pMac, LOG1, FL("Trying to set Group Keys...%d "), pMlmSetKeysReq->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07003760 /** When trying to set Group Keys for any
3761 * security mode other than WEP, use the
3762 * STA Index corresponding to the AP...
3763 */
3764 switch( pMlmSetKeysReq->edType ) {
3765 case eSIR_ED_CCMP:
3766
3767#ifdef WLAN_FEATURE_11W
3768 case eSIR_ED_AES_128_CMAC:
3769#endif
3770 staIdx = psessionEntry->staId;
3771 break;
3772
3773 default:
3774 break;
3775 }
3776 }else {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003777 limLog( pMac, LOG1, FL("Trying to set Unicast Keys..."));
Jeff Johnson295189b2012-06-20 16:38:30 -07003778 /**
3779 * Check if there exists a context for the
3780 * peer entity for which keys need to be set.
3781 */
3782
3783
3784 pStaDs = dphLookupHashEntry( pMac, pMlmSetKeysReq->peerMacAddr, &aid , &psessionEntry->dph.dphHashTable);
3785
Jeff Johnson295189b2012-06-20 16:38:30 -07003786 if ((pStaDs == NULL) ||
3787 ((pStaDs->mlmStaContext.mlmState != eLIM_MLM_LINK_ESTABLISHED_STATE) && (psessionEntry->limSystemRole != eLIM_AP_ROLE))) {
Jeff Johnson295189b2012-06-20 16:38:30 -07003788 /**
3789 * Received LIM_MLM_SETKEYS_REQ for STA
3790 * that does not have context or in some
3791 * transit state. Log error.
3792 */
3793 limLog( pMac, LOG1,
3794 FL("Received MLM_SETKEYS_REQ for STA that either has no context or in some transit state, Addr = "));
3795 limPrintMacAddr( pMac, pMlmSetKeysReq->peerMacAddr, LOGW );
3796
3797 // Prepare and Send LIM_MLM_SETKEYS_CNF
3798 mlmSetKeysCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3799 goto end;
3800 } else
3801 staIdx = pStaDs->staIndex;
3802 }
3803
3804 if ((pMlmSetKeysReq->numKeys == 0) && (pMlmSetKeysReq->edType != eSIR_ED_NONE)) {
Jeff Johnsone7245742012-09-05 17:12:55 -07003805 //
3806 // Broadcast/Multicast Keys (for WEP!!) are NOT sent
3807 // via this interface!!
3808 //
3809 // This indicates to HAL that the WEP Keys need to be
3810 // extracted from the CFG and applied to hardware
3811 defaultKeyId = 0xff;
3812 }else if(pMlmSetKeysReq->key[0].keyId &&
3813 ((pMlmSetKeysReq->edType == eSIR_ED_WEP40) ||
3814 (pMlmSetKeysReq->edType == eSIR_ED_WEP104))){
3815 /* If the Key Id is non zero and encryption mode is WEP,
3816 * the key index is coming from the upper layers so that key only
3817 * need to be used as the default tx key, This is being used only
3818 * in case of WEP mode in HAL */
3819 defaultKeyId = pMlmSetKeysReq->key[0].keyId;
3820 }else
3821 defaultKeyId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003822
3823 limLog( pMac, LOG1,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003824 FL( "Trying to set keys for STA Index [%d], using defaultKeyId [%d]" ),
Jeff Johnson295189b2012-06-20 16:38:30 -07003825 staIdx,
3826 defaultKeyId );
3827
3828 if(limIsAddrBC( pMlmSetKeysReq->peerMacAddr )) {
3829 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
3830 psessionEntry->limMlmState = eLIM_MLM_WT_SET_BSS_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003831 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003832 limLog( pMac, LOG1, FL("Trying to set Group Keys...%d "),
Jeff Johnson295189b2012-06-20 16:38:30 -07003833 psessionEntry->peSessionId);
3834
3835 // Package WDA_SET_BSSKEY_REQ message parameters
3836 limSendSetBssKeyReq(pMac, pMlmSetKeysReq,psessionEntry);
3837 return;
3838 }else {
3839 // Package WDA_SET_STAKEY_REQ / WDA_SET_STA_BCASTKEY_REQ message parameters
3840 limSendSetStaKeyReq(pMac, pMlmSetKeysReq, staIdx, (tANI_U8) defaultKeyId,psessionEntry);
3841 return;
3842 }
3843
3844end:
3845 mlmSetKeysCnf.sessionId= pMlmSetKeysReq->sessionId;
3846 limPostSmeSetKeysCnf( pMac, pMlmSetKeysReq, &mlmSetKeysCnf );
3847
3848} /*** limProcessMlmSetKeysReq() ***/
3849
3850/**
3851 * limProcessMlmRemoveKeyReq()
3852 *
3853 *FUNCTION:
3854 * This function is called to process MLM_REMOVEKEY_REQ message
3855 * from SME
3856 *
3857 *LOGIC:
3858 *
3859 *ASSUMPTIONS:
3860 *
3861 *NOTE:
3862 *
3863 * @param pMac Pointer to Global MAC structure
3864 * @param *pMsgBuf A pointer to the MLM message buffer
3865 * @return None
3866 */
3867
3868static void
3869limProcessMlmRemoveKeyReq(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
3870{
3871tANI_U16 aid;
3872tANI_U16 staIdx = 0;
3873tSirMacAddr currentBssId;
3874tpDphHashNode pStaDs;
3875tLimMlmRemoveKeyReq *pMlmRemoveKeyReq;
3876tLimMlmRemoveKeyCnf mlmRemoveKeyCnf;
3877 tpPESession psessionEntry;
3878
3879 if(pMsgBuf == NULL)
3880 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003881 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07003882 return;
3883 }
3884
3885 pMlmRemoveKeyReq = (tLimMlmRemoveKeyReq *) pMsgBuf;
3886
3887
3888 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmRemoveKeyReq->sessionId))== NULL)
3889 {
3890 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003891 FL("session does not exist for given sessionId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303892 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07003893 return;
3894 }
3895
3896
3897 if( pMac->lim.gpLimMlmRemoveKeyReq != NULL )
3898 {
3899 // Free any previous requests.
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303900 vos_mem_free(pMac->lim.gpLimMlmRemoveKeyReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07003901 pMac->lim.gpLimMlmRemoveKeyReq = NULL;
3902 }
3903 // Hold onto the RemoveKeys request parameters
3904 pMac->lim.gpLimMlmRemoveKeyReq = (void *) pMlmRemoveKeyReq;
3905
3906 #if 0
3907 if( eSIR_SUCCESS != wlan_cfgGetStr( pMac,
3908 WNI_CFG_BSSID,
3909 currentBssId,
3910 &cfg ))
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003911 limLog( pMac, LOGP, FL("Could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003912 #endif //TO-SUPPORT BT-AMP
3913 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
3914
3915 switch( psessionEntry->limSystemRole )
3916 {
3917 case eLIM_STA_ROLE:
3918 case eLIM_BT_AMP_STA_ROLE:
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05303919 if (( limIsAddrBC( pMlmRemoveKeyReq->peerMacAddr ) != true ) &&
3920 (!vos_mem_compare(pMlmRemoveKeyReq->peerMacAddr,
3921 currentBssId,
3922 sizeof(tSirMacAddr))))
Jeff Johnson295189b2012-06-20 16:38:30 -07003923 {
3924 limLog( pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07003925 FL("Received MLM_REMOVEKEY_REQ with invalid BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07003926 limPrintMacAddr( pMac, pMlmRemoveKeyReq->peerMacAddr, LOGW );
3927
3928 // Prepare and Send LIM_MLM_REMOVEKEY_CNF with error code
3929 mlmRemoveKeyCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3930 goto end;
3931 }
3932 break;
3933
3934 case eLIM_STA_IN_IBSS_ROLE:
3935 default: // eLIM_AP_ROLE
3936 // Fall thru...
3937 break;
3938 }
3939
3940
3941 psessionEntry->limPrevMlmState = psessionEntry->limMlmState;
3942 if(limIsAddrBC( pMlmRemoveKeyReq->peerMacAddr )) //Second condition for IBSS or AP role.
3943 {
3944 psessionEntry->limMlmState = eLIM_MLM_WT_REMOVE_BSS_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003945 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003946 // Package WDA_REMOVE_BSSKEY_REQ message parameters
3947 limSendRemoveBssKeyReq( pMac,pMlmRemoveKeyReq,psessionEntry);
3948 return;
3949 }
3950
3951 /**
3952 * Check if there exists a context for the
3953 * peer entity for which keys need to be removed.
3954 */
3955 pStaDs = dphLookupHashEntry( pMac, pMlmRemoveKeyReq->peerMacAddr, &aid, &psessionEntry->dph.dphHashTable );
3956 if ((pStaDs == NULL) ||
3957 (pStaDs &&
3958 (pStaDs->mlmStaContext.mlmState !=
3959 eLIM_MLM_LINK_ESTABLISHED_STATE)))
3960 {
3961 /**
3962 * Received LIM_MLM_REMOVEKEY_REQ for STA
3963 * that does not have context or in some
3964 * transit state. Log error.
3965 */
3966 limLog( pMac, LOGW,
3967 FL("Received MLM_REMOVEKEYS_REQ for STA that either has no context or in some transit state, Addr = "));
3968 limPrintMacAddr( pMac, pMlmRemoveKeyReq->peerMacAddr, LOGW );
3969
3970 // Prepare and Send LIM_MLM_REMOVEKEY_CNF
3971 mlmRemoveKeyCnf.resultCode = eSIR_SME_INVALID_PARAMETERS;
3972 mlmRemoveKeyCnf.sessionId = pMlmRemoveKeyReq->sessionId;
3973
3974
3975 goto end;
3976 }
3977 else
3978 staIdx = pStaDs->staIndex;
3979
3980
3981
3982 psessionEntry->limMlmState = eLIM_MLM_WT_REMOVE_STA_KEY_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07003983 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07003984
3985 // Package WDA_REMOVE_STAKEY_REQ message parameters
3986 limSendRemoveStaKeyReq( pMac,pMlmRemoveKeyReq,staIdx,psessionEntry);
3987 return;
3988
3989end:
3990 limPostSmeRemoveKeyCnf( pMac,
Jeff Johnsone7245742012-09-05 17:12:55 -07003991 psessionEntry,
Jeff Johnson295189b2012-06-20 16:38:30 -07003992 pMlmRemoveKeyReq,
3993 &mlmRemoveKeyCnf );
3994
3995} /*** limProcessMlmRemoveKeyReq() ***/
3996
3997
3998/**
3999 * limProcessMinChannelTimeout()
4000 *
4001 *FUNCTION:
4002 * This function is called to process Min Channel Timeout
4003 * during channel scan.
4004 *
4005 *LOGIC:
4006 *
4007 *ASSUMPTIONS:
4008 *
4009 *NOTE:
4010 *
4011 * @param pMac Pointer to Global MAC structure
4012 * @return None
4013 */
4014
4015static void
4016limProcessMinChannelTimeout(tpAniSirGlobal pMac)
4017{
4018 tANI_U8 channelNum;
4019
4020#ifdef GEN6_TODO
4021 //if the min Channel is maintained per session, then use the below seesionEntry
4022 //priority - LOW/might not be needed
4023
4024 //TBD-RAJESH HOW TO GET sessionEntry?????
4025 tpPESession psessionEntry;
4026
4027 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimMinChannelTimer.sessionId))== NULL)
4028 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004029 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004030 return;
4031 }
4032#endif
4033
Abhishek Singh89e1d672013-11-28 15:13:42 +05304034 /*do not process if we are in finish scan wait state i.e.
4035 scan is aborted or finished*/
4036 if (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE &&
4037 pMac->lim.gLimHalScanState != eLIM_HAL_FINISH_SCAN_WAIT_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004038 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004039 /// Min channel timer timed out
4040 pMac->lim.limTimers.gLimPeriodicProbeReqTimer.sessionId = 0xff;
4041 limDeactivateAndChangeTimer(pMac, eLIM_MIN_CHANNEL_TIMER);
4042 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -08004043 pMac->lim.probeCounter = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07004044 if (pMac->lim.gLimCurrentScanChannelId <=
4045 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
4046 {
4047 channelNum = (tANI_U8)limGetCurrentScanChannel(pMac);
4048 }
4049 else
4050 {
4051 // This shouldn't be the case, but when this happens, this timeout should be for the last channelId.
4052 // Get the channelNum as close to correct as possible.
4053 if(pMac->lim.gpLimMlmScanReq->channelList.channelNumber)
4054 {
4055 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1];
4056 }
4057 else
4058 {
4059 channelNum = 1;
4060 }
4061 }
4062
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07004063 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304064 FL("Sending End Scan req from MIN_CH_TIMEOUT in state %d ch-%d"),
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07004065 pMac->lim.gLimMlmState,channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -07004066 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
4067 }
4068 else
4069 {
4070 /**
4071 * MIN channel timer should not have timed out
4072 * in states other than wait_probe_response.
4073 * Log error.
4074 */
4075 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304076 FL("received unexpected MIN channel timeout in mlme state %d and hal scan State %d"),
Abhishek Singh89e1d672013-11-28 15:13:42 +05304077 pMac->lim.gLimMlmState,pMac->lim.gLimHalScanState);
Jeff Johnson295189b2012-06-20 16:38:30 -07004078 limPrintMlmState(pMac, LOGE, pMac->lim.gLimMlmState);
4079 }
4080} /*** limProcessMinChannelTimeout() ***/
4081
4082
4083
4084/**
4085 * limProcessMaxChannelTimeout()
4086 *
4087 *FUNCTION:
4088 * This function is called to process Max Channel Timeout
4089 * during channel scan.
4090 *
4091 *LOGIC:
4092 *
4093 *ASSUMPTIONS:
4094 *
4095 *NOTE:
4096 *
4097 * @param pMac Pointer to Global MAC structure
4098 * @return None
4099 */
4100
4101static void
4102limProcessMaxChannelTimeout(tpAniSirGlobal pMac)
4103{
4104 tANI_U8 channelNum;
4105
Abhishek Singh89e1d672013-11-28 15:13:42 +05304106 /*do not process if we are in finish scan wait state i.e.
4107 scan is aborted or finished*/
4108 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE ||
4109 pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) &&
4110 pMac->lim.gLimHalScanState != eLIM_HAL_FINISH_SCAN_WAIT_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004111 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304112 limLog(pMac, LOG1, FL("Scanning : Max channel timed out"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004113 /**
4114 * MAX channel timer timed out
4115 * Continue channel scan.
4116 */
4117 limDeactivateAndChangeTimer(pMac, eLIM_MAX_CHANNEL_TIMER);
4118 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_PROBE_REQ_TIMER);
4119 pMac->lim.limTimers.gLimPeriodicProbeReqTimer.sessionId = 0xff;
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -08004120 pMac->lim.probeCounter = 0;
4121
Kiet Lamaa8e15a2014-02-11 23:30:06 -08004122 if (pMac->lim.gLimCurrentScanChannelId <=
Jeff Johnson295189b2012-06-20 16:38:30 -07004123 (tANI_U32)(pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1))
4124 {
4125 channelNum = limGetCurrentScanChannel(pMac);
4126 }
4127 else
4128 {
4129 if(pMac->lim.gpLimMlmScanReq->channelList.channelNumber)
4130 {
4131 channelNum = pMac->lim.gpLimMlmScanReq->channelList.channelNumber[pMac->lim.gpLimMlmScanReq->channelList.numChannels - 1];
4132 }
4133 else
4134 {
4135 channelNum = 1;
4136 }
4137 }
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07004138 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304139 FL("Sending End Scan req from MAX_CH_TIMEOUT in state %d on ch-%d"),
Praveen Kumar Sirisillaac600a82013-10-18 11:07:47 -07004140 pMac->lim.gLimMlmState,channelNum);
Jeff Johnson295189b2012-06-20 16:38:30 -07004141 limSendHalEndScanReq(pMac, channelNum, eLIM_HAL_END_SCAN_WAIT_STATE);
4142 }
4143 else
4144 {
4145 /**
4146 * MAX channel timer should not have timed out
4147 * in states other than wait_scan.
4148 * Log error.
4149 */
4150 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304151 FL("received unexpected MAX channel timeout in mlme state %d and hal scan state %d"),
Abhishek Singh89e1d672013-11-28 15:13:42 +05304152 pMac->lim.gLimMlmState, pMac->lim.gLimHalScanState);
Jeff Johnson295189b2012-06-20 16:38:30 -07004153 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
4154 }
4155} /*** limProcessMaxChannelTimeout() ***/
4156
4157/**
4158 * limProcessPeriodicProbeReqTimer()
4159 *
4160 *FUNCTION:
4161 * This function is called to process periodic probe request
4162 * to send during scan.
4163 *
4164 *LOGIC:
4165 *
4166 *ASSUMPTIONS:
4167 *
4168 *NOTE:
4169 *
4170 * @param pMac Pointer to Global MAC structure
4171 * @return None
4172 */
4173
4174static void
4175limProcessPeriodicProbeReqTimer(tpAniSirGlobal pMac)
4176{
4177 tANI_U8 channelNum;
4178 tANI_U8 i = 0;
4179 tSirRetStatus status = eSIR_SUCCESS;
4180 TX_TIMER *pPeriodicProbeReqTimer;
4181 pPeriodicProbeReqTimer = &pMac->lim.limTimers.gLimPeriodicProbeReqTimer;
4182
4183 if(vos_timer_getCurrentState(&pPeriodicProbeReqTimer->vosTimer)
4184 != VOS_TIMER_STATE_STOPPED)
4185 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304186 limLog(pMac, LOG1, FL("Invalid state of timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004187 return;
4188 }
4189
4190 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) &&
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -08004191 (pPeriodicProbeReqTimer->sessionId != 0xff) && (pMac->lim.probeCounter < pMac->lim.maxProbe))
Jeff Johnson295189b2012-06-20 16:38:30 -07004192 {
4193 tLimMlmScanReq *pLimMlmScanReq = pMac->lim.gpLimMlmScanReq;
Praveen Kumar Sirisilla7ea8dc92013-12-22 16:35:05 -08004194 pMac->lim.probeCounter++;
Jeff Johnson295189b2012-06-20 16:38:30 -07004195 /**
4196 * Periodic channel timer timed out
4197 * to send probe request.
4198 */
4199 channelNum = limGetCurrentScanChannel(pMac);
Abhishek Singh795e1b82015-09-25 15:35:03 +05304200 /* Prepare and send Probe Request frame for all the SSIDs
4201 * present in the saved MLM
4202 */
Jeff Johnson295189b2012-06-20 16:38:30 -07004203 do
4204 {
Siddharth Bhal4f3187c2014-10-09 21:38:08 +05304205 tSirMacAddr gSelfMacAddr;
4206
Abhishek Singh795e1b82015-09-25 15:35:03 +05304207 /* Send self MAC as src address if
4208 * MAC spoof is not enabled OR
4209 * spoofMacAddr is all 0 OR
4210 * disableP2PMacSpoof is enabled and scan is P2P scan
4211 * else use the spoofMac as src address
Jeff Johnson295189b2012-06-20 16:38:30 -07004212 */
Abhishek Singh795e1b82015-09-25 15:35:03 +05304213 if ((pMac->lim.isSpoofingEnabled != TRUE) ||
4214 (TRUE ==
4215 vos_is_macaddr_zero((v_MACADDR_t *)&pMac->lim.spoofMacAddr)) ||
4216 (pMac->roam.configParam.disableP2PMacSpoofing &&
4217 pMac->lim.gpLimMlmScanReq->p2pSearch)) {
Siddharth Bhal4f3187c2014-10-09 21:38:08 +05304218 vos_mem_copy(gSelfMacAddr, pMac->lim.gSelfMacAddr, VOS_MAC_ADDRESS_LEN);
4219 } else {
4220 vos_mem_copy(gSelfMacAddr, pMac->lim.spoofMacAddr, VOS_MAC_ADDRESS_LEN);
4221 }
4222 limLog( pMac, LOG1, FL("Mac Addr used in Probe Req is :"MAC_ADDRESS_STR),
4223 MAC_ADDR_ARRAY(gSelfMacAddr));
4224
Jeff Johnson295189b2012-06-20 16:38:30 -07004225 /*
4226 * PELOGE(limLog(pMac, LOGW, FL("sending ProbeReq number %d,"
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004227 * " for SSID %s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004228 * i, pLimMlmScanReq->ssId[i].ssId,
4229 * channelNum);)
4230 */
4231 status = limSendProbeReqMgmtFrame( pMac, &pLimMlmScanReq->ssId[i],
Siddharth Bhal4f3187c2014-10-09 21:38:08 +05304232 pLimMlmScanReq->bssId, channelNum, gSelfMacAddr,
Jeff Johnson295189b2012-06-20 16:38:30 -07004233 pLimMlmScanReq->dot11mode, pLimMlmScanReq->uIEFieldLen,
4234 (tANI_U8 *)(pLimMlmScanReq) + pLimMlmScanReq->uIEFieldOffset);
4235
4236
4237 if ( status != eSIR_SUCCESS)
4238 {
4239 PELOGE(limLog(pMac, LOGE, FL("send ProbeReq failed for SSID "
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004240 "%s on channel: %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004241 pLimMlmScanReq->ssId[i].ssId,
4242 channelNum);)
4243 return;
4244 }
4245 i++;
4246 } while (i < pLimMlmScanReq->numSsid);
4247
4248 /* Activate timer again */
4249 if (tx_timer_activate(pPeriodicProbeReqTimer) != TX_SUCCESS)
4250 {
4251 limLog(pMac, LOGP, FL("could not start periodic probe"
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004252 " req timer"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004253 return;
4254 }
4255 }
4256 else
4257 {
4258 /**
4259 * Periodic scan is timeout is happening in
4260 * in states other than wait_scan.
4261 * Log error.
4262 */
Mohit Khanna23863762012-09-11 17:40:09 -07004263 limLog(pMac, LOG1,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304264 FL("received unexpected Periodic scan timeout in state %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004265 pMac->lim.gLimMlmState);
4266 }
4267} /*** limProcessPeriodicProbeReqTimer() ***/
4268
4269/**
4270 * limProcessJoinFailureTimeout()
4271 *
4272 *FUNCTION:
4273 * This function is called to process JoinFailureTimeout
4274 *
4275 *LOGIC:
4276 *
4277 *ASSUMPTIONS:
4278 *
4279 *NOTE:
4280 *
4281 * @param pMac Pointer to Global MAC structure
4282 * @return None
4283 */
4284
4285static void
4286limProcessJoinFailureTimeout(tpAniSirGlobal pMac)
4287{
4288 tLimMlmJoinCnf mlmJoinCnf;
4289 tSirMacAddr bssid;
4290 tANI_U32 len;
krunal soni8d13b092013-07-19 13:23:29 -07004291#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4292 vos_log_rssi_pkt_type *pRssiLog = NULL;
4293#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07004294
4295 //fetch the sessionEntry based on the sessionId
4296 tpPESession psessionEntry;
4297
4298 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimJoinFailureTimer.sessionId))== NULL)
4299 {
Srinivas Girigowda2a69dcf2013-09-13 14:48:34 -07004300 limLog(pMac, LOGE, FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004301 return;
4302 }
krunal soni8d13b092013-07-19 13:23:29 -07004303
4304#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4305 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
4306 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
4307 if (pRssiLog)
4308 {
4309 pRssiLog->rssi = psessionEntry->rssi;
4310 }
4311 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
4312#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
4313
Jeff Johnson295189b2012-06-20 16:38:30 -07004314 if (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE)
4315 {
4316 len = sizeof(tSirMacAddr);
4317
4318 if (wlan_cfgGetStr(pMac, WNI_CFG_BSSID, bssid, &len) !=
4319 eSIR_SUCCESS)
4320 {
4321 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004322 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004323 return;
4324 }
4325
4326 // 'Change' timer for future activations
4327 limDeactivateAndChangeTimer(pMac, eLIM_JOIN_FAIL_TIMER);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004328 // Change Periodic probe req timer for future activation
4329 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_JOIN_PROBE_REQ_TIMER);
Jeff Johnson295189b2012-06-20 16:38:30 -07004330 /**
4331 * Issue MLM join confirm with timeout reason code
4332 */
Kiet Lam82004c62013-11-11 13:24:28 +05304333 PELOGE(limLog(pMac, LOGE, FL(" In state eLIM_MLM_WT_JOIN_BEACON_STATE."));)
4334 PELOGE(limLog(pMac, LOGE, FL(" Join Failure Timeout occurred for session %d with BSS "),
4335 psessionEntry->peSessionId);
4336 limPrintMacAddr(pMac, psessionEntry->bssId, LOGE);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004337
4338 mlmJoinCnf.resultCode = eSIR_SME_JOIN_TIMEOUT_RESULT_CODE;
4339 mlmJoinCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
4340
4341 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07004342 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004343 if(limSetLinkState(pMac, eSIR_LINK_IDLE_STATE, psessionEntry->bssId,
4344 psessionEntry->selfMacAddr, NULL, NULL) != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004345 PELOGE(limLog(pMac, LOGE, FL("Failed to set the LinkState"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004346 /* Update PE session Id */
4347 mlmJoinCnf.sessionId = psessionEntry->peSessionId;
4348
4349
4350 // Freeup buffer allocated to join request
4351 if (psessionEntry->pLimMlmJoinReq)
4352 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304353 vos_mem_free(psessionEntry->pLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004354 psessionEntry->pLimMlmJoinReq = NULL;
4355 }
4356
4357 limPostSmeMessage(pMac,
4358 LIM_MLM_JOIN_CNF,
4359 (tANI_U32 *) &mlmJoinCnf);
4360
4361 return;
4362 }
4363 else
4364 {
4365 /**
4366 * Join failure timer should not have timed out
4367 * in states other than wait_join_beacon state.
4368 * Log error.
4369 */
4370 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304371 FL("received unexpected JOIN failure timeout in state %d"),psessionEntry->limMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -07004372 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
4373 }
4374} /*** limProcessJoinFailureTimeout() ***/
4375
4376
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004377/**
4378 * limProcessPeriodicJoinProbeReqTimer()
4379 *
4380 *FUNCTION:
4381 * This function is called to process periodic probe request
4382 * send during joining process.
4383 *
4384 *LOGIC:
4385 *
4386 *ASSUMPTIONS:
4387 *
4388 *NOTE:
4389 *
4390 * @param pMac Pointer to Global MAC structure
4391 * @return None
4392 */
4393
4394static void limProcessPeriodicJoinProbeReqTimer(tpAniSirGlobal pMac)
4395{
4396 tpPESession psessionEntry;
4397 tSirMacSSid ssId;
4398
4399 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer.sessionId))== NULL)
4400 {
Kiet Lam82004c62013-11-11 13:24:28 +05304401 limLog(pMac, LOGE,FL("session does not exist for given SessionId : %d"),
4402 pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer.sessionId);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004403 return;
4404 }
4405
4406 if((VOS_TRUE == tx_timer_running(&pMac->lim.limTimers.gLimJoinFailureTimer)) &&
4407 (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE))
4408 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304409 vos_mem_copy(ssId.ssId,
4410 psessionEntry->ssId.ssId,
4411 psessionEntry->ssId.length);
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004412 ssId.length = psessionEntry->ssId.length;
4413
4414 limSendProbeReqMgmtFrame( pMac, &ssId,
4415 psessionEntry->pLimMlmJoinReq->bssDescription.bssId, psessionEntry->currentOperChannel/*chanNum*/,
4416 psessionEntry->selfMacAddr, psessionEntry->dot11mode,
4417 psessionEntry->pLimJoinReq->addIEScan.length, psessionEntry->pLimJoinReq->addIEScan.addIEdata);
4418
4419 limDeactivateAndChangeTimer(pMac, eLIM_PERIODIC_JOIN_PROBE_REQ_TIMER);
4420
4421 // Activate Join Periodic Probe Req timer
4422 if (tx_timer_activate(&pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer) != TX_SUCCESS)
4423 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004424 limLog(pMac, LOGP, FL("could not activate Periodic Join req failure timer"));
Madan Mohan Koyyalamudi9aff9ff2012-11-29 11:27:25 -08004425 return;
4426 }
4427 }
4428 return;
4429} /*** limProcessPeriodicJoinProbeReqTimer() ***/
4430
Sushant Kaushik9e923872015-04-02 17:09:31 +05304431/**
4432 * limProcessAuthRetryTimer()
4433 *
4434 *FUNCTION:
4435 * This function is called to process Auth Retry request
4436 * send during joining process.
4437 *
4438 *LOGIC:
4439 *
4440 *ASSUMPTIONS:
4441 *
4442 *NOTE:
4443 *
4444 * @param pMac Pointer to Global MAC structure
4445 * @return None
4446 */
4447
4448static void limProcessAuthRetryTimer(tpAniSirGlobal pMac)
4449{
4450 tpPESession psessionEntry;
4451 limLog(pMac, LOG1, FL(" ENTER "));
4452 if ((psessionEntry =
4453 peFindSessionBySessionId(pMac,
4454 pMac->lim.limTimers.gLimPeriodicAuthRetryTimer.sessionId)) == NULL)
4455 {
4456 limLog(pMac, LOGE,FL("session does not exist for given SessionId : %d"),
4457 pMac->lim.limTimers.gLimPeriodicAuthRetryTimer.sessionId);
4458 return;
4459 }
4460
4461 if ((VOS_TRUE ==
4462 tx_timer_running(&pMac->lim.limTimers.gLimAuthFailureTimer)) &&
4463 (psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME2_STATE) &&
4464 (LIM_AUTH_ACK_RCD_SUCCESS != pMac->authAckStatus))
4465 {
4466 tSirMacAuthFrameBody authFrameBody;
4467
4468 /* Send the auth retry only in case we have received ack failure
4469 * else just restart the retry timer.
4470 */
4471 if (LIM_AUTH_ACK_RCD_FAILURE == pMac->authAckStatus)
4472 {
4473 /// Prepare & send Authentication frame
4474 authFrameBody.authAlgoNumber =
4475 (tANI_U8) pMac->lim.gpLimMlmAuthReq->authType;
4476 authFrameBody.authTransactionSeqNumber = SIR_MAC_AUTH_FRAME_1;
4477 authFrameBody.authStatusCode = 0;
4478 limLog(pMac, LOGW, FL("Retry Auth "));
4479 pMac->authAckStatus = LIM_AUTH_ACK_NOT_RCD;
4480 limSendAuthMgmtFrame(pMac,
4481 &authFrameBody,
4482 pMac->lim.gpLimMlmAuthReq->peerMacAddr,
4483 LIM_NO_WEP_IN_FC, psessionEntry, eSIR_TRUE);
4484 }
4485
4486 limDeactivateAndChangeTimer(pMac, eLIM_AUTH_RETRY_TIMER);
4487
4488 // Activate Auth Retry timer
4489 if (tx_timer_activate(&pMac->lim.limTimers.gLimPeriodicAuthRetryTimer)
4490 != TX_SUCCESS)
4491 {
4492 limLog(pMac, LOGE,
4493 FL("could not activate Auth Retry failure timer"));
4494 return;
4495 }
4496 }
4497 return;
4498} /*** limProcessAuthRetryTimer() ***/
4499
Jeff Johnson295189b2012-06-20 16:38:30 -07004500
4501/**
4502 * limProcessAuthFailureTimeout()
4503 *
4504 *FUNCTION:
4505 * This function is called to process Min Channel Timeout
4506 * during channel scan.
4507 *
4508 *LOGIC:
4509 *
4510 *ASSUMPTIONS:
4511 *
4512 *NOTE:
4513 *
4514 * @param pMac Pointer to Global MAC structure
4515 * @return None
4516 */
4517
4518static void
4519limProcessAuthFailureTimeout(tpAniSirGlobal pMac)
4520{
4521 //fetch the sessionEntry based on the sessionId
4522 tpPESession psessionEntry;
krunal soni8d13b092013-07-19 13:23:29 -07004523#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4524 vos_log_rssi_pkt_type *pRssiLog = NULL;
4525#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07004526 if((psessionEntry = peFindSessionBySessionId(pMac, pMac->lim.limTimers.gLimAuthFailureTimer.sessionId))== NULL)
4527 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004528 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004529 return;
4530 }
Abhishek Singhdcbd8272014-01-09 14:16:01 +05304531 limLog(pMac, LOGE, FL("received AUTH failure timeout in sessionid %d "
Sushant Kaushik1b645382014-10-13 16:39:36 +05304532 "limMlmstate %d limSmeState %d"), psessionEntry->peSessionId,
Abhishek Singhdcbd8272014-01-09 14:16:01 +05304533 psessionEntry->limMlmState, psessionEntry->limSmeState);
krunal soni8d13b092013-07-19 13:23:29 -07004534#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4535 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
4536 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
4537 if (pRssiLog)
4538 {
4539 pRssiLog->rssi = psessionEntry->rssi;
4540 }
4541 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
4542#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
4543
Jeff Johnson295189b2012-06-20 16:38:30 -07004544 switch (psessionEntry->limMlmState)
4545 {
4546 case eLIM_MLM_WT_AUTH_FRAME2_STATE:
4547 case eLIM_MLM_WT_AUTH_FRAME4_STATE:
4548 /**
4549 * Requesting STA did not receive next auth frame
4550 * before Auth Failure timeout.
4551 * Issue MLM auth confirm with timeout reason code
4552 */
Madan Mohan Koyyalamudi666d33a2012-11-29 11:32:59 -08004553 //Restore default failure timeout
4554 if (VOS_P2P_CLIENT_MODE == psessionEntry->pePersona && psessionEntry->defaultAuthFailureTimeout)
4555 {
4556 ccmCfgSetInt(pMac,WNI_CFG_AUTHENTICATE_FAILURE_TIMEOUT ,
4557 psessionEntry->defaultAuthFailureTimeout, NULL, eANI_BOOLEAN_FALSE);
4558 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004559 limRestoreFromAuthState(pMac,eSIR_SME_AUTH_TIMEOUT_RESULT_CODE,eSIR_MAC_UNSPEC_FAILURE_REASON,psessionEntry);
4560 break;
4561
4562 default:
4563 /**
4564 * Auth failure timer should not have timed out
4565 * in states other than wt_auth_frame2/4
4566 * Log error.
4567 */
Sushant Kaushik1b645382014-10-13 16:39:36 +05304568 PELOGE(limLog(pMac, LOGE, FL("received unexpected AUTH failure timeout in state %d"), psessionEntry->limMlmState);)
Jeff Johnson295189b2012-06-20 16:38:30 -07004569 limPrintMlmState(pMac, LOGE, psessionEntry->limMlmState);
4570
4571 break;
4572 }
Abhishek Singhbfb3c9e2016-07-22 11:25:43 +05304573 /* Reinit scan results to remove the unreachable BSS */
4574 limReInitScanResults(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07004575} /*** limProcessAuthFailureTimeout() ***/
4576
4577
4578
4579/**
4580 * limProcessAuthRspTimeout()
4581 *
4582 *FUNCTION:
4583 * This function is called to process Min Channel Timeout
4584 * during channel scan.
4585 *
4586 *LOGIC:
4587 *
4588 *ASSUMPTIONS:
4589 *
4590 *NOTE:
4591 *
4592 * @param pMac Pointer to Global MAC structure
4593 * @return None
4594 */
4595
4596static void
4597limProcessAuthRspTimeout(tpAniSirGlobal pMac, tANI_U32 authIndex)
4598{
4599 struct tLimPreAuthNode *pAuthNode;
4600 tpPESession psessionEntry;
4601 tANI_U8 sessionId;
4602
4603 pAuthNode = limGetPreAuthNodeFromIndex(pMac, &pMac->lim.gLimPreAuthTimerTable, authIndex);
4604
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304605 if (NULL == pAuthNode)
4606 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004607 limLog(pMac, LOGW, FL("Invalid auth node"));
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304608 return;
4609 }
4610
4611 if ((psessionEntry = peFindSessionByBssid(pMac, pAuthNode->peerMacAddr, &sessionId)) == NULL)
Jeff Johnson295189b2012-06-20 16:38:30 -07004612 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004613 limLog(pMac, LOGW, FL("session does not exist for given BSSID "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004614 return;
4615 }
4616
4617 if (psessionEntry->limSystemRole == eLIM_AP_ROLE ||
4618 psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE)
4619 {
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304620 if (pAuthNode->mlmState != eLIM_MLM_WT_AUTH_FRAME3_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -07004621 {
4622 /**
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304623 * Authentication response timer timedout
4624 * in unexpected state. Log error
Jeff Johnson295189b2012-06-20 16:38:30 -07004625 */
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304626 PELOGE(limLog(pMac, LOGE,
Abhishek Singhcd09b562013-12-24 16:02:20 +05304627 FL("received AUTH rsp timeout in unexpected state "
4628 "for MAC address: "MAC_ADDRESS_STR),
4629 MAC_ADDR_ARRAY(pAuthNode->peerMacAddr));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004630 }
4631 else
4632 {
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304633 // Authentication response timer
4634 // timedout for an STA.
4635 pAuthNode->mlmState = eLIM_MLM_AUTH_RSP_TIMEOUT_STATE;
4636 pAuthNode->fTimerStarted = 0;
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304637 limLog(pMac, LOG1,
Abhishek Singhcd09b562013-12-24 16:02:20 +05304638 FL("AUTH rsp timedout for MAC address "MAC_ADDRESS_STR),
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304639 MAC_ADDR_ARRAY(pAuthNode->peerMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07004640
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304641 // Change timer to reactivate it in future
4642 limDeactivateAndChangePerStaIdTimer(pMac,
4643 eLIM_AUTH_RSP_TIMER,
4644 pAuthNode->authNodeIdx);
Jeff Johnson295189b2012-06-20 16:38:30 -07004645
Pratik Bhalgataa1ae392012-11-22 17:44:33 +05304646 limDeletePreAuthNode(pMac, pAuthNode->peerMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -07004647 }
4648 }
4649} /*** limProcessAuthRspTimeout() ***/
4650
4651
4652/**
4653 * limProcessAssocFailureTimeout()
4654 *
4655 *FUNCTION:
4656 * This function is called to process Min Channel Timeout
4657 * during channel scan.
4658 *
4659 *LOGIC:
4660 *
4661 *ASSUMPTIONS:
4662 *
4663 *NOTE:
4664 *
4665 * @param pMac Pointer to Global MAC structure
4666 * @return None
4667 */
4668
4669static void
4670limProcessAssocFailureTimeout(tpAniSirGlobal pMac, tANI_U32 MsgType)
4671{
4672
4673 tLimMlmAssocCnf mlmAssocCnf;
4674 tpPESession psessionEntry;
krunal soni8d13b092013-07-19 13:23:29 -07004675#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4676 vos_log_rssi_pkt_type *pRssiLog = NULL;
4677#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
Jeff Johnson295189b2012-06-20 16:38:30 -07004678
4679 //to fetch the lim/mlm state based on the sessionId, use the below sessionEntry
4680 tANI_U8 sessionId;
4681
4682 if(MsgType == LIM_ASSOC)
4683 {
4684 sessionId = pMac->lim.limTimers.gLimAssocFailureTimer.sessionId;
4685 }
4686 else
4687 {
4688 sessionId = pMac->lim.limTimers.gLimReassocFailureTimer.sessionId;
4689 }
4690
4691 if((psessionEntry = peFindSessionBySessionId(pMac, sessionId))== NULL)
4692 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004693 limLog(pMac, LOGP,FL("Session Does not exist for given sessionID"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004694 return;
4695 }
krunal soni8d13b092013-07-19 13:23:29 -07004696#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT_LIM
4697 WLAN_VOS_DIAG_LOG_ALLOC(pRssiLog,
4698 vos_log_rssi_pkt_type, LOG_WLAN_RSSI_UPDATE_C);
4699 if (pRssiLog)
4700 {
4701 pRssiLog->rssi = psessionEntry->rssi;
4702 }
4703 WLAN_VOS_DIAG_LOG_REPORT(pRssiLog);
4704#endif //FEATURE_WLAN_DIAG_SUPPORT_LIM
4705
Jeff Johnson295189b2012-06-20 16:38:30 -07004706 /**
4707 * Expected Re/Association Response frame
4708 * not received within Re/Association Failure Timeout.
4709 */
4710
4711
4712
4713
Abhishek Singh70af9c72016-03-09 17:23:30 +05304714 /*
4715 * CR: vos packet memory is leaked when assoc rsp timeouted/failed.
4716 * notify TL that association is failed so that TL can flush the
4717 * cached frame
4718 */
Jeff Johnson295189b2012-06-20 16:38:30 -07004719 WLANTL_AssocFailed (psessionEntry->staId);
4720
Abhishek Singh70af9c72016-03-09 17:23:30 +05304721 /* Log error */
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304722 limLog(pMac, LOG1,
4723 FL("Re/Association Response not received before timeout "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004724
Abhishek Singh70af9c72016-03-09 17:23:30 +05304725 /*
4726 * Send Deauth to handle the scenareo where association timeout happened
4727 * when device has missed the assoc resp sent by peer.
4728 * By sending deauth try to clear the session created on peer device.
4729 */
4730 limLog(pMac, LOGE,
4731 FL("Sessionid: %d try sending Send deauth on channel %d to BSSID: "
4732 MAC_ADDRESS_STR ), psessionEntry->peSessionId,
4733 psessionEntry->currentOperChannel,
4734 MAC_ADDR_ARRAY(psessionEntry->bssId));
4735
4736 limSendDeauthMgmtFrame(pMac, eSIR_MAC_UNSPEC_FAILURE_REASON,
4737 psessionEntry->bssId,
4738 psessionEntry, FALSE);
4739
4740 if (((psessionEntry->limSystemRole == eLIM_AP_ROLE) ||
4741 (psessionEntry->limSystemRole == eLIM_BT_AMP_AP_ROLE) )||
4742 ((psessionEntry->limMlmState != eLIM_MLM_WT_ASSOC_RSP_STATE) &&
4743 (psessionEntry->limMlmState != eLIM_MLM_WT_REASSOC_RSP_STATE) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07004744 (psessionEntry->limMlmState != eLIM_MLM_WT_FT_REASSOC_RSP_STATE)))
4745 {
4746 /**
4747 * Re/Assoc failure timer should not have timedout on AP
4748 * or in a state other than wt_re/assoc_response.
4749 */
4750
4751 // Log error
4752 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +05304753 FL("received unexpected REASSOC failure timeout in state %d for role %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -07004754 psessionEntry->limMlmState, psessionEntry->limSystemRole);
4755 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
4756 }
4757 else
4758 {
4759
4760 if ((MsgType == LIM_ASSOC) ||
4761 ((MsgType == LIM_REASSOC) && (psessionEntry->limMlmState == eLIM_MLM_WT_FT_REASSOC_RSP_STATE)))
4762 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004763 PELOGE(limLog(pMac, LOGE, FL("(Re)Assoc Failure Timeout occurred."));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004764
4765 psessionEntry->limMlmState = eLIM_MLM_IDLE_STATE;
Jeff Johnsone7245742012-09-05 17:12:55 -07004766 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
4767
Jeff Johnson295189b2012-06-20 16:38:30 -07004768 // 'Change' timer for future activations
4769 limDeactivateAndChangeTimer(pMac, eLIM_ASSOC_FAIL_TIMER);
4770
4771 // Free up buffer allocated for JoinReq held by
4772 // MLM state machine
4773 if (psessionEntry->pLimMlmJoinReq)
4774 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304775 vos_mem_free(psessionEntry->pLimMlmJoinReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004776 psessionEntry->pLimMlmJoinReq = NULL;
4777 }
4778
Jeff Johnson295189b2012-06-20 16:38:30 -07004779 //To remove the preauth node in case of fail to associate
4780 if (limSearchPreAuthList(pMac, psessionEntry->bssId))
4781 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +05304782 limLog(pMac, LOG1, FL(" delete pre auth node for "
4783 MAC_ADDRESS_STR), MAC_ADDR_ARRAY(psessionEntry->bssId));
Jeff Johnson295189b2012-06-20 16:38:30 -07004784 limDeletePreAuthNode(pMac, psessionEntry->bssId);
4785 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004786
4787 mlmAssocCnf.resultCode =
4788 eSIR_SME_ASSOC_TIMEOUT_RESULT_CODE;
4789 mlmAssocCnf.protStatusCode =
4790 eSIR_MAC_UNSPEC_FAILURE_STATUS;
4791
4792 /* Update PE session Id*/
4793 mlmAssocCnf.sessionId = psessionEntry->peSessionId;
4794 if (MsgType == LIM_ASSOC)
4795 limPostSmeMessage(pMac, LIM_MLM_ASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
4796 else
4797 {
Varun Reddy Yeturu5d5e2c62014-02-27 13:31:29 -08004798 /* Will come here only in case of 11r, ESE, FT when reassoc rsp
Jeff Johnson295189b2012-06-20 16:38:30 -07004799 is not received and we receive a reassoc - timesout */
4800 mlmAssocCnf.resultCode = eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE;
4801 limPostSmeMessage(pMac, LIM_MLM_REASSOC_CNF, (tANI_U32 *) &mlmAssocCnf);
4802 }
4803 }
4804 else
4805 {
4806 /**
4807 * Restore pre-reassoc req state.
4808 * Set BSSID to currently associated AP address.
4809 */
4810 psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004811 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004812
4813 limRestorePreReassocState(pMac,
4814 eSIR_SME_REASSOC_TIMEOUT_RESULT_CODE, eSIR_MAC_UNSPEC_FAILURE_STATUS,psessionEntry);
4815 }
4816 }
Abhishek Singhbfb3c9e2016-07-22 11:25:43 +05304817 /* Reinit scan results to remove the unreachable BSS */
4818 limReInitScanResults(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07004819} /*** limProcessAssocFailureTimeout() ***/
4820
4821
4822
4823/**
4824 * limCompleteMlmScan()
4825 *
4826 *FUNCTION:
4827 * This function is called to send MLM_SCAN_CNF message
4828 * to SME state machine.
4829 *
4830 *LOGIC:
4831 *
4832 *ASSUMPTIONS:
4833 *
4834 *NOTE:
4835 *
4836 * @param pMac Pointer to Global MAC structure
4837 * @param retCode Result code to be sent
4838 * @return None
4839 */
4840
4841void
4842limCompleteMlmScan(tpAniSirGlobal pMac, tSirResultCodes retCode)
4843{
4844 tLimMlmScanCnf mlmScanCnf;
4845
4846 /// Restore previous MLM state
4847 pMac->lim.gLimMlmState = pMac->lim.gLimPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004848 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, NO_SESSION, pMac->lim.gLimMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004849 limRestorePreScanState(pMac);
4850
4851 // Free up pMac->lim.gLimMlmScanReq
4852 if( NULL != pMac->lim.gpLimMlmScanReq )
4853 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304854 vos_mem_free(pMac->lim.gpLimMlmScanReq);
Jeff Johnson295189b2012-06-20 16:38:30 -07004855 pMac->lim.gpLimMlmScanReq = NULL;
4856 }
4857
4858 mlmScanCnf.resultCode = retCode;
4859 mlmScanCnf.scanResultLength = pMac->lim.gLimMlmScanResultLength;
4860
4861 limPostSmeMessage(pMac, LIM_MLM_SCAN_CNF, (tANI_U32 *) &mlmScanCnf);
4862
4863} /*** limCompleteMlmScan() ***/
4864
4865/**
4866 * \brief Setup an A-MPDU/BA session
4867 *
4868 * \sa limProcessMlmAddBAReq
4869 *
4870 * \param pMac The global tpAniSirGlobal object
4871 *
4872 * \param pMsgBuf The MLME ADDBA Req message buffer
4873 *
4874 * \return none
4875 */
4876void limProcessMlmAddBAReq( tpAniSirGlobal pMac,
4877 tANI_U32 *pMsgBuf )
4878{
4879tSirRetStatus status = eSIR_SUCCESS;
4880tpLimMlmAddBAReq pMlmAddBAReq;
4881tpLimMlmAddBACnf pMlmAddBACnf;
4882 tpPESession psessionEntry;
4883
4884 if(pMsgBuf == NULL)
4885 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004886 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004887 return;
4888 }
4889
4890 pMlmAddBAReq = (tpLimMlmAddBAReq) pMsgBuf;
4891 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmAddBAReq->sessionId))== NULL)
4892 {
4893 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004894 FL("session does not exist for given sessionId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304895 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004896 return;
4897 }
4898
4899
4900 // Send ADDBA Req over the air
4901 status = limSendAddBAReq( pMac, pMlmAddBAReq,psessionEntry);
4902
4903 //
4904 // Respond immediately to LIM, only if MLME has not been
4905 // successfully able to send WDA_ADDBA_REQ to HAL.
4906 // Else, LIM_MLM_ADDBA_CNF will be sent after receiving
4907 // ADDBA Rsp from peer entity
4908 //
4909 if( eSIR_SUCCESS != status )
4910 {
4911 // Allocate for LIM_MLM_ADDBA_CNF
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304912
4913 pMlmAddBACnf = vos_mem_malloc(sizeof( tLimMlmAddBACnf ));
4914 if ( NULL == pMlmAddBACnf )
Jeff Johnson295189b2012-06-20 16:38:30 -07004915 {
4916 limLog( pMac, LOGP,
Jeff Johnson0f4d0bc2013-11-03 17:48:50 -08004917 FL("AllocateMemory failed"));
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304918 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004919 return;
4920 }
4921 else
4922 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304923 vos_mem_set((void *) pMlmAddBACnf, sizeof( tLimMlmAddBACnf ), 0);
4924 vos_mem_copy((void *) pMlmAddBACnf->peerMacAddr,
4925 (void *) pMlmAddBAReq->peerMacAddr,
4926 sizeof( tSirMacAddr ));
Jeff Johnson295189b2012-06-20 16:38:30 -07004927
4928 pMlmAddBACnf->baDialogToken = pMlmAddBAReq->baDialogToken;
4929 pMlmAddBACnf->baTID = pMlmAddBAReq->baTID;
4930 pMlmAddBACnf->baPolicy = pMlmAddBAReq->baPolicy;
4931 pMlmAddBACnf->baBufferSize = pMlmAddBAReq->baBufferSize;
4932 pMlmAddBACnf->baTimeout = pMlmAddBAReq->baTimeout;
4933 pMlmAddBACnf->sessionId = pMlmAddBAReq->sessionId;
4934
4935 // Update the result code
4936 pMlmAddBACnf->addBAResultCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
4937
4938 limPostSmeMessage( pMac,
4939 LIM_MLM_ADDBA_CNF,
4940 (tANI_U32 *) pMlmAddBACnf );
4941 }
4942
4943 // Restore MLME state
4944 psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
Jeff Johnsone7245742012-09-05 17:12:55 -07004945 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, psessionEntry->peSessionId, psessionEntry->limMlmState));
Jeff Johnson295189b2012-06-20 16:38:30 -07004946
4947 }
4948
4949 // Free the buffer allocated for tLimMlmAddBAReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304950 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004951
4952}
4953
4954/**
4955 * \brief Send an ADDBA Rsp to peer STA in response
4956 * to an ADDBA Req received earlier
4957 *
4958 * \sa limProcessMlmAddBARsp
4959 *
4960 * \param pMac The global tpAniSirGlobal object
4961 *
4962 * \param pMsgBuf The MLME ADDBA Rsp message buffer
4963 *
4964 * \return none
4965 */
4966void limProcessMlmAddBARsp( tpAniSirGlobal pMac,
4967 tANI_U32 *pMsgBuf )
4968{
4969tpLimMlmAddBARsp pMlmAddBARsp;
4970 tANI_U16 aid;
4971 tpDphHashNode pSta;
4972 tpPESession psessionEntry;
4973
4974
4975 if(pMsgBuf == NULL)
4976 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004977 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07004978 return;
4979 }
4980
4981 pMlmAddBARsp = (tpLimMlmAddBARsp) pMsgBuf;
4982
4983 if(( psessionEntry = peFindSessionBySessionId(pMac,pMlmAddBARsp->sessionId))== NULL)
4984 {
4985 PELOGE(limLog(pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004986 FL("session does not exist for given session ID"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05304987 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07004988 return;
4989 }
4990
4991
4992 // Send ADDBA Rsp over the air
4993 if( eSIR_SUCCESS != limSendAddBARsp( pMac,pMlmAddBARsp,psessionEntry))
4994 {
4995 limLog( pMac, LOGE,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07004996 FL("Failed to send ADDBA Rsp to peer "));
Jeff Johnson295189b2012-06-20 16:38:30 -07004997 limPrintMacAddr( pMac, pMlmAddBARsp->peerMacAddr, LOGE );
4998 /* Clean the BA context maintained by HAL and TL on failure */
4999 pSta = dphLookupHashEntry( pMac, pMlmAddBARsp->peerMacAddr, &aid,
5000 &psessionEntry->dph.dphHashTable);
5001 if( NULL != pSta )
5002 {
5003 limPostMsgDelBAInd( pMac, pSta, pMlmAddBARsp->baTID, eBA_RECIPIENT,
5004 psessionEntry);
5005 }
5006 }
5007
5008 // Time to post a WDA_DELBA_IND to HAL in order
5009 // to cleanup the HAL and SoftMAC entries
5010
5011
5012 // Free the buffer allocated for tLimMlmAddBARsp
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05305013 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07005014
5015}
5016
5017/**
5018 * \brief Setup an A-MPDU/BA session
5019 *
5020 * \sa limProcessMlmDelBAReq
5021 *
5022 * \param pMac The global tpAniSirGlobal object
5023 *
5024 * \param pMsgBuf The MLME DELBA Req message buffer
5025 *
5026 * \return none
5027 */
5028void limProcessMlmDelBAReq( tpAniSirGlobal pMac,
5029 tANI_U32 *pMsgBuf )
5030{
5031 tSirRetStatus status = eSIR_SUCCESS;
5032 tpLimMlmDelBAReq pMlmDelBAReq;
5033 tpLimMlmDelBACnf pMlmDelBACnf;
5034 tpPESession psessionEntry;
5035
5036
5037 if(pMsgBuf == NULL)
5038 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005039 PELOGE(limLog(pMac, LOGE,FL("Buffer is Pointing to NULL"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07005040 return;
5041 }
5042
5043 // TODO - Need to validate MLME state
5044 pMlmDelBAReq = (tpLimMlmDelBAReq) pMsgBuf;
5045
5046 if((psessionEntry = peFindSessionBySessionId(pMac,pMlmDelBAReq->sessionId))== NULL)
5047 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005048 PELOGE(limLog(pMac, LOGE,FL("session does not exist for given bssId"));)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05305049 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07005050 return;
5051 }
5052
5053 // Send DELBA Ind over the air
5054 if( eSIR_SUCCESS !=
5055 (status = limSendDelBAInd( pMac, pMlmDelBAReq,psessionEntry)))
5056 status = eSIR_SME_HAL_SEND_MESSAGE_FAIL;
5057 else
5058 {
5059 tANI_U16 aid;
5060 tpDphHashNode pSta;
5061
5062 // Time to post a WDA_DELBA_IND to HAL in order
5063 // to cleanup the HAL and SoftMAC entries
5064 pSta = dphLookupHashEntry( pMac, pMlmDelBAReq->peerMacAddr, &aid , &psessionEntry->dph.dphHashTable);
5065 if( NULL != pSta )
5066 {
5067 status = limPostMsgDelBAInd( pMac,
5068 pSta,
5069 pMlmDelBAReq->baTID,
5070 pMlmDelBAReq->baDirection,psessionEntry);
5071
5072 }
5073 }
5074
5075 //
5076 // Respond immediately to SME with DELBA CNF using
5077 // LIM_MLM_DELBA_CNF with appropriate status
5078 //
5079
5080 // Allocate for LIM_MLM_DELBA_CNF
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05305081
5082 pMlmDelBACnf = vos_mem_malloc(sizeof( tLimMlmDelBACnf ));
5083 if ( NULL == pMlmDelBACnf )
Jeff Johnson295189b2012-06-20 16:38:30 -07005084 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05305085 limLog( pMac, LOGP, FL("AllocateMemory failed"));
5086 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07005087 return;
5088 }
5089 else
5090 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05305091 vos_mem_set((void *) pMlmDelBACnf, sizeof( tLimMlmDelBACnf ), 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07005092
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05305093 vos_mem_copy((void *) pMlmDelBACnf,
5094 (void *) pMlmDelBAReq,
5095 sizeof( tLimMlmDelBAReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -07005096
5097 // Update DELBA result code
5098 pMlmDelBACnf->delBAReasonCode = pMlmDelBAReq->delBAReasonCode;
5099
5100 /* Update PE session Id*/
5101 pMlmDelBACnf->sessionId = pMlmDelBAReq->sessionId;
5102
5103 limPostSmeMessage( pMac,
5104 LIM_MLM_DELBA_CNF,
5105 (tANI_U32 *) pMlmDelBACnf );
5106 }
5107
5108 // Free the buffer allocated for tLimMlmDelBAReq
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05305109 vos_mem_free(pMsgBuf);
Jeff Johnson295189b2012-06-20 16:38:30 -07005110
5111}
5112
5113/**
5114 * @function : limSMPowerSaveStateInd( )
5115 *
5116 * @brief : This function is called upon receiving the PMC Indication to update the STA's MimoPs State.
5117 *
5118 * LOGIC:
5119 *
5120 * ASSUMPTIONS:
5121 * NA
5122 *
5123 * NOTE:
5124 * NA
5125 *
5126 * @param pMac - Pointer to Global MAC structure
5127 * @param limMsg - Lim Message structure object with the MimoPSparam in body
5128 * @return None
5129 */
5130
5131tSirRetStatus
5132limSMPowerSaveStateInd(tpAniSirGlobal pMac, tSirMacHTMIMOPowerSaveState state)
5133{
5134#if 0
5135 tSirRetStatus retStatus = eSIR_SUCCESS;
5136#if 0
5137 tANI_U32 cfgVal1;
5138 tANI_U16 cfgVal2;
5139 tSirMacHTCapabilityInfo *pHTCapabilityInfo;
5140 tpDphHashNode pSta = NULL;
5141
5142 tpPESession psessionEntry = &pMac->lim.gpSession[0]; //TBD-RAJESH HOW TO GET sessionEntry?????
5143 /** Verify the Mode of operation */
5144 if (pMac->lim.gLimSystemRole != eSYSTEM_STA_ROLE) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005145 PELOGE(limLog(pMac, LOGE, FL("Got PMC indication when System not in the STA Role"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07005146 return eSIR_FAILURE;
5147 }
5148
5149 if ((pMac->lim.gHTMIMOPSState == state) || (state == eSIR_HT_MIMO_PS_NA )) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005150 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 -07005151 return eSIR_FAILURE;
5152 }
5153
5154 if (!pMac->lim.htCapability){
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005155 PELOGW(limLog(pMac, LOGW, FL(" Not in 11n or HT capable mode"));)
Jeff Johnson295189b2012-06-20 16:38:30 -07005156 return eSIR_FAILURE;
5157 }
5158
5159 /** Update the CFG about the default MimoPS State */
5160 if (wlan_cfgGetInt(pMac, WNI_CFG_HT_CAP_INFO, &cfgVal1) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005161 limLog(pMac, LOGP, FL("could not retrieve HT Cap CFG "));
Jeff Johnson295189b2012-06-20 16:38:30 -07005162 return eSIR_FAILURE;
5163 }
5164
5165 cfgVal2 = (tANI_U16)cfgVal1;
5166 pHTCapabilityInfo = (tSirMacHTCapabilityInfo *) &cfgVal2;
5167 pHTCapabilityInfo->mimoPowerSave = state;
5168
5169 if(cfgSetInt(pMac, WNI_CFG_HT_CAP_INFO, *(tANI_U16*)pHTCapabilityInfo) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005170 limLog(pMac, LOGP, FL("could not update HT Cap Info CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005171 return eSIR_FAILURE;
5172 }
5173
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005174 PELOG2(limLog(pMac, LOG2, FL(" The HT Capability for Mimo Pwr is updated to State: %u "),state);)
Jeff Johnson295189b2012-06-20 16:38:30 -07005175 if (pMac->lim.gLimSmeState != eLIM_SME_LINK_EST_STATE) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005176 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 -07005177 /** Update in the LIM the MIMO PS state of the SELF */
5178 pMac->lim.gHTMIMOPSState = state;
5179 return eSIR_SUCCESS;
5180 }
5181
5182 pSta = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable);
5183 if (!pSta->mlmStaContext.htCapability) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005184 limLog( pMac, LOGE,FL( "limSendSMPowerState: Peer is not HT Capable " ));
Jeff Johnson295189b2012-06-20 16:38:30 -07005185 return eSIR_FAILURE;
5186 }
5187
5188 if (isEnteringMimoPS(pMac->lim.gHTMIMOPSState, state)) {
5189 tSirMacAddr macAddr;
5190 /** Obtain the AP's Mac Address */
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +05305191 vos_mem_copy((tANI_U8 *)macAddr, psessionEntry->bssId, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07005192 /** Send Action Frame with the corresponding mode */
5193 retStatus = limSendSMPowerStateFrame(pMac, macAddr, state);
5194 if (retStatus != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005195 PELOGE(limLog(pMac, LOGE, "Update SM POWER: Sending Action Frame has failed");)
Jeff Johnson295189b2012-06-20 16:38:30 -07005196 return retStatus;
5197 }
5198 }
5199
5200 /** Update MlmState about the SetMimoPS State */
5201 pMac->lim.gLimPrevMlmState = pMac->lim.gLimMlmState;
5202 pMac->lim.gLimMlmState = eLIM_MLM_WT_SET_MIMOPS_STATE;
5203 MTRACE(macTrace(pMac, TRACE_CODE_MLM_STATE, 0, pMac->lim.gLimMlmState));
5204
5205 /** Update the HAL and s/w mac about the mode to be set */
5206 retStatus = limPostSMStateUpdate( pMac,psessionEntry->staId, state);
5207
5208 PELOG2(limLog(pMac, LOG2, " Updated the New SMPS State");)
5209 /** Update in the LIM the MIMO PS state of the SELF */
5210 pMac->lim.gHTMIMOPSState = state;
5211#endif
5212 return retStatus;
5213#endif
5214return eSIR_SUCCESS;
5215}
5216
Jeff Johnsone7245742012-09-05 17:12:55 -07005217#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005218ePhyChanBondState limGet11ACPhyCBState(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 htSecondaryChannelOffset,tANI_U8 peerCenterChan, tpPESession psessionEntry)
Jeff Johnsone7245742012-09-05 17:12:55 -07005219{
5220 ePhyChanBondState cbState = PHY_SINGLE_CHANNEL_CENTERED;
5221
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005222 if(!psessionEntry->apChanWidth)
Jeff Johnsone7245742012-09-05 17:12:55 -07005223 {
5224 return htSecondaryChannelOffset;
5225 }
5226
5227 if ( (htSecondaryChannelOffset
5228 == PHY_DOUBLE_CHANNEL_LOW_PRIMARY)
5229 )
5230 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005231 if ((channel + 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005232 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005233 else if ((channel + 6 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005234 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005235 else if ((channel - 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005236 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
5237 else
5238 limLog (pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005239 FL("Invalid Channel Number = %d Center Chan = %d "),
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005240 channel, peerCenterChan);
Jeff Johnsone7245742012-09-05 17:12:55 -07005241 }
5242 if ( (htSecondaryChannelOffset
5243 == PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
5244 )
5245 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005246 if ((channel - 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005247 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005248 else if ((channel + 2 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005249 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005250 else if ((channel - 6 ) == peerCenterChan )
Jeff Johnsone7245742012-09-05 17:12:55 -07005251 cbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
5252 else
5253 limLog (pMac, LOGP,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005254 FL("Invalid Channel Number = %d Center Chan = %d "),
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005255 channel, peerCenterChan);
Jeff Johnsone7245742012-09-05 17:12:55 -07005256 }
5257 return cbState;
5258}
5259
5260#endif
5261
Jeff Johnson295189b2012-06-20 16:38:30 -07005262void
Jeff Johnsone7245742012-09-05 17:12:55 -07005263limSetChannel(tpAniSirGlobal pMac, tANI_U8 channel, tANI_U8 secChannelOffset, tPowerdBm maxTxPower, tANI_U8 peSessionId)
Jeff Johnson295189b2012-06-20 16:38:30 -07005264{
5265#if !defined WLAN_FEATURE_VOWIFI
5266 tANI_U32 localPwrConstraint;
5267#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07005268 tpPESession peSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07005269
Jeff Johnsone7245742012-09-05 17:12:55 -07005270 peSession = peFindSessionBySessionId (pMac, peSessionId);
5271
5272 if ( NULL == peSession)
5273 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005274 limLog (pMac, LOGP, FL("Invalid PE session = %d"), peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07005275 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07005276 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005277#if defined WLAN_FEATURE_VOWIFI
Jeff Johnsone7245742012-09-05 17:12:55 -07005278#ifdef WLAN_FEATURE_11AC
5279 if ( peSession->vhtCapability )
5280 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005281 limSendSwitchChnlParams( pMac, channel, limGet11ACPhyCBState( pMac,channel,secChannelOffset,peSession->apCenterChan, peSession), maxTxPower, peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07005282 }
5283 else
5284#endif
5285 {
5286 limSendSwitchChnlParams( pMac, channel, secChannelOffset, maxTxPower, peSessionId);
5287 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005288#else
5289 if (wlan_cfgGetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, &localPwrConstraint) != eSIR_SUCCESS) {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -07005290 limLog(pMac, LOGP, FL("could not read WNI_CFG_LOCAL_POWER_CONSTRAINT from CFG"));
Jeff Johnson295189b2012-06-20 16:38:30 -07005291 return;
5292 }
5293 // Send WDA_CHNL_SWITCH_IND to HAL
Jeff Johnsone7245742012-09-05 17:12:55 -07005294#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005295 if ( peSession->vhtCapability && peSession->vhtCapabilityPresentInBeacon)
Jeff Johnsone7245742012-09-05 17:12:55 -07005296 {
Madan Mohan Koyyalamudic6226de2012-09-18 16:33:31 -07005297 limSendSwitchChnlParams( pMac, channel, limGet11ACPhyCBState( pMac,channel,secChannelOffset,peSession->apCenterChan, peSession), maxTxPower, peSessionId);
Jeff Johnsone7245742012-09-05 17:12:55 -07005298 }
5299 else
Jeff Johnson295189b2012-06-20 16:38:30 -07005300#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07005301 {
5302 limSendSwitchChnlParams( pMac, channel, secChannelOffset, (tPowerdBm)localPwrConstraint, peSessionId);
5303 }
5304#endif
5305
Jeff Johnson295189b2012-06-20 16:38:30 -07005306 }