blob: 45a2339eb882d0d29321aca6a0136cf4b6dbf926 [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 limProcessBeaconFrame.cc contains the code
46 * for processing Received Beacon Frame.
47 * Author: Chandra Modumudi
48 * Date: 03/01/02
49 * History:-
50 * Date Modified by Modification Information
51 * --------------------------------------------------------------------
52 *
53 */
54
Jeff Johnson295189b2012-06-20 16:38:30 -070055#include "wniCfgSta.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070056#include "aniGlobal.h"
57#include "cfgApi.h"
58#include "schApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070059#include "utilsApi.h"
60#include "limTypes.h"
61#include "limUtils.h"
62#include "limAssocUtils.h"
63#include "limPropExtsUtils.h"
64#include "limSerDesUtils.h"
65
66/**
67 * limProcessBeaconFrame
68 *
69 *FUNCTION:
70 * This function is called by limProcessMessageQueue() upon Beacon
71 * frame reception.
72 *
73 *LOGIC:
74 *
75 *ASSUMPTIONS:
76 *
77 *NOTE:
78 * 1. Beacons received in 'normal' state in IBSS are handled by
79 * Beacon Processing module.
80 *
81 * @param pMac - Pointer to Global MAC structure
82 * @param *pRxPacketInfo - A pointer to RX packet info structure
83 * @return None
84 */
85
86void
87limProcessBeaconFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo,tpPESession psessionEntry)
88{
89 tpSirMacMgmtHdr pHdr;
Jeff Johnson32d95a32012-09-10 13:15:23 -070090 tSchBeaconStruct *pBeacon;
Jeff Johnson295189b2012-06-20 16:38:30 -070091
92 pMac->lim.gLimNumBeaconsRcvd++;
93
94 /* here is it required to increment session specific heartBeat beacon counter */
95
96
97
98 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
99
100
101 PELOG2(limLog(pMac, LOG2, FL("Received Beacon frame with length=%d from "),
102 WDA_GET_RX_MPDU_LEN(pRxPacketInfo));
103 limPrintMacAddr(pMac, pHdr->sa, LOG2);)
104
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530105 if (!pMac->fScanOffload)
106 {
107 if (limDeactivateMinChannelTimerDuringScan(pMac) != eSIR_SUCCESS)
108 return;
109 }
Jeff Johnson32d95a32012-09-10 13:15:23 -0700110
Jeff Johnson295189b2012-06-20 16:38:30 -0700111 /**
112 * Expect Beacon only when
113 * 1. STA is in Scan mode waiting for Beacon/Probe response or
114 * 2. STA is waiting for Beacon/Probe Respose Frame
115 * to announce join success.
116 * 3. STA/AP is in Learn mode
117 */
118 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
119 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) ||
120 (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE) ||
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530121 (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE)
122 || pMac->fScanOffload
123 )
Jeff Johnson295189b2012-06-20 16:38:30 -0700124 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700125 if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,
126 (void **)&pBeacon, sizeof(tSchBeaconStruct)))
127 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700128 limLog(pMac, LOGE, FL("Unable to PAL allocate memory in limProcessBeaconFrame") );
Jeff Johnson32d95a32012-09-10 13:15:23 -0700129 return;
130 }
131
Jeff Johnson295189b2012-06-20 16:38:30 -0700132 // Parse received Beacon
133 if (sirConvertBeaconFrame2Struct(pMac, (tANI_U8 *) pRxPacketInfo,
Jeff Johnson32d95a32012-09-10 13:15:23 -0700134 pBeacon) != eSIR_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700135 {
136 // Received wrongly formatted/invalid Beacon.
137 // Ignore it and move on.
138 limLog(pMac, LOGW,
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700139 FL("Received invalid Beacon in state %X"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700140 psessionEntry->limMlmState);
141 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
Jeff Johnson32d95a32012-09-10 13:15:23 -0700142 palFreeMemory(pMac->hHdd, pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700143 return;
144 }
145
Tushnim Bhattacharyyafe9feb72013-03-28 17:34:45 -0700146 /*during scanning, when any session is active, and beacon/Pr belongs to
147 one of the session, fill up the following, TBD - HB couter */
148 if ((!psessionEntry->lastBeaconDtimPeriod) &&
149 (sirCompareMacAddr( psessionEntry->bssId, pBeacon->bssid)))
150 {
151 palCopyMemory( pMac->hHdd, ( tANI_U8* )&psessionEntry->lastBeaconTimeStamp, ( tANI_U8* )pBeacon->timeStamp, sizeof(tANI_U64) );
152 psessionEntry->lastBeaconDtimCount = pBeacon->tim.dtimCount;
153 psessionEntry->lastBeaconDtimPeriod= pBeacon->tim.dtimPeriod;
154 psessionEntry->currentBssBeaconCnt++;
155 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700156
Jeff Johnson32d95a32012-09-10 13:15:23 -0700157 MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, pBeacon->timeStamp[0]);)
158 MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, pBeacon->timeStamp[1]);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700159
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530160 if (pMac->fScanOffload)
161 {
162 limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo,
163 eANI_BOOLEAN_FALSE, eANI_BOOLEAN_TRUE);
164
165 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700166
167 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
168 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE))
169 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700170 //If we are scanning for P2P, only accept probe rsp
171 if((pMac->lim.gLimHalScanState != eLIM_HAL_SCANNING_STATE) || (NULL == pMac->lim.gpLimMlmScanReq)
172 || !pMac->lim.gpLimMlmScanReq->p2pSearch )
Jeff Johnson295189b2012-06-20 16:38:30 -0700173 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700174 limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -0700175 ((pMac->lim.gLimHalScanState == eLIM_HAL_SCANNING_STATE) ? eANI_BOOLEAN_TRUE : eANI_BOOLEAN_FALSE),
176 eANI_BOOLEAN_FALSE);
177 }
178 }
179 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE)
180 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700181 }
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530182 else if (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -0700183 {
184 if( psessionEntry->beacon != NULL )
185 {
186 palFreeMemory(pMac->hHdd, psessionEntry->beacon);
187 psessionEntry->beacon = NULL;
188 }
189 psessionEntry->bcnLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
Jeff Johnson43971f52012-07-17 12:26:56 -0700190 if( (palAllocateMemory(pMac->hHdd, (void**)&psessionEntry->beacon, psessionEntry->bcnLen)) != eHAL_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700191 {
192 PELOGE(limLog(pMac, LOGE, FL("Unable to allocate memory to store beacon"));)
193 }
194 else
195 {
196 //Store the Beacon/ProbeRsp. This is sent to csr/hdd in join cnf response.
197 palCopyMemory(pMac->hHdd, psessionEntry->beacon, WDA_GET_RX_MPDU_DATA(pRxPacketInfo), psessionEntry->bcnLen);
198
199 }
200
201 // STA in WT_JOIN_BEACON_STATE (IBSS)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700202 limCheckAndAnnounceJoinSuccess(pMac, pBeacon, pHdr,psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700203 } // if (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700204 palFreeMemory(pMac->hHdd, pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700205 } // if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) || ...
206 else
207 {
208 // Ignore Beacon frame in all other states
209 if (psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE ||
210 psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE ||
211 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME2_STATE ||
212 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME3_STATE ||
213 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME4_STATE ||
214 psessionEntry->limMlmState == eLIM_MLM_AUTH_RSP_TIMEOUT_STATE ||
215 psessionEntry->limMlmState == eLIM_MLM_AUTHENTICATED_STATE ||
216 psessionEntry->limMlmState == eLIM_MLM_WT_ASSOC_RSP_STATE ||
217 psessionEntry->limMlmState == eLIM_MLM_WT_REASSOC_RSP_STATE ||
218 psessionEntry->limMlmState == eLIM_MLM_ASSOCIATED_STATE ||
219 psessionEntry->limMlmState == eLIM_MLM_REASSOCIATED_STATE ||
220 psessionEntry->limMlmState == eLIM_MLM_WT_ASSOC_CNF_STATE ||
221 limIsReassocInProgress(pMac,psessionEntry)) {
222 // nothing unexpected about beacon in these states
223 pMac->lim.gLimNumBeaconsIgnored++;
224 }
225 else
226 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700227 PELOG1(limLog(pMac, LOG1, FL("Received Beacon in unexpected state %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700228 psessionEntry->limMlmState);
229 limPrintMlmState(pMac, LOG1, psessionEntry->limMlmState);)
230#ifdef WLAN_DEBUG
231 pMac->lim.gLimUnexpBcnCnt++;
232#endif
233 }
234 }
235
236 return;
237} /*** end limProcessBeaconFrame() ***/
238
239
240/**---------------------------------------------------------------
241\fn limProcessBeaconFrameNoSession
242\brief This function is called by limProcessMessageQueue()
243\ upon Beacon reception.
244\
245\param pMac
246\param *pRxPacketInfo - A pointer to Rx packet info structure
247\return None
248------------------------------------------------------------------*/
249void
250limProcessBeaconFrameNoSession(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo)
251{
252 tpSirMacMgmtHdr pHdr;
Jeff Johnson32d95a32012-09-10 13:15:23 -0700253 tSchBeaconStruct *pBeacon;
Jeff Johnson295189b2012-06-20 16:38:30 -0700254
255 pMac->lim.gLimNumBeaconsRcvd++;
256 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
257
258 limLog(pMac, LOG2, FL("Received Beacon frame with length=%d from "),
259 WDA_GET_RX_MPDU_LEN(pRxPacketInfo));
260 limPrintMacAddr(pMac, pHdr->sa, LOG2);
261
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530262 if (!pMac->fScanOffload)
263 {
264 if (limDeactivateMinChannelTimerDuringScan(pMac) != eSIR_SUCCESS)
265 return;
266 }
Jeff Johnson32d95a32012-09-10 13:15:23 -0700267
Jeff Johnson295189b2012-06-20 16:38:30 -0700268 /**
269 * No session has been established. Expect Beacon only when
270 * 1. STA is in Scan mode waiting for Beacon/Probe response or
271 * 2. STA/AP is in Learn mode
272 */
273 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
274 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) ||
275 (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE))
276 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700277 if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,
278 (void **)&pBeacon, sizeof(tSchBeaconStruct)))
279 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700280 limLog(pMac, LOGE, FL("Unable to PAL allocate memory in limProcessBeaconFrameNoSession") );
Jeff Johnson32d95a32012-09-10 13:15:23 -0700281 return;
282 }
283
284 if (sirConvertBeaconFrame2Struct(pMac, (tANI_U8 *) pRxPacketInfo, pBeacon) != eSIR_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700285 {
286 // Received wrongly formatted/invalid Beacon. Ignore and move on.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700287 limLog(pMac, LOGW, FL("Received invalid Beacon in global MLM state %X"), pMac->lim.gLimMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -0700288 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
Jeff Johnson32d95a32012-09-10 13:15:23 -0700289 palFreeMemory(pMac->hHdd, pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700290 return;
291 }
292
293 if ( (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
294 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) )
295 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700296 //If we are scanning for P2P, only accept probe rsp
297 if((pMac->lim.gLimHalScanState != eLIM_HAL_SCANNING_STATE) || (NULL == pMac->lim.gpLimMlmScanReq)
298 || !pMac->lim.gpLimMlmScanReq->p2pSearch )
Jeff Johnson295189b2012-06-20 16:38:30 -0700299 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700300 limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo, eANI_BOOLEAN_TRUE, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700301 }
302 }
303 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE)
304 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700305 } // end of eLIM_MLM_LEARN_STATE)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700306 palFreeMemory(pMac->hHdd, pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700307 } // end of (eLIM_MLM_WT_PROBE_RESP_STATE) || (eLIM_MLM_PASSIVE_SCAN_STATE)
308 else
309 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700310 limLog(pMac, LOG1, FL("Rcvd Beacon in unexpected MLM state %d"), pMac->lim.gLimMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -0700311 limPrintMlmState(pMac, LOG1, pMac->lim.gLimMlmState);
312#ifdef WLAN_DEBUG
313 pMac->lim.gLimUnexpBcnCnt++;
314#endif
315 }
316
317 return;
318} /*** end limProcessBeaconFrameNoSession() ***/
319