blob: a6456b234b7b229d6419a354fd39dd1204b0d718 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Abhishek Singh39ae47e2017-10-30 17:39:50 +05302 * Copyright (c) 2012-2015, 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
22/*
23 * 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
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080028/*
Jeff Johnson295189b2012-06-20 16:38:30 -070029 *
Jeff Johnson295189b2012-06-20 16:38:30 -070030 * This file limProcessProbeRspFrame.cc contains the code
31 * for processing Probe Response Frame.
32 * Author: Chandra Modumudi
33 * Date: 03/01/02
34 * History:-
35 * Date Modified by Modification Information
36 * --------------------------------------------------------------------
37 *
38 */
39
40#include "wniApi.h"
Satyanarayana Dash6f438272015-03-03 18:01:06 +053041#include "wniCfg.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070042#include "aniGlobal.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070043#include "schApi.h"
44#include "utilsApi.h"
45#include "limApi.h"
46#include "limTypes.h"
47#include "limUtils.h"
48#include "limAssocUtils.h"
49#include "limPropExtsUtils.h"
50#include "limSerDesUtils.h"
51#include "limSendMessages.h"
52
53#include "parserApi.h"
54
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -080055tSirRetStatus
Rashmi Ramanna2b55dc12014-06-10 22:56:20 +053056limValidateIEInformationInProbeRspFrame (tpAniSirGlobal pMac,
57 tANI_U8 *pRxPacketInfo)
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -080058{
59 tSirRetStatus status = eSIR_SUCCESS;
Rashmi Ramanna2b55dc12014-06-10 22:56:20 +053060 tANI_U8 *pFrame;
61 tANI_U32 nFrame;
62 tANI_U32 nMissingRsnBytes;
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -080063
Rashmi Ramanna2b55dc12014-06-10 22:56:20 +053064 /* Validate a Probe response frame for malformed frame.
65 * If the frame is malformed then do not consider as it
66 * may cause problem fetching wrong IE values
67 */
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -080068 if (WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo) < (SIR_MAC_B_PR_SSID_OFFSET + SIR_MAC_MIN_IE_LEN))
69 {
Rashmi Ramanna2b55dc12014-06-10 22:56:20 +053070 return eSIR_FAILURE;
71 }
72
73 pFrame = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
74 nFrame = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
75 nMissingRsnBytes = 0;
76
77 status = ValidateAndRectifyIEs(pMac, pFrame, nFrame, &nMissingRsnBytes);
78 if ( status == eSIR_SUCCESS )
79 {
80 WDA_GET_RX_MPDU_LEN(pRxPacketInfo) += nMissingRsnBytes;
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -080081 }
82
83 return status;
84}
85
Jeff Johnson295189b2012-06-20 16:38:30 -070086/**
87 * limProcessProbeRspFrame
88 *
89 *FUNCTION:
90 * This function is called by limProcessMessageQueue() upon
91 * Probe Response frame reception.
92 *
93 *LOGIC:
94 * This function processes received Probe Response frame.
95 *
96 *ASSUMPTIONS:
97 *
98 *NOTE:
99 * 1. Frames with out-of-order IEs are dropped.
100 * 2. In case of IBSS, join 'success' makes MLM state machine
101 * transition into 'BSS started' state. This may have to change
102 * depending on supporting what kinda Authentication in IBSS.
103 *
104 * @param pMac Pointer to Global MAC structure
105 * @param *pRxPacketInfo A pointer to Buffer descriptor + associated PDUs
106 * @return None
107 */
108
109
110void
111limProcessProbeRspFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo,tpPESession psessionEntry)
112{
113 tANI_U8 *pBody;
114 tANI_U32 frameLen = 0;
115 tSirMacAddr currentBssId;
116 tpSirMacMgmtHdr pHdr;
Jeff Johnson32d95a32012-09-10 13:15:23 -0700117 tSirProbeRespBeacon *pProbeRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -0700118 tANI_U8 qosEnabled = false;
119 tANI_U8 wmeEnabled = false;
120
Dino Myclea7f18452014-04-24 08:55:31 +0530121 if (!psessionEntry)
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +0530122 {
Dino Myclea7f18452014-04-24 08:55:31 +0530123 limLog(pMac, LOGE, FL("psessionEntry is NULL") );
124 return;
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +0530125 }
Dino Myclea7f18452014-04-24 08:55:31 +0530126 limLog(pMac,LOG1,"SessionId:%d ProbeRsp Frame is received",
127 psessionEntry->peSessionId);
128
Padma, Santhosh Kumar2b47ca82014-01-03 16:57:27 +0530129
Abhishek Singhc75726d2015-04-13 14:44:14 +0530130 pProbeRsp = vos_mem_vmalloc(sizeof(tSirProbeRespBeacon));
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530131 if ( NULL == pProbeRsp )
Jeff Johnson32d95a32012-09-10 13:15:23 -0700132 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530133 limLog(pMac, LOGE, FL("Unable to allocate memory in limProcessProbeRspFrame") );
Jeff Johnson32d95a32012-09-10 13:15:23 -0700134 return;
135 }
136
137 pProbeRsp->ssId.length = 0;
138 pProbeRsp->wpa.length = 0;
139 pProbeRsp->propIEinfo.apName.length = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700140
141
142 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
143
144
Abhishek Singh525045c2014-12-15 17:18:45 +0530145 limLog(pMac, LOG2,
Jeff Johnson295189b2012-06-20 16:38:30 -0700146 FL("Received Probe Response frame with length=%d from "),
147 WDA_GET_RX_MPDU_LEN(pRxPacketInfo));
Abhishek Singh525045c2014-12-15 17:18:45 +0530148 limPrintMacAddr(pMac, pHdr->sa, LOG2);
Jeff Johnson295189b2012-06-20 16:38:30 -0700149
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530150 if (!pMac->fScanOffload)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700151 {
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530152 if (limDeactivateMinChannelTimerDuringScan(pMac) != eSIR_SUCCESS)
153 {
Abhishek Singhc75726d2015-04-13 14:44:14 +0530154 vos_mem_vfree(pProbeRsp);
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530155 return;
156 }
Jeff Johnson32d95a32012-09-10 13:15:23 -0700157 }
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530158
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800159 // Validate IE information before processing Probe Response Frame
Rashmi Ramanna2b55dc12014-06-10 22:56:20 +0530160 if (limValidateIEInformationInProbeRspFrame(pMac, pRxPacketInfo)
161 != eSIR_SUCCESS)
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800162 {
163 PELOG1(limLog(pMac, LOG1,
164 FL("Parse error ProbeResponse, length=%d"), frameLen);)
Abhishek Singhc75726d2015-04-13 14:44:14 +0530165 vos_mem_vfree(pProbeRsp);
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800166 return;
167 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700168
169 /**
170 * Expect Probe Response only when
171 * 1. STA is in scan mode waiting for Beacon/Probe response or
172 * 2. STA is waiting for Beacon/Probe Response to announce
173 * join success or
174 * 3. STA is in IBSS mode in BSS started state or
175 * 4. STA/AP is in learn mode
176 * 5. STA in link established state. In this state, the probe response is
177 * expected for two scenarios:
178 * -- As part of heart beat mechanism, probe req is sent out
179 * -- If QoS Info IE in beacon has a different count for EDCA Params,
180 * and EDCA IE is not present in beacon,
181 * then probe req is sent out to get the EDCA params.
182 *
183 * Ignore Probe Response frame in all other states
184 */
Kiet Lam842dad02014-02-18 18:44:02 -0800185
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530186 // TO SUPPORT BT-AMP
Jeff Johnson295189b2012-06-20 16:38:30 -0700187 if (((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) || //mlm state check should be global - 18th oct
188 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) || //mlm state check should be global - 18th oct
189 (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE) || //mlm state check should be global - 18th oct
190 (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE) ||
191 (psessionEntry->limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE) )||
192 ((GET_LIM_SYSTEM_ROLE(psessionEntry) == eLIM_STA_IN_IBSS_ROLE) &&
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530193 (psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE)) ||
194 pMac->fScanOffload)
Jeff Johnson295189b2012-06-20 16:38:30 -0700195 {
196 frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
197
Chet Lanctotc6fbce72013-05-20 17:52:15 -0700198 if (pMac->lim.gLimBackgroundScanMode == eSIR_ROAMING_SCAN)
199 {
200 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
201 FL("Probe Resp Frame Received: BSSID " MAC_ADDRESS_STR " (RSSI %d)"),
202 MAC_ADDR_ARRAY(pHdr->bssId),
203 (uint)abs((tANI_S8)WDA_GET_RX_RSSI_DB(pRxPacketInfo)));
204 }
205
Jeff Johnson295189b2012-06-20 16:38:30 -0700206 // Get pointer to Probe Response frame body
207 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
208
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800209 if (sirConvertProbeFrame2Struct(pMac, pBody, frameLen, pProbeRsp) == eSIR_FAILURE ||
210 !pProbeRsp->ssidPresent) // Enforce Mandatory IEs
Jeff Johnson295189b2012-06-20 16:38:30 -0700211 {
212 PELOG1(limLog(pMac, LOG1,
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800213 FL("Parse error ProbeResponse, length=%d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700214 frameLen);)
Abhishek Singhc75726d2015-04-13 14:44:14 +0530215 vos_mem_vfree(pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700216 return;
217 }
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530218
219 if (pMac->fScanOffload)
220 {
221 limCheckAndAddBssDescription(pMac, pProbeRsp, pRxPacketInfo,
222 eANI_BOOLEAN_FALSE, eANI_BOOLEAN_TRUE);
223 }
224
225 //To Support BT-AMP
Jeff Johnson295189b2012-06-20 16:38:30 -0700226 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) || //mlm state check should be global - 18th oct
227 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE))
Jeff Johnson32d95a32012-09-10 13:15:23 -0700228 limCheckAndAddBssDescription(pMac, pProbeRsp, pRxPacketInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -0700229 ((pMac->lim.gLimHalScanState == eLIM_HAL_SCANNING_STATE) ? eANI_BOOLEAN_TRUE : eANI_BOOLEAN_FALSE), eANI_BOOLEAN_TRUE);
230 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE) //mlm state check should be global - 18th oct
231 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700232 }
233 else if (psessionEntry->limMlmState ==
234 eLIM_MLM_WT_JOIN_BEACON_STATE)
235 {
Jeff Johnson43971f52012-07-17 12:26:56 -0700236 if( psessionEntry->beacon != NULL )//Either Beacon/probe response is required. Hence store it in same buffer.
Jeff Johnson295189b2012-06-20 16:38:30 -0700237 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530238 vos_mem_free(psessionEntry->beacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700239 psessionEntry->beacon = NULL;
Jeff Johnson43971f52012-07-17 12:26:56 -0700240 }
241 psessionEntry->bcnLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530242
243 psessionEntry->beacon = vos_mem_malloc(psessionEntry->bcnLen);
244 if ( NULL == psessionEntry->beacon )
Jeff Johnson43971f52012-07-17 12:26:56 -0700245 {
246 PELOGE(limLog(pMac, LOGE,
247 FL("Unable to allocate memory to store beacon"));)
248 }
249 else
250 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700251 //Store the Beacon/ProbeRsp. This is sent to csr/hdd in join cnf response.
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530252 vos_mem_copy(psessionEntry->beacon,
253 WDA_GET_RX_MPDU_DATA(pRxPacketInfo),
254 psessionEntry->bcnLen);
Jeff Johnson43971f52012-07-17 12:26:56 -0700255 }
256
Jeff Johnson295189b2012-06-20 16:38:30 -0700257 // STA in WT_JOIN_BEACON_STATE
Jeff Johnson32d95a32012-09-10 13:15:23 -0700258 limCheckAndAnnounceJoinSuccess(pMac, pProbeRsp, pHdr, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700259 }
260 else if(psessionEntry->limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)
261 {
262 tpDphHashNode pStaDs = NULL;
263 /**
264 * Check if this Probe Response is for
265 * our Probe Request sent upon reaching
266 * heart beat threshold
267 */
268 #if 0
269 if (wlan_cfgGetStr(pMac,
270 WNI_CFG_BSSID,
271 currentBssId,
272 &cfg) != eSIR_SUCCESS)
273 {
274 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700275 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700276 }
277 #endif //TO SUPPORT BT-AMP
278 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
279
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530280 if ( !vos_mem_compare(currentBssId, pHdr->bssId, sizeof(tSirMacAddr)) )
Jeff Johnson32d95a32012-09-10 13:15:23 -0700281 {
Abhishek Singhc75726d2015-04-13 14:44:14 +0530282 vos_mem_vfree(pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700283 return;
Jeff Johnson32d95a32012-09-10 13:15:23 -0700284 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700285
286 if (!LIM_IS_CONNECTION_ACTIVE(psessionEntry))
287 {
288 limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700289 FL("Received Probe Resp from AP. So it is alive!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700290
Jeff Johnson32d95a32012-09-10 13:15:23 -0700291 if (pProbeRsp->HTInfo.present)
292 limReceivedHBHandler(pMac, (tANI_U8)pProbeRsp->HTInfo.primaryChannel, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700293 else
Jeff Johnson32d95a32012-09-10 13:15:23 -0700294 limReceivedHBHandler(pMac, (tANI_U8)pProbeRsp->channelNumber, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700295 }
296
Jeff Johnson295189b2012-06-20 16:38:30 -0700297
298 if (psessionEntry->limSystemRole == eLIM_STA_ROLE)
299 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700300 if (pProbeRsp->channelSwitchPresent ||
Abhishek Singh39ae47e2017-10-30 17:39:50 +0530301 pProbeRsp->propIEinfo.propChannelSwitchPresent ||
302 pProbeRsp->ecsa_present)
Jeff Johnson295189b2012-06-20 16:38:30 -0700303 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700304 limUpdateChannelSwitch(pMac, pProbeRsp, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700305 }
Jeff Johnsone7245742012-09-05 17:12:55 -0700306 else if (psessionEntry->gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING)
Jeff Johnson295189b2012-06-20 16:38:30 -0700307 {
308 limCancelDot11hChannelSwitch(pMac, psessionEntry);
309 }
310 }
311
Jeff Johnson295189b2012-06-20 16:38:30 -0700312
313 /**
314 * Now Process EDCA Parameters, if EDCAParamSet count is different.
315 * -- While processing beacons in link established state if it is determined that
316 * QoS Info IE has a different count for EDCA Params,
317 * and EDCA IE is not present in beacon,
318 * then probe req is sent out to get the EDCA params.
319 */
320
321 pStaDs = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable);
322
323 limGetQosMode(psessionEntry, &qosEnabled);
324 limGetWmeMode(psessionEntry, &wmeEnabled);
325 PELOG2(limLog(pMac, LOG2,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700326 FL("wmeEdcaPresent: %d wmeEnabled: %d, edcaPresent: %d, qosEnabled: %d, edcaParams.qosInfo.count: %d schObject.gLimEdcaParamSetCount: %d"),
Jeff Johnson32d95a32012-09-10 13:15:23 -0700327 pProbeRsp->wmeEdcaPresent, wmeEnabled, pProbeRsp->edcaPresent, qosEnabled,
328 pProbeRsp->edcaParams.qosInfo.count, psessionEntry->gLimEdcaParamSetCount);)
329 if (((pProbeRsp->wmeEdcaPresent && wmeEnabled) ||
330 (pProbeRsp->edcaPresent && qosEnabled)) &&
331 (pProbeRsp->edcaParams.qosInfo.count != psessionEntry->gLimEdcaParamSetCount))
Jeff Johnson295189b2012-06-20 16:38:30 -0700332 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700333 if (schBeaconEdcaProcess(pMac, &pProbeRsp->edcaParams, psessionEntry) != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700334 PELOGE(limLog(pMac, LOGE, FL("EDCA parameter processing error"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700335 else if (pStaDs != NULL)
336 {
337 // If needed, downgrade the EDCA parameters
338 limSetActiveEdcaParams(pMac, psessionEntry->gLimEdcaParams, psessionEntry);
339
340 if (pStaDs->aniPeer == eANI_BOOLEAN_TRUE)
341 limSendEdcaParams(pMac, psessionEntry->gLimEdcaParamsActive, pStaDs->bssId, eANI_BOOLEAN_TRUE);
342 else
343 limSendEdcaParams(pMac, psessionEntry->gLimEdcaParamsActive, pStaDs->bssId, eANI_BOOLEAN_FALSE);
344 }
345 else
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700346 PELOGE(limLog(pMac, LOGE, FL("Self Entry missing in Hash Table"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700347
348 }
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +0530349
350 if (psessionEntry->fWaitForProbeRsp == true)
351 {
352 limLog(pMac, LOGW, FL("Checking probe response for capability change\n") );
353 limDetectChangeInApCapabilities(pMac, pProbeRsp, psessionEntry);
354 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700355 }
356 else if ((psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE) &&
357 (psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE))
Jeff Johnson32d95a32012-09-10 13:15:23 -0700358 limHandleIBSScoalescing(pMac, pProbeRsp, pRxPacketInfo,psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700359 } // if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) || ...
360
Abhishek Singhc75726d2015-04-13 14:44:14 +0530361 vos_mem_vfree(pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700362 // Ignore Probe Response frame in all other states
363 return;
364} /*** end limProcessProbeRspFrame() ***/
365
366
367void
368limProcessProbeRspFrameNoSession(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo)
369{
370 tANI_U8 *pBody;
371 tANI_U32 frameLen = 0;
372 tpSirMacMgmtHdr pHdr;
Jeff Johnson32d95a32012-09-10 13:15:23 -0700373 tSirProbeRespBeacon *pProbeRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -0700374
Abhishek Singhc75726d2015-04-13 14:44:14 +0530375 pProbeRsp = vos_mem_vmalloc(sizeof(tSirProbeRespBeacon));
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530376 if ( NULL == pProbeRsp )
Jeff Johnson32d95a32012-09-10 13:15:23 -0700377 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530378 limLog(pMac, LOGE, FL("Unable to allocate memory in limProcessProbeRspFrameNoSession") );
Jeff Johnson32d95a32012-09-10 13:15:23 -0700379 return;
380 }
381
382 pProbeRsp->ssId.length = 0;
383 pProbeRsp->wpa.length = 0;
384 pProbeRsp->propIEinfo.apName.length = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700385
386
387 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
388
389
390 limLog(pMac, LOG2,
391 FL("Received Probe Response frame with length=%d from "),
392 WDA_GET_RX_MPDU_LEN(pRxPacketInfo));
393 limPrintMacAddr(pMac, pHdr->sa, LOG2);
394
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700395#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
396 if (!(WDA_GET_OFFLOADSCANLEARN(pRxPacketInfo) ||
397 WDA_GET_ROAMCANDIDATEIND(pRxPacketInfo)))
Jeff Johnson32d95a32012-09-10 13:15:23 -0700398 {
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700399#endif
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530400 if (!pMac->fScanOffload)
401 {
402 if (limDeactivateMinChannelTimerDuringScan(pMac) != eSIR_SUCCESS)
403 {
Abhishek Singhc75726d2015-04-13 14:44:14 +0530404 vos_mem_vfree(pProbeRsp);
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530405 return;
406 }
407 }
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700408#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
Jeff Johnson32d95a32012-09-10 13:15:23 -0700409 }
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700410#endif
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800411 // Validate IE information before processing Probe Response Frame
Rashmi Ramanna2b55dc12014-06-10 22:56:20 +0530412 if (limValidateIEInformationInProbeRspFrame(pMac, pRxPacketInfo)
413 != eSIR_SUCCESS)
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800414 {
415 PELOG1(limLog(pMac, LOG1,FL("Parse error ProbeResponse, length=%d"),
416 frameLen);)
Abhishek Singhc75726d2015-04-13 14:44:14 +0530417 vos_mem_vfree(pProbeRsp);
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800418 return;
419 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700420 /* Since there is no psessionEntry, PE cannot be in the following states:
421 * - eLIM_MLM_WT_JOIN_BEACON_STATE
422 * - eLIM_MLM_LINK_ESTABLISHED_STATE
423 * - eLIM_MLM_BSS_STARTED_STATE
424 * Hence, expect Probe Response only when
425 * 1. STA is in scan mode waiting for Beacon/Probe response
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700426 * 2. LFR logic in FW sends up candidate frames
Jeff Johnson295189b2012-06-20 16:38:30 -0700427 *
428 * Ignore Probe Response frame in all other states
429 */
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700430#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
431 if (WDA_GET_OFFLOADSCANLEARN(pRxPacketInfo))
432 {
433 frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
434
Chet Lanctotc6fbce72013-05-20 17:52:15 -0700435 if (pMac->lim.gLimBackgroundScanMode == eSIR_ROAMING_SCAN)
436 {
437 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
438 FL("Probe Resp Frame Received: BSSID " MAC_ADDRESS_STR " (RSSI %d)"),
439 MAC_ADDR_ARRAY(pHdr->bssId),
440 (uint)abs((tANI_S8)WDA_GET_RX_RSSI_DB(pRxPacketInfo)));
441 }
442
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700443 // Get pointer to Probe Response frame body
444 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
445
446 if (sirConvertProbeFrame2Struct(pMac, pBody, frameLen, pProbeRsp) == eSIR_FAILURE)
447 {
448 limLog(pMac, LOG1, FL("Parse error ProbeResponse, length=%d\n"), frameLen);
Abhishek Singhc75726d2015-04-13 14:44:14 +0530449 vos_mem_vfree(pProbeRsp);
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700450 return;
451 }
452 limLog( pMac, LOG2, FL("Save this probe rsp in LFR cache"));
453 limCheckAndAddBssDescription(pMac, pProbeRsp, pRxPacketInfo,
454 eANI_BOOLEAN_FALSE, eANI_BOOLEAN_TRUE);
455 }
456 else
457#endif
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530458 if (pMac->fScanOffload)
459 {
460 frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
461
462 // Get pointer to Probe Response frame body
463 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
464
465 if (sirConvertProbeFrame2Struct(pMac, pBody, frameLen, pProbeRsp)
466 == eSIR_FAILURE)
467 {
468 limLog(pMac, LOG1,
469 FL("Parse error ProbeResponse, length=%d\n"), frameLen);
Abhishek Singhc75726d2015-04-13 14:44:14 +0530470 vos_mem_vfree(pProbeRsp);
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530471 return;
472 }
473 limCheckAndAddBssDescription(pMac, pProbeRsp, pRxPacketInfo,
474 eANI_BOOLEAN_FALSE, eANI_BOOLEAN_TRUE);
475 }
476 else if( (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
Jeff Johnson295189b2012-06-20 16:38:30 -0700477 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) || //mlm state check should be global - 18th oct
478 (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE) )
479 {
480 frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
481
Chet Lanctotc6fbce72013-05-20 17:52:15 -0700482 if (pMac->lim.gLimBackgroundScanMode == eSIR_ROAMING_SCAN)
483 {
484 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
485 FL("Probe Resp Frame Received: BSSID " MAC_ADDRESS_STR " (RSSI %d)"),
486 MAC_ADDR_ARRAY(pHdr->bssId),
487 (uint)abs((tANI_S8)WDA_GET_RX_RSSI_DB(pRxPacketInfo)));
488 }
489
Jeff Johnson295189b2012-06-20 16:38:30 -0700490 // Get pointer to Probe Response frame body
491 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
492
Jeff Johnson32d95a32012-09-10 13:15:23 -0700493 if (sirConvertProbeFrame2Struct(pMac, pBody, frameLen, pProbeRsp) == eSIR_FAILURE)
Jeff Johnson295189b2012-06-20 16:38:30 -0700494 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700495 limLog(pMac, LOG1, FL("Parse error ProbeResponse, length=%d"), frameLen);
Abhishek Singhc75726d2015-04-13 14:44:14 +0530496 vos_mem_vfree(pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700497 return;
498 }
499
500 if( (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
501 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) )
Jeff Johnson32d95a32012-09-10 13:15:23 -0700502 limCheckAndAddBssDescription(pMac, pProbeRsp, pRxPacketInfo, eANI_BOOLEAN_TRUE, eANI_BOOLEAN_TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700503 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE)
504 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700505 }
506 }
Abhishek Singhc75726d2015-04-13 14:44:14 +0530507 vos_mem_vfree(pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700508 return;
509} /*** end limProcessProbeRspFrameNew() ***/