blob: c5cbef97b01ffabf027e3636a1717afdf9e3e862 [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
142
Jeff Johnson32d95a32012-09-10 13:15:23 -0700143 MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, pBeacon->timeStamp[0]);)
144 MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, pBeacon->timeStamp[1]);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700145
146
147 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
148 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE))
149 {
150#ifdef WLAN_FEATURE_P2P
151 //If we are scanning for P2P, only accept probe rsp
152 if((pMac->lim.gLimHalScanState != eLIM_HAL_SCANNING_STATE) || (NULL == pMac->lim.gpLimMlmScanReq)
153 || !pMac->lim.gpLimMlmScanReq->p2pSearch )
154#endif
155 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700156 limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo,
Jeff Johnson295189b2012-06-20 16:38:30 -0700157 ((pMac->lim.gLimHalScanState == eLIM_HAL_SCANNING_STATE) ? eANI_BOOLEAN_TRUE : eANI_BOOLEAN_FALSE),
158 eANI_BOOLEAN_FALSE);
159 }
160 }
161 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE)
162 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700163 }
164 else
165 {
166 if( psessionEntry->beacon != NULL )
167 {
168 palFreeMemory(pMac->hHdd, psessionEntry->beacon);
169 psessionEntry->beacon = NULL;
170 }
171 psessionEntry->bcnLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
Jeff Johnson43971f52012-07-17 12:26:56 -0700172 if( (palAllocateMemory(pMac->hHdd, (void**)&psessionEntry->beacon, psessionEntry->bcnLen)) != eHAL_STATUS_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700173 {
174 PELOGE(limLog(pMac, LOGE, FL("Unable to allocate memory to store beacon"));)
175 }
176 else
177 {
178 //Store the Beacon/ProbeRsp. This is sent to csr/hdd in join cnf response.
179 palCopyMemory(pMac->hHdd, psessionEntry->beacon, WDA_GET_RX_MPDU_DATA(pRxPacketInfo), psessionEntry->bcnLen);
180
181 }
182
183 // STA in WT_JOIN_BEACON_STATE (IBSS)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700184 limCheckAndAnnounceJoinSuccess(pMac, pBeacon, pHdr,psessionEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700185 } // if (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700186 palFreeMemory(pMac->hHdd, pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700187 } // if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) || ...
188 else
189 {
190 // Ignore Beacon frame in all other states
191 if (psessionEntry->limMlmState == eLIM_MLM_JOINED_STATE ||
192 psessionEntry->limMlmState == eLIM_MLM_BSS_STARTED_STATE ||
193 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME2_STATE ||
194 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME3_STATE ||
195 psessionEntry->limMlmState == eLIM_MLM_WT_AUTH_FRAME4_STATE ||
196 psessionEntry->limMlmState == eLIM_MLM_AUTH_RSP_TIMEOUT_STATE ||
197 psessionEntry->limMlmState == eLIM_MLM_AUTHENTICATED_STATE ||
198 psessionEntry->limMlmState == eLIM_MLM_WT_ASSOC_RSP_STATE ||
199 psessionEntry->limMlmState == eLIM_MLM_WT_REASSOC_RSP_STATE ||
200 psessionEntry->limMlmState == eLIM_MLM_ASSOCIATED_STATE ||
201 psessionEntry->limMlmState == eLIM_MLM_REASSOCIATED_STATE ||
202 psessionEntry->limMlmState == eLIM_MLM_WT_ASSOC_CNF_STATE ||
203 limIsReassocInProgress(pMac,psessionEntry)) {
204 // nothing unexpected about beacon in these states
205 pMac->lim.gLimNumBeaconsIgnored++;
206 }
207 else
208 {
209 PELOG1(limLog(pMac, LOG1, FL("Received Beacon in unexpected state %d\n"),
210 psessionEntry->limMlmState);
211 limPrintMlmState(pMac, LOG1, psessionEntry->limMlmState);)
212#ifdef WLAN_DEBUG
213 pMac->lim.gLimUnexpBcnCnt++;
214#endif
215 }
216 }
217
218 return;
219} /*** end limProcessBeaconFrame() ***/
220
221
222/**---------------------------------------------------------------
223\fn limProcessBeaconFrameNoSession
224\brief This function is called by limProcessMessageQueue()
225\ upon Beacon reception.
226\
227\param pMac
228\param *pRxPacketInfo - A pointer to Rx packet info structure
229\return None
230------------------------------------------------------------------*/
231void
232limProcessBeaconFrameNoSession(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo)
233{
234 tpSirMacMgmtHdr pHdr;
Jeff Johnson32d95a32012-09-10 13:15:23 -0700235 tSchBeaconStruct *pBeacon;
Jeff Johnson295189b2012-06-20 16:38:30 -0700236
237 pMac->lim.gLimNumBeaconsRcvd++;
238 pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
239
240 limLog(pMac, LOG2, FL("Received Beacon frame with length=%d from "),
241 WDA_GET_RX_MPDU_LEN(pRxPacketInfo));
242 limPrintMacAddr(pMac, pHdr->sa, LOG2);
243
244 if (limDeactivateMinChannelTimerDuringScan(pMac) != eSIR_SUCCESS)
245 return;
246
Jeff Johnson32d95a32012-09-10 13:15:23 -0700247
Jeff Johnson295189b2012-06-20 16:38:30 -0700248 /**
249 * No session has been established. Expect Beacon only when
250 * 1. STA is in Scan mode waiting for Beacon/Probe response or
251 * 2. STA/AP is in Learn mode
252 */
253 if ((pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
254 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) ||
255 (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE))
256 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700257 if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,
258 (void **)&pBeacon, sizeof(tSchBeaconStruct)))
259 {
260 limLog(pMac, LOGE, FL("Unable to PAL allocate memory in limProcessBeaconFrameNoSession\n") );
261 return;
262 }
263
264 if (sirConvertBeaconFrame2Struct(pMac, (tANI_U8 *) pRxPacketInfo, pBeacon) != eSIR_SUCCESS)
Jeff Johnson295189b2012-06-20 16:38:30 -0700265 {
266 // Received wrongly formatted/invalid Beacon. Ignore and move on.
267 limLog(pMac, LOGW, FL("Received invalid Beacon in global MLM state %X\n"), pMac->lim.gLimMlmState);
268 limPrintMlmState(pMac, LOGW, pMac->lim.gLimMlmState);
Jeff Johnson32d95a32012-09-10 13:15:23 -0700269 palFreeMemory(pMac->hHdd, pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700270 return;
271 }
272
273 if ( (pMac->lim.gLimMlmState == eLIM_MLM_WT_PROBE_RESP_STATE) ||
274 (pMac->lim.gLimMlmState == eLIM_MLM_PASSIVE_SCAN_STATE) )
275 {
276#ifdef WLAN_FEATURE_P2P
277 //If we are scanning for P2P, only accept probe rsp
278 if((pMac->lim.gLimHalScanState != eLIM_HAL_SCANNING_STATE) || (NULL == pMac->lim.gpLimMlmScanReq)
279 || !pMac->lim.gpLimMlmScanReq->p2pSearch )
280#endif
281 {
Jeff Johnson32d95a32012-09-10 13:15:23 -0700282 limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo, eANI_BOOLEAN_TRUE, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700283 }
284 }
285 else if (pMac->lim.gLimMlmState == eLIM_MLM_LEARN_STATE)
286 {
Jeff Johnson295189b2012-06-20 16:38:30 -0700287 } // end of eLIM_MLM_LEARN_STATE)
Jeff Johnson32d95a32012-09-10 13:15:23 -0700288 palFreeMemory(pMac->hHdd, pBeacon);
Jeff Johnson295189b2012-06-20 16:38:30 -0700289 } // end of (eLIM_MLM_WT_PROBE_RESP_STATE) || (eLIM_MLM_PASSIVE_SCAN_STATE)
290 else
291 {
292 limLog(pMac, LOG1, FL("Rcvd Beacon in unexpected MLM state %d\n"), pMac->lim.gLimMlmState);
293 limPrintMlmState(pMac, LOG1, pMac->lim.gLimMlmState);
294#ifdef WLAN_DEBUG
295 pMac->lim.gLimUnexpBcnCnt++;
296#endif
297 }
298
299 return;
300} /*** end limProcessBeaconFrameNoSession() ***/
301