blob: 4a3dd86956156d41e40c19342f18045338f84a58 [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
105 if (limDeactivateMinChannelTimerDuringScan(pMac) != eSIR_SUCCESS)
106 return;
107
Jeff Johnson32d95a32012-09-10 13:15:23 -0700108
Jeff Johnson295189b2012-06-20 16:38:30 -0700109 /**
110 * Expect Beacon only when
111 * 1. STA is in Scan mode waiting for Beacon/Probe response or
112 * 2. STA is waiting for Beacon/Probe Respose Frame
113 * to announce join success.
114 * 3. STA/AP is in Learn mode
115 */
116 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
117 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) ||
118 (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE) ||
119 (psessionEntry->limMlmState == eLIM_MLM_WT_JOIN_BEACON_STATE))
120 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700121 if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,
122 (void **)&pBeacon, sizeof(tSchBeaconStruct)))
123 {
124 limLog(pMac, LOGE, FL("Unable to PAL allocate memory in limProcessBeaconFrame\n") );
125 return;
126 }
127
Jeff Johnson295189b2012-06-20 16:38:30 -0700128 // Parse received Beacon
129 if (sirConvertBeaconFrame2Struct(pMac, (tANI_U8 *) pRxPacketInfo,
Jeff Johnson32d95a32012-09-10 13:15:23 -0700130 pBeacon) != eSIR_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700131 {
132 // Received wrongly formatted/invalid Beacon.
133 // Ignore it and move on.
134 limLog(pMac, LOGW,
135 FL("Received invalid Beacon in state %X\n"),
136 psessionEntry->limMlmState);
137 limPrintMlmState(pMac, LOGW, psessionEntry->limMlmState);
Jeff Johnson32d95a32012-09-10 13:15:23 -0700138 palFreeMemory(pMac->hHdd, pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700139 return;
140 }
141
Tushnim Bhattacharyyafe9feb72013-03-28 17:34:45 -0700142 /*during scanning, when any session is active, and beacon/Pr belongs to
143 one of the session, fill up the following, TBD - HB couter */
144 if ((!psessionEntry->lastBeaconDtimPeriod) &&
145 (sirCompareMacAddr( psessionEntry->bssId, pBeacon->bssid)))
146 {
147 palCopyMemory( pMac->hHdd, ( tANI_U8* )&psessionEntry->lastBeaconTimeStamp, ( tANI_U8* )pBeacon->timeStamp, sizeof(tANI_U64) );
148 psessionEntry->lastBeaconDtimCount = pBeacon->tim.dtimCount;
149 psessionEntry->lastBeaconDtimPeriod= pBeacon->tim.dtimPeriod;
150 psessionEntry->currentBssBeaconCnt++;
151 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700152
Jeff Johnson32d95a32012-09-10 13:15:23 -0700153 MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, pBeacon->timeStamp[0]);)
154 MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, pBeacon->timeStamp[1]);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700155
156
157 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
158 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE))
159 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700160 //If we are scanning for P2P, only accept probe rsp
161 if((pMac->lim.gLimHalScanState != eLIM_HAL_SCANNING_STATE) || (NULL == pMac->lim.gpLimMlmScanReq)
162 || !pMac->lim.gpLimMlmScanReq->p2pSearch )
Jeff Johnson295189b2012-06-20 16:38:30 -0700163 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700164 limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -0700165 ((pMac->lim.gLimHalScanState == eLIM_HAL_SCANNING_STATE) ? eANI_BOOLEAN_TRUE : eANI_BOOLEAN_FALSE),
166 eANI_BOOLEAN_FALSE);
167 }
168 }
169 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE)
170 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700171 }
172 else
173 {
174 if( psessionEntry->beacon != NULL )
175 {
176 palFreeMemory(pMac->hHdd, psessionEntry->beacon);
177 psessionEntry->beacon = NULL;
178 }
179 psessionEntry->bcnLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
Jeff Johnson43971f52012-07-17 12:26:56 -0700180 if( (palAllocateMemory(pMac->hHdd, (void**)&psessionEntry->beacon, psessionEntry->bcnLen)) != eHAL_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700181 {
182 PELOGE(limLog(pMac, LOGE, FL("Unable to allocate memory to store beacon"));)
183 }
184 else
185 {
186 //Store the Beacon/ProbeRsp. This is sent to csr/hdd in join cnf response.
187 palCopyMemory(pMac->hHdd, psessionEntry->beacon, WDA_GET_RX_MPDU_DATA(pRxPacketInfo), psessionEntry->bcnLen);
188
189 }
190
191 // STA in WT_JOIN_BEACON_STATE (IBSS)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700192 limCheckAndAnnounceJoinSuccess(pMac, pBeacon, pHdr,psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700193 } // if (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700194 palFreeMemory(pMac->hHdd, pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700195 } // if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) || ...
196 else
197 {
198 // Ignore Beacon frame in all other states
199 if (psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE ||
200 psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE ||
201 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME2_STATE ||
202 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME3_STATE ||
203 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME4_STATE ||
204 psessionEntry->limMlmState == eLIM_MLM_AUTH_RSP_TIMEOUT_STATE ||
205 psessionEntry->limMlmState == eLIM_MLM_AUTHENTICATED_STATE ||
206 psessionEntry->limMlmState == eLIM_MLM_WT_ASSOC_RSP_STATE ||
207 psessionEntry->limMlmState == eLIM_MLM_WT_REASSOC_RSP_STATE ||
208 psessionEntry->limMlmState == eLIM_MLM_ASSOCIATED_STATE ||
209 psessionEntry->limMlmState == eLIM_MLM_REASSOCIATED_STATE ||
210 psessionEntry->limMlmState == eLIM_MLM_WT_ASSOC_CNF_STATE ||
211 limIsReassocInProgress(pMac,psessionEntry)) {
212 // nothing unexpected about beacon in these states
213 pMac->lim.gLimNumBeaconsIgnored++;
214 }
215 else
216 {
217 PELOG1(limLog(pMac, LOG1, FL("Received Beacon in unexpected state %d\n"),
218 psessionEntry->limMlmState);
219 limPrintMlmState(pMac, LOG1, psessionEntry->limMlmState);)
220#ifdef WLAN_DEBUG
221 pMac->lim.gLimUnexpBcnCnt++;
222#endif
223 }
224 }
225
226 return;
227} /*** end limProcessBeaconFrame() ***/
228
229
230/**---------------------------------------------------------------
231\fn limProcessBeaconFrameNoSession
232\brief This function is called by limProcessMessageQueue()
233\ upon Beacon reception.
234\
235\param pMac
236\param *pRxPacketInfo - A pointer to Rx packet info structure
237\return None
238------------------------------------------------------------------*/
239void
240limProcessBeaconFrameNoSession(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo)
241{
242 tpSirMacMgmtHdr pHdr;
Jeff Johnson32d95a32012-09-10 13:15:23 -0700243 tSchBeaconStruct *pBeacon;
Jeff Johnson295189b2012-06-20 16:38:30 -0700244
245 pMac->lim.gLimNumBeaconsRcvd++;
246 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
247
248 limLog(pMac, LOG2, FL("Received Beacon frame with length=%d from "),
249 WDA_GET_RX_MPDU_LEN(pRxPacketInfo));
250 limPrintMacAddr(pMac, pHdr->sa, LOG2);
251
252 if (limDeactivateMinChannelTimerDuringScan(pMac) != eSIR_SUCCESS)
253 return;
254
Jeff Johnson32d95a32012-09-10 13:15:23 -0700255
Jeff Johnson295189b2012-06-20 16:38:30 -0700256 /**
257 * No session has been established. Expect Beacon only when
258 * 1. STA is in Scan mode waiting for Beacon/Probe response or
259 * 2. STA/AP is in Learn mode
260 */
261 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
262 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) ||
263 (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE))
264 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700265 if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,
266 (void **)&pBeacon, sizeof(tSchBeaconStruct)))
267 {
268 limLog(pMac, LOGE, FL("Unable to PAL allocate memory in limProcessBeaconFrameNoSession\n") );
269 return;
270 }
271
272 if (sirConvertBeaconFrame2Struct(pMac, (tANI_U8 *) pRxPacketInfo, pBeacon) != eSIR_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700273 {
274 // Received wrongly formatted/invalid Beacon. Ignore and move on.
275 limLog(pMac, LOGW, FL("Received invalid Beacon in global MLM state %X\n"), pMac->lim.gLimMlmState);
276 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
Jeff Johnson32d95a32012-09-10 13:15:23 -0700277 palFreeMemory(pMac->hHdd, pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700278 return;
279 }
280
281 if ( (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
282 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) )
283 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700284 //If we are scanning for P2P, only accept probe rsp
285 if((pMac->lim.gLimHalScanState != eLIM_HAL_SCANNING_STATE) || (NULL == pMac->lim.gpLimMlmScanReq)
286 || !pMac->lim.gpLimMlmScanReq->p2pSearch )
Jeff Johnson295189b2012-06-20 16:38:30 -0700287 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700288 limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo, eANI_BOOLEAN_TRUE, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700289 }
290 }
291 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE)
292 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700293 } // end of eLIM_MLM_LEARN_STATE)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700294 palFreeMemory(pMac->hHdd, pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700295 } // end of (eLIM_MLM_WT_PROBE_RESP_STATE) || (eLIM_MLM_PASSIVE_SCAN_STATE)
296 else
297 {
298 limLog(pMac, LOG1, FL("Rcvd Beacon in unexpected MLM state %d\n"), pMac->lim.gLimMlmState);
299 limPrintMlmState(pMac, LOG1, pMac->lim.gLimMlmState);
300#ifdef WLAN_DEBUG
301 pMac->lim.gLimUnexpBcnCnt++;
302#endif
303 }
304
305 return;
306} /*** end limProcessBeaconFrameNoSession() ***/
307