blob: 6e1b64f6a246d226aea10cd97515ee00fc2b18e7 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Sushant Kaushik02c866d2015-01-16 15:24:25 +05302 * Copyright (c) 2011-2015 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 limProcessBeaconFrame.cc contains the code
31 * for processing Received Beacon Frame.
32 * Author: Chandra Modumudi
33 * Date: 03/01/02
34 * History:-
35 * Date Modified by Modification Information
36 * --------------------------------------------------------------------
37 *
38 */
39
Satyanarayana Dash6f438272015-03-03 18:01:06 +053040#include "wniCfg.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070041#include "aniGlobal.h"
42#include "cfgApi.h"
43#include "schApi.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070044#include "utilsApi.h"
45#include "limTypes.h"
46#include "limUtils.h"
47#include "limAssocUtils.h"
48#include "limPropExtsUtils.h"
49#include "limSerDesUtils.h"
50
51/**
52 * limProcessBeaconFrame
53 *
54 *FUNCTION:
55 * This function is called by limProcessMessageQueue() upon Beacon
56 * frame reception.
57 *
58 *LOGIC:
59 *
60 *ASSUMPTIONS:
61 *
62 *NOTE:
63 * 1. Beacons received in 'normal' state in IBSS are handled by
64 * Beacon Processing module.
65 *
66 * @param pMac - Pointer to Global MAC structure
67 * @param *pRxPacketInfo - A pointer to RX packet info structure
68 * @return None
69 */
70
71void
72limProcessBeaconFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo,tpPESession psessionEntry)
73{
74 tpSirMacMgmtHdr pHdr;
Jeff Johnson32d95a32012-09-10 13:15:23 -070075 tSchBeaconStruct *pBeacon;
Jeff Johnson295189b2012-06-20 16:38:30 -070076
77 pMac->lim.gLimNumBeaconsRcvd++;
78
79 /* here is it required to increment session specific heartBeat beacon counter */
80
81
Jeff Johnson295189b2012-06-20 16:38:30 -070082 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
83
84
Abhishek Singh525045c2014-12-15 17:18:45 +053085 limLog(pMac, LOG2, FL("Received Beacon frame with length=%d from "),
Jeff Johnson295189b2012-06-20 16:38:30 -070086 WDA_GET_RX_MPDU_LEN(pRxPacketInfo));
Abhishek Singh525045c2014-12-15 17:18:45 +053087 limPrintMacAddr(pMac, pHdr->sa, LOG2);
Jeff Johnson295189b2012-06-20 16:38:30 -070088
Gopichand Nakkala2c231c82013-06-11 17:49:16 +053089 if (!pMac->fScanOffload)
90 {
91 if (limDeactivateMinChannelTimerDuringScan(pMac) != eSIR_SUCCESS)
92 return;
93 }
Jeff Johnson32d95a32012-09-10 13:15:23 -070094
Jeff Johnson295189b2012-06-20 16:38:30 -070095 /**
96 * Expect Beacon only when
97 * 1. STA is in Scan mode waiting for Beacon/Probe response or
98 * 2. STA is waiting for Beacon/Probe Respose Frame
99 * to announce join success.
100 * 3. STA/AP is in Learn mode
101 */
102 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
103 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) ||
104 (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE) ||
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530105 (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE)
106 || pMac->fScanOffload
107 )
Jeff Johnson295189b2012-06-20 16:38:30 -0700108 {
Abhishek Singhc75726d2015-04-13 14:44:14 +0530109 pBeacon = vos_mem_vmalloc(sizeof(tSchBeaconStruct));
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530110 if ( NULL == pBeacon )
Jeff Johnson32d95a32012-09-10 13:15:23 -0700111 {
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530112 limLog(pMac, LOGE, FL("Unable to allocate memory in limProcessBeaconFrame") );
Jeff Johnson32d95a32012-09-10 13:15:23 -0700113 return;
114 }
115
Jeff Johnson295189b2012-06-20 16:38:30 -0700116 // Parse received Beacon
117 if (sirConvertBeaconFrame2Struct(pMac, (tANI_U8 *) pRxPacketInfo,
Jeff Johnson32d95a32012-09-10 13:15:23 -0700118 pBeacon) != eSIR_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700119 {
120 // Received wrongly formatted/invalid Beacon.
121 // Ignore it and move on.
122 limLog(pMac, LOGW,
Sushant Kaushik1b645382014-10-13 16:39:36 +0530123 FL("Received invalid Beacon in state %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700124 psessionEntry->limMlmState);
125 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
Sushant Kaushik02c866d2015-01-16 15:24:25 +0530126 if ((!psessionEntry->currentBssBeaconCnt) &&
127 (sirCompareMacAddr( psessionEntry->bssId, pHdr->sa)))
128 limParseBeaconForTim(pMac, (tANI_U8 *) pRxPacketInfo, psessionEntry);
129
Abhishek Singhc75726d2015-04-13 14:44:14 +0530130 vos_mem_vfree(pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700131 return;
132 }
Tushnim Bhattacharyyafe9feb72013-03-28 17:34:45 -0700133 /*during scanning, when any session is active, and beacon/Pr belongs to
134 one of the session, fill up the following, TBD - HB couter */
135 if ((!psessionEntry->lastBeaconDtimPeriod) &&
136 (sirCompareMacAddr( psessionEntry->bssId, pBeacon->bssid)))
137 {
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530138 vos_mem_copy(( tANI_U8* )&psessionEntry->lastBeaconTimeStamp,
139 ( tANI_U8* )pBeacon->timeStamp, sizeof(tANI_U64) );
Tushnim Bhattacharyyafe9feb72013-03-28 17:34:45 -0700140 psessionEntry->lastBeaconDtimCount = pBeacon->tim.dtimCount;
141 psessionEntry->lastBeaconDtimPeriod= pBeacon->tim.dtimPeriod;
142 psessionEntry->currentBssBeaconCnt++;
143 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700144
Jeff Johnson32d95a32012-09-10 13:15:23 -0700145 MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, pBeacon->timeStamp[0]);)
146 MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, pBeacon->timeStamp[1]);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700147
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530148 if (pMac->fScanOffload)
149 {
150 limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo,
151 eANI_BOOLEAN_FALSE, eANI_BOOLEAN_TRUE);
152
153 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700154
155 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
156 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE))
157 {
Ganesh Kondabattini62feb162016-01-14 17:41:05 +0530158 //If we are scanning for P2P, only accept probe rsp
159 if((pMac->lim.gLimHalScanState != eLIM_HAL_SCANNING_STATE) || (NULL == pMac->lim.gpLimMlmScanReq)
160 || !pMac->lim.gpLimMlmScanReq->p2pSearch )
161 {
162 limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo,
163 ((pMac->lim.gLimHalScanState == eLIM_HAL_SCANNING_STATE) ? eANI_BOOLEAN_TRUE : eANI_BOOLEAN_FALSE),
164 eANI_BOOLEAN_FALSE);
165
166 }
Madan Mohan Koyyalamudiad19b012013-09-26 01:22:15 +0530167 /* Calling dfsChannelList which will convert DFS channel
168 * to Active channel for x secs if this channel is DFS channel */
169 limSetDFSChannelList(pMac, pBeacon->channelNumber,
170 &pMac->lim.dfschannelList);
Jeff Johnson295189b2012-06-20 16:38:30 -0700171 }
172 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE)
173 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700174 }
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530175 else if (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -0700176 {
177 if( psessionEntry->beacon != NULL )
178 {
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530179 vos_mem_free(psessionEntry->beacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700180 psessionEntry->beacon = NULL;
181 }
182 psessionEntry->bcnLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530183 psessionEntry->beacon = vos_mem_malloc(psessionEntry->bcnLen);
184 if ( NULL == psessionEntry->beacon )
Jeff Johnson295189b2012-06-20 16:38:30 -0700185 {
186 PELOGE(limLog(pMac, LOGE, FL("Unable to allocate memory to store beacon"));)
187 }
188 else
189 {
190 //Store the Beacon/ProbeRsp. This is sent to csr/hdd in join cnf response.
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530191 vos_mem_copy(psessionEntry->beacon, WDA_GET_RX_MPDU_DATA(pRxPacketInfo),
192 psessionEntry->bcnLen);
Jeff Johnson295189b2012-06-20 16:38:30 -0700193
194 }
195
196 // STA in WT_JOIN_BEACON_STATE (IBSS)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700197 limCheckAndAnnounceJoinSuccess(pMac, pBeacon, pHdr,psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700198 } // if (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE)
Abhishek Singhc75726d2015-04-13 14:44:14 +0530199 vos_mem_vfree(pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700200 } // if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) || ...
201 else
202 {
203 // Ignore Beacon frame in all other states
204 if (psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE ||
205 psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE ||
206 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME2_STATE ||
207 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME3_STATE ||
208 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME4_STATE ||
209 psessionEntry->limMlmState == eLIM_MLM_AUTH_RSP_TIMEOUT_STATE ||
210 psessionEntry->limMlmState == eLIM_MLM_AUTHENTICATED_STATE ||
211 psessionEntry->limMlmState == eLIM_MLM_WT_ASSOC_RSP_STATE ||
212 psessionEntry->limMlmState == eLIM_MLM_WT_REASSOC_RSP_STATE ||
213 psessionEntry->limMlmState == eLIM_MLM_ASSOCIATED_STATE ||
214 psessionEntry->limMlmState == eLIM_MLM_REASSOCIATED_STATE ||
215 psessionEntry->limMlmState == eLIM_MLM_WT_ASSOC_CNF_STATE ||
216 limIsReassocInProgress(pMac,psessionEntry)) {
217 // nothing unexpected about beacon in these states
218 pMac->lim.gLimNumBeaconsIgnored++;
219 }
220 else
221 {
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530222 limLog(pMac, LOG1, FL("Received Beacon in unexpected state %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700223 psessionEntry->limMlmState);
Abhishek Singh3cbf6052014-12-15 16:46:42 +0530224 limPrintMlmState(pMac, LOG1, psessionEntry->limMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -0700225#ifdef WLAN_DEBUG
226 pMac->lim.gLimUnexpBcnCnt++;
227#endif
228 }
229 }
230
231 return;
232} /*** end limProcessBeaconFrame() ***/
233
234
235/**---------------------------------------------------------------
236\fn limProcessBeaconFrameNoSession
237\brief This function is called by limProcessMessageQueue()
238\ upon Beacon reception.
239\
240\param pMac
241\param *pRxPacketInfo - A pointer to Rx packet info structure
242\return None
243------------------------------------------------------------------*/
244void
245limProcessBeaconFrameNoSession(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo)
246{
247 tpSirMacMgmtHdr pHdr;
Jeff Johnson32d95a32012-09-10 13:15:23 -0700248 tSchBeaconStruct *pBeacon;
Jeff Johnson295189b2012-06-20 16:38:30 -0700249
250 pMac->lim.gLimNumBeaconsRcvd++;
251 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
252
253 limLog(pMac, LOG2, FL("Received Beacon frame with length=%d from "),
254 WDA_GET_RX_MPDU_LEN(pRxPacketInfo));
255 limPrintMacAddr(pMac, pHdr->sa, LOG2);
256
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530257 if (!pMac->fScanOffload)
258 {
259 if (limDeactivateMinChannelTimerDuringScan(pMac) != eSIR_SUCCESS)
260 return;
261 }
Jeff Johnson32d95a32012-09-10 13:15:23 -0700262
Jeff Johnson295189b2012-06-20 16:38:30 -0700263 /**
264 * No session has been established. Expect Beacon only when
265 * 1. STA is in Scan mode waiting for Beacon/Probe response or
266 * 2. STA/AP is in Learn mode
267 */
268 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
269 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) ||
270 (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE))
271 {
Abhishek Singhc75726d2015-04-13 14:44:14 +0530272 pBeacon = vos_mem_vmalloc(sizeof(tSchBeaconStruct));
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530273 if ( NULL == pBeacon )
Jeff Johnson32d95a32012-09-10 13:15:23 -0700274 {
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530275 limLog(pMac, LOGE, FL("Unable to allocate memory in limProcessBeaconFrameNoSession") );
Jeff Johnson32d95a32012-09-10 13:15:23 -0700276 return;
277 }
278
279 if (sirConvertBeaconFrame2Struct(pMac, (tANI_U8 *) pRxPacketInfo, pBeacon) != eSIR_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700280 {
281 // Received wrongly formatted/invalid Beacon. Ignore and move on.
Sushant Kaushik1b645382014-10-13 16:39:36 +0530282 limLog(pMac, LOGW, FL("Received invalid Beacon in global MLM state %d"), pMac->lim.gLimMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -0700283 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
Abhishek Singhc75726d2015-04-13 14:44:14 +0530284 vos_mem_vfree(pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700285 return;
286 }
287
288 if ( (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
289 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) )
290 {
Ganesh Kondabattini62feb162016-01-14 17:41:05 +0530291 //If we are scanning for P2P, only accept probe rsp
292 if((pMac->lim.gLimHalScanState != eLIM_HAL_SCANNING_STATE) || (NULL == pMac->lim.gpLimMlmScanReq)
293 || !pMac->lim.gpLimMlmScanReq->p2pSearch )
294 {
295 limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo, eANI_BOOLEAN_TRUE, eANI_BOOLEAN_FALSE);
296 }
Madan Mohan Koyyalamudiad19b012013-09-26 01:22:15 +0530297 /* Calling dfsChannelList which will convert DFS channel
298 * to Active channel for x secs if this channel is DFS channel */
299 limSetDFSChannelList(pMac, pBeacon->channelNumber,
300 &pMac->lim.dfschannelList);
Jeff Johnson295189b2012-06-20 16:38:30 -0700301 }
302 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE)
303 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700304 } // end of eLIM_MLM_LEARN_STATE)
Abhishek Singhc75726d2015-04-13 14:44:14 +0530305 vos_mem_vfree(pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700306 } // end of (eLIM_MLM_WT_PROBE_RESP_STATE) || (eLIM_MLM_PASSIVE_SCAN_STATE)
307 else
308 {
Sushant Kaushike0d2cce2014-04-10 14:36:07 +0530309 limLog(pMac, LOG1, FL("Rcvd Beacon in unexpected MLM state %s (%d)"),
310 limMlmStateStr(pMac->lim.gLimMlmState), 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