blob: ab8217953b778d741db2ce88af736f0b6373fc21 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Gopichand Nakkala92f07d82013-01-08 21:16:34 -08002 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21/*
Jeff Johnson32d95a32012-09-10 13:15:23 -070022 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Jeff Johnson295189b2012-06-20 16:38:30 -070023 *
24 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
25 *
26 *
27 * Permission to use, copy, modify, and/or distribute this software for
28 * any purpose with or without fee is hereby granted, provided that the
29 * above copyright notice and this permission notice appear in all
30 * copies.
31 *
32 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
33 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
34 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
35 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
36 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
37 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
38 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
39 * PERFORMANCE OF THIS SOFTWARE.
40 */
41
42/*
43 *
44 * Airgo Networks, Inc proprietary. All rights reserved.
45 * This file limProcessProbeRspFrame.cc contains the code
46 * for processing Probe Response Frame.
47 * Author: Chandra Modumudi
48 * Date: 03/01/02
49 * History:-
50 * Date Modified by Modification Information
51 * --------------------------------------------------------------------
52 *
53 */
54
55#include "wniApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070056#include "wniCfgSta.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070057#include "aniGlobal.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070058#include "schApi.h"
59#include "utilsApi.h"
60#include "limApi.h"
61#include "limTypes.h"
62#include "limUtils.h"
63#include "limAssocUtils.h"
64#include "limPropExtsUtils.h"
65#include "limSerDesUtils.h"
66#include "limSendMessages.h"
67
68#include "parserApi.h"
69
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -080070tSirRetStatus
71limValidateIEInformationInProbeRspFrame (tANI_U8 *pRxPacketInfo)
72{
73 tSirRetStatus status = eSIR_SUCCESS;
74
75 if (WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo) < (SIR_MAC_B_PR_SSID_OFFSET + SIR_MAC_MIN_IE_LEN))
76 {
77 status = eSIR_FAILURE;
78 }
79
80 return status;
81}
82
Jeff Johnson295189b2012-06-20 16:38:30 -070083/**
84 * limProcessProbeRspFrame
85 *
86 *FUNCTION:
87 * This function is called by limProcessMessageQueue() upon
88 * Probe Response frame reception.
89 *
90 *LOGIC:
91 * This function processes received Probe Response frame.
92 *
93 *ASSUMPTIONS:
94 *
95 *NOTE:
96 * 1. Frames with out-of-order IEs are dropped.
97 * 2. In case of IBSS, join 'success' makes MLM state machine
98 * transition into 'BSS started' state. This may have to change
99 * depending on supporting what kinda Authentication in IBSS.
100 *
101 * @param pMac Pointer to Global MAC structure
102 * @param *pRxPacketInfo A pointer to Buffer descriptor + associated PDUs
103 * @return None
104 */
105
106
107void
108limProcessProbeRspFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo,tpPESession psessionEntry)
109{
110 tANI_U8 *pBody;
111 tANI_U32 frameLen = 0;
112 tSirMacAddr currentBssId;
113 tpSirMacMgmtHdr pHdr;
Jeff Johnson32d95a32012-09-10 13:15:23 -0700114 tSirProbeRespBeacon *pProbeRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -0700115 tANI_U8 qosEnabled = false;
116 tANI_U8 wmeEnabled = false;
117
Jeff Johnson32d95a32012-09-10 13:15:23 -0700118 if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,
119 (void **)&pProbeRsp, sizeof(tSirProbeRespBeacon)))
120 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700121 limLog(pMac, LOGE, FL("Unable to PAL allocate memory in limProcessProbeRspFrame") );
Jeff Johnson32d95a32012-09-10 13:15:23 -0700122 return;
123 }
124
125 pProbeRsp->ssId.length = 0;
126 pProbeRsp->wpa.length = 0;
127 pProbeRsp->propIEinfo.apName.length = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700128
129
130 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
131
132
133 PELOG2(limLog(pMac, LOG2,
134 FL("Received Probe Response frame with length=%d from "),
135 WDA_GET_RX_MPDU_LEN(pRxPacketInfo));
136 limPrintMacAddr(pMac, pHdr->sa, LOG2);)
137
138 if (limDeactivateMinChannelTimerDuringScan(pMac) != eSIR_SUCCESS)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700139 {
140 palFreeMemory(pMac->hHdd, pProbeRsp);
141 return;
142 }
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800143 // Validate IE information before processing Probe Response Frame
144 if (limValidateIEInformationInProbeRspFrame(pRxPacketInfo) != eSIR_SUCCESS)
145 {
146 PELOG1(limLog(pMac, LOG1,
147 FL("Parse error ProbeResponse, length=%d"), frameLen);)
148 palFreeMemory(pMac->hHdd, pProbeRsp);
149 return;
150 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700151
152 /**
153 * Expect Probe Response only when
154 * 1. STA is in scan mode waiting for Beacon/Probe response or
155 * 2. STA is waiting for Beacon/Probe Response to announce
156 * join success or
157 * 3. STA is in IBSS mode in BSS started state or
158 * 4. STA/AP is in learn mode
159 * 5. STA in link established state. In this state, the probe response is
160 * expected for two scenarios:
161 * -- As part of heart beat mechanism, probe req is sent out
162 * -- If QoS Info IE in beacon has a different count for EDCA Params,
163 * and EDCA IE is not present in beacon,
164 * then probe req is sent out to get the EDCA params.
165 *
166 * Ignore Probe Response frame in all other states
167 */
168 // TO SUPPORT BT-AMP
169 if (((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) || //mlm state check should be global - 18th oct
170 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) || //mlm state check should be global - 18th oct
171 (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE) || //mlm state check should be global - 18th oct
172 (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE) ||
173 (psessionEntry->limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE) )||
174 ((GET_LIM_SYSTEM_ROLE(psessionEntry) == eLIM_STA_IN_IBSS_ROLE) &&
175 (psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE)))
176 {
177 frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
178
Chet Lanctotc6fbce72013-05-20 17:52:15 -0700179 if (pMac->lim.gLimBackgroundScanMode == eSIR_ROAMING_SCAN)
180 {
181 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
182 FL("Probe Resp Frame Received: BSSID " MAC_ADDRESS_STR " (RSSI %d)"),
183 MAC_ADDR_ARRAY(pHdr->bssId),
184 (uint)abs((tANI_S8)WDA_GET_RX_RSSI_DB(pRxPacketInfo)));
185 }
186
Jeff Johnson295189b2012-06-20 16:38:30 -0700187 // Get pointer to Probe Response frame body
188 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
189
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800190 if (sirConvertProbeFrame2Struct(pMac, pBody, frameLen, pProbeRsp) == eSIR_FAILURE ||
191 !pProbeRsp->ssidPresent) // Enforce Mandatory IEs
Jeff Johnson295189b2012-06-20 16:38:30 -0700192 {
193 PELOG1(limLog(pMac, LOG1,
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800194 FL("Parse error ProbeResponse, length=%d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700195 frameLen);)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700196 palFreeMemory(pMac->hHdd, pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700197 return;
198 }
199 //To Support BT-AMP
200 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) || //mlm state check should be global - 18th oct
201 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE))
Jeff Johnson32d95a32012-09-10 13:15:23 -0700202 limCheckAndAddBssDescription(pMac, pProbeRsp, pRxPacketInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -0700203 ((pMac->lim.gLimHalScanState == eLIM_HAL_SCANNING_STATE) ? eANI_BOOLEAN_TRUE : eANI_BOOLEAN_FALSE), eANI_BOOLEAN_TRUE);
204 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE) //mlm state check should be global - 18th oct
205 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700206 }
207 else if (psessionEntry->limMlmState ==
208 eLIM_MLM_WT_JOIN_BEACON_STATE)
209 {
Jeff Johnson43971f52012-07-17 12:26:56 -0700210 if( psessionEntry->beacon != NULL )//Either Beacon/probe response is required. Hence store it in same buffer.
Jeff Johnson295189b2012-06-20 16:38:30 -0700211 {
212 palFreeMemory(pMac->hHdd, psessionEntry->beacon);
213 psessionEntry->beacon = NULL;
Jeff Johnson43971f52012-07-17 12:26:56 -0700214 }
215 psessionEntry->bcnLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
216 if ((palAllocateMemory(pMac->hHdd, (void**)&psessionEntry->beacon,
217 psessionEntry->bcnLen))
218 != eHAL_STATUS_SUCCESS)
219 {
220 PELOGE(limLog(pMac, LOGE,
221 FL("Unable to allocate memory to store beacon"));)
222 }
223 else
224 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700225 //Store the Beacon/ProbeRsp. This is sent to csr/hdd in join cnf response.
Jeff Johnson43971f52012-07-17 12:26:56 -0700226 palCopyMemory(pMac->hHdd, psessionEntry->beacon,
227 WDA_GET_RX_MPDU_DATA(pRxPacketInfo),
228 psessionEntry->bcnLen);
229 }
230
Jeff Johnson295189b2012-06-20 16:38:30 -0700231 // STA in WT_JOIN_BEACON_STATE
Jeff Johnson32d95a32012-09-10 13:15:23 -0700232 limCheckAndAnnounceJoinSuccess(pMac, pProbeRsp, pHdr, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700233 }
234 else if(psessionEntry->limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)
235 {
236 tpDphHashNode pStaDs = NULL;
237 /**
238 * Check if this Probe Response is for
239 * our Probe Request sent upon reaching
240 * heart beat threshold
241 */
242 #if 0
243 if (wlan_cfgGetStr(pMac,
244 WNI_CFG_BSSID,
245 currentBssId,
246 &cfg) != eSIR_SUCCESS)
247 {
248 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700249 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700250 }
251 #endif //TO SUPPORT BT-AMP
252 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
253
254 if ( !palEqualMemory( pMac->hHdd,currentBssId, pHdr->bssId, sizeof(tSirMacAddr)) )
Jeff Johnson32d95a32012-09-10 13:15:23 -0700255 {
256 palFreeMemory(pMac->hHdd, pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700257 return;
Jeff Johnson32d95a32012-09-10 13:15:23 -0700258 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700259
260 if (!LIM_IS_CONNECTION_ACTIVE(psessionEntry))
261 {
262 limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700263 FL("Received Probe Resp from AP. So it is alive!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700264
Jeff Johnson32d95a32012-09-10 13:15:23 -0700265 if (pProbeRsp->HTInfo.present)
266 limReceivedHBHandler(pMac, (tANI_U8)pProbeRsp->HTInfo.primaryChannel, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700267 else
Jeff Johnson32d95a32012-09-10 13:15:23 -0700268 limReceivedHBHandler(pMac, (tANI_U8)pProbeRsp->channelNumber, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700269 }
270
Jeff Johnson295189b2012-06-20 16:38:30 -0700271
272 if (psessionEntry->limSystemRole == eLIM_STA_ROLE)
273 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700274 if (pProbeRsp->channelSwitchPresent ||
275 pProbeRsp->propIEinfo.propChannelSwitchPresent)
Jeff Johnson295189b2012-06-20 16:38:30 -0700276 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700277 limUpdateChannelSwitch(pMac, pProbeRsp, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700278 }
Jeff Johnsone7245742012-09-05 17:12:55 -0700279 else if (psessionEntry->gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING)
Jeff Johnson295189b2012-06-20 16:38:30 -0700280 {
281 limCancelDot11hChannelSwitch(pMac, psessionEntry);
282 }
283 }
284
Jeff Johnson295189b2012-06-20 16:38:30 -0700285
286 /**
287 * Now Process EDCA Parameters, if EDCAParamSet count is different.
288 * -- While processing beacons in link established state if it is determined that
289 * QoS Info IE has a different count for EDCA Params,
290 * and EDCA IE is not present in beacon,
291 * then probe req is sent out to get the EDCA params.
292 */
293
294 pStaDs = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable);
295
296 limGetQosMode(psessionEntry, &qosEnabled);
297 limGetWmeMode(psessionEntry, &wmeEnabled);
298 PELOG2(limLog(pMac, LOG2,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700299 FL("wmeEdcaPresent: %d wmeEnabled: %d, edcaPresent: %d, qosEnabled: %d, edcaParams.qosInfo.count: %d schObject.gLimEdcaParamSetCount: %d"),
Jeff Johnson32d95a32012-09-10 13:15:23 -0700300 pProbeRsp->wmeEdcaPresent, wmeEnabled, pProbeRsp->edcaPresent, qosEnabled,
301 pProbeRsp->edcaParams.qosInfo.count, psessionEntry->gLimEdcaParamSetCount);)
302 if (((pProbeRsp->wmeEdcaPresent && wmeEnabled) ||
303 (pProbeRsp->edcaPresent && qosEnabled)) &&
304 (pProbeRsp->edcaParams.qosInfo.count != psessionEntry->gLimEdcaParamSetCount))
Jeff Johnson295189b2012-06-20 16:38:30 -0700305 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700306 if (schBeaconEdcaProcess(pMac, &pProbeRsp->edcaParams, psessionEntry) != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700307 PELOGE(limLog(pMac, LOGE, FL("EDCA parameter processing error"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700308 else if (pStaDs != NULL)
309 {
310 // If needed, downgrade the EDCA parameters
311 limSetActiveEdcaParams(pMac, psessionEntry->gLimEdcaParams, psessionEntry);
312
313 if (pStaDs->aniPeer == eANI_BOOLEAN_TRUE)
314 limSendEdcaParams(pMac, psessionEntry->gLimEdcaParamsActive, pStaDs->bssId, eANI_BOOLEAN_TRUE);
315 else
316 limSendEdcaParams(pMac, psessionEntry->gLimEdcaParamsActive, pStaDs->bssId, eANI_BOOLEAN_FALSE);
317 }
318 else
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700319 PELOGE(limLog(pMac, LOGE, FL("Self Entry missing in Hash Table"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700320
321 }
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +0530322
323 if (psessionEntry->fWaitForProbeRsp == true)
324 {
325 limLog(pMac, LOGW, FL("Checking probe response for capability change\n") );
326 limDetectChangeInApCapabilities(pMac, pProbeRsp, psessionEntry);
327 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700328 }
329 else if ((psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE) &&
330 (psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE))
Jeff Johnson32d95a32012-09-10 13:15:23 -0700331 limHandleIBSScoalescing(pMac, pProbeRsp, pRxPacketInfo,psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700332 } // if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) || ...
333
Jeff Johnson32d95a32012-09-10 13:15:23 -0700334 palFreeMemory(pMac->hHdd, pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700335 // Ignore Probe Response frame in all other states
336 return;
337} /*** end limProcessProbeRspFrame() ***/
338
339
340void
341limProcessProbeRspFrameNoSession(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo)
342{
343 tANI_U8 *pBody;
344 tANI_U32 frameLen = 0;
345 tpSirMacMgmtHdr pHdr;
Jeff Johnson32d95a32012-09-10 13:15:23 -0700346 tSirProbeRespBeacon *pProbeRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -0700347
Jeff Johnson32d95a32012-09-10 13:15:23 -0700348 if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,
349 (void **)&pProbeRsp, sizeof(tSirProbeRespBeacon)))
350 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700351 limLog(pMac, LOGE, FL("Unable to PAL allocate memory in limProcessProbeRspFrameNoSession") );
Jeff Johnson32d95a32012-09-10 13:15:23 -0700352 return;
353 }
354
355 pProbeRsp->ssId.length = 0;
356 pProbeRsp->wpa.length = 0;
357 pProbeRsp->propIEinfo.apName.length = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700358
359
360 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
361
362
363 limLog(pMac, LOG2,
364 FL("Received Probe Response frame with length=%d from "),
365 WDA_GET_RX_MPDU_LEN(pRxPacketInfo));
366 limPrintMacAddr(pMac, pHdr->sa, LOG2);
367
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700368#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
369 if (!(WDA_GET_OFFLOADSCANLEARN(pRxPacketInfo) ||
370 WDA_GET_ROAMCANDIDATEIND(pRxPacketInfo)))
Jeff Johnson32d95a32012-09-10 13:15:23 -0700371 {
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700372#endif
373 if (limDeactivateMinChannelTimerDuringScan(pMac) != eSIR_SUCCESS)
374 {
375 palFreeMemory(pMac->hHdd, pProbeRsp);
376 return;
377 }
378#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
Jeff Johnson32d95a32012-09-10 13:15:23 -0700379 }
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700380#endif
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800381 // Validate IE information before processing Probe Response Frame
382 if (limValidateIEInformationInProbeRspFrame(pRxPacketInfo) != eSIR_SUCCESS)
383 {
384 PELOG1(limLog(pMac, LOG1,FL("Parse error ProbeResponse, length=%d"),
385 frameLen);)
386 palFreeMemory(pMac->hHdd, pProbeRsp);
387 return;
388 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700389 /* Since there is no psessionEntry, PE cannot be in the following states:
390 * - eLIM_MLM_WT_JOIN_BEACON_STATE
391 * - eLIM_MLM_LINK_ESTABLISHED_STATE
392 * - eLIM_MLM_BSS_STARTED_STATE
393 * Hence, expect Probe Response only when
394 * 1. STA is in scan mode waiting for Beacon/Probe response
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700395 * 2. LFR logic in FW sends up candidate frames
Jeff Johnson295189b2012-06-20 16:38:30 -0700396 *
397 * Ignore Probe Response frame in all other states
398 */
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700399#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
400 if (WDA_GET_OFFLOADSCANLEARN(pRxPacketInfo))
401 {
402 frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
403
Chet Lanctotc6fbce72013-05-20 17:52:15 -0700404 if (pMac->lim.gLimBackgroundScanMode == eSIR_ROAMING_SCAN)
405 {
406 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
407 FL("Probe Resp Frame Received: BSSID " MAC_ADDRESS_STR " (RSSI %d)"),
408 MAC_ADDR_ARRAY(pHdr->bssId),
409 (uint)abs((tANI_S8)WDA_GET_RX_RSSI_DB(pRxPacketInfo)));
410 }
411
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700412 // Get pointer to Probe Response frame body
413 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
414
415 if (sirConvertProbeFrame2Struct(pMac, pBody, frameLen, pProbeRsp) == eSIR_FAILURE)
416 {
417 limLog(pMac, LOG1, FL("Parse error ProbeResponse, length=%d\n"), frameLen);
418 palFreeMemory(pMac->hHdd, pProbeRsp);
419 return;
420 }
421 limLog( pMac, LOG2, FL("Save this probe rsp in LFR cache"));
422 limCheckAndAddBssDescription(pMac, pProbeRsp, pRxPacketInfo,
423 eANI_BOOLEAN_FALSE, eANI_BOOLEAN_TRUE);
424 }
425 else
426#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700427 if( (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
428 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) || //mlm state check should be global - 18th oct
429 (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE) )
430 {
431 frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
432
Chet Lanctotc6fbce72013-05-20 17:52:15 -0700433 if (pMac->lim.gLimBackgroundScanMode == eSIR_ROAMING_SCAN)
434 {
435 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
436 FL("Probe Resp Frame Received: BSSID " MAC_ADDRESS_STR " (RSSI %d)"),
437 MAC_ADDR_ARRAY(pHdr->bssId),
438 (uint)abs((tANI_S8)WDA_GET_RX_RSSI_DB(pRxPacketInfo)));
439 }
440
Jeff Johnson295189b2012-06-20 16:38:30 -0700441 // Get pointer to Probe Response frame body
442 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
443
Jeff Johnson32d95a32012-09-10 13:15:23 -0700444 if (sirConvertProbeFrame2Struct(pMac, pBody, frameLen, pProbeRsp) == eSIR_FAILURE)
Jeff Johnson295189b2012-06-20 16:38:30 -0700445 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700446 limLog(pMac, LOG1, FL("Parse error ProbeResponse, length=%d"), frameLen);
Jeff Johnson32d95a32012-09-10 13:15:23 -0700447 palFreeMemory(pMac->hHdd, pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700448 return;
449 }
450
451 if( (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
452 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) )
Jeff Johnson32d95a32012-09-10 13:15:23 -0700453 limCheckAndAddBssDescription(pMac, pProbeRsp, pRxPacketInfo, eANI_BOOLEAN_TRUE, eANI_BOOLEAN_TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700454 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE)
455 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700456 }
457 }
Jeff Johnson32d95a32012-09-10 13:15:23 -0700458 palFreeMemory(pMac->hHdd, pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700459 return;
460} /*** end limProcessProbeRspFrameNew() ***/