blob: 70b8f90406ddf808a6e2914bac289e7561c54238 [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 {
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530125 pBeacon = vos_mem_malloc(sizeof(tSchBeaconStruct));
126 if ( NULL == pBeacon )
Jeff Johnson32d95a32012-09-10 13:15:23 -0700127 {
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530128 limLog(pMac, LOGE, FL("Unable to 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);
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530142 vos_mem_free(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 {
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530151 vos_mem_copy(( tANI_U8* )&psessionEntry->lastBeaconTimeStamp,
152 ( tANI_U8* )pBeacon->timeStamp, sizeof(tANI_U64) );
Tushnim Bhattacharyyafe9feb72013-03-28 17:34:45 -0700153 psessionEntry->lastBeaconDtimCount = pBeacon->tim.dtimCount;
154 psessionEntry->lastBeaconDtimPeriod= pBeacon->tim.dtimPeriod;
155 psessionEntry->currentBssBeaconCnt++;
156 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700157
Jeff Johnson32d95a32012-09-10 13:15:23 -0700158 MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, pBeacon->timeStamp[0]);)
159 MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, pBeacon->timeStamp[1]);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700160
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530161 if (pMac->fScanOffload)
162 {
163 limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo,
164 eANI_BOOLEAN_FALSE, eANI_BOOLEAN_TRUE);
165
166 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700167
168 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
169 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE))
170 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700171 //If we are scanning for P2P, only accept probe rsp
172 if((pMac->lim.gLimHalScanState != eLIM_HAL_SCANNING_STATE) || (NULL == pMac->lim.gpLimMlmScanReq)
173 || !pMac->lim.gpLimMlmScanReq->p2pSearch )
Jeff Johnson295189b2012-06-20 16:38:30 -0700174 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700175 limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -0700176 ((pMac->lim.gLimHalScanState == eLIM_HAL_SCANNING_STATE) ? eANI_BOOLEAN_TRUE : eANI_BOOLEAN_FALSE),
177 eANI_BOOLEAN_FALSE);
178 }
179 }
180 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE)
181 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700182 }
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530183 else if (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE)
Jeff Johnson295189b2012-06-20 16:38:30 -0700184 {
185 if( psessionEntry->beacon != NULL )
186 {
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530187 vos_mem_free(psessionEntry->beacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700188 psessionEntry->beacon = NULL;
189 }
190 psessionEntry->bcnLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530191 psessionEntry->beacon = vos_mem_malloc(psessionEntry->bcnLen);
192 if ( NULL == psessionEntry->beacon )
Jeff Johnson295189b2012-06-20 16:38:30 -0700193 {
194 PELOGE(limLog(pMac, LOGE, FL("Unable to allocate memory to store beacon"));)
195 }
196 else
197 {
198 //Store the Beacon/ProbeRsp. This is sent to csr/hdd in join cnf response.
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530199 vos_mem_copy(psessionEntry->beacon, WDA_GET_RX_MPDU_DATA(pRxPacketInfo),
200 psessionEntry->bcnLen);
Jeff Johnson295189b2012-06-20 16:38:30 -0700201
202 }
203
204 // STA in WT_JOIN_BEACON_STATE (IBSS)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700205 limCheckAndAnnounceJoinSuccess(pMac, pBeacon, pHdr,psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700206 } // if (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE)
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530207 vos_mem_free(pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700208 } // if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) || ...
209 else
210 {
211 // Ignore Beacon frame in all other states
212 if (psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE ||
213 psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE ||
214 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME2_STATE ||
215 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME3_STATE ||
216 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME4_STATE ||
217 psessionEntry->limMlmState == eLIM_MLM_AUTH_RSP_TIMEOUT_STATE ||
218 psessionEntry->limMlmState == eLIM_MLM_AUTHENTICATED_STATE ||
219 psessionEntry->limMlmState == eLIM_MLM_WT_ASSOC_RSP_STATE ||
220 psessionEntry->limMlmState == eLIM_MLM_WT_REASSOC_RSP_STATE ||
221 psessionEntry->limMlmState == eLIM_MLM_ASSOCIATED_STATE ||
222 psessionEntry->limMlmState == eLIM_MLM_REASSOCIATED_STATE ||
223 psessionEntry->limMlmState == eLIM_MLM_WT_ASSOC_CNF_STATE ||
224 limIsReassocInProgress(pMac,psessionEntry)) {
225 // nothing unexpected about beacon in these states
226 pMac->lim.gLimNumBeaconsIgnored++;
227 }
228 else
229 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700230 PELOG1(limLog(pMac, LOG1, FL("Received Beacon in unexpected state %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700231 psessionEntry->limMlmState);
232 limPrintMlmState(pMac, LOG1, psessionEntry->limMlmState);)
233#ifdef WLAN_DEBUG
234 pMac->lim.gLimUnexpBcnCnt++;
235#endif
236 }
237 }
238
239 return;
240} /*** end limProcessBeaconFrame() ***/
241
242
243/**---------------------------------------------------------------
244\fn limProcessBeaconFrameNoSession
245\brief This function is called by limProcessMessageQueue()
246\ upon Beacon reception.
247\
248\param pMac
249\param *pRxPacketInfo - A pointer to Rx packet info structure
250\return None
251------------------------------------------------------------------*/
252void
253limProcessBeaconFrameNoSession(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo)
254{
255 tpSirMacMgmtHdr pHdr;
Jeff Johnson32d95a32012-09-10 13:15:23 -0700256 tSchBeaconStruct *pBeacon;
Jeff Johnson295189b2012-06-20 16:38:30 -0700257
258 pMac->lim.gLimNumBeaconsRcvd++;
259 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
260
261 limLog(pMac, LOG2, FL("Received Beacon frame with length=%d from "),
262 WDA_GET_RX_MPDU_LEN(pRxPacketInfo));
263 limPrintMacAddr(pMac, pHdr->sa, LOG2);
264
Gopichand Nakkala2c231c82013-06-11 17:49:16 +0530265 if (!pMac->fScanOffload)
266 {
267 if (limDeactivateMinChannelTimerDuringScan(pMac) != eSIR_SUCCESS)
268 return;
269 }
Jeff Johnson32d95a32012-09-10 13:15:23 -0700270
Jeff Johnson295189b2012-06-20 16:38:30 -0700271 /**
272 * No session has been established. Expect Beacon only when
273 * 1. STA is in Scan mode waiting for Beacon/Probe response or
274 * 2. STA/AP is in Learn mode
275 */
276 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
277 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) ||
278 (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE))
279 {
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530280 pBeacon = vos_mem_malloc(sizeof(tSchBeaconStruct));
281 if ( NULL == pBeacon )
Jeff Johnson32d95a32012-09-10 13:15:23 -0700282 {
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530283 limLog(pMac, LOGE, FL("Unable to allocate memory in limProcessBeaconFrameNoSession") );
Jeff Johnson32d95a32012-09-10 13:15:23 -0700284 return;
285 }
286
287 if (sirConvertBeaconFrame2Struct(pMac, (tANI_U8 *) pRxPacketInfo, pBeacon) != eSIR_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700288 {
289 // Received wrongly formatted/invalid Beacon. Ignore and move on.
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700290 limLog(pMac, LOGW, FL("Received invalid Beacon in global MLM state %X"), pMac->lim.gLimMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -0700291 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530292 vos_mem_free(pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700293 return;
294 }
295
296 if ( (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
297 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) )
298 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700299 //If we are scanning for P2P, only accept probe rsp
300 if((pMac->lim.gLimHalScanState != eLIM_HAL_SCANNING_STATE) || (NULL == pMac->lim.gpLimMlmScanReq)
301 || !pMac->lim.gpLimMlmScanReq->p2pSearch )
Jeff Johnson295189b2012-06-20 16:38:30 -0700302 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700303 limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo, eANI_BOOLEAN_TRUE, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700304 }
305 }
306 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE)
307 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700308 } // end of eLIM_MLM_LEARN_STATE)
Hema Aparna Medicharlaeef78fc2013-07-12 11:47:01 +0530309 vos_mem_free(pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700310 } // end of (eLIM_MLM_WT_PROBE_RESP_STATE) || (eLIM_MLM_PASSIVE_SCAN_STATE)
311 else
312 {
Kiran Kumar Lokere531ca702013-04-01 13:24:23 -0700313 limLog(pMac, LOG1, FL("Rcvd Beacon in unexpected MLM state %d"), pMac->lim.gLimMlmState);
Jeff Johnson295189b2012-06-20 16:38:30 -0700314 limPrintMlmState(pMac, LOG1, pMac->lim.gLimMlmState);
315#ifdef WLAN_DEBUG
316 pMac->lim.gLimUnexpBcnCnt++;
317#endif
318 }
319
320 return;
321} /*** end limProcessBeaconFrameNoSession() ***/
322