blob: 6c1546f3349de68c7f67c5042f680bc61831aee7 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Kiet Lamaa8e15a2014-02-11 23:30:06 -08002 * Copyright (c) 2012-2013 Qualcomm Atheros, Inc.
3 * All Rights Reserved.
4 * Qualcomm Atheros Confidential and Proprietary.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -08005 */
6/*
Jeff Johnson295189b2012-06-20 16:38:30 -07007 *
8 * Airgo Networks, Inc proprietary. All rights reserved.
9 * This file limProcessProbeRspFrame.cc contains the code
10 * for processing Probe Response Frame.
11 * Author: Chandra Modumudi
12 * Date: 03/01/02
13 * History:-
14 * Date Modified by Modification Information
15 * --------------------------------------------------------------------
16 *
17 */
18
19#include "wniApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070020#include "wniCfgSta.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070021#include "aniGlobal.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070022#include "schApi.h"
23#include "utilsApi.h"
24#include "limApi.h"
25#include "limTypes.h"
26#include "limUtils.h"
27#include "limAssocUtils.h"
28#include "limPropExtsUtils.h"
29#include "limSerDesUtils.h"
30#include "limSendMessages.h"
31
32#include "parserApi.h"
33
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -080034tSirRetStatus
35limValidateIEInformationInProbeRspFrame (tANI_U8 *pRxPacketInfo)
36{
37 tSirRetStatus status = eSIR_SUCCESS;
38
39 if (WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo) < (SIR_MAC_B_PR_SSID_OFFSET + SIR_MAC_MIN_IE_LEN))
40 {
41 status = eSIR_FAILURE;
42 }
43
44 return status;
45}
46
Jeff Johnson295189b2012-06-20 16:38:30 -070047/**
48 * limProcessProbeRspFrame
49 *
50 *FUNCTION:
51 * This function is called by limProcessMessageQueue() upon
52 * Probe Response frame reception.
53 *
54 *LOGIC:
55 * This function processes received Probe Response frame.
56 *
57 *ASSUMPTIONS:
58 *
59 *NOTE:
60 * 1. Frames with out-of-order IEs are dropped.
61 * 2. In case of IBSS, join 'success' makes MLM state machine
62 * transition into 'BSS started' state. This may have to change
63 * depending on supporting what kinda Authentication in IBSS.
64 *
65 * @param pMac Pointer to Global MAC structure
66 * @param *pRxPacketInfo A pointer to Buffer descriptor + associated PDUs
67 * @return None
68 */
69
70
71void
72limProcessProbeRspFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo,tpPESession psessionEntry)
73{
74 tANI_U8 *pBody;
75 tANI_U32 frameLen = 0;
76 tSirMacAddr currentBssId;
77 tpSirMacMgmtHdr pHdr;
Jeff Johnson32d95a32012-09-10 13:15:23 -070078 tSirProbeRespBeacon *pProbeRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070079 tANI_U8 qosEnabled = false;
80 tANI_U8 wmeEnabled = false;
81
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +053082 pProbeRsp = vos_mem_malloc(sizeof(tSirProbeRespBeacon));
83 if ( NULL == pProbeRsp )
Jeff Johnson32d95a32012-09-10 13:15:23 -070084 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +053085 limLog(pMac, LOGE, FL("Unable to allocate memory in limProcessProbeRspFrame") );
Jeff Johnson32d95a32012-09-10 13:15:23 -070086 return;
87 }
88
89 pProbeRsp->ssId.length = 0;
90 pProbeRsp->wpa.length = 0;
91 pProbeRsp->propIEinfo.apName.length = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070092
93
94 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
95
96
97 PELOG2(limLog(pMac, LOG2,
98 FL("Received Probe Response frame with length=%d from "),
99 WDA_GET_RX_MPDU_LEN(pRxPacketInfo));
100 limPrintMacAddr(pMac, pHdr->sa, LOG2);)
101
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530102 if (!pMac->fScanOffload)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700103 {
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530104 if (limDeactivateMinChannelTimerDuringScan(pMac) != eSIR_SUCCESS)
105 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530106 vos_mem_free(pProbeRsp);
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530107 return;
108 }
Jeff Johnson32d95a32012-09-10 13:15:23 -0700109 }
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530110
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800111 // Validate IE information before processing Probe Response Frame
112 if (limValidateIEInformationInProbeRspFrame(pRxPacketInfo) != eSIR_SUCCESS)
113 {
114 PELOG1(limLog(pMac, LOG1,
115 FL("Parse error ProbeResponse, length=%d"), frameLen);)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530116 vos_mem_free(pProbeRsp);
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800117 return;
118 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700119
120 /**
121 * Expect Probe Response only when
122 * 1. STA is in scan mode waiting for Beacon/Probe response or
123 * 2. STA is waiting for Beacon/Probe Response to announce
124 * join success or
125 * 3. STA is in IBSS mode in BSS started state or
126 * 4. STA/AP is in learn mode
127 * 5. STA in link established state. In this state, the probe response is
128 * expected for two scenarios:
129 * -- As part of heart beat mechanism, probe req is sent out
130 * -- If QoS Info IE in beacon has a different count for EDCA Params,
131 * and EDCA IE is not present in beacon,
132 * then probe req is sent out to get the EDCA params.
133 *
134 * Ignore Probe Response frame in all other states
135 */
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530136 /* */
137 // TO SUPPORT BT-AMP
Jeff Johnson295189b2012-06-20 16:38:30 -0700138 if (((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) || //mlm state check should be global - 18th oct
139 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) || //mlm state check should be global - 18th oct
140 (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE) || //mlm state check should be global - 18th oct
141 (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE) ||
142 (psessionEntry->limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE) )||
143 ((GET_LIM_SYSTEM_ROLE(psessionEntry) == eLIM_STA_IN_IBSS_ROLE) &&
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530144 (psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE)) ||
145 pMac->fScanOffload)
Jeff Johnson295189b2012-06-20 16:38:30 -0700146 {
147 frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
148
Chet Lanctotc6fbce72013-05-20 17:52:15 -0700149 if (pMac->lim.gLimBackgroundScanMode == eSIR_ROAMING_SCAN)
150 {
151 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
152 FL("Probe Resp Frame Received: BSSID " MAC_ADDRESS_STR " (RSSI %d)"),
153 MAC_ADDR_ARRAY(pHdr->bssId),
154 (uint)abs((tANI_S8)WDA_GET_RX_RSSI_DB(pRxPacketInfo)));
155 }
156
Jeff Johnson295189b2012-06-20 16:38:30 -0700157 // Get pointer to Probe Response frame body
158 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
159
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800160 if (sirConvertProbeFrame2Struct(pMac, pBody, frameLen, pProbeRsp) == eSIR_FAILURE ||
161 !pProbeRsp->ssidPresent) // Enforce Mandatory IEs
Jeff Johnson295189b2012-06-20 16:38:30 -0700162 {
163 PELOG1(limLog(pMac, LOG1,
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800164 FL("Parse error ProbeResponse, length=%d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700165 frameLen);)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530166 vos_mem_free(pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700167 return;
168 }
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530169
170 if (pMac->fScanOffload)
171 {
172 limCheckAndAddBssDescription(pMac, pProbeRsp, pRxPacketInfo,
173 eANI_BOOLEAN_FALSE, eANI_BOOLEAN_TRUE);
174 }
175
176 //To Support BT-AMP
Jeff Johnson295189b2012-06-20 16:38:30 -0700177 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) || //mlm state check should be global - 18th oct
178 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE))
Jeff Johnson32d95a32012-09-10 13:15:23 -0700179 limCheckAndAddBssDescription(pMac, pProbeRsp, pRxPacketInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -0700180 ((pMac->lim.gLimHalScanState == eLIM_HAL_SCANNING_STATE) ? eANI_BOOLEAN_TRUE : eANI_BOOLEAN_FALSE), eANI_BOOLEAN_TRUE);
181 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE) //mlm state check should be global - 18th oct
182 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700183 }
184 else if (psessionEntry->limMlmState ==
185 eLIM_MLM_WT_JOIN_BEACON_STATE)
186 {
Jeff Johnson43971f52012-07-17 12:26:56 -0700187 if( psessionEntry->beacon != NULL )//Either Beacon/probe response is required. Hence store it in same buffer.
Jeff Johnson295189b2012-06-20 16:38:30 -0700188 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530189 vos_mem_free(psessionEntry->beacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700190 psessionEntry->beacon = NULL;
Jeff Johnson43971f52012-07-17 12:26:56 -0700191 }
192 psessionEntry->bcnLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530193
194 psessionEntry->beacon = vos_mem_malloc(psessionEntry->bcnLen);
195 if ( NULL == psessionEntry->beacon )
Jeff Johnson43971f52012-07-17 12:26:56 -0700196 {
197 PELOGE(limLog(pMac, LOGE,
198 FL("Unable to allocate memory to store beacon"));)
199 }
200 else
201 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700202 //Store the Beacon/ProbeRsp. This is sent to csr/hdd in join cnf response.
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530203 vos_mem_copy(psessionEntry->beacon,
204 WDA_GET_RX_MPDU_DATA(pRxPacketInfo),
205 psessionEntry->bcnLen);
Jeff Johnson43971f52012-07-17 12:26:56 -0700206 }
207
Jeff Johnson295189b2012-06-20 16:38:30 -0700208 // STA in WT_JOIN_BEACON_STATE
Jeff Johnson32d95a32012-09-10 13:15:23 -0700209 limCheckAndAnnounceJoinSuccess(pMac, pProbeRsp, pHdr, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700210 }
211 else if(psessionEntry->limMlmState == eLIM_MLM_LINK_ESTABLISHED_STATE)
212 {
213 tpDphHashNode pStaDs = NULL;
214 /**
215 * Check if this Probe Response is for
216 * our Probe Request sent upon reaching
217 * heart beat threshold
218 */
219 #if 0
220 if (wlan_cfgGetStr(pMac,
221 WNI_CFG_BSSID,
222 currentBssId,
223 &cfg) != eSIR_SUCCESS)
224 {
225 /// Could not get BSSID from CFG. Log error.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700226 limLog(pMac, LOGP, FL("could not retrieve BSSID"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700227 }
228 #endif //TO SUPPORT BT-AMP
229 sirCopyMacAddr(currentBssId,psessionEntry->bssId);
230
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530231 if ( !vos_mem_compare(currentBssId, pHdr->bssId, sizeof(tSirMacAddr)) )
Jeff Johnson32d95a32012-09-10 13:15:23 -0700232 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530233 vos_mem_free(pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700234 return;
Jeff Johnson32d95a32012-09-10 13:15:23 -0700235 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700236
237 if (!LIM_IS_CONNECTION_ACTIVE(psessionEntry))
238 {
239 limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700240 FL("Received Probe Resp from AP. So it is alive!!"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700241
Jeff Johnson32d95a32012-09-10 13:15:23 -0700242 if (pProbeRsp->HTInfo.present)
243 limReceivedHBHandler(pMac, (tANI_U8)pProbeRsp->HTInfo.primaryChannel, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700244 else
Jeff Johnson32d95a32012-09-10 13:15:23 -0700245 limReceivedHBHandler(pMac, (tANI_U8)pProbeRsp->channelNumber, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700246 }
247
Jeff Johnson295189b2012-06-20 16:38:30 -0700248
249 if (psessionEntry->limSystemRole == eLIM_STA_ROLE)
250 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700251 if (pProbeRsp->channelSwitchPresent ||
252 pProbeRsp->propIEinfo.propChannelSwitchPresent)
Jeff Johnson295189b2012-06-20 16:38:30 -0700253 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700254 limUpdateChannelSwitch(pMac, pProbeRsp, psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700255 }
Jeff Johnsone7245742012-09-05 17:12:55 -0700256 else if (psessionEntry->gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING)
Jeff Johnson295189b2012-06-20 16:38:30 -0700257 {
258 limCancelDot11hChannelSwitch(pMac, psessionEntry);
259 }
260 }
261
Jeff Johnson295189b2012-06-20 16:38:30 -0700262
263 /**
264 * Now Process EDCA Parameters, if EDCAParamSet count is different.
265 * -- While processing beacons in link established state if it is determined that
266 * QoS Info IE has a different count for EDCA Params,
267 * and EDCA IE is not present in beacon,
268 * then probe req is sent out to get the EDCA params.
269 */
270
271 pStaDs = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable);
272
273 limGetQosMode(psessionEntry, &qosEnabled);
274 limGetWmeMode(psessionEntry, &wmeEnabled);
275 PELOG2(limLog(pMac, LOG2,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700276 FL("wmeEdcaPresent: %d wmeEnabled: %d, edcaPresent: %d, qosEnabled: %d, edcaParams.qosInfo.count: %d schObject.gLimEdcaParamSetCount: %d"),
Jeff Johnson32d95a32012-09-10 13:15:23 -0700277 pProbeRsp->wmeEdcaPresent, wmeEnabled, pProbeRsp->edcaPresent, qosEnabled,
278 pProbeRsp->edcaParams.qosInfo.count, psessionEntry->gLimEdcaParamSetCount);)
279 if (((pProbeRsp->wmeEdcaPresent && wmeEnabled) ||
280 (pProbeRsp->edcaPresent && qosEnabled)) &&
281 (pProbeRsp->edcaParams.qosInfo.count != psessionEntry->gLimEdcaParamSetCount))
Jeff Johnson295189b2012-06-20 16:38:30 -0700282 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700283 if (schBeaconEdcaProcess(pMac, &pProbeRsp->edcaParams, psessionEntry) != eSIR_SUCCESS)
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700284 PELOGE(limLog(pMac, LOGE, FL("EDCA parameter processing error"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700285 else if (pStaDs != NULL)
286 {
287 // If needed, downgrade the EDCA parameters
288 limSetActiveEdcaParams(pMac, psessionEntry->gLimEdcaParams, psessionEntry);
289
290 if (pStaDs->aniPeer == eANI_BOOLEAN_TRUE)
291 limSendEdcaParams(pMac, psessionEntry->gLimEdcaParamsActive, pStaDs->bssId, eANI_BOOLEAN_TRUE);
292 else
293 limSendEdcaParams(pMac, psessionEntry->gLimEdcaParamsActive, pStaDs->bssId, eANI_BOOLEAN_FALSE);
294 }
295 else
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700296 PELOGE(limLog(pMac, LOGE, FL("Self Entry missing in Hash Table"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700297
298 }
Gopichand Nakkalabe8653b2013-04-10 08:16:05 +0530299
300 if (psessionEntry->fWaitForProbeRsp == true)
301 {
302 limLog(pMac, LOGW, FL("Checking probe response for capability change\n") );
303 limDetectChangeInApCapabilities(pMac, pProbeRsp, psessionEntry);
304 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700305 }
306 else if ((psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE) &&
307 (psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE))
Jeff Johnson32d95a32012-09-10 13:15:23 -0700308 limHandleIBSScoalescing(pMac, pProbeRsp, pRxPacketInfo,psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700309 } // if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) || ...
310
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530311 vos_mem_free(pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700312 // Ignore Probe Response frame in all other states
313 return;
314} /*** end limProcessProbeRspFrame() ***/
315
316
317void
318limProcessProbeRspFrameNoSession(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo)
319{
320 tANI_U8 *pBody;
321 tANI_U32 frameLen = 0;
322 tpSirMacMgmtHdr pHdr;
Jeff Johnson32d95a32012-09-10 13:15:23 -0700323 tSirProbeRespBeacon *pProbeRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -0700324
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530325 pProbeRsp = vos_mem_malloc(sizeof(tSirProbeRespBeacon));
326 if ( NULL == pProbeRsp )
Jeff Johnson32d95a32012-09-10 13:15:23 -0700327 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530328 limLog(pMac, LOGE, FL("Unable to allocate memory in limProcessProbeRspFrameNoSession") );
Jeff Johnson32d95a32012-09-10 13:15:23 -0700329 return;
330 }
331
332 pProbeRsp->ssId.length = 0;
333 pProbeRsp->wpa.length = 0;
334 pProbeRsp->propIEinfo.apName.length = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700335
336
337 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
338
339
340 limLog(pMac, LOG2,
341 FL("Received Probe Response frame with length=%d from "),
342 WDA_GET_RX_MPDU_LEN(pRxPacketInfo));
343 limPrintMacAddr(pMac, pHdr->sa, LOG2);
344
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700345#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
346 if (!(WDA_GET_OFFLOADSCANLEARN(pRxPacketInfo) ||
347 WDA_GET_ROAMCANDIDATEIND(pRxPacketInfo)))
Jeff Johnson32d95a32012-09-10 13:15:23 -0700348 {
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700349#endif
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530350 if (!pMac->fScanOffload)
351 {
352 if (limDeactivateMinChannelTimerDuringScan(pMac) != eSIR_SUCCESS)
353 {
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530354 vos_mem_free(pProbeRsp);
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530355 return;
356 }
357 }
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700358#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
Jeff Johnson32d95a32012-09-10 13:15:23 -0700359 }
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700360#endif
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800361 // Validate IE information before processing Probe Response Frame
362 if (limValidateIEInformationInProbeRspFrame(pRxPacketInfo) != eSIR_SUCCESS)
363 {
364 PELOG1(limLog(pMac, LOG1,FL("Parse error ProbeResponse, length=%d"),
365 frameLen);)
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530366 vos_mem_free(pProbeRsp);
Leela V Kiran Kumar Reddy Chirala6a458752013-02-16 15:41:27 -0800367 return;
368 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700369 /* Since there is no psessionEntry, PE cannot be in the following states:
370 * - eLIM_MLM_WT_JOIN_BEACON_STATE
371 * - eLIM_MLM_LINK_ESTABLISHED_STATE
372 * - eLIM_MLM_BSS_STARTED_STATE
373 * Hence, expect Probe Response only when
374 * 1. STA is in scan mode waiting for Beacon/Probe response
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700375 * 2. LFR logic in FW sends up candidate frames
Jeff Johnson295189b2012-06-20 16:38:30 -0700376 *
377 * Ignore Probe Response frame in all other states
378 */
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700379#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
380 if (WDA_GET_OFFLOADSCANLEARN(pRxPacketInfo))
381 {
382 frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
383
Chet Lanctotc6fbce72013-05-20 17:52:15 -0700384 if (pMac->lim.gLimBackgroundScanMode == eSIR_ROAMING_SCAN)
385 {
386 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
387 FL("Probe Resp Frame Received: BSSID " MAC_ADDRESS_STR " (RSSI %d)"),
388 MAC_ADDR_ARRAY(pHdr->bssId),
389 (uint)abs((tANI_S8)WDA_GET_RX_RSSI_DB(pRxPacketInfo)));
390 }
391
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700392 // Get pointer to Probe Response frame body
393 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
394
395 if (sirConvertProbeFrame2Struct(pMac, pBody, frameLen, pProbeRsp) == eSIR_FAILURE)
396 {
397 limLog(pMac, LOG1, FL("Parse error ProbeResponse, length=%d\n"), frameLen);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530398 vos_mem_free(pProbeRsp);
Varun Reddy Yeturud0a3f252013-04-15 21:58:13 -0700399 return;
400 }
401 limLog( pMac, LOG2, FL("Save this probe rsp in LFR cache"));
402 limCheckAndAddBssDescription(pMac, pProbeRsp, pRxPacketInfo,
403 eANI_BOOLEAN_FALSE, eANI_BOOLEAN_TRUE);
404 }
405 else
406#endif
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530407 if (pMac->fScanOffload)
408 {
409 frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
410
411 // Get pointer to Probe Response frame body
412 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
413
414 if (sirConvertProbeFrame2Struct(pMac, pBody, frameLen, pProbeRsp)
415 == eSIR_FAILURE)
416 {
417 limLog(pMac, LOG1,
418 FL("Parse error ProbeResponse, length=%d\n"), frameLen);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530419 vos_mem_free(pProbeRsp);
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530420 return;
421 }
422 limCheckAndAddBssDescription(pMac, pProbeRsp, pRxPacketInfo,
423 eANI_BOOLEAN_FALSE, eANI_BOOLEAN_TRUE);
424 }
425 else if( (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
Jeff Johnson295189b2012-06-20 16:38:30 -0700426 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) || //mlm state check should be global - 18th oct
427 (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE) )
428 {
429 frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
430
Chet Lanctotc6fbce72013-05-20 17:52:15 -0700431 if (pMac->lim.gLimBackgroundScanMode == eSIR_ROAMING_SCAN)
432 {
433 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
434 FL("Probe Resp Frame Received: BSSID " MAC_ADDRESS_STR " (RSSI %d)"),
435 MAC_ADDR_ARRAY(pHdr->bssId),
436 (uint)abs((tANI_S8)WDA_GET_RX_RSSI_DB(pRxPacketInfo)));
437 }
438
Jeff Johnson295189b2012-06-20 16:38:30 -0700439 // Get pointer to Probe Response frame body
440 pBody = WDA_GET_RX_MPDU_DATA(pRxPacketInfo);
441
Jeff Johnson32d95a32012-09-10 13:15:23 -0700442 if (sirConvertProbeFrame2Struct(pMac, pBody, frameLen, pProbeRsp) == eSIR_FAILURE)
Jeff Johnson295189b2012-06-20 16:38:30 -0700443 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700444 limLog(pMac, LOG1, FL("Parse error ProbeResponse, length=%d"), frameLen);
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530445 vos_mem_free(pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700446 return;
447 }
448
449 if( (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
450 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) )
Jeff Johnson32d95a32012-09-10 13:15:23 -0700451 limCheckAndAddBssDescription(pMac, pProbeRsp, pRxPacketInfo, eANI_BOOLEAN_TRUE, eANI_BOOLEAN_TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700452 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE)
453 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700454 }
455 }
Bansidhar Gopalachari1d9c6162013-07-11 10:24:30 +0530456 vos_mem_free(pProbeRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -0700457 return;
458} /*** end limProcessProbeRspFrameNew() ***/