blob: d7e39079f2e3ac769cfad3af3436ef69f9bfcd7d [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Jeff Johnson32d95a32012-09-10 13:15:23 -07002 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Jeff Johnson295189b2012-06-20 16:38:30 -07003 *
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
22/** ------------------------------------------------------------------------- *
23 ------------------------------------------------------------------------- *
Jeff Johnsone7245742012-09-05 17:12:55 -070024
Jeff Johnson295189b2012-06-20 16:38:30 -070025
26 \file csrApiRoam.c
27
28 Implementation for the Common Roaming interfaces.
29
30 Copyright (C) 2008 Qualcomm, Incorporated
31
32
33 ========================================================================== */
Jeff Johnson295189b2012-06-20 16:38:30 -070034/*===========================================================================
Jeff Johnson295189b2012-06-20 16:38:30 -070035 EDIT HISTORY FOR FILE
36
Jeff Johnson295189b2012-06-20 16:38:30 -070037 This section contains comments describing changes made to the module.
38 Notice that changes are listed in reverse chronological order.
39
Jeff Johnson295189b2012-06-20 16:38:30 -070040 when who what, where, why
41---------- --- --------------------------------------------------------
4206/03/10 js Added support to hostapd driven
43 * deauth/disassoc/mic failure
Jeff Johnson295189b2012-06-20 16:38:30 -070044===========================================================================*/
Jeff Johnson295189b2012-06-20 16:38:30 -070045#include "aniGlobal.h" //for tpAniSirGlobal
46#include "wlan_qct_wda.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070047#ifdef FEATURE_WLAN_INTEGRATED_SOC
48#include "halMsgApi.h" //for HAL_STA_INVALID_IDX.
49#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070050#ifdef FEATURE_WLAN_NON_INTEGRATED_SOC
51#include "halPhyApi.h"
52#include "halInternal.h"
53#endif
Jeff Johnsone7245742012-09-05 17:12:55 -070054#include "limUtils.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070055#include "palApi.h"
56#include "csrInsideApi.h"
57#include "smsDebug.h"
58#include "logDump.h"
59#include "smeQosInternal.h"
60#include "wlan_qct_tl.h"
61#include "smeInside.h"
62#include "vos_diag_core_event.h"
63#include "vos_diag_core_log.h"
64#include "csrApi.h"
65#include "pmc.h"
66#include "vos_nvitem.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070067#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
68#include "csrNeighborRoam.h"
69#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
Jeff Johnson295189b2012-06-20 16:38:30 -070070#ifdef FEATURE_WLAN_CCX
71#include "csrCcx.h"
72#endif /* FEATURE_WLAN_CCX */
Jeff Johnson295189b2012-06-20 16:38:30 -070073#define CSR_NUM_IBSS_START_CHANNELS_50 4
74#define CSR_NUM_IBSS_START_CHANNELS_24 3
75#define CSR_DEF_IBSS_START_CHANNEL_50 36
76#define CSR_DEF_IBSS_START_CHANNEL_24 1
77#define CSR_IBSS_JOIN_TIMEOUT_PERIOD ( 1 * PAL_TIMER_TO_SEC_UNIT ) // 1 second
78#define CSR_WAIT_FOR_KEY_TIMEOUT_PERIOD ( 50 * PAL_TIMER_TO_SEC_UNIT ) // 50 seconds, for WPA, WPA2, CCKM
79#define CSR_WAIT_FOR_WPS_KEY_TIMEOUT_PERIOD ( 120 * PAL_TIMER_TO_SEC_UNIT ) // 120 seconds, for WPS
80/*---------------------------------------------------------------------------
81 OBIWAN recommends [8 10]% : pick 9%
82---------------------------------------------------------------------------*/
83#define CSR_VCC_UL_MAC_LOSS_THRESHOLD 9
Jeff Johnson295189b2012-06-20 16:38:30 -070084/*---------------------------------------------------------------------------
85 OBIWAN recommends -85dBm
86---------------------------------------------------------------------------*/
87#define CSR_VCC_RSSI_THRESHOLD 80
88#define CSR_MIN_GLOBAL_STAT_QUERY_PERIOD 500 //ms
89#define CSR_MIN_GLOBAL_STAT_QUERY_PERIOD_IN_BMPS 2000 //ms
90#define CSR_MIN_TL_STAT_QUERY_PERIOD 500 //ms
91#define CSR_DIAG_LOG_STAT_PERIOD 3000 //ms
Jeff Johnson295189b2012-06-20 16:38:30 -070092//We use constatnt 4 here
93//This macro returns true when higher AC parameter is bigger than lower AC for a difference
94//The bigger the number, the less chance of TX
95//It must put lower AC as the first parameter.
96#define SME_DETECT_AC_WEIGHT_DIFF(loAC, hiAC) (v_BOOL_t)(((hiAC) > (loAC)) ? (((hiAC)-(loAC)) > 4) : 0)
Jeff Johnson295189b2012-06-20 16:38:30 -070097//Flag to send/do not send disassoc frame over the air
98#define CSR_DONT_SEND_DISASSOC_OVER_THE_AIR 1
Jeff Johnson295189b2012-06-20 16:38:30 -070099#define RSSI_HACK_BMPS (-40)
Jeff Johnsone7245742012-09-05 17:12:55 -0700100#define MAX_CB_VALUE_IN_INI (2)
101
Jeff Johnson295189b2012-06-20 16:38:30 -0700102/*--------------------------------------------------------------------------
103 Static Type declarations
104 ------------------------------------------------------------------------*/
105static tChannelListWithPower csrRoamPowerTableFromEeprom[WNI_CFG_VALID_CHANNEL_LIST_LEN];
106static tChannelListWithPower csrRoamPowerTableFromEeprom40MHz[WNI_CFG_VALID_CHANNEL_LIST_LEN];
107static tCsrRoamSession csrRoamRoamSession[CSR_ROAM_SESSION_MAX];
Jeff Johnson295189b2012-06-20 16:38:30 -0700108/*--------------------------------------------------------------------------
109 Type declarations
110 ------------------------------------------------------------------------*/
111#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -0700112int diagAuthTypeFromCSRType(eCsrAuthType authType)
113{
114 int n = AUTH_OPEN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700115 switch(authType)
116 {
117 case eCSR_AUTH_TYPE_SHARED_KEY:
118 n = AUTH_SHARED;
119 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700120 case eCSR_AUTH_TYPE_WPA:
121 n = AUTH_WPA_EAP;
122 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700123 case eCSR_AUTH_TYPE_WPA_PSK:
124 n = AUTH_WPA_PSK;
125 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700126 case eCSR_AUTH_TYPE_RSN:
127 n = AUTH_WPA2_EAP;
128 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700129 case eCSR_AUTH_TYPE_RSN_PSK:
130 n = AUTH_WPA2_PSK;
131 break;
132#ifdef FEATURE_WLAN_WAPI
133 case eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE:
134 n = AUTH_WAPI_CERT;
135 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700136 case eCSR_AUTH_TYPE_WAPI_WAI_PSK:
137 n = AUTH_WAPI_PSK;
138 break;
139#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -0700140 default:
141 break;
142 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700143 return (n);
144}
Jeff Johnson295189b2012-06-20 16:38:30 -0700145int diagEncTypeFromCSRType(eCsrEncryptionType encType)
146{
147 int n = ENC_MODE_OPEN;
Jeff Johnson295189b2012-06-20 16:38:30 -0700148 switch(encType)
149 {
150 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
151 case eCSR_ENCRYPT_TYPE_WEP40:
152 n = ENC_MODE_WEP40;
153 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700154 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
155 case eCSR_ENCRYPT_TYPE_WEP104:
156 n = ENC_MODE_WEP104;
157 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700158 case eCSR_ENCRYPT_TYPE_TKIP:
159 n = ENC_MODE_TKIP;
160 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700161 case eCSR_ENCRYPT_TYPE_AES:
162 n = ENC_MODE_AES;
163 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700164#ifdef FEATURE_WLAN_WAPI
165 case eCSR_ENCRYPT_TYPE_WPI:
166 n = ENC_MODE_SMS4;
167 break;
168#endif /* FEATURE_WLAN_WAPI */
169 default:
170 break;
171 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700172 return (n);
173}
Jeff Johnson295189b2012-06-20 16:38:30 -0700174#endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -0700175static const tANI_U8 csrStartIbssChannels50[ CSR_NUM_IBSS_START_CHANNELS_50 ] = { 36, 40, 44, 48};
176static const tANI_U8 csrStartIbssChannels24[ CSR_NUM_IBSS_START_CHANNELS_24 ] = { 1, 6, 11 };
Jeff Johnson295189b2012-06-20 16:38:30 -0700177static void initConfigParam(tpAniSirGlobal pMac);
178static tANI_BOOLEAN csrRoamProcessResults( tpAniSirGlobal pMac, tSmeCmd *pCommand,
179 eCsrRoamCompleteResult Result, void *Context );
180static eHalStatus csrRoamStartIbss( tpAniSirGlobal pMac, tANI_U32 sessionId,
181 tCsrRoamProfile *pProfile,
182 tANI_BOOLEAN *pfSameIbss );
183static void csrRoamUpdateConnectedProfileFromNewBss( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirSmeNewBssInfo *pNewBss );
184static void csrRoamPrepareBssParams(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
Jeff Johnsone7245742012-09-05 17:12:55 -0700185 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig, tDot11fBeaconIEs *pIes);
186static ePhyChanBondState csrGetCBModeFromIes(tpAniSirGlobal pMac, tANI_U8 primaryChn, tDot11fBeaconIEs *pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -0700187eHalStatus csrInitGetChannels(tpAniSirGlobal pMac);
188static void csrRoamingStateConfigCnfProcessor( tpAniSirGlobal pMac, tANI_U32 result );
189eHalStatus csrRoamOpen(tpAniSirGlobal pMac);
190eHalStatus csrRoamClose(tpAniSirGlobal pMac);
191void csrRoamMICErrorTimerHandler(void *pv);
192void csrRoamTKIPCounterMeasureTimerHandler(void *pv);
193tANI_BOOLEAN csrRoamIsSameProfileKeys(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pConnProfile, tCsrRoamProfile *pProfile2);
194
195static eHalStatus csrRoamStartRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval);
196static eHalStatus csrRoamStopRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId);
197static void csrRoamRoamingTimerHandler(void *pv);
198eHalStatus csrRoamStartIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval);
199eHalStatus csrRoamStopIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId);
200static void csrRoamIbssJoinTimerHandler(void *pv);
201eHalStatus csrRoamStartWaitForKeyTimer(tpAniSirGlobal pMac, tANI_U32 interval);
202eHalStatus csrRoamStopWaitForKeyTimer(tpAniSirGlobal pMac);
203static void csrRoamWaitForKeyTimeOutHandler(void *pv);
204
205static eHalStatus CsrInit11dInfo(tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo);
Jeff Johnsone7245742012-09-05 17:12:55 -0700206static eHalStatus csrInitChannelPowerList( tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo);
Jeff Johnson295189b2012-06-20 16:38:30 -0700207static eHalStatus csrRoamFreeConnectedInfo( tpAniSirGlobal pMac, tCsrRoamConnectedInfo *pConnectedInfo );
208eHalStatus csrSendMBSetContextReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId,
209 tSirMacAddr peerMacAddr, tANI_U8 numKeys, tAniEdType edType,
210 tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
211 tANI_U8 keyId, tANI_U8 keyLength, tANI_U8 *pKey, tANI_U8 paeRole,
212 tANI_U8 *pKeyRsc );
213static eHalStatus csrRoamIssueReassociate( tpAniSirGlobal pMac, tANI_U32 sessionId,
214 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes,
215 tCsrRoamProfile *pProfile );
216void csrRoamStatisticsTimerHandler(void *pv);
217void csrRoamStatsGlobalClassDTimerHandler(void *pv);
Jeff Johnson295189b2012-06-20 16:38:30 -0700218static void csrRoamLinkUp(tpAniSirGlobal pMac, tCsrBssid bssid);
219VOS_STATUS csrRoamVccTriggerRssiIndCallback(tHalHandle hHal,
220 v_U8_t rssiNotification,
221 void * context);
222static void csrRoamLinkDown(tpAniSirGlobal pMac, tANI_U32 sessionId);
223void csrRoamVccTrigger(tpAniSirGlobal pMac);
224eHalStatus csrSendMBStatsReqMsg( tpAniSirGlobal pMac, tANI_U32 statsMask, tANI_U8 staId);
225/*
226 pStaEntry is no longer invalid upon the return of this function.
227*/
228static void csrRoamRemoveStatListEntry(tpAniSirGlobal pMac, tListElem *pEntry);
Jeff Johnson295189b2012-06-20 16:38:30 -0700229#ifdef WLAN_SOFTAP_FEATURE
230static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,tANI_U8 operationChn, eCsrBand *pBand );
231#else
232static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, eCsrPhyMode phyModeIn, tANI_U8 operationChn, eCsrBand *pBand );
233#endif
234static eHalStatus csrRoamGetQosInfoFromBss(tpAniSirGlobal pMac, tSirBssDescription *pBssDesc);
Jeff Johnson295189b2012-06-20 16:38:30 -0700235tCsrStatsClientReqInfo * csrRoamInsertEntryIntoList( tpAniSirGlobal pMac,
236 tDblLinkList *pStaList,
237 tCsrStatsClientReqInfo *pStaEntry);
238void csrRoamStatsClientTimerHandler(void *pv);
239tCsrPeStatsReqInfo * csrRoamCheckPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask,
240 tANI_U32 periodicity, tANI_BOOLEAN *pFound, tANI_U8 staId);
241void csrRoamReportStatistics(tpAniSirGlobal pMac, tANI_U32 statsMask,
242 tCsrStatsCallback callback, tANI_U8 staId, void *pContext);
Jeff Johnsone7245742012-09-05 17:12:55 -0700243void csrRoamSaveStatsFromTl(tpAniSirGlobal pMac, WLANTL_TRANSFER_STA_TYPE *pTlStats);
Jeff Johnson295189b2012-06-20 16:38:30 -0700244void csrRoamTlStatsTimerHandler(void *pv);
245void csrRoamPeStatsTimerHandler(void *pv);
246tListElem * csrRoamCheckClientReqList(tpAniSirGlobal pMac, tANI_U32 statsMask);
247void csrRoamRemoveEntryFromPeStatsReqList(tpAniSirGlobal pMac, tCsrPeStatsReqInfo *pPeStaEntry);
248tListElem * csrRoamFindInPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask);
249eHalStatus csrRoamDeregStatisticsReq(tpAniSirGlobal pMac);
250static tANI_U32 csrFindIbssSession( tpAniSirGlobal pMac );
251static eHalStatus csrRoamStartWds( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc );
252static void csrInitSession( tpAniSirGlobal pMac, tANI_U32 sessionId );
253static eHalStatus csrRoamIssueSetKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
254 tCsrRoamSetKey *pSetKey, tANI_U32 roamId );
255//static eHalStatus csrRoamProcessStopBss( tpAniSirGlobal pMac, tSmeCmd *pCommand );
256static eHalStatus csrRoamGetQosInfoFromBss(tpAniSirGlobal pMac, tSirBssDescription *pBssDesc);
257void csrRoamReissueRoamCommand(tpAniSirGlobal pMac);
258#ifdef FEATURE_WLAN_BTAMP_UT_RF
259void csrRoamJoinRetryTimerHandler(void *pv);
260#endif
261extern void SysProcessMmhMsg(tpAniSirGlobal pMac, tSirMsgQ* pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -0700262extern void btampEstablishLogLinkHdlr(void* pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -0700263static void csrSerDesUnpackDiassocRsp(tANI_U8 *pBuf, tSirSmeDisassocRsp *pRsp);
264
265//Initialize global variables
266static void csrRoamInitGlobals(tpAniSirGlobal pMac)
267{
268 if(pMac)
269 {
270 pMac->roam.powerTableFromEeprom = csrRoamPowerTableFromEeprom;
271 pMac->roam.powerTableFromEeprom40MHz = csrRoamPowerTableFromEeprom40MHz;
272 pMac->roam.roamSession = csrRoamRoamSession;
273 }
274 return;
275}
276
Jeff Johnson295189b2012-06-20 16:38:30 -0700277static void csrRoamDeInitGlobals(tpAniSirGlobal pMac)
278{
279 if(pMac)
280 {
281 pMac->roam.powerTableFromEeprom = NULL;
282 pMac->roam.powerTableFromEeprom40MHz = NULL;
283 pMac->roam.roamSession = NULL;
284 }
285 return;
286}
Jeff Johnson295189b2012-06-20 16:38:30 -0700287eHalStatus csrOpen(tpAniSirGlobal pMac)
288{
289 eHalStatus status = eHAL_STATUS_SUCCESS;
290 static uNvTables nvTables;
291 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700292 v_REGDOMAIN_t regId;
293 tANI_U32 i;
294
295 do
296 {
297 /* Initialize CSR Roam Globals */
298 csrRoamInitGlobals(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -0700299 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
300 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_STOP, i);
301
302 initConfigParam(pMac);
303 if(!HAL_STATUS_SUCCESS((status = csrScanOpen(pMac))))
304 break;
305 if(!HAL_STATUS_SUCCESS((status = csrRoamOpen(pMac))))
306 break;
307 pMac->roam.nextRoamId = 1; //Must not be 0
308 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &pMac->roam.statsClientReqList)))
309 break;
310 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &pMac->roam.peStatsReqList)))
311 break;
312 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &pMac->roam.roamCmdPendingList)))
313 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700314 vosStatus = vos_nv_readDefaultCountryTable( &nvTables );
315 if ( VOS_IS_STATUS_SUCCESS(vosStatus) )
316 {
317 palCopyMemory( pMac->hHdd, pMac->scan.countryCodeDefault,
318 nvTables.defaultCountryTable.countryCode, WNI_CFG_COUNTRY_CODE_LEN );
319 status = eHAL_STATUS_SUCCESS;
320 }
321 else
322 {
323 smsLog( pMac, LOGE, FL(" fail to get NV_FIELD_IMAGE\n") );
324 //hardcoded for now
325 pMac->scan.countryCodeDefault[0] = 'U';
326 pMac->scan.countryCodeDefault[1] = 'S';
327 pMac->scan.countryCodeDefault[2] = 'I';
328 //status = eHAL_STATUS_SUCCESS;
329 }
Madan Mohan Koyyalamudi8b7f1e62012-10-05 14:56:51 -0700330 smsLog( pMac, LOG1, FL(" country Code from nvRam %s"), pMac->scan.countryCodeDefault );
Jeff Johnson295189b2012-06-20 16:38:30 -0700331 csrGetRegulatoryDomainForCountry(pMac, pMac->scan.countryCodeDefault, &regId);
Jeff Johnson295189b2012-06-20 16:38:30 -0700332 WDA_SetRegDomain(pMac, regId);
333 pMac->scan.domainIdDefault = regId;
334 pMac->scan.domainIdCurrent = pMac->scan.domainIdDefault;
Jeff Johnson295189b2012-06-20 16:38:30 -0700335 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeCurrent,
336 pMac->scan.countryCodeDefault, WNI_CFG_COUNTRY_CODE_LEN);
337 status = csrInitGetChannels( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -0700338 }while(0);
339
340 return (status);
341}
342
Jeff Johnson295189b2012-06-20 16:38:30 -0700343#ifdef WLAN_SOFTAP_FEATURE
344eHalStatus csrSetRegInfo(tHalHandle hHal, tANI_U8 *apCntryCode)
345{
346 eHalStatus status = eHAL_STATUS_SUCCESS;
347 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
348 v_REGDOMAIN_t regId;
349 v_U8_t cntryCodeLength;
Jeff Johnson295189b2012-06-20 16:38:30 -0700350 if(NULL == apCntryCode)
351 {
352 smsLog( pMac, LOGW, FL(" Invalid country Code Pointer\n") );
353 return eHAL_STATUS_FAILURE;
354 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700355 smsLog( pMac, LOGW, FL(" country Code %s\n"), apCntryCode );
Jeff Johnson295189b2012-06-20 16:38:30 -0700356 /* To get correct Regulatory domain from NV table
357 * 2 character Country code should be used
358 * 3rd charater is optional for indoor/outdoor setting */
359 cntryCodeLength = strlen(apCntryCode);
Madan Mohan Koyyalamudib666eb12012-09-18 17:29:47 -0700360
361 if (cntryCodeLength > WNI_CFG_COUNTRY_CODE_LEN)
362 {
363 smsLog( pMac, LOGW, FL(" Invalid Country Code Length\n") );
364 return eHAL_STATUS_FAILURE;
365 }
366
Jeff Johnson295189b2012-06-20 16:38:30 -0700367 status = csrGetRegulatoryDomainForCountry(pMac, apCntryCode, &regId);
368 if (status != eHAL_STATUS_SUCCESS)
369 {
370 smsLog( pMac, LOGE, FL(" fail to get regId for country Code %s\n"), apCntryCode );
371 return status;
372 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700373 status = WDA_SetRegDomain(hHal, regId);
374 if (status != eHAL_STATUS_SUCCESS)
375 {
376 smsLog( pMac, LOGE, FL(" fail to get regId for country Code %s\n"), apCntryCode );
377 return status;
378 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700379 pMac->scan.domainIdDefault = regId;
380 pMac->scan.domainIdCurrent = pMac->scan.domainIdDefault;
Jeff Johnson295189b2012-06-20 16:38:30 -0700381 /* Clear CC field */
382 palFillMemory( pMac->hHdd,
383 pMac->scan.countryCodeDefault,
384 WNI_CFG_COUNTRY_CODE_LEN,
385 0 );
386 /* Copy 2 or 3 bytes country code */
387 palCopyMemory( pMac->hHdd, pMac->scan.countryCodeDefault,
388 apCntryCode, cntryCodeLength );
Jeff Johnson295189b2012-06-20 16:38:30 -0700389 /* If 2 bytes country code, 3rd byte must be filled with space */
390 if((WNI_CFG_COUNTRY_CODE_LEN - 1) == cntryCodeLength)
391 {
392 palFillMemory( pMac->hHdd,
393 pMac->scan.countryCodeDefault + 2,
394 1,
395 0x20 );
396 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700397 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeCurrent,
398 pMac->scan.countryCodeDefault, WNI_CFG_COUNTRY_CODE_LEN);
399 status = csrInitGetChannels( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -0700400 return status;
401}
Jeff Johnson295189b2012-06-20 16:38:30 -0700402eHalStatus csrSetChannels(tHalHandle hHal, tCsrConfigParam *pParam )
403{
404 eHalStatus status = eHAL_STATUS_SUCCESS;
405 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
406 tANI_U8 index = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700407 palCopyMemory( pMac->hHdd, pParam->Csr11dinfo.countryCode,
408 pMac->scan.countryCodeCurrent, WNI_CFG_COUNTRY_CODE_LEN );
Jeff Johnson295189b2012-06-20 16:38:30 -0700409 for ( index = 0; index < pMac->scan.base20MHzChannels.numChannels ; index++)
410 {
411 pParam->Csr11dinfo.Channels.channelList[index] = pMac->scan.base20MHzChannels.channelList[ index ];
412 pParam->Csr11dinfo.ChnPower[index].firstChannel = pMac->scan.base20MHzChannels.channelList[ index ];
413 pParam->Csr11dinfo.ChnPower[index].numChannels = 1;
414 pParam->Csr11dinfo.ChnPower[index].maxtxPower = pMac->scan.defaultPowerTable[index].pwr;
415 }
416 pParam->Csr11dinfo.Channels.numChannels = pMac->scan.base20MHzChannels.numChannels;
417
418 return status;
419}
420#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700421eHalStatus csrClose(tpAniSirGlobal pMac)
422{
423 eHalStatus status = eHAL_STATUS_SUCCESS;
424
425 csrStop(pMac);
426 csrRoamClose(pMac);
427 csrScanClose(pMac);
428 csrLLClose(&pMac->roam.statsClientReqList);
429 csrLLClose(&pMac->roam.peStatsReqList);
430 csrLLClose(&pMac->roam.roamCmdPendingList);
Jeff Johnson295189b2012-06-20 16:38:30 -0700431 /* DeInit Globals */
432 csrRoamDeInitGlobals(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -0700433 return (status);
434}
Jeff Johnson295189b2012-06-20 16:38:30 -0700435eHalStatus csrStart(tpAniSirGlobal pMac)
436{
437 eHalStatus status = eHAL_STATUS_SUCCESS;
438 tANI_U32 i;
439
440 do
441 {
442 //save the global vos context
443 pMac->roam.gVosContext = vos_get_global_context(VOS_MODULE_ID_SME, pMac);
444 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
445 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, i );
446
447 status = csrRoamStart(pMac);
448 if(!HAL_STATUS_SUCCESS(status)) break;
449 pMac->scan.f11dInfoApplied = eANI_BOOLEAN_FALSE;
450 status = pmcRegisterPowerSaveCheck(pMac, csrCheckPSReady, pMac);
451 if(!HAL_STATUS_SUCCESS(status)) break;
452 pMac->roam.sPendingCommands = 0;
453 csrScanEnable(pMac);
454#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
455 status = csrNeighborRoamInit(pMac);
456#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
457 pMac->roam.tlStatsReqInfo.numClient = 0;
458 pMac->roam.tlStatsReqInfo.periodicity = 0;
459 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
460 //init the link quality indication also
461 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_MIN_IND;
462 if(!HAL_STATUS_SUCCESS(status))
463 {
464 smsLog(pMac, LOGW, " csrStart: Couldn't Init HO control blk \n");
465 break;
466 }
467 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700468#if defined(ANI_LOGDUMP)
469 csrDumpInit(pMac);
470#endif //#if defined(ANI_LOGDUMP)
Jeff Johnson295189b2012-06-20 16:38:30 -0700471 return (status);
472}
473
Jeff Johnson295189b2012-06-20 16:38:30 -0700474eHalStatus csrStop(tpAniSirGlobal pMac)
475{
476 tANI_U32 sessionId;
477 tANI_U32 i;
478
479 for(sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
480 {
481 csrRoamCloseSession(pMac, sessionId, TRUE, NULL, NULL);
482 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700483 csrScanDisable(pMac);
484 pMac->scan.fCancelIdleScan = eANI_BOOLEAN_FALSE;
485 pMac->scan.fRestartIdleScan = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700486 csrLLPurge( &pMac->roam.roamCmdPendingList, eANI_BOOLEAN_TRUE );
487
488#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
489 csrNeighborRoamClose(pMac);
490#endif
491 csrScanFlushResult(pMac); //Do we want to do this?
Jeff Johnson295189b2012-06-20 16:38:30 -0700492 // deregister from PMC since we register during csrStart()
493 // (ignore status since there is nothing we can do if it fails)
494 (void) pmcDeregisterPowerSaveCheck(pMac, csrCheckPSReady);
Jeff Johnson295189b2012-06-20 16:38:30 -0700495 //Reset the domain back to the deault
496 pMac->scan.domainIdCurrent = pMac->scan.domainIdDefault;
497 csrResetCountryInformation(pMac, eANI_BOOLEAN_TRUE);
498
499 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
500 {
501 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_STOP ,i );
502 pMac->roam.curSubState[i] = eCSR_ROAM_SUBSTATE_NONE;
503 }
504
505 return (eHAL_STATUS_SUCCESS);
506}
507
Jeff Johnson295189b2012-06-20 16:38:30 -0700508eHalStatus csrReady(tpAniSirGlobal pMac)
509{
510 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700511 csrScanGetSupportedChannels( pMac );
512 //WNI_CFG_VALID_CHANNEL_LIST should be set by this time
513 //use it to init the background scan list
514 csrInitBGScanChannelList(pMac);
515 /* HDD issues the init scan */
516 csrScanStartResultAgingTimer(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -0700517 //Store the AC weights in TL for later use
518 WLANTL_GetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
Jeff Johnson295189b2012-06-20 16:38:30 -0700519 status = csrInitChannelList( pMac );
520 if ( ! HAL_STATUS_SUCCESS( status ) )
521 {
522 smsLog( pMac, LOGE, "csrInitChannelList failed during csrReady with status=%d\n",
523 status );
524 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700525 return (status);
526}
Jeff Johnson295189b2012-06-20 16:38:30 -0700527void csrSetDefaultDot11Mode( tpAniSirGlobal pMac )
528{
529 v_U32_t wniDot11mode = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700530 wniDot11mode = csrTranslateToWNICfgDot11Mode(pMac,pMac->roam.configParam.uCfgDot11Mode);
531 ccmCfgSetInt(pMac, WNI_CFG_DOT11_MODE, wniDot11mode, NULL, eANI_BOOLEAN_FALSE);
532}
Jeff Johnson295189b2012-06-20 16:38:30 -0700533void csrSetGlobalCfgs( tpAniSirGlobal pMac )
534{
Jeff Johnsone7245742012-09-05 17:12:55 -0700535
Jeff Johnson295189b2012-06-20 16:38:30 -0700536 ccmCfgSetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD, csrGetFragThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
537 ccmCfgSetInt(pMac, WNI_CFG_RTS_THRESHOLD, csrGetRTSThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
538 ccmCfgSetInt(pMac, WNI_CFG_11D_ENABLED,
539 ((pMac->roam.configParam.Is11hSupportEnabled) ? pMac->roam.configParam.Is11dSupportEnabled : pMac->roam.configParam.Is11dSupportEnabled),
540 NULL, eANI_BOOLEAN_FALSE);
541 ccmCfgSetInt(pMac, WNI_CFG_11H_ENABLED, pMac->roam.configParam.Is11hSupportEnabled, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnsone7245742012-09-05 17:12:55 -0700542 /* For now we will just use the 5GHz CB mode ini parameter to decide whether CB supported or not in Probes when there is no session
543 * Once session is established we will use the session related params stored in PE session for CB mode
544 */
545 ccmCfgSetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, !!(pMac->roam.configParam.channelBondingMode5GHz), NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700546 ccmCfgSetInt(pMac, WNI_CFG_HEART_BEAT_THRESHOLD, pMac->roam.configParam.HeartbeatThresh24, NULL, eANI_BOOLEAN_FALSE);
547
548 //Update the operating mode to configured value during initialization,
549 //So that client can advertise full capabilities in Probe request frame.
550 csrSetDefaultDot11Mode( pMac );
551}
552
Jeff Johnson295189b2012-06-20 16:38:30 -0700553eHalStatus csrRoamOpen(tpAniSirGlobal pMac)
554{
555 eHalStatus status = eHAL_STATUS_SUCCESS;
556 tANI_U32 i;
557 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -0700558 do
559 {
560 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
561 {
562 pSession = CSR_GET_SESSION( pMac, i );
563 pSession->roamingTimerInfo.pMac = pMac;
564 pSession->roamingTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
565 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700566 pMac->roam.WaitForKeyTimerInfo.pMac = pMac;
567 pMac->roam.WaitForKeyTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
568 status = palTimerAlloc(pMac->hHdd, &pMac->roam.hTimerWaitForKey, csrRoamWaitForKeyTimeOutHandler,
569 &pMac->roam.WaitForKeyTimerInfo);
570 if(!HAL_STATUS_SUCCESS(status))
571 {
572 smsLog(pMac, LOGE, FL("cannot allocate memory for WaitForKey time out timer\n"));
573 break;
574 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700575 status = palTimerAlloc(pMac->hHdd, &pMac->roam.tlStatsReqInfo.hTlStatsTimer, csrRoamTlStatsTimerHandler, pMac);
576 if(!HAL_STATUS_SUCCESS(status))
577 {
578 smsLog(pMac, LOGE, FL("cannot allocate memory for summary Statistics timer\n"));
579 return eHAL_STATUS_FAILURE;
580 }
581 }while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700582 return (status);
583}
584
Jeff Johnson295189b2012-06-20 16:38:30 -0700585eHalStatus csrRoamClose(tpAniSirGlobal pMac)
586{
587 tANI_U32 sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -0700588 for(sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
589 {
590 csrRoamCloseSession(pMac, sessionId, TRUE, NULL, NULL);
591 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700592 palTimerStop(pMac->hHdd, pMac->roam.hTimerWaitForKey);
593 palTimerFree(pMac->hHdd, pMac->roam.hTimerWaitForKey);
Jeff Johnson295189b2012-06-20 16:38:30 -0700594 palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
595 palTimerFree(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
Jeff Johnson295189b2012-06-20 16:38:30 -0700596 return (eHAL_STATUS_SUCCESS);
597}
598
Jeff Johnson295189b2012-06-20 16:38:30 -0700599eHalStatus csrRoamStart(tpAniSirGlobal pMac)
600{
601 (void)pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -0700602 return (eHAL_STATUS_SUCCESS);
603}
604
Jeff Johnson295189b2012-06-20 16:38:30 -0700605void csrRoamStop(tpAniSirGlobal pMac, tANI_U32 sessionId)
606{
607 csrRoamStopRoamingTimer(pMac, sessionId);
608 /* deregister the clients requesting stats from PE/TL & also stop the corresponding timers*/
609 csrRoamDeregStatisticsReq(pMac);
610}
Jeff Johnson295189b2012-06-20 16:38:30 -0700611eHalStatus csrRoamGetConnectState(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrConnectState *pState)
612{
613 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
Jeff Johnson295189b2012-06-20 16:38:30 -0700614 if( pState )
615 {
616 status = eHAL_STATUS_SUCCESS;
617 *pState = pMac->roam.roamSession[sessionId].connectState;
618 }
619 return (status);
620}
621
Jeff Johnson295189b2012-06-20 16:38:30 -0700622eHalStatus csrRoamCopyConnectProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamConnectedProfile *pProfile)
623{
624 eHalStatus status = eHAL_STATUS_FAILURE;
625 tANI_U32 size = 0;
626 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -0700627
628 if(!pSession)
629 {
630 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
631 return eHAL_STATUS_FAILURE;
632 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700633
634 if(pProfile)
635 {
636 if(pSession->pConnectBssDesc)
637 {
638 do
639 {
640 size = pSession->pConnectBssDesc->length + sizeof(pSession->pConnectBssDesc->length);
641 if(size)
642 {
643 status = palAllocateMemory(pMac->hHdd, (void **)&pProfile->pBssDesc, size);
644 if(HAL_STATUS_SUCCESS(status))
645 {
646 palCopyMemory(pMac->hHdd, pProfile->pBssDesc, pSession->pConnectBssDesc, size);
647 }
648 else
649 break;
650 }
651 else
652 {
653 pProfile->pBssDesc = NULL;
654 }
655 pProfile->AuthType = pSession->connectedProfile.AuthType;
656 pProfile->EncryptionType = pSession->connectedProfile.EncryptionType;
657 pProfile->mcEncryptionType = pSession->connectedProfile.mcEncryptionType;
658 pProfile->BSSType = pSession->connectedProfile.BSSType;
659 pProfile->operationChannel = pSession->connectedProfile.operationChannel;
660 pProfile->CBMode = pSession->connectedProfile.CBMode;
661 palCopyMemory(pMac->hHdd, &pProfile->bssid, &pSession->connectedProfile.bssid, sizeof(tCsrBssid));
662 palCopyMemory(pMac->hHdd, &pProfile->SSID, &pSession->connectedProfile.SSID, sizeof(tSirMacSSid));
663#ifdef WLAN_FEATURE_VOWIFI_11R
664 if (pSession->connectedProfile.MDID.mdiePresent)
665 {
666 pProfile->MDID.mdiePresent = 1;
667 pProfile->MDID.mobilityDomain = pSession->connectedProfile.MDID.mobilityDomain;
668 }
669 else
670 {
671 pProfile->MDID.mdiePresent = 0;
672 pProfile->MDID.mobilityDomain = 0;
673 }
674#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700675#ifdef FEATURE_WLAN_CCX
676 pProfile->isCCXAssoc = pSession->connectedProfile.isCCXAssoc;
Jeff Johnson295189b2012-06-20 16:38:30 -0700677 if (csrIsAuthTypeCCX(pSession->connectedProfile.AuthType))
678 {
679 palCopyMemory( pMac->hHdd, pProfile->ccxCckmInfo.krk,
680 pSession->connectedProfile.ccxCckmInfo.krk, CSR_KRK_KEY_LEN );
681 pProfile->ccxCckmInfo.reassoc_req_num=
682 pSession->connectedProfile.ccxCckmInfo.reassoc_req_num;
683 pProfile->ccxCckmInfo.krk_plumbed =
684 pSession->connectedProfile.ccxCckmInfo.krk_plumbed;
685 }
686#endif
687 }while(0);
688 }
689 }
690
691 return (status);
692}
693
Jeff Johnson295189b2012-06-20 16:38:30 -0700694eHalStatus csrRoamGetConnectProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamConnectedProfile *pProfile)
695{
696 eHalStatus status = eHAL_STATUS_FAILURE;
697
698 if(csrIsConnStateConnected(pMac, sessionId))
699 {
700 if(pProfile)
701 {
702 status = csrRoamCopyConnectProfile(pMac, sessionId, pProfile);
703 }
704 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700705 return (status);
706}
Jeff Johnson295189b2012-06-20 16:38:30 -0700707eHalStatus csrRoamFreeConnectProfile(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pProfile)
708{
709 eHalStatus status = eHAL_STATUS_SUCCESS;
710
711 if(pProfile->pBssDesc)
712 {
713 palFreeMemory(pMac->hHdd, pProfile->pBssDesc);
714 }
715 palZeroMemory(pMac->hHdd, pProfile, sizeof(tCsrRoamConnectedProfile));
716 pProfile->AuthType = eCSR_AUTH_TYPE_UNKNOWN;
717 return (status);
718}
719
Jeff Johnson295189b2012-06-20 16:38:30 -0700720static eHalStatus csrRoamFreeConnectedInfo( tpAniSirGlobal pMac, tCsrRoamConnectedInfo *pConnectedInfo )
721{
722 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700723 if( pConnectedInfo->pbFrames )
724 {
725 palFreeMemory( pMac->hHdd, pConnectedInfo->pbFrames );
726 pConnectedInfo->pbFrames = NULL;
727 }
728 pConnectedInfo->nBeaconLength = 0;
729 pConnectedInfo->nAssocReqLength = 0;
730 pConnectedInfo->nAssocRspLength = 0;
731 pConnectedInfo->staId = 0;
732#ifdef WLAN_FEATURE_VOWIFI_11R
733 pConnectedInfo->nRICRspLength = 0;
734#endif
735#ifdef FEATURE_WLAN_CCX
736 pConnectedInfo->nTspecIeLength = 0;
737#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700738 return ( status );
739}
740
Jeff Johnson295189b2012-06-20 16:38:30 -0700741
742
Jeff Johnsone7245742012-09-05 17:12:55 -0700743
Jeff Johnson295189b2012-06-20 16:38:30 -0700744void csrReleaseCommandRoam(tpAniSirGlobal pMac, tSmeCmd *pCommand)
745{
746 csrReinitRoamCmd(pMac, pCommand);
747 csrReleaseCommand( pMac, pCommand );
748}
749
Jeff Johnson295189b2012-06-20 16:38:30 -0700750void csrReleaseCommandScan(tpAniSirGlobal pMac, tSmeCmd *pCommand)
751{
752 csrReinitScanCmd(pMac, pCommand);
753 csrReleaseCommand( pMac, pCommand );
754}
755
Jeff Johnson295189b2012-06-20 16:38:30 -0700756void csrReleaseCommandWmStatusChange(tpAniSirGlobal pMac, tSmeCmd *pCommand)
757{
758 csrReinitWmStatusChangeCmd(pMac, pCommand);
759 csrReleaseCommand( pMac, pCommand );
760}
761
Jeff Johnson295189b2012-06-20 16:38:30 -0700762void csrReinitSetKeyCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
763{
764 palZeroMemory(pMac->hHdd, &pCommand->u.setKeyCmd, sizeof(tSetKeyCmd));
765}
766
Jeff Johnson295189b2012-06-20 16:38:30 -0700767void csrReinitRemoveKeyCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
768{
769 palZeroMemory(pMac->hHdd, &pCommand->u.removeKeyCmd, sizeof(tRemoveKeyCmd));
770}
771
Jeff Johnson295189b2012-06-20 16:38:30 -0700772void csrReleaseCommandSetKey(tpAniSirGlobal pMac, tSmeCmd *pCommand)
773{
774 csrReinitSetKeyCmd(pMac, pCommand);
775 csrReleaseCommand( pMac, pCommand );
776}
Jeff Johnson295189b2012-06-20 16:38:30 -0700777void csrReleaseCommandRemoveKey(tpAniSirGlobal pMac, tSmeCmd *pCommand)
778{
779 csrReinitRemoveKeyCmd(pMac, pCommand);
780 csrReleaseCommand( pMac, pCommand );
781}
Jeff Johnson295189b2012-06-20 16:38:30 -0700782void csrAbortCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fStopping )
783{
784
785 if( eSmeCsrCommandMask & pCommand->command )
786 {
787 switch (pCommand->command)
788 {
789 case eSmeCommandScan:
790 // We need to inform the requester before droping the scan command
791 smsLog( pMac, LOGW, "%s: Drop scan reason %d callback 0x%X\n",
792 __FUNCTION__, pCommand->u.scanCmd.reason, (unsigned int)pCommand->u.scanCmd.callback);
793 if (NULL != pCommand->u.scanCmd.callback)
794 {
795 smsLog( pMac, LOGW, "%s callback scan requester\n", __FUNCTION__);
796 csrScanCallCallback(pMac, pCommand, eCSR_SCAN_ABORT);
797 }
798 csrReleaseCommandScan( pMac, pCommand );
799 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700800 case eSmeCommandRoam:
801 csrReleaseCommandRoam( pMac, pCommand );
802 break;
803
804 case eSmeCommandWmStatusChange:
805 csrReleaseCommandWmStatusChange( pMac, pCommand );
806 break;
807
808 case eSmeCommandSetKey:
809 csrReleaseCommandSetKey( pMac, pCommand );
810 break;
811
812 case eSmeCommandRemoveKey:
813 csrReleaseCommandRemoveKey( pMac, pCommand );
814 break;
815
816 default:
817 smsLog( pMac, LOGW, " CSR abort standard command %d\n", pCommand->command );
818 csrReleaseCommand( pMac, pCommand );
819 break;
820 }
821 }
822}
823
Jeff Johnson295189b2012-06-20 16:38:30 -0700824void csrRoamSubstateChange( tpAniSirGlobal pMac, eCsrRoamSubState NewSubstate, tANI_U32 sessionId)
825{
826 smsLog( pMac, LOG1, " CSR RoamSubstate: [ %d <== %d ]\n", NewSubstate, pMac->roam.curSubState[sessionId]);
827
Jeff Johnson295189b2012-06-20 16:38:30 -0700828 if(pMac->roam.curSubState[sessionId] == NewSubstate)
829 {
830 return;
Jeff Johnsone7245742012-09-05 17:12:55 -0700831 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700832 pMac->roam.curSubState[sessionId] = NewSubstate;
833}
834
Jeff Johnson295189b2012-06-20 16:38:30 -0700835eCsrRoamState csrRoamStateChange( tpAniSirGlobal pMac, eCsrRoamState NewRoamState, tANI_U8 sessionId)
836{
837 eCsrRoamState PreviousState;
838
839 smsLog( pMac, LOG1, "CSR RoamState: [ %d <== %d ]\n", NewRoamState, pMac->roam.curState[sessionId]);
840
841 PreviousState = pMac->roam.curState[sessionId];
842
843 if ( NewRoamState != pMac->roam.curState[sessionId] )
844 {
845 // Whenever we transition OUT of the Roaming state, clear the Roaming substate...
846 if ( CSR_IS_ROAM_JOINING(pMac, sessionId) )
847 {
848 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
849 }
850
851 pMac->roam.curState[sessionId] = NewRoamState;
852 }
853 return( PreviousState );
854}
855
Jeff Johnson295189b2012-06-20 16:38:30 -0700856void csrAssignRssiForCategory(tpAniSirGlobal pMac, tANI_U8 catOffset)
857{
858 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -0700859 if(catOffset)
860 {
861 pMac->roam.configParam.bCatRssiOffset = catOffset;
862 for(i = 0; i < CSR_NUM_RSSI_CAT; i++)
863 {
864 pMac->roam.configParam.RSSICat[CSR_NUM_RSSI_CAT - i - 1] = (int)CSR_BEST_RSSI_VALUE - (int)(i * catOffset);
865 }
866 }
867}
868
Jeff Johnson295189b2012-06-20 16:38:30 -0700869static void initConfigParam(tpAniSirGlobal pMac)
870{
871 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -0700872 pMac->roam.configParam.agingCount = CSR_AGING_COUNT;
873 pMac->roam.configParam.channelBondingMode24GHz = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
874 pMac->roam.configParam.channelBondingMode5GHz = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700875
Jeff Johnson295189b2012-06-20 16:38:30 -0700876 pMac->roam.configParam.phyMode = eCSR_DOT11_MODE_TAURUS;
877 pMac->roam.configParam.eBand = eCSR_BAND_ALL;
878 pMac->roam.configParam.uCfgDot11Mode = eCSR_CFG_DOT11_MODE_TAURUS;
879 pMac->roam.configParam.FragmentationThreshold = eCSR_DOT11_FRAG_THRESH_DEFAULT;
880 pMac->roam.configParam.HeartbeatThresh24 = 40;
881 pMac->roam.configParam.HeartbeatThresh50 = 40;
882 pMac->roam.configParam.Is11dSupportEnabled = eANI_BOOLEAN_FALSE;
883 pMac->roam.configParam.Is11dSupportEnabledOriginal = eANI_BOOLEAN_FALSE;
884 pMac->roam.configParam.Is11eSupportEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700885 pMac->roam.configParam.Is11hSupportEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700886 pMac->roam.configParam.RTSThreshold = 2346;
887 pMac->roam.configParam.shortSlotTime = eANI_BOOLEAN_TRUE;
888 pMac->roam.configParam.WMMSupportMode = eCsrRoamWmmAuto;
889 pMac->roam.configParam.ProprietaryRatesEnabled = eANI_BOOLEAN_TRUE;
890 pMac->roam.configParam.TxRate = eCSR_TX_RATE_AUTO;
891 pMac->roam.configParam.impsSleepTime = CSR_IDLE_SCAN_NO_PS_INTERVAL;
892 pMac->roam.configParam.scanAgeTimeNCNPS = CSR_SCAN_AGING_TIME_NOT_CONNECT_NO_PS;
893 pMac->roam.configParam.scanAgeTimeNCPS = CSR_SCAN_AGING_TIME_NOT_CONNECT_W_PS;
894 pMac->roam.configParam.scanAgeTimeCNPS = CSR_SCAN_AGING_TIME_CONNECT_NO_PS;
895 pMac->roam.configParam.scanAgeTimeCPS = CSR_SCAN_AGING_TIME_CONNECT_W_PS;
896 for(i = 0; i < CSR_NUM_RSSI_CAT; i++)
897 {
898 pMac->roam.configParam.BssPreferValue[i] = i;
899 }
900 csrAssignRssiForCategory(pMac, CSR_DEFAULT_RSSI_DB_GAP);
901 pMac->roam.configParam.nRoamingTime = CSR_DEFAULT_ROAMING_TIME;
902 pMac->roam.configParam.fEnforce11dChannels = eANI_BOOLEAN_FALSE;
903 pMac->roam.configParam.fSupplicantCountryCodeHasPriority = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700904 pMac->roam.configParam.fEnforceCountryCodeMatch = eANI_BOOLEAN_FALSE;
905 pMac->roam.configParam.fEnforceDefaultDomain = eANI_BOOLEAN_FALSE;
906 pMac->roam.configParam.nActiveMaxChnTime = CSR_ACTIVE_MAX_CHANNEL_TIME;
907 pMac->roam.configParam.nActiveMinChnTime = CSR_ACTIVE_MIN_CHANNEL_TIME;
908 pMac->roam.configParam.nPassiveMaxChnTime = CSR_PASSIVE_MAX_CHANNEL_TIME;
909 pMac->roam.configParam.nPassiveMinChnTime = CSR_PASSIVE_MIN_CHANNEL_TIME;
Jeff Johnson295189b2012-06-20 16:38:30 -0700910 pMac->roam.configParam.IsIdleScanEnabled = TRUE; //enable the idle scan by default
911 pMac->roam.configParam.nTxPowerCap = CSR_MAX_TX_POWER;
912 pMac->roam.configParam.statsReqPeriodicity = CSR_MIN_GLOBAL_STAT_QUERY_PERIOD;
913 pMac->roam.configParam.statsReqPeriodicityInPS = CSR_MIN_GLOBAL_STAT_QUERY_PERIOD_IN_BMPS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700914#ifdef WLAN_FEATURE_VOWIFI_11R
915 pMac->roam.configParam.csr11rConfig.IsFTResourceReqSupported = 0;
916#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700917#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
918 pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries = 3;
919 pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold = 120;
920 pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold = 125;
921 pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime = 20;
922 pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime = 40;
923 pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod = 200;
924 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels = 3;
925 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[0] = 1;
926 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[1] = 6;
927 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[2] = 11;
928 pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod = 20000; //20 seconds
929#endif
Jeff Johnsone7245742012-09-05 17:12:55 -0700930#ifdef WLAN_FEATURE_11AC
931 pMac->roam.configParam.nVhtChannelWidth = WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ + 1;
932#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700933
934 pMac->roam.configParam.addTSWhenACMIsOff = 0;
935 pMac->roam.configParam.fScanTwice = eANI_BOOLEAN_FALSE;
Mohit Khanna349bc392012-09-11 17:24:52 -0700936
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -0700937 //Remove this code once SLM_Sessionization is supported
938 //BMPS_WORKAROUND_NOT_NEEDED
Jeff Johnsone7245742012-09-05 17:12:55 -0700939 pMac->roam.configParam.doBMPSWorkaround = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700940
Jeff Johnsone7245742012-09-05 17:12:55 -0700941}
Jeff Johnson295189b2012-06-20 16:38:30 -0700942eCsrBand csrGetCurrentBand(tHalHandle hHal)
943{
944 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
945 return pMac->roam.configParam.bandCapability;
946}
Jeff Johnson295189b2012-06-20 16:38:30 -0700947eHalStatus csrSetBand(tHalHandle hHal, eCsrBand eBand)
948{
949 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
950 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700951 if (CSR_IS_PHY_MODE_A_ONLY(pMac) &&
952 (eBand == eCSR_BAND_24))
953 {
954 /* DOT11 mode configured to 11a only and received
955 request to change the band to 2.4 GHz */
956 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
957 "failed to set band cfg80211 = %u, band = %u\n",
958 pMac->roam.configParam.uCfgDot11Mode, eBand);
959 return eHAL_STATUS_INVALID_PARAMETER;
960 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700961 if ((CSR_IS_PHY_MODE_B_ONLY(pMac) ||
962 CSR_IS_PHY_MODE_G_ONLY(pMac)) &&
963 (eBand == eCSR_BAND_5G))
964 {
965 /* DOT11 mode configured to 11b/11g only and received
966 request to change the band to 5 GHz */
967 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
968 "failed to set band dot11mode = %u, band = %u\n",
969 pMac->roam.configParam.uCfgDot11Mode, eBand);
970 return eHAL_STATUS_INVALID_PARAMETER;
971 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700972 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
973 "Band changed to %u (0 - ALL, 1 - 2.4 GHZ, 2 - 5GHZ)\n", eBand);
974 pMac->roam.configParam.eBand = eBand;
975 pMac->roam.configParam.bandCapability = eBand;
976 csrScanGetSupportedChannels( pMac );
977 status = csrInitGetChannels( pMac );
978 if (eHAL_STATUS_SUCCESS == status)
979 csrInitChannelList( hHal );
980 return status;
981}
Jeff Johnsone7245742012-09-05 17:12:55 -0700982/* The funcns csrConvertCBIniValueToPhyCBState and csrConvertPhyCBStateToIniValue have been
983 * introduced to convert the ini value to the ENUM used in csr and MAC for CB state
984 * Ideally we should have kept the ini value and enum value same and representing the same
985 * cb values as in 11n standard i.e.
986 * Set to 1 (SCA) if the secondary channel is above the primary channel
987 * Set to 3 (SCB) if the secondary channel is below the primary channel
988 * Set to 0 (SCN) if no secondary channel is present
989 * However, since our driver is already distributed we will keep the ini definition as it is which is:
990 * 0 - secondary none
991 * 1 - secondary LOW
992 * 2 - secondary HIGH
993 * and convert to enum value used within the driver in csrChangeDefaultConfigParam using this funcn
994 * The enum values are as follows:
995 * PHY_SINGLE_CHANNEL_CENTERED = 0
996 * PHY_DOUBLE_CHANNEL_LOW_PRIMARY = 1
997 * PHY_DOUBLE_CHANNEL_HIGH_PRIMARY = 3
998 */
999ePhyChanBondState csrConvertCBIniValueToPhyCBState(v_U32_t cbIniValue)
1000{
1001
1002 ePhyChanBondState phyCbState;
1003 switch (cbIniValue) {
1004 // secondary none
1005 case 0:
1006 phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
1007 break;
1008 // secondary LOW
1009 case 1:
1010 phyCbState = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
1011 break;
1012 // secondary HIGH
1013 case 2:
1014 phyCbState = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
1015 break;
1016#ifdef WLAN_FEATURE_11AC
1017 case 3:
1018 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
1019 break;
1020 case 4:
1021 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
1022 break;
1023 case 5:
1024 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
1025 break;
1026 case 6:
1027 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
1028 break;
1029 case 7:
1030 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
1031 break;
1032 case 8:
1033 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
1034 break;
1035 case 9:
1036 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
1037 break;
1038#endif
1039 default:
1040 // If an invalid value is passed, disable CHANNEL BONDING
1041 phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
1042 break;
1043 }
1044 return phyCbState;
1045}
1046
1047v_U32_t csrConvertPhyCBStateToIniValue(ePhyChanBondState phyCbState)
1048{
1049
1050 v_U32_t cbIniValue;
1051 switch (phyCbState) {
1052 // secondary none
1053 case PHY_SINGLE_CHANNEL_CENTERED:
1054 cbIniValue = 0;
1055 break;
1056 // secondary LOW
1057 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
1058 cbIniValue = 1;
1059 break;
1060 // secondary HIGH
1061 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
1062 cbIniValue = 2;
1063 break;
1064#ifdef WLAN_FEATURE_11AC
1065 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
1066 cbIniValue = 3;
1067 break;
1068 case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
1069 cbIniValue = 4;
1070 break;
1071 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
1072 cbIniValue = 5;
1073 break;
1074 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
1075 cbIniValue = 6;
1076 break;
1077 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
1078 cbIniValue = 7;
1079 break;
1080 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
1081 cbIniValue = 8;
1082 break;
1083 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
1084 cbIniValue = 9;
1085 break;
1086#endif
1087 default:
1088 // return some invalid value
1089 cbIniValue = 10;
1090 break;
1091 }
1092 return cbIniValue;
1093}
Jeff Johnson295189b2012-06-20 16:38:30 -07001094
1095eHalStatus csrChangeDefaultConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
1096{
1097 eHalStatus status = eHAL_STATUS_SUCCESS;
1098
1099 if(pParam)
1100 {
1101 pMac->roam.configParam.WMMSupportMode = pParam->WMMSupportMode;
1102 pMac->roam.configParam.Is11eSupportEnabled = pParam->Is11eSupportEnabled;
1103 pMac->roam.configParam.FragmentationThreshold = pParam->FragmentationThreshold;
1104 pMac->roam.configParam.Is11dSupportEnabled = pParam->Is11dSupportEnabled;
1105 pMac->roam.configParam.Is11dSupportEnabledOriginal = pParam->Is11dSupportEnabled;
1106 pMac->roam.configParam.Is11hSupportEnabled = pParam->Is11hSupportEnabled;
1107
1108 pMac->roam.configParam.fenableMCCMode = pParam->fEnableMCCMode;
Mohit Khanna7ed53f02012-09-11 17:52:10 -07001109 pMac->roam.configParam.fAllowMCCGODiffBI = pParam->fAllowMCCGODiffBI;
1110
Jeff Johnsone7245742012-09-05 17:12:55 -07001111 /* channelBondingMode5GHz plays a dual role right now
1112 * INFRA STA will use this non zero value as CB enabled and SOFTAP will use this non-zero value to determine the secondary channel offset
1113 * This is how channelBondingMode5GHz works now and this is kept intact to avoid any cfg.ini change
1114 */
1115 if (pParam->channelBondingMode24GHz > MAX_CB_VALUE_IN_INI)
1116 {
1117 smsLog( pMac, LOGW, "Invalid CB value from ini in 2.4GHz band %d, CB DISABLED\n", pParam->channelBondingMode24GHz);
1118 }
1119 pMac->roam.configParam.channelBondingMode24GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingMode24GHz);
1120 if (pParam->channelBondingMode5GHz > MAX_CB_VALUE_IN_INI)
1121 {
1122 smsLog( pMac, LOGW, "Invalid CB value from ini in 5GHz band %d, CB DISABLED\n", pParam->channelBondingMode5GHz);
1123 }
1124 pMac->roam.configParam.channelBondingMode5GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingMode5GHz);
Jeff Johnson295189b2012-06-20 16:38:30 -07001125 pMac->roam.configParam.RTSThreshold = pParam->RTSThreshold;
1126 pMac->roam.configParam.phyMode = pParam->phyMode;
1127 pMac->roam.configParam.shortSlotTime = pParam->shortSlotTime;
1128 pMac->roam.configParam.HeartbeatThresh24 = pParam->HeartbeatThresh24;
1129 pMac->roam.configParam.HeartbeatThresh50 = pParam->HeartbeatThresh50;
1130 pMac->roam.configParam.ProprietaryRatesEnabled = pParam->ProprietaryRatesEnabled;
1131 pMac->roam.configParam.TxRate = pParam->TxRate;
1132 pMac->roam.configParam.AdHocChannel24 = pParam->AdHocChannel24;
1133 pMac->roam.configParam.AdHocChannel5G = pParam->AdHocChannel5G;
1134 pMac->roam.configParam.bandCapability = pParam->bandCapability;
1135 pMac->roam.configParam.cbChoice = pParam->cbChoice;
1136 pMac->roam.configParam.bgScanInterval = pParam->bgScanInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07001137 //if HDD passed down non zero values then only update,
1138 //otherwise keep using the defaults
1139 if(pParam->nActiveMaxChnTime)
1140 {
1141 pMac->roam.configParam.nActiveMaxChnTime = pParam->nActiveMaxChnTime;
1142 }
1143 if(pParam->nActiveMinChnTime)
1144 {
1145 pMac->roam.configParam.nActiveMinChnTime = pParam->nActiveMinChnTime;
1146 }
1147 if(pParam->nPassiveMaxChnTime)
1148 {
1149 pMac->roam.configParam.nPassiveMaxChnTime = pParam->nPassiveMaxChnTime;
1150 }
1151 if(pParam->nPassiveMinChnTime)
1152 {
1153 pMac->roam.configParam.nPassiveMinChnTime = pParam->nPassiveMinChnTime;
1154 }
1155 //if upper layer wants to disable idle scan altogether set it to 0
1156 if(pParam->impsSleepTime)
1157 {
1158 //Change the unit from second to microsecond
1159 tANI_U32 impsSleepTime = pParam->impsSleepTime * PAL_TIMER_TO_SEC_UNIT;
Jeff Johnson295189b2012-06-20 16:38:30 -07001160 if(CSR_IDLE_SCAN_NO_PS_INTERVAL_MIN <= impsSleepTime)
1161 {
1162 pMac->roam.configParam.impsSleepTime = impsSleepTime;
1163 }
1164 else
1165 {
1166 pMac->roam.configParam.impsSleepTime = CSR_IDLE_SCAN_NO_PS_INTERVAL;
1167 }
1168 }
1169 else
1170 {
1171 pMac->roam.configParam.impsSleepTime = 0;
1172 }
1173 pMac->roam.configParam.eBand = pParam->eBand;
1174#ifdef WLAN_SOFTAP_FEATURE
1175 pMac->roam.configParam.uCfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(NULL, pMac->roam.configParam.phyMode,
1176 pMac->roam.configParam.ProprietaryRatesEnabled);
1177#else
1178 pMac->roam.configParam.uCfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(pMac->roam.configParam.phyMode,
1179 pMac->roam.configParam.ProprietaryRatesEnabled);
1180#endif
1181 //if HDD passed down non zero values for age params, then only update,
1182 //otherwise keep using the defaults
1183 if(pParam->nScanResultAgeCount)
1184 {
1185 pMac->roam.configParam.agingCount = pParam->nScanResultAgeCount;
1186 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001187 if(pParam->scanAgeTimeNCNPS)
1188 {
1189 pMac->roam.configParam.scanAgeTimeNCNPS = pParam->scanAgeTimeNCNPS;
1190 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001191 if(pParam->scanAgeTimeNCPS)
1192 {
1193 pMac->roam.configParam.scanAgeTimeNCPS = pParam->scanAgeTimeNCPS;
1194 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001195 if(pParam->scanAgeTimeCNPS)
1196 {
1197 pMac->roam.configParam.scanAgeTimeCNPS = pParam->scanAgeTimeCNPS;
1198 }
1199 if(pParam->scanAgeTimeCPS)
1200 {
1201 pMac->roam.configParam.scanAgeTimeCPS = pParam->scanAgeTimeCPS;
1202 }
1203
1204 csrAssignRssiForCategory(pMac, pParam->bCatRssiOffset);
1205 pMac->roam.configParam.nRoamingTime = pParam->nRoamingTime;
1206 pMac->roam.configParam.fEnforce11dChannels = pParam->fEnforce11dChannels;
1207 pMac->roam.configParam.fSupplicantCountryCodeHasPriority = pParam->fSupplicantCountryCodeHasPriority;
1208 pMac->roam.configParam.fEnforceCountryCodeMatch = pParam->fEnforceCountryCodeMatch;
1209 pMac->roam.configParam.fEnforceDefaultDomain = pParam->fEnforceDefaultDomain;
Jeff Johnson295189b2012-06-20 16:38:30 -07001210 pMac->roam.configParam.vccRssiThreshold = pParam->vccRssiThreshold;
1211 pMac->roam.configParam.vccUlMacLossThreshold = pParam->vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07001212 pMac->roam.configParam.IsIdleScanEnabled = pParam->IsIdleScanEnabled;
1213 pMac->roam.configParam.statsReqPeriodicity = pParam->statsReqPeriodicity;
1214 pMac->roam.configParam.statsReqPeriodicityInPS = pParam->statsReqPeriodicityInPS;
1215 //Assign this before calling CsrInit11dInfo
1216 pMac->roam.configParam.nTxPowerCap = pParam->nTxPowerCap;
Jeff Johnson295189b2012-06-20 16:38:30 -07001217 if( csrIs11dSupported( pMac ) )
1218 {
1219 status = CsrInit11dInfo(pMac, &pParam->Csr11dinfo);
1220 }
1221 else
1222 {
1223 pMac->scan.curScanType = eSIR_ACTIVE_SCAN;
1224 }
Jeff Johnsone7245742012-09-05 17:12:55 -07001225
1226 /* Initialize the power + channel information if 11h is enabled.
1227 If 11d is enabled this information has already been initialized */
1228 if( csrIs11hSupported( pMac ) && !csrIs11dSupported( pMac ) )
1229 {
1230 csrInitChannelPowerList(pMac, &pParam->Csr11dinfo);
1231 }
1232
1233
Jeff Johnson295189b2012-06-20 16:38:30 -07001234#ifdef WLAN_FEATURE_VOWIFI_11R
1235 palCopyMemory( pMac->hHdd, &pMac->roam.configParam.csr11rConfig, &pParam->csr11rConfig, sizeof(tCsr11rConfigParams) );
1236 smsLog( pMac, LOG1, "IsFTResourceReqSupp = %d\n", pMac->roam.configParam.csr11rConfig.IsFTResourceReqSupported);
1237#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07001238#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -07001239 pMac->roam.configParam.isFastTransitionEnabled = pParam->isFastTransitionEnabled;
Jeff Johnson43971f52012-07-17 12:26:56 -07001240 pMac->roam.configParam.RoamRssiDiff = pParam->RoamRssiDiff;
Jeff Johnson295189b2012-06-20 16:38:30 -07001241#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07001242#ifdef FEATURE_WLAN_LFR
1243 pMac->roam.configParam.isFastRoamIniFeatureEnabled = pParam->isFastRoamIniFeatureEnabled;
1244#endif
1245
Jeff Johnson295189b2012-06-20 16:38:30 -07001246#ifdef FEATURE_WLAN_CCX
1247 pMac->roam.configParam.isCcxIniFeatureEnabled = pParam->isCcxIniFeatureEnabled;
1248#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001249#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1250 palCopyMemory( pMac->hHdd, &pMac->roam.configParam.neighborRoamConfig, &pParam->neighborRoamConfig, sizeof(tCsrNeighborRoamConfigParams) );
Jeff Johnson295189b2012-06-20 16:38:30 -07001251 smsLog( pMac, LOG1, "nNeighborScanTimerPerioid = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod);
1252 smsLog( pMac, LOG1, "nNeighborReassocRssiThreshold = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold);
1253 smsLog( pMac, LOG1, "nNeighborLookupRssiThreshold = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold);
1254 smsLog( pMac, LOG1, "nNeighborScanMinChanTime = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime);
1255 smsLog( pMac, LOG1, "nNeighborScanMaxChanTime = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime);
1256 smsLog( pMac, LOG1, "nMaxNeighborRetries = %d\n", pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries);
1257 smsLog( pMac, LOG1, "nNeighborResultsRefreshPeriod = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod);
Jeff Johnson295189b2012-06-20 16:38:30 -07001258 {
1259 int i;
1260 smsLog( pMac, LOG1, FL("Num of Channels in CFG Channel List: %d\n"), pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels);
Jeff Johnson295189b2012-06-20 16:38:30 -07001261 for( i=0; i< pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels; i++)
1262 {
1263 smsLog( pMac, LOG1, "%d ", pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[i] );
1264 }
1265 smsLog( pMac, LOG1, "\n");
1266 }
1267#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001268 pMac->roam.configParam.addTSWhenACMIsOff = pParam->addTSWhenACMIsOff;
1269 pMac->scan.fValidateList = pParam->fValidateList;
1270 pMac->scan.fEnableBypass11d = pParam->fEnableBypass11d;
1271 pMac->scan.fEnableDFSChnlScan = pParam->fEnableDFSChnlScan;
1272 pMac->roam.configParam.fScanTwice = pParam->fScanTwice;
Jeff Johnsone7245742012-09-05 17:12:55 -07001273 pMac->scan.fFirstScanOnly2GChnl = pParam->fFirstScanOnly2GChnl;
1274 /* This parameter is not available in cfg and not passed from upper layers. Instead it is initialized here
1275 * This paramtere is used in concurrency to determine if there are concurrent active sessions.
1276 * Is used as a temporary fix to disconnect all active sessions when BMPS enabled so the active session if Infra STA
1277 * will automatically connect back and resume BMPS since resume BMPS is not working when moving from concurrent to
1278 * single session
1279 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07001280 //Remove this code once SLM_Sessionization is supported
1281 //BMPS_WORKAROUND_NOT_NEEDED
Mohit Khanna349bc392012-09-11 17:24:52 -07001282 pMac->roam.configParam.doBMPSWorkaround = 0;
1283
Jeff Johnsone7245742012-09-05 17:12:55 -07001284#ifdef WLAN_FEATURE_11AC
1285 pMac->roam.configParam.nVhtChannelWidth = pParam->nVhtChannelWidth;
1286#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001287 }
1288
1289 return status;
1290}
1291
Jeff Johnson295189b2012-06-20 16:38:30 -07001292eHalStatus csrGetConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
1293{
1294 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
Jeff Johnson295189b2012-06-20 16:38:30 -07001295 if(pParam)
1296 {
1297 pParam->WMMSupportMode = pMac->roam.configParam.WMMSupportMode;
1298 pParam->Is11eSupportEnabled = pMac->roam.configParam.Is11eSupportEnabled;
1299 pParam->FragmentationThreshold = pMac->roam.configParam.FragmentationThreshold;
1300 pParam->Is11dSupportEnabled = pMac->roam.configParam.Is11dSupportEnabled;
1301 pParam->Is11dSupportEnabledOriginal = pMac->roam.configParam.Is11dSupportEnabledOriginal;
1302 pParam->Is11hSupportEnabled = pMac->roam.configParam.Is11hSupportEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07001303 pParam->channelBondingMode24GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode24GHz);
1304 pParam->channelBondingMode5GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode5GHz);
Jeff Johnson295189b2012-06-20 16:38:30 -07001305 pParam->RTSThreshold = pMac->roam.configParam.RTSThreshold;
1306 pParam->phyMode = pMac->roam.configParam.phyMode;
1307 pParam->shortSlotTime = pMac->roam.configParam.shortSlotTime;
1308 pParam->HeartbeatThresh24 = pMac->roam.configParam.HeartbeatThresh24;
1309 pParam->HeartbeatThresh50 = pMac->roam.configParam.HeartbeatThresh50;
1310 pParam->ProprietaryRatesEnabled = pMac->roam.configParam.ProprietaryRatesEnabled;
1311 pParam->TxRate = pMac->roam.configParam.TxRate;
1312 pParam->AdHocChannel24 = pMac->roam.configParam.AdHocChannel24;
1313 pParam->AdHocChannel5G = pMac->roam.configParam.AdHocChannel5G;
1314 pParam->bandCapability = pMac->roam.configParam.bandCapability;
1315 pParam->cbChoice = pMac->roam.configParam.cbChoice;
1316 pParam->bgScanInterval = pMac->roam.configParam.bgScanInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07001317 pParam->nActiveMaxChnTime = pMac->roam.configParam.nActiveMaxChnTime;
1318 pParam->nActiveMinChnTime = pMac->roam.configParam.nActiveMinChnTime;
1319 pParam->nPassiveMaxChnTime = pMac->roam.configParam.nPassiveMaxChnTime;
1320 pParam->nPassiveMinChnTime = pMac->roam.configParam.nPassiveMinChnTime;
Jeff Johnson295189b2012-06-20 16:38:30 -07001321 //Change the unit from microsecond to second
1322 pParam->impsSleepTime = pMac->roam.configParam.impsSleepTime / PAL_TIMER_TO_SEC_UNIT;
1323 pParam->eBand = pMac->roam.configParam.eBand;
1324 pParam->nScanResultAgeCount = pMac->roam.configParam.agingCount;
1325 pParam->scanAgeTimeNCNPS = pMac->roam.configParam.scanAgeTimeNCNPS;
1326 pParam->scanAgeTimeNCPS = pMac->roam.configParam.scanAgeTimeNCPS;
1327 pParam->scanAgeTimeCNPS = pMac->roam.configParam.scanAgeTimeCNPS;
1328 pParam->scanAgeTimeCPS = pMac->roam.configParam.scanAgeTimeCPS;
1329 pParam->bCatRssiOffset = pMac->roam.configParam.bCatRssiOffset;
1330 pParam->nRoamingTime = pMac->roam.configParam.nRoamingTime;
1331 pParam->fEnforce11dChannels = pMac->roam.configParam.fEnforce11dChannels;
1332 pParam->fSupplicantCountryCodeHasPriority = pMac->roam.configParam.fSupplicantCountryCodeHasPriority;
1333 pParam->fEnforceCountryCodeMatch = pMac->roam.configParam.fEnforceCountryCodeMatch;
1334 pParam->fEnforceDefaultDomain = pMac->roam.configParam.fEnforceDefaultDomain;
1335 pParam->vccRssiThreshold = pMac->roam.configParam.vccRssiThreshold;
1336 pParam->vccUlMacLossThreshold = pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07001337 pParam->IsIdleScanEnabled = pMac->roam.configParam.IsIdleScanEnabled;
1338 pParam->nTxPowerCap = pMac->roam.configParam.nTxPowerCap;
1339 pParam->statsReqPeriodicity = pMac->roam.configParam.statsReqPeriodicity;
1340 pParam->statsReqPeriodicityInPS = pMac->roam.configParam.statsReqPeriodicityInPS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001341 pParam->addTSWhenACMIsOff = pMac->roam.configParam.addTSWhenACMIsOff;
1342 pParam->fValidateList = pMac->roam.configParam.fValidateList;
1343 pParam->fEnableBypass11d = pMac->scan.fEnableBypass11d;
1344 pParam->fEnableDFSChnlScan = pMac->scan.fEnableDFSChnlScan;
1345 pParam->fScanTwice = pMac->roam.configParam.fScanTwice;
Jeff Johnsone7245742012-09-05 17:12:55 -07001346 pParam->fFirstScanOnly2GChnl = pMac->scan.fFirstScanOnly2GChnl;
Jeff Johnson295189b2012-06-20 16:38:30 -07001347
1348#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1349 palCopyMemory( pMac->hHdd, &pParam->neighborRoamConfig, &pMac->roam.configParam.neighborRoamConfig, sizeof(tCsrNeighborRoamConfigParams) );
1350#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07001351#ifdef WLAN_FEATURE_11AC
1352 pParam->nVhtChannelWidth = pMac->roam.configParam.nVhtChannelWidth;
1353#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001354
1355 csrSetChannels(pMac, pParam);
1356
1357 status = eHAL_STATUS_SUCCESS;
1358 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001359 return (status);
1360}
1361
Jeff Johnson295189b2012-06-20 16:38:30 -07001362eHalStatus csrSetPhyMode(tHalHandle hHal, tANI_U32 phyMode, eCsrBand eBand, tANI_BOOLEAN *pfRestartNeeded)
1363{
1364 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
1365 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
1366 tANI_BOOLEAN fRestartNeeded = eANI_BOOLEAN_FALSE;
1367 eCsrPhyMode newPhyMode = eCSR_DOT11_MODE_AUTO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001368 do
1369 {
1370 if(eCSR_BAND_24 == eBand)
1371 {
1372 if(CSR_IS_RADIO_A_ONLY(pMac)) break;
1373 if((eCSR_DOT11_MODE_11a & phyMode) || (eCSR_DOT11_MODE_11a_ONLY & phyMode)) break;
1374 }
1375 if(eCSR_BAND_5G == eBand)
1376 {
1377 if(CSR_IS_RADIO_BG_ONLY(pMac)) break;
1378 if((eCSR_DOT11_MODE_11b & phyMode) || (eCSR_DOT11_MODE_11b_ONLY & phyMode) ||
1379 (eCSR_DOT11_MODE_11g & phyMode) || (eCSR_DOT11_MODE_11g_ONLY & phyMode)
1380 )
1381 {
1382 break;
1383 }
1384 }
1385 if((0 == phyMode) || (eCSR_DOT11_MODE_TAURUS & phyMode))
1386 {
1387 newPhyMode = eCSR_DOT11_MODE_TAURUS;
1388 }
1389 else if(eCSR_DOT11_MODE_AUTO & phyMode)
1390 {
1391 newPhyMode = eCSR_DOT11_MODE_AUTO;
1392 }
1393 else
1394 {
1395 //Check for dual band and higher capability first
1396 if(eCSR_DOT11_MODE_11n_ONLY & phyMode)
1397 {
1398 if(eCSR_DOT11_MODE_11n_ONLY != phyMode) break;
1399 newPhyMode = eCSR_DOT11_MODE_11n_ONLY;
1400 }
1401 else if(eCSR_DOT11_MODE_11a_ONLY & phyMode)
1402 {
1403 if(eCSR_DOT11_MODE_11a_ONLY != phyMode) break;
1404 if(eCSR_BAND_24 == eBand) break;
1405 newPhyMode = eCSR_DOT11_MODE_11a_ONLY;
1406 eBand = eCSR_BAND_5G;
1407 }
1408 else if(eCSR_DOT11_MODE_11g_ONLY & phyMode)
1409 {
1410 if(eCSR_DOT11_MODE_11g_ONLY != phyMode) break;
1411 if(eCSR_BAND_5G == eBand) break;
1412 newPhyMode = eCSR_DOT11_MODE_11g_ONLY;
1413 eBand = eCSR_BAND_24;
1414 }
1415 else if(eCSR_DOT11_MODE_11b_ONLY & phyMode)
1416 {
1417 if(eCSR_DOT11_MODE_11b_ONLY != phyMode) break;
1418 if(eCSR_BAND_5G == eBand) break;
1419 newPhyMode = eCSR_DOT11_MODE_11b_ONLY;
1420 eBand = eCSR_BAND_24;
1421 }
1422 else if(eCSR_DOT11_MODE_11n & phyMode)
1423 {
1424 newPhyMode = eCSR_DOT11_MODE_11n;
1425 }
1426 else if(eCSR_DOT11_MODE_abg & phyMode)
1427 {
1428 newPhyMode = eCSR_DOT11_MODE_abg;
1429 }
1430 else if(eCSR_DOT11_MODE_11a & phyMode)
1431 {
1432 if((eCSR_DOT11_MODE_11g & phyMode) || (eCSR_DOT11_MODE_11b & phyMode))
1433 {
1434 if(eCSR_BAND_ALL == eBand)
1435 {
1436 newPhyMode = eCSR_DOT11_MODE_abg;
1437 }
1438 else
1439 {
1440 //bad setting
1441 break;
1442 }
1443 }
1444 else
1445 {
1446 newPhyMode = eCSR_DOT11_MODE_11a;
1447 eBand = eCSR_BAND_5G;
1448 }
1449 }
1450 else if(eCSR_DOT11_MODE_11g & phyMode)
1451 {
1452 newPhyMode = eCSR_DOT11_MODE_11g;
1453 eBand = eCSR_BAND_24;
1454 }
1455 else if(eCSR_DOT11_MODE_11b & phyMode)
1456 {
1457 newPhyMode = eCSR_DOT11_MODE_11b;
1458 eBand = eCSR_BAND_24;
1459 }
1460 else
1461 {
1462 //We will never be here
1463 smsLog( pMac, LOGE, FL(" cannot recognize the phy mode 0x%08X\n"), phyMode );
1464 newPhyMode = eCSR_DOT11_MODE_AUTO;
1465 }
1466 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001467 //Done validating
1468 status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001469 //Now we need to check whether a restart is needed.
1470 if(eBand != pMac->roam.configParam.eBand)
1471 {
1472 fRestartNeeded = eANI_BOOLEAN_TRUE;
1473 break;
1474 }
1475 if(newPhyMode != pMac->roam.configParam.phyMode)
1476 {
1477 fRestartNeeded = eANI_BOOLEAN_TRUE;
1478 break;
1479 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001480 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001481 if(HAL_STATUS_SUCCESS(status))
1482 {
1483 pMac->roam.configParam.eBand = eBand;
1484 pMac->roam.configParam.phyMode = newPhyMode;
1485 if(pfRestartNeeded)
1486 {
1487 *pfRestartNeeded = fRestartNeeded;
1488 }
1489 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001490 return (status);
1491}
1492
Jeff Johnson295189b2012-06-20 16:38:30 -07001493void csrPruneChannelListForMode( tpAniSirGlobal pMac, tCsrChannel *pChannelList )
1494{
1495 tANI_U8 Index;
1496 tANI_U8 cChannels;
Jeff Johnson295189b2012-06-20 16:38:30 -07001497 // for dual band NICs, don't need to trim the channel list....
1498 if ( !CSR_IS_OPEARTING_DUAL_BAND( pMac ) )
1499 {
1500 // 2.4 GHz band operation requires the channel list to be trimmed to
1501 // the 2.4 GHz channels only...
1502 if ( CSR_IS_24_BAND_ONLY( pMac ) )
1503 {
1504 for( Index = 0, cChannels = 0; Index < pChannelList->numChannels;
1505 Index++ )
1506 {
1507 if ( CSR_IS_CHANNEL_24GHZ(pChannelList->channelList[ Index ]) )
1508 {
1509 pChannelList->channelList[ cChannels ] = pChannelList->channelList[ Index ];
1510 cChannels++;
1511 }
1512 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001513 // Cleanup the rest of channels. Note we only need to clean up the channels if we had
1514 // to trim the list. Calling palZeroMemory() with a 0 size is going to throw asserts on
1515 // the debug builds so let's be a bit smarter about that. Zero out the reset of the channels
1516 // only if we need to.
1517 //
1518 // The amount of memory to clear is the number of channesl that we trimmed
1519 // (pChannelList->numChannels - cChannels) times the size of a channel in the structure.
1520
1521 if ( pChannelList->numChannels > cChannels )
1522 {
1523 palZeroMemory( pMac->hHdd, &pChannelList->channelList[ cChannels ],
1524 sizeof( pChannelList->channelList[ 0 ] ) * ( pChannelList->numChannels - cChannels ) );
1525
1526 }
1527
1528 pChannelList->numChannels = cChannels;
1529 }
1530 else if ( CSR_IS_5G_BAND_ONLY( pMac ) )
1531 {
1532 for ( Index = 0, cChannels = 0; Index < pChannelList->numChannels; Index++ )
1533 {
1534 if ( CSR_IS_CHANNEL_5GHZ(pChannelList->channelList[ Index ]) )
1535 {
1536 pChannelList->channelList[ cChannels ] = pChannelList->channelList[ Index ];
1537 cChannels++;
1538 }
1539 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001540 // Cleanup the rest of channels. Note we only need to clean up the channels if we had
1541 // to trim the list. Calling palZeroMemory() with a 0 size is going to throw asserts on
1542 // the debug builds so let's be a bit smarter about that. Zero out the reset of the channels
1543 // only if we need to.
1544 //
1545 // The amount of memory to clear is the number of channesl that we trimmed
1546 // (pChannelList->numChannels - cChannels) times the size of a channel in the structure.
1547 if ( pChannelList->numChannels > cChannels )
1548 {
1549 palZeroMemory( pMac->hHdd, &pChannelList->channelList[ cChannels ],
1550 sizeof( pChannelList->channelList[ 0 ] ) * ( pChannelList->numChannels - cChannels ) );
1551 }
1552
1553 pChannelList->numChannels = cChannels;
1554 }
1555 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001556}
Jeff Johnson295189b2012-06-20 16:38:30 -07001557#ifdef WLAN_SOFTAP_FEATURE
1558#define INFRA_AP_DEFAULT_CHANNEL 6
1559eHalStatus csrIsValidChannel(tpAniSirGlobal pMac, tANI_U8 chnNum)
1560{
1561 tANI_U8 index= 0;
1562 eHalStatus status = eHAL_STATUS_FAILURE;
1563 for (index=0; index < pMac->scan.base20MHzChannels.numChannels ;index++)
1564 {
1565 if(pMac->scan.base20MHzChannels.channelList[ index ] == chnNum){
1566 status = eHAL_STATUS_SUCCESS;
1567 break;
1568 }
1569 }
1570 return status;
1571}
1572#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001573eHalStatus csrInitGetChannels(tpAniSirGlobal pMac)
1574{
1575 eHalStatus status = eHAL_STATUS_SUCCESS;
1576 tANI_U8 num20MHzChannelsFound = 0;
1577 VOS_STATUS vosStatus;
1578 tANI_U8 Index = 0;
1579 tANI_U8 num40MHzChannelsFound = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001580
Jeff Johnson295189b2012-06-20 16:38:30 -07001581
1582 //TODO: this interface changed to include the 40MHz channel list
1583 // this needs to be tied into the adapter structure somehow and referenced appropriately for CB operation
1584 // Read the scan channel list (including the power limit) from EEPROM
1585 vosStatus = vos_nv_getChannelListWithPower( pMac->scan.defaultPowerTable, &num20MHzChannelsFound,
1586 pMac->scan.defaultPowerTable40MHz, &num40MHzChannelsFound);
1587 if ( (VOS_STATUS_SUCCESS != vosStatus) || (num20MHzChannelsFound == 0) )
1588 {
1589 smsLog( pMac, LOGE, FL("failed to get channels \n"));
1590 status = eHAL_STATUS_FAILURE;
1591 }
1592 else
1593 {
1594 if ( num20MHzChannelsFound > WNI_CFG_VALID_CHANNEL_LIST_LEN )
1595 {
1596 num20MHzChannelsFound = WNI_CFG_VALID_CHANNEL_LIST_LEN;
1597 }
1598 pMac->scan.numChannelsDefault = num20MHzChannelsFound;
1599 // Move the channel list to the global data
1600 // structure -- this will be used as the scan list
1601 for ( Index = 0; Index < num20MHzChannelsFound; Index++)
1602 {
1603#ifdef FEATURE_WLAN_INTEGRATED_SOC /* Need to fix this while dealing with NV item */
1604 pMac->scan.base20MHzChannels.channelList[ Index ] = pMac->scan.defaultPowerTable[ Index ].chanId;
1605#else
1606 pMac->scan.base20MHzChannels.channelList[ Index ] = Index + 1;
1607 pMac->scan.defaultPowerTable[Index].chanId = Index + 1;
1608 pMac->scan.defaultPowerTable[Index].pwr = 25;
1609#endif
1610 }
1611 pMac->scan.base20MHzChannels.numChannels = num20MHzChannelsFound;
1612 if(num40MHzChannelsFound > WNI_CFG_VALID_CHANNEL_LIST_LEN)
1613 {
1614 num40MHzChannelsFound = WNI_CFG_VALID_CHANNEL_LIST_LEN;
1615 }
1616 for ( Index = 0; Index < num40MHzChannelsFound; Index++)
1617 {
1618 pMac->scan.base40MHzChannels.channelList[ Index ] = pMac->scan.defaultPowerTable40MHz[ Index ].chanId;
1619 }
1620 pMac->scan.base40MHzChannels.numChannels = num40MHzChannelsFound;
1621 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001622 return (status);
1623}
1624
Jeff Johnson295189b2012-06-20 16:38:30 -07001625eHalStatus csrInitChannelList( tHalHandle hHal )
1626{
1627 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
1628 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001629 csrPruneChannelListForMode(pMac, &pMac->scan.baseChannels);
1630 csrPruneChannelListForMode(pMac, &pMac->scan.base20MHzChannels);
1631 // Apply the base channel list, power info, and set the Country code...
1632 csrApplyChannelPowerCountryInfo( pMac, &pMac->scan.base20MHzChannels, pMac->scan.countryCodeCurrent );
1633
1634 return (status);
1635}
Jeff Johnson295189b2012-06-20 16:38:30 -07001636eHalStatus csrChangeConfigParams(tpAniSirGlobal pMac,
1637 tCsrUpdateConfigParam *pUpdateConfigParam)
1638{
1639 eHalStatus status = eHAL_STATUS_FAILURE;
1640 tCsr11dinfo *ps11dinfo = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001641 ps11dinfo = &pUpdateConfigParam->Csr11dinfo;
1642 status = CsrInit11dInfo(pMac, ps11dinfo);
1643 return status;
1644}
1645
Jeff Johnson295189b2012-06-20 16:38:30 -07001646static eHalStatus CsrInit11dInfo(tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo)
1647{
1648 eHalStatus status = eHAL_STATUS_FAILURE;
1649 tANI_U8 index;
1650 tANI_U32 count=0;
1651 tSirMacChanInfo *pChanInfo;
1652 tSirMacChanInfo *pChanInfoStart;
1653 tANI_BOOLEAN applyConfig = TRUE;
1654
1655 if(!ps11dinfo)
1656 {
1657 return (status);
1658 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001659 if ( ps11dinfo->Channels.numChannels && ( WNI_CFG_VALID_CHANNEL_LIST_LEN >= ps11dinfo->Channels.numChannels ) )
1660 {
1661 pMac->scan.base20MHzChannels.numChannels = ps11dinfo->Channels.numChannels;
1662 status = palCopyMemory(pMac->hHdd, pMac->scan.base20MHzChannels.channelList,
1663 ps11dinfo->Channels.channelList, ps11dinfo->Channels.numChannels);
1664 if(!HAL_STATUS_SUCCESS(status)) return (status);
1665 }
1666 else
1667 {
1668 //No change
1669 return (eHAL_STATUS_SUCCESS);
1670 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001671 //legacy maintenance
1672 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeDefault,
1673 ps11dinfo->countryCode, WNI_CFG_COUNTRY_CODE_LEN);
1674 if(!HAL_STATUS_SUCCESS(status)) return (status);
Jeff Johnson295189b2012-06-20 16:38:30 -07001675 //Tush: at csropen get this initialized with default, during csr reset if this
1676 // already set with some value no need initilaize with default again
1677 if(0 == pMac->scan.countryCodeCurrent[0])
1678 {
1679 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeCurrent,
1680 ps11dinfo->countryCode, WNI_CFG_COUNTRY_CODE_LEN);
1681 if(!HAL_STATUS_SUCCESS(status)) return (status);
1682 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001683 // need to add the max power channel list
1684 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN)))
1685 {
1686 palZeroMemory(pMac->hHdd, pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN);
1687 pChanInfoStart = pChanInfo;
Jeff Johnsone7245742012-09-05 17:12:55 -07001688 for(index = 0; index < ps11dinfo->Channels.numChannels; index++)
1689 {
1690 pChanInfo->firstChanNum = ps11dinfo->ChnPower[index].firstChannel;
1691 pChanInfo->numChannels = ps11dinfo->ChnPower[index].numChannels;
1692 pChanInfo->maxTxPower = CSR_ROAM_MIN( ps11dinfo->ChnPower[index].maxtxPower, pMac->roam.configParam.nTxPowerCap );
1693 pChanInfo++;
1694 count++;
1695 }
1696 if(count)
1697 {
1698 csrSaveToChannelPower2G_5G( pMac, count * sizeof(tSirMacChanInfo), pChanInfoStart );
1699 }
1700 palFreeMemory(pMac->hHdd, pChanInfoStart);
1701 }
1702 //Only apply them to CFG when not in STOP state. Otherwise they will be applied later
1703 if( HAL_STATUS_SUCCESS(status) )
1704 {
1705 for( index = 0; index < CSR_ROAM_SESSION_MAX; index++ )
1706 {
1707 if((CSR_IS_SESSION_VALID(pMac, index)) && CSR_IS_ROAM_STOP(pMac, index))
1708 {
1709 applyConfig = FALSE;
1710 }
1711 }
1712
1713 if(TRUE == applyConfig)
1714 {
1715 // Apply the base channel list, power info, and set the Country code...
1716 csrApplyChannelPowerCountryInfo( pMac, &pMac->scan.base20MHzChannels, pMac->scan.countryCodeCurrent );
1717 }
1718
1719 }
1720 return (status);
1721}
1722/* Initialize the Channel + Power List in the local cache and in the CFG */
1723eHalStatus csrInitChannelPowerList( tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo)
1724{
1725 tANI_U8 index;
1726 tANI_U32 count=0;
1727 tSirMacChanInfo *pChanInfo;
1728 tSirMacChanInfo *pChanInfoStart;
1729
1730 if(!ps11dinfo || !pMac)
1731 {
1732 return eHAL_STATUS_FAILURE;
1733 }
1734
1735 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN)))
1736 {
1737 palZeroMemory(pMac->hHdd, pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN);
1738 pChanInfoStart = pChanInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07001739
1740 for(index = 0; index < ps11dinfo->Channels.numChannels; index++)
1741 {
1742 pChanInfo->firstChanNum = ps11dinfo->ChnPower[index].firstChannel;
1743 pChanInfo->numChannels = ps11dinfo->ChnPower[index].numChannels;
1744 pChanInfo->maxTxPower = CSR_ROAM_MIN( ps11dinfo->ChnPower[index].maxtxPower, pMac->roam.configParam.nTxPowerCap );
1745 pChanInfo++;
1746 count++;
1747 }
1748 if(count)
1749 {
1750 csrSaveToChannelPower2G_5G( pMac, count * sizeof(tSirMacChanInfo), pChanInfoStart );
1751 }
1752 palFreeMemory(pMac->hHdd, pChanInfoStart);
1753 }
1754
Jeff Johnsone7245742012-09-05 17:12:55 -07001755 return eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001756}
1757
1758//pCommand may be NULL
1759//Pass in sessionId in case pCommand is NULL. sessionId is not used in case pCommand is not NULL.
1760void csrRoamRemoveDuplicateCommand(tpAniSirGlobal pMac, tANI_U32 sessionId, tSmeCmd *pCommand, eCsrRoamReason eRoamReason)
1761{
1762 tListElem *pEntry, *pNextEntry;
1763 tSmeCmd *pDupCommand;
1764 tDblLinkList localList;
1765
1766 vos_mem_zero(&localList, sizeof(tDblLinkList));
1767 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &localList)))
1768 {
1769 smsLog(pMac, LOGE, FL(" failed to open list"));
1770 return;
1771 }
1772 csrLLLock( &pMac->sme.smeCmdPendingList );
1773 pEntry = csrLLPeekHead( &pMac->sme.smeCmdPendingList, LL_ACCESS_NOLOCK );
1774 while( pEntry )
1775 {
1776 pNextEntry = csrLLNext( &pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK );
1777 pDupCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07001778 // Remove the previous command if..
1779 // - the new roam command is for the same RoamReason...
1780 // - the new roam command is a NewProfileList.
1781 // - the new roam command is a Forced Dissoc
1782 // - the new roam command is from an 802.11 OID (OID_SSID or OID_BSSID).
1783 if (
1784 (pCommand && ( pCommand->sessionId == pDupCommand->sessionId ) &&
1785 ((pCommand->command == pDupCommand->command) &&
1786 (pCommand->u.roamCmd.roamReason == pDupCommand->u.roamCmd.roamReason ||
1787 eCsrForcedDisassoc == pCommand->u.roamCmd.roamReason ||
1788 eCsrHddIssued == pCommand->u.roamCmd.roamReason)))
1789 ||
1790 //below the pCommand is NULL
Jeff Johnson43971f52012-07-17 12:26:56 -07001791 ( (sessionId == pDupCommand->sessionId) &&
1792 (eSmeCommandRoam == pDupCommand->command) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07001793 ((eCsrForcedDisassoc == eRoamReason) ||
1794 (eCsrHddIssued == eRoamReason))
1795 )
1796 )
1797 {
1798 smsLog(pMac, LOGW, FL(" roamReason = %d\n"), pDupCommand->u.roamCmd.roamReason);
1799 // Remove the 'stale' roam command from the pending list...
1800 if(csrLLRemoveEntry( &pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK ))
1801 {
1802 csrLLInsertTail(&localList, pEntry, LL_ACCESS_NOLOCK);
1803 }
1804 }
1805 pEntry = pNextEntry;
1806 }
1807 csrLLUnlock( &pMac->sme.smeCmdPendingList );
1808
1809 while( (pEntry = csrLLRemoveHead(&localList, LL_ACCESS_NOLOCK)) )
1810 {
1811 pDupCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
1812 //Tell caller that the command is cancelled
1813 csrRoamCallCallback(pMac, pDupCommand->sessionId, NULL, pDupCommand->u.roamCmd.roamId,
1814 eCSR_ROAM_CANCELLED, eCSR_ROAM_RESULT_NONE);
1815 csrReleaseCommandRoam(pMac, pDupCommand);
1816 }
1817 csrLLClose(&localList);
1818}
Jeff Johnson295189b2012-06-20 16:38:30 -07001819eHalStatus csrRoamCallCallback(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamInfo *pRoamInfo,
1820 tANI_U32 roamId, eRoamCmdStatus u1, eCsrRoamResult u2)
1821{
1822 eHalStatus status = eHAL_STATUS_SUCCESS;
1823#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
1824 WLAN_VOS_DIAG_EVENT_DEF(connectionStatus, vos_event_wlan_status_payload_type);
1825#endif
1826 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07001827 if( CSR_IS_SESSION_VALID( pMac, sessionId) )
1828 {
1829 pSession = CSR_GET_SESSION( pMac, sessionId );
1830 }
1831 else
1832 {
1833 smsLog(pMac, LOGE, "Session ID:%d is not valid\n", sessionId);
1834 VOS_ASSERT(0);
1835 return eHAL_STATUS_FAILURE;
1836 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001837 if(eCSR_ROAM_ASSOCIATION_COMPLETION == u1 && pRoamInfo)
1838 {
1839 smsLog(pMac, LOGW, " Assoc complete result = %d statusCode = %d reasonCode = %d\n", u2, pRoamInfo->statusCode, pRoamInfo->reasonCode);
1840 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001841 if ( (pSession == NULL) ||
1842 (eANI_BOOLEAN_FALSE == pSession->sessionActive) )
1843 {
1844 smsLog(pMac, LOG1, "Session ID is not valid\n");
1845 return eHAL_STATUS_FAILURE;
1846 }
1847
1848 if(NULL != pSession->callback)
1849 {
1850 if( pRoamInfo )
1851 {
1852 pRoamInfo->sessionId = (tANI_U8)sessionId;
1853 }
1854
1855 /* avoid holding the global lock when making the roaming callback , original change came
1856 from a raised CR (CR304874). Since this callback is in HDD a potential deadlock
1857 is possible on other OS ports where the callback may need to take locks to protect
1858 HDD state
1859 UPDATE : revert this change but keep the comments here. Need to revisit as there are callbacks
1860 that may actually depend on the lock being held */
1861 // TODO: revisit: sme_ReleaseGlobalLock( &pMac->sme );
1862 status = pSession->callback(pSession->pContext, pRoamInfo, roamId, u1, u2);
1863 // TODO: revisit: sme_AcquireGlobalLock( &pMac->sme );
1864 }
1865 //EVENT_WLAN_STATUS: eCSR_ROAM_ASSOCIATION_COMPLETION,
1866 // eCSR_ROAM_LOSTLINK, eCSR_ROAM_DISASSOCIATED,
1867#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
1868 palZeroMemory(pMac->hHdd, &connectionStatus, sizeof(vos_event_wlan_status_payload_type));
1869 if((eCSR_ROAM_ASSOCIATION_COMPLETION == u1) && (eCSR_ROAM_RESULT_ASSOCIATED == u2))
1870 {
1871 connectionStatus.eventId = eCSR_WLAN_STATUS_CONNECT;
1872 connectionStatus.bssType = pRoamInfo->u.pConnectedProfile->BSSType;
1873 if(NULL != pRoamInfo->pBssDesc)
1874 {
1875 connectionStatus.rssi = pRoamInfo->pBssDesc->rssi * (-1);
1876 connectionStatus.channel = pRoamInfo->pBssDesc->channelId;
1877 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001878 connectionStatus.qosCapability = pRoamInfo->u.pConnectedProfile->qosConnection;
1879 connectionStatus.authType = (v_U8_t)diagAuthTypeFromCSRType(pRoamInfo->u.pConnectedProfile->AuthType);
1880 connectionStatus.encryptionType = (v_U8_t)diagEncTypeFromCSRType(pRoamInfo->u.pConnectedProfile->EncryptionType);
1881 palCopyMemory(pMac->hHdd, connectionStatus.ssid, pRoamInfo->u.pConnectedProfile->SSID.ssId, 6);
1882 connectionStatus.reason = eCSR_REASON_UNSPECIFIED;
1883 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1884 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001885 if((eCSR_ROAM_MIC_ERROR_IND == u1) || (eCSR_ROAM_RESULT_MIC_FAILURE == u2))
1886 {
1887 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1888 connectionStatus.reason = eCSR_REASON_MIC_ERROR;
1889 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1890 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001891 if(eCSR_ROAM_RESULT_FORCED == u2)
1892 {
1893 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1894 connectionStatus.reason = eCSR_REASON_USER_REQUESTED;
1895 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1896 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001897 if(eCSR_ROAM_RESULT_DISASSOC_IND == u2)
1898 {
1899 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1900 connectionStatus.reason = eCSR_REASON_DISASSOC;
1901 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1902 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001903 if(eCSR_ROAM_RESULT_DEAUTH_IND == u2)
1904 {
1905 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1906 connectionStatus.reason = eCSR_REASON_DEAUTH;
1907 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1908 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001909#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
1910
1911 return (status);
1912}
Jeff Johnson295189b2012-06-20 16:38:30 -07001913// Returns whether handoff is currently in progress or not
1914tANI_BOOLEAN csrRoamIsHandoffInProgress(tpAniSirGlobal pMac)
1915{
1916#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1917 return csrNeighborRoamIsHandoffInProgress(pMac);
1918#else
1919 return eANI_BOOLEAN_FALSE;
1920#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001921}
Jeff Johnson295189b2012-06-20 16:38:30 -07001922eHalStatus csrRoamIssueDisassociate( tpAniSirGlobal pMac, tANI_U32 sessionId,
1923 eCsrRoamSubState NewSubstate, tANI_BOOLEAN fMICFailure )
1924{
1925 eHalStatus status = eHAL_STATUS_SUCCESS;
1926 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1927 tANI_U16 reasonCode;
1928 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07001929
1930 if(!pSession)
1931 {
1932 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
1933 return eHAL_STATUS_FAILURE;
1934 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001935
1936 //Restore AC weight in case we change it
1937 if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
1938 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07001939 smsLog(pMac, LOG1, FL(" restore AC weights (%d-%d-%d-%d)"), pMac->roam.ucACWeights[0], pMac->roam.ucACWeights[1],
Jeff Johnson295189b2012-06-20 16:38:30 -07001940 pMac->roam.ucACWeights[2], pMac->roam.ucACWeights[3]);
1941 WLANTL_SetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
1942 }
1943
1944 if ( fMICFailure )
1945 {
1946 reasonCode = eSIR_MAC_MIC_FAILURE_REASON;
1947 }
1948 else if (NewSubstate == eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF)
1949 {
1950 reasonCode = eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON;
1951 } else
1952 {
1953 reasonCode = eSIR_MAC_UNSPEC_FAILURE_REASON;
1954 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001955#ifdef WLAN_FEATURE_VOWIFI_11R
1956 if ( (csrRoamIsHandoffInProgress(pMac)) &&
1957 (NewSubstate != eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF))
1958 {
1959 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
1960 palCopyMemory(pMac->hHdd, &bssId, pNeighborRoamInfo->csrNeighborRoamProfile.BSSIDs.bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07001961 } else
1962#endif
1963 if(pSession->pConnectBssDesc)
1964 {
1965 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
1966 }
Jeff Johnsone7245742012-09-05 17:12:55 -07001967
Jeff Johnson295189b2012-06-20 16:38:30 -07001968
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07001969 smsLog( pMac, LOG1, "CSR Attempting to Disassociate Bssid= %02x-%02x-%02x-%02x-%02x-%02x subState = %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07001970 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
1971 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ], NewSubstate );
Jeff Johnson295189b2012-06-20 16:38:30 -07001972 csrRoamSubstateChange( pMac, NewSubstate, sessionId);
1973
1974 status = csrSendMBDisassocReqMsg( pMac, sessionId, bssId, reasonCode );
1975
1976 if(HAL_STATUS_SUCCESS(status))
1977 {
1978 csrRoamLinkDown(pMac, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07001979#ifndef WLAN_MDM_CODE_REDUCTION_OPT
1980 //no need to tell QoS that we are disassociating, it will be taken care off in assoc req for HO
1981 if(eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF != NewSubstate)
1982 {
1983 //Tush-QoS: notify QoS module that disassoc happening
1984 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_REQ, NULL);
1985 }
1986#endif
1987 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001988 return (status);
1989}
Jeff Johnson295189b2012-06-20 16:38:30 -07001990#ifdef WLAN_SOFTAP_FEATURE
1991
Jeff Johnson295189b2012-06-20 16:38:30 -07001992/* ---------------------------------------------------------------------------
1993 \fn csrRoamIssueDisassociateStaCmd
1994 \brief csr function that HDD calls to disassociate a associated station
1995 \param sessionId - session Id for Soft AP
1996 \param pPeerMacAddr - MAC of associated station to delete
1997 \param reason - reason code, be one of the tSirMacReasonCodes
1998 \return eHalStatus
1999 ---------------------------------------------------------------------------*/
2000eHalStatus csrRoamIssueDisassociateStaCmd( tpAniSirGlobal pMac,
2001 tANI_U32 sessionId,
2002 tANI_U8 *pPeerMacAddr,
2003 tANI_U32 reason)
2004{
2005 eHalStatus status = eHAL_STATUS_SUCCESS;
2006 tSmeCmd *pCommand;
2007
2008 do
2009 {
2010 pCommand = csrGetCommandBuffer( pMac );
2011 if ( !pCommand )
2012 {
2013 smsLog( pMac, LOGE, FL(" fail to get command buffer") );
2014 status = eHAL_STATUS_RESOURCES;
2015 break;
2016 }
2017 pCommand->command = eSmeCommandRoam;
2018 pCommand->sessionId = (tANI_U8)sessionId;
2019 pCommand->u.roamCmd.roamReason = eCsrForcedDisassocSta;
2020 vos_mem_copy(pCommand->u.roamCmd.peerMac, pPeerMacAddr, 6);
2021 pCommand->u.roamCmd.reason = (tSirMacReasonCodes)reason;
2022 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_FALSE);
2023 if( !HAL_STATUS_SUCCESS( status ) )
2024 {
2025 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
2026 csrReleaseCommandRoam( pMac, pCommand );
2027 }
2028 }while(0);
2029
2030 return status;
2031}
2032
2033
Jeff Johnson295189b2012-06-20 16:38:30 -07002034/* ---------------------------------------------------------------------------
2035 \fn csrRoamIssueDeauthSta
2036 \brief csr function that HDD calls to delete a associated station
2037 \param sessionId - session Id for Soft AP
2038 \param pPeerMacAddr - MAC of associated station to delete
2039 \param reason - reason code, be one of the tSirMacReasonCodes
2040 \return eHalStatus
2041 ---------------------------------------------------------------------------*/
2042eHalStatus csrRoamIssueDeauthStaCmd( tpAniSirGlobal pMac,
2043 tANI_U32 sessionId,
2044 tANI_U8 *pPeerMacAddr,
2045 tANI_U32 reason)
2046{
2047 eHalStatus status = eHAL_STATUS_SUCCESS;
2048 tSmeCmd *pCommand;
2049
2050 do
2051 {
2052 pCommand = csrGetCommandBuffer( pMac );
2053 if ( !pCommand )
2054 {
2055 smsLog( pMac, LOGE, FL(" fail to get command buffer") );
2056 status = eHAL_STATUS_RESOURCES;
2057 break;
2058 }
2059 pCommand->command = eSmeCommandRoam;
2060 pCommand->sessionId = (tANI_U8)sessionId;
2061 pCommand->u.roamCmd.roamReason = eCsrForcedDeauthSta;
2062 vos_mem_copy(pCommand->u.roamCmd.peerMac, pPeerMacAddr, 6);
2063 pCommand->u.roamCmd.reason = (tSirMacReasonCodes)reason;
2064 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_FALSE);
2065 if( !HAL_STATUS_SUCCESS( status ) )
2066 {
2067 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
2068 csrReleaseCommandRoam( pMac, pCommand );
2069 }
2070 }while(0);
2071
2072 return status;
2073}
Jeff Johnson295189b2012-06-20 16:38:30 -07002074eHalStatus
2075csrRoamIssueTkipCounterMeasures( tpAniSirGlobal pMac, tANI_U32 sessionId,
2076 tANI_BOOLEAN bEnable )
2077{
2078 eHalStatus status = eHAL_STATUS_FAILURE;
2079 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2080 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07002081 if (!pSession)
2082 {
2083 smsLog( pMac, LOGE, "csrRoamIssueTkipCounterMeasures:CSR Session not found\n");
2084 return (status);
2085 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002086 if (pSession->pConnectBssDesc)
2087 {
2088 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
2089 }
2090 else
2091 {
2092 smsLog( pMac, LOGE, "csrRoamIssueTkipCounterMeasures:Connected BSS Description in CSR Session not found\n");
2093 return (status);
2094 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002095 smsLog( pMac, LOG2, "CSR issuing tkip counter measures for Bssid = %02x-%02x-%02x-%02x-%02x-%02x, Enable = %d\n",
2096 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2097 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] , bEnable);
Jeff Johnson295189b2012-06-20 16:38:30 -07002098 status = csrSendMBTkipCounterMeasuresReqMsg( pMac, sessionId, bEnable, bssId );
2099 return (status);
2100}
Jeff Johnson295189b2012-06-20 16:38:30 -07002101eHalStatus
2102csrRoamGetAssociatedStas( tpAniSirGlobal pMac, tANI_U32 sessionId,
2103 VOS_MODULE_ID modId, void *pUsrContext,
2104 void *pfnSapEventCallback, v_U8_t *pAssocStasBuf )
2105{
2106 eHalStatus status = eHAL_STATUS_SUCCESS;
2107 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2108 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07002109 if (!pSession)
2110 {
2111 smsLog( pMac, LOGE, "csrRoamGetAssociatedStas:CSR Session not found\n");
2112 return (status);
2113 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002114 if(pSession->pConnectBssDesc)
2115 {
2116 palCopyMemory( pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid) );
2117 }
2118 else
2119 {
2120 smsLog( pMac, LOGE, "csrRoamGetAssociatedStas:Connected BSS Description in CSR Session not found\n");
2121 return (status);
2122 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002123 smsLog( pMac, LOG2, "CSR getting associated stations for Bssid = %02x-%02x-%02x-%02x-%02x-%02x\n",
2124 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2125 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -07002126 status = csrSendMBGetAssociatedStasReqMsg( pMac, sessionId, modId, bssId, pUsrContext, pfnSapEventCallback, pAssocStasBuf );
2127 return (status);
2128}
Jeff Johnson295189b2012-06-20 16:38:30 -07002129eHalStatus
2130csrRoamGetWpsSessionOverlap( tpAniSirGlobal pMac, tANI_U32 sessionId,
2131 void *pUsrContext, void *pfnSapEventCallback, v_MACADDR_t pRemoveMac )
2132{
2133 eHalStatus status = eHAL_STATUS_SUCCESS;
2134 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2135 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
2136
2137 if (!pSession)
2138 {
2139 smsLog( pMac, LOGE, "csrRoamGetWpsSessionOverlap:CSR Session not found\n");
2140 return (status);
2141 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002142 if(pSession->pConnectBssDesc)
2143 {
2144 palCopyMemory( pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid) );
2145 }
2146 else
2147 {
2148 smsLog( pMac, LOGE, "csrRoamGetWpsSessionOverlap:Connected BSS Description in CSR Session not found\n");
2149 return (status);
2150 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002151 smsLog( pMac, LOG2, "CSR getting WPS Session Overlap for Bssid = %02x-%02x-%02x-%02x-%02x-%02x\n",
2152 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2153 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
2154
2155 status = csrSendMBGetWPSPBCSessions( pMac, sessionId, bssId, pUsrContext, pfnSapEventCallback, pRemoveMac);
2156
2157 return (status);
2158}
Jeff Johnson295189b2012-06-20 16:38:30 -07002159#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002160eHalStatus csrRoamIssueDeauth( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamSubState NewSubstate )
2161{
2162 eHalStatus status = eHAL_STATUS_SUCCESS;
2163 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2164 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07002165
2166 if (!pSession)
2167 {
2168 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
2169 return eHAL_STATUS_FAILURE;
2170 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002171
2172 if(pSession->pConnectBssDesc)
2173 {
2174 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
2175 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002176 smsLog( pMac, LOG2, "CSR Attempting to Deauth Bssid= %02x-%02x-%02x-%02x-%02x-%02x\n",
2177 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2178 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -07002179 csrRoamSubstateChange( pMac, NewSubstate, sessionId);
2180
2181 status = csrSendMBDeauthReqMsg( pMac, sessionId, bssId, eSIR_MAC_DISASSOC_LEAVING_BSS_REASON );
2182
2183 return (status);
2184}
2185
Jeff Johnson295189b2012-06-20 16:38:30 -07002186eHalStatus csrRoamSaveConnectedBssDesc( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDesc )
2187{
2188 eHalStatus status = eHAL_STATUS_SUCCESS;
2189 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
2190 tANI_U32 size;
Jeff Johnson32d95a32012-09-10 13:15:23 -07002191
2192 if(!pSession)
2193 {
2194 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
2195 return eHAL_STATUS_FAILURE;
2196 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002197
2198 // If no BSS description was found in this connection (happens with start IBSS), then
2199 // nix the BSS description that we keep around for the connected BSS) and get out...
2200 if(NULL == pBssDesc)
2201 {
2202 csrFreeConnectBssDesc(pMac, sessionId);
2203 }
2204 else
2205 {
2206 size = pBssDesc->length + sizeof( pBssDesc->length );
2207 if(NULL != pSession->pConnectBssDesc)
2208 {
2209 if(((pSession->pConnectBssDesc->length) + sizeof(pSession->pConnectBssDesc->length)) < size)
2210 {
2211 //not enough room for the new BSS, pMac->roam.pConnectBssDesc is freed inside
2212 csrFreeConnectBssDesc(pMac, sessionId);
2213 }
2214 }
2215 if(NULL == pSession->pConnectBssDesc)
2216 {
2217 status = palAllocateMemory( pMac->hHdd, (void **)&pSession->pConnectBssDesc, size);
2218 }
2219 if ( HAL_STATUS_SUCCESS(status) && pSession->pConnectBssDesc )
2220 {
2221 palCopyMemory( pMac->hHdd, pSession->pConnectBssDesc, pBssDesc, size );
2222 }
2223 }
2224
2225 return (status);
2226}
2227
Jeff Johnson295189b2012-06-20 16:38:30 -07002228eHalStatus csrRoamPrepareBssConfig(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
2229 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig,
2230 tDot11fBeaconIEs *pIes)
2231{
2232 eHalStatus status = eHAL_STATUS_SUCCESS;
2233 eCsrCfgDot11Mode cfgDot11Mode;
Jeff Johnson295189b2012-06-20 16:38:30 -07002234#if defined(VOSS_ENABLED)
2235 VOS_ASSERT( pIes != NULL );
2236#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07002237
Jeff Johnson295189b2012-06-20 16:38:30 -07002238 do
2239 {
2240 palCopyMemory(pMac->hHdd, &pBssConfig->BssCap, &pBssDesc->capabilityInfo, sizeof(tSirMacCapabilityInfo));
2241 //get qos
2242 pBssConfig->qosType = csrGetQoSFromBssDesc(pMac, pBssDesc, pIes);
2243 //get SSID
2244 if(pIes->SSID.present)
2245 {
2246 palCopyMemory(pMac->hHdd, &pBssConfig->SSID.ssId, pIes->SSID.ssid, pIes->SSID.num_ssid);
2247 pBssConfig->SSID.length = pIes->SSID.num_ssid;
2248 }
2249 else
2250 pBssConfig->SSID.length = 0;
2251 if(csrIsNULLSSID(pBssConfig->SSID.ssId, pBssConfig->SSID.length))
2252 {
2253 smsLog(pMac, LOGW, " BSS desc SSID is a wildcard\n");
2254 //Return failed if profile doesn't have an SSID either.
2255 if(pProfile->SSIDs.numOfSSIDs == 0)
2256 {
2257 smsLog(pMac, LOGW, " Both BSS desc and profile doesn't have SSID\n");
2258 status = eHAL_STATUS_FAILURE;
2259 break;
2260 }
2261 }
2262 if(CSR_IS_CHANNEL_5GHZ(pBssDesc->channelId))
2263 {
2264 pBssConfig->eBand = eCSR_BAND_5G;
2265 }
2266 else
2267 {
2268 pBssConfig->eBand = eCSR_BAND_24;
2269 }
2270 //phymode
2271 if(csrIsPhyModeMatch( pMac, pProfile->phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes ))
2272 {
2273 pBssConfig->uCfgDot11Mode = cfgDot11Mode;
2274 }
2275 else
2276 {
2277 smsLog(pMac, LOGW, " Can not find match phy mode\n");
2278 //force it
2279 if(eCSR_BAND_24 == pBssConfig->eBand)
2280 {
2281 pBssConfig->uCfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2282 }
2283 else
2284 {
2285 pBssConfig->uCfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2286 }
2287 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002288 //Qos
2289 if ((pBssConfig->uCfgDot11Mode != eCSR_CFG_DOT11_MODE_11N) &&
2290 (pMac->roam.configParam.WMMSupportMode == eCsrRoamWmmNoQos))
2291 {
2292 //Joining BSS is not 11n capable and WMM is disabled on client.
2293 //Disable QoS and WMM
2294 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_DCF;
2295 }
2296
2297 //auth type
2298 switch( pProfile->negotiatedAuthType )
2299 {
2300 default:
2301 case eCSR_AUTH_TYPE_WPA:
2302 case eCSR_AUTH_TYPE_WPA_PSK:
2303 case eCSR_AUTH_TYPE_WPA_NONE:
2304 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
2305 pBssConfig->authType = eSIR_OPEN_SYSTEM;
2306 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002307 case eCSR_AUTH_TYPE_SHARED_KEY:
2308 pBssConfig->authType = eSIR_SHARED_KEY;
2309 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002310 case eCSR_AUTH_TYPE_AUTOSWITCH:
2311 pBssConfig->authType = eSIR_AUTO_SWITCH;
2312 break;
2313 }
2314 //short slot time
2315 if( eCSR_CFG_DOT11_MODE_11B != cfgDot11Mode )
2316 {
2317 pBssConfig->uShortSlotTime = pMac->roam.configParam.shortSlotTime;
2318 }
2319 else
2320 {
2321 pBssConfig->uShortSlotTime = 0;
2322 }
2323 if(pBssConfig->BssCap.ibss)
2324 {
2325 //We don't support 11h on IBSS
2326 pBssConfig->f11hSupport = eANI_BOOLEAN_FALSE;
2327 }
2328 else
2329 {
2330 pBssConfig->f11hSupport = pMac->roam.configParam.Is11hSupportEnabled;
2331 }
2332 //power constraint
2333 pBssConfig->uPowerLimit = csrGet11hPowerConstraint(pMac, &pIes->PowerConstraints);
2334 //heartbeat
2335 if ( CSR_IS_11A_BSS( pBssDesc ) )
2336 {
2337 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh50;
2338 }
2339 else
2340 {
2341 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh24;
2342 }
2343 //Join timeout
2344 // if we find a BeaconInterval in the BssDescription, then set the Join Timeout to
Jeff Johnsone7245742012-09-05 17:12:55 -07002345 // be 10 x the BeaconInterval.
Jeff Johnson295189b2012-06-20 16:38:30 -07002346 if ( pBssDesc->beaconInterval )
2347 {
2348 //Make sure it is bigger than the minimal
Jeff Johnsone7245742012-09-05 17:12:55 -07002349 pBssConfig->uJoinTimeOut = CSR_ROAM_MAX(10 * pBssDesc->beaconInterval, CSR_JOIN_FAILURE_TIMEOUT_MIN);
Jeff Johnson295189b2012-06-20 16:38:30 -07002350 }
2351 else
2352 {
2353 pBssConfig->uJoinTimeOut = CSR_JOIN_FAILURE_TIMEOUT_DEFAULT;
2354 }
2355 //validate CB
2356 pBssConfig->cbMode = csrGetCBModeFromIes(pMac, pBssDesc->channelId, pIes);
2357 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002358 return (status);
2359}
2360
Jeff Johnson295189b2012-06-20 16:38:30 -07002361static eHalStatus csrRoamPrepareBssConfigFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
2362 tBssConfigParam *pBssConfig, tSirBssDescription *pBssDesc)
2363{
2364 eHalStatus status = eHAL_STATUS_SUCCESS;
2365 tANI_U8 operationChannel = 0;
2366 tANI_U8 qAPisEnabled = FALSE;
2367 //SSID
2368 pBssConfig->SSID.length = 0;
2369 if(pProfile->SSIDs.numOfSSIDs)
2370 {
2371 //only use the first one
2372 palCopyMemory(pMac->hHdd, &pBssConfig->SSID, &pProfile->SSIDs.SSIDList[0].SSID, sizeof(tSirMacSSid));
2373 }
2374 else
2375 {
2376 //SSID must present
2377 return eHAL_STATUS_FAILURE;
2378 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002379 //Settomg up the capabilities
2380 if( csrIsBssTypeIBSS(pProfile->BSSType) )
2381 {
2382 pBssConfig->BssCap.ibss = 1;
2383 }
2384 else
2385 {
2386 pBssConfig->BssCap.ess = 1;
2387 }
2388 if( eCSR_ENCRYPT_TYPE_NONE != pProfile->EncryptionType.encryptionType[0] )
2389 {
2390 pBssConfig->BssCap.privacy = 1;
2391 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002392 pBssConfig->eBand = pMac->roam.configParam.eBand;
2393 //phymode
2394 if(pProfile->ChannelInfo.ChannelList)
2395 {
2396 operationChannel = pProfile->ChannelInfo.ChannelList[0];
2397 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002398#ifdef WLAN_SOFTAP_FEATURE
2399 pBssConfig->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, operationChannel,
2400 &pBssConfig->eBand);
2401#else
Jeff Johnson295189b2012-06-20 16:38:30 -07002402 pBssConfig->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel,
2403 &pBssConfig->eBand);
2404#endif
2405 //QOS
2406 //Is this correct to always set to this //***
Jeff Johnson295189b2012-06-20 16:38:30 -07002407 if ( pBssConfig->BssCap.ess == 1 )
2408 {
2409#ifdef WLAN_SOFTAP_FEATURE
2410 /*For Softap case enable WMM*/
2411 if(CSR_IS_INFRA_AP(pProfile) && (eCsrRoamWmmNoQos != pMac->roam.configParam.WMMSupportMode )){
2412 qAPisEnabled = TRUE;
2413 }
2414 else
2415#endif
2416 if (csrRoamGetQosInfoFromBss(pMac, pBssDesc) == eHAL_STATUS_SUCCESS) {
2417 qAPisEnabled = TRUE;
2418 } else {
2419 qAPisEnabled = FALSE;
2420 }
2421 } else {
2422 qAPisEnabled = TRUE;
2423 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002424 if (( eCsrRoamWmmNoQos != pMac->roam.configParam.WMMSupportMode && qAPisEnabled) ||
2425 (( eCSR_CFG_DOT11_MODE_11N == pBssConfig->uCfgDot11Mode && qAPisEnabled) ||
2426 ( eCSR_CFG_DOT11_MODE_TAURUS == pBssConfig->uCfgDot11Mode ) ) //For 11n, need QoS
2427 )
2428 {
2429 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP;
2430 } else {
2431 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_DCF;
2432 }
2433
2434 //auth type
2435 switch( pProfile->AuthType.authType[0] ) //Take the prefered Auth type.
2436 {
2437 default:
2438 case eCSR_AUTH_TYPE_WPA:
2439 case eCSR_AUTH_TYPE_WPA_PSK:
2440 case eCSR_AUTH_TYPE_WPA_NONE:
2441 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
2442 pBssConfig->authType = eSIR_OPEN_SYSTEM;
2443 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002444 case eCSR_AUTH_TYPE_SHARED_KEY:
2445 pBssConfig->authType = eSIR_SHARED_KEY;
2446 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002447 case eCSR_AUTH_TYPE_AUTOSWITCH:
2448 pBssConfig->authType = eSIR_AUTO_SWITCH;
2449 break;
2450 }
2451 //short slot time
2452 if( WNI_CFG_PHY_MODE_11B != pBssConfig->uCfgDot11Mode )
2453 {
2454 pBssConfig->uShortSlotTime = pMac->roam.configParam.shortSlotTime;
2455 }
2456 else
2457 {
2458 pBssConfig->uShortSlotTime = 0;
2459 }
2460 //power constraint. We don't support 11h on IBSS
2461 pBssConfig->f11hSupport = eANI_BOOLEAN_FALSE;
2462 pBssConfig->uPowerLimit = 0;
2463 //heartbeat
2464 if ( eCSR_BAND_5G == pBssConfig->eBand )
2465 {
2466 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh50;
2467 }
2468 else
2469 {
2470 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh24;
2471 }
2472 //Join timeout
2473 pBssConfig->uJoinTimeOut = CSR_JOIN_FAILURE_TIMEOUT_DEFAULT;
Jeff Johnsone7245742012-09-05 17:12:55 -07002474
Jeff Johnson295189b2012-06-20 16:38:30 -07002475 return (status);
2476}
Jeff Johnson295189b2012-06-20 16:38:30 -07002477static eHalStatus csrRoamGetQosInfoFromBss(tpAniSirGlobal pMac, tSirBssDescription *pBssDesc)
2478{
2479 eHalStatus status = eHAL_STATUS_FAILURE;
2480 tDot11fBeaconIEs *pIes = NULL;
2481
2482 do
2483 {
2484 if(!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIes)))
2485 {
2486 //err msg
2487 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
2488 "csrRoamGetQosInfoFromBss() failed\n");
Jeff Johnson295189b2012-06-20 16:38:30 -07002489 break;
2490 }
2491 //check if the AP is QAP & it supports APSD
2492 if( CSR_IS_QOS_BSS(pIes) )
2493 {
2494 return eHAL_STATUS_SUCCESS;
2495 }
2496 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002497 return status;
2498}
2499
Jeff Johnson295189b2012-06-20 16:38:30 -07002500void csrSetCfgPrivacy( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, tANI_BOOLEAN fPrivacy )
2501{
Jeff Johnson295189b2012-06-20 16:38:30 -07002502 // !! Note: the only difference between this function and the csrSetCfgPrivacyFromProfile() is the
2503 // setting of the privacy CFG based on the advertised privacy setting from the AP for WPA associations.
2504 // See !!Note: below in this function...
2505 tANI_U32 PrivacyEnabled = 0;
2506 tANI_U32 RsnEnabled = 0;
2507 tANI_U32 WepDefaultKeyId = 0;
2508 tANI_U32 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_5; /* default 40 bits */
2509 tANI_U32 Key0Length = 0;
2510 tANI_U32 Key1Length = 0;
2511 tANI_U32 Key2Length = 0;
2512 tANI_U32 Key3Length = 0;
2513
2514 // Reserve for the biggest key
2515 tANI_U8 Key0[ WNI_CFG_WEP_DEFAULT_KEY_1_LEN ];
2516 tANI_U8 Key1[ WNI_CFG_WEP_DEFAULT_KEY_2_LEN ];
2517 tANI_U8 Key2[ WNI_CFG_WEP_DEFAULT_KEY_3_LEN ];
2518 tANI_U8 Key3[ WNI_CFG_WEP_DEFAULT_KEY_4_LEN ];
2519
2520 switch ( pProfile->negotiatedUCEncryptionType )
2521 {
2522 case eCSR_ENCRYPT_TYPE_NONE:
2523
2524 // for NO encryption, turn off Privacy and Rsn.
2525 PrivacyEnabled = 0;
2526 RsnEnabled = 0;
2527
2528 // WEP key length and Wep Default Key ID don't matter in this case....
2529
2530 // clear out the WEP keys that may be hanging around.
2531 Key0Length = 0;
2532 Key1Length = 0;
2533 Key2Length = 0;
2534 Key3Length = 0;
2535
2536 break;
2537
2538 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
2539
2540 // Privacy is ON. NO RSN for Wep40 static key.
2541 PrivacyEnabled = 1;
2542 RsnEnabled = 0;
2543
2544 // Set the Wep default key ID.
2545 WepDefaultKeyId = pProfile->Keys.defaultIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07002546 // Wep key size if 5 bytes (40 bits).
2547 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_5;
2548
2549 // set encryption keys in the CFG database or clear those that are not present in this profile.
2550 if ( pProfile->Keys.KeyLength[0] )
2551 {
2552 palCopyMemory( pMac->hHdd, Key0, pProfile->Keys.KeyMaterial[0], WNI_CFG_WEP_KEY_LENGTH_5 );
2553 Key0Length = WNI_CFG_WEP_KEY_LENGTH_5;
2554 }
2555 else
2556 {
2557 Key0Length = 0;
2558 }
2559
2560 if ( pProfile->Keys.KeyLength[1] )
2561 {
2562 palCopyMemory( pMac->hHdd, Key1, pProfile->Keys.KeyMaterial[1], WNI_CFG_WEP_KEY_LENGTH_5 );
2563 Key1Length = WNI_CFG_WEP_KEY_LENGTH_5;
2564 }
2565 else
2566 {
2567 Key1Length = 0;
2568 }
2569
2570 if ( pProfile->Keys.KeyLength[2] )
2571 {
2572 palCopyMemory( pMac->hHdd, Key2, pProfile->Keys.KeyMaterial[2], WNI_CFG_WEP_KEY_LENGTH_5 );
2573 Key2Length = WNI_CFG_WEP_KEY_LENGTH_5;
2574 }
2575 else
2576 {
2577 Key2Length = 0;
2578 }
2579
2580 if ( pProfile->Keys.KeyLength[3] )
2581 {
2582 palCopyMemory( pMac->hHdd, Key3, pProfile->Keys.KeyMaterial[3], WNI_CFG_WEP_KEY_LENGTH_5 );
2583 Key3Length = WNI_CFG_WEP_KEY_LENGTH_5;
2584 }
2585 else
2586 {
2587 Key3Length = 0;
2588 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002589 break;
2590
2591 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
2592
2593 // Privacy is ON. NO RSN for Wep40 static key.
2594 PrivacyEnabled = 1;
2595 RsnEnabled = 0;
2596
2597 // Set the Wep default key ID.
2598 WepDefaultKeyId = pProfile->Keys.defaultIndex;
2599
2600 // Wep key size if 13 bytes (104 bits).
2601 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_13;
2602
2603 // set encryption keys in the CFG database or clear those that are not present in this profile.
2604 if ( pProfile->Keys.KeyLength[0] )
2605 {
2606 palCopyMemory( pMac->hHdd, Key0, pProfile->Keys.KeyMaterial[ 0 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2607 Key0Length = WNI_CFG_WEP_KEY_LENGTH_13;
2608 }
2609 else
2610 {
2611 Key0Length = 0;
2612 }
2613
2614 if ( pProfile->Keys.KeyLength[1] )
2615 {
2616 palCopyMemory( pMac->hHdd, Key1, pProfile->Keys.KeyMaterial[ 1 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2617 Key1Length = WNI_CFG_WEP_KEY_LENGTH_13;
2618 }
2619 else
2620 {
2621 Key1Length = 0;
2622 }
2623
2624 if ( pProfile->Keys.KeyLength[2] )
2625 {
2626 palCopyMemory( pMac->hHdd, Key2, pProfile->Keys.KeyMaterial[ 2 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2627 Key2Length = WNI_CFG_WEP_KEY_LENGTH_13;
2628 }
2629 else
2630 {
2631 Key2Length = 0;
2632 }
2633
2634 if ( pProfile->Keys.KeyLength[3] )
2635 {
2636 palCopyMemory( pMac->hHdd, Key3, pProfile->Keys.KeyMaterial[ 3 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2637 Key3Length = WNI_CFG_WEP_KEY_LENGTH_13;
2638 }
2639 else
2640 {
2641 Key3Length = 0;
2642 }
2643
2644 break;
2645
2646 case eCSR_ENCRYPT_TYPE_WEP40:
2647 case eCSR_ENCRYPT_TYPE_WEP104:
2648 case eCSR_ENCRYPT_TYPE_TKIP:
2649 case eCSR_ENCRYPT_TYPE_AES:
2650#ifdef FEATURE_WLAN_WAPI
2651 case eCSR_ENCRYPT_TYPE_WPI:
2652#endif /* FEATURE_WLAN_WAPI */
2653 // !! Note: this is the only difference between this function and the csrSetCfgPrivacyFromProfile()
2654 // (setting of the privacy CFG based on the advertised privacy setting from the AP for WPA/WAPI associations ).
2655 PrivacyEnabled = (0 != fPrivacy);
2656
2657 // turn on RSN enabled for WPA associations
2658 RsnEnabled = 1;
2659
2660 // WEP key length and Wep Default Key ID don't matter in this case....
2661
2662 // clear out the static WEP keys that may be hanging around.
2663 Key0Length = 0;
2664 Key1Length = 0;
2665 Key2Length = 0;
2666 Key3Length = 0;
2667
2668 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002669 default:
2670 PrivacyEnabled = 0;
2671 RsnEnabled = 0;
2672 break;
2673 }
2674
2675 ccmCfgSetInt(pMac, WNI_CFG_PRIVACY_ENABLED, PrivacyEnabled, NULL, eANI_BOOLEAN_FALSE);
2676 ccmCfgSetInt(pMac, WNI_CFG_RSN_ENABLED, RsnEnabled, NULL, eANI_BOOLEAN_FALSE);
2677 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_1, Key0, Key0Length, NULL, eANI_BOOLEAN_FALSE);
2678 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_2, Key1, Key1Length, NULL, eANI_BOOLEAN_FALSE);
2679 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_3, Key2, Key2Length, NULL, eANI_BOOLEAN_FALSE);
2680 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_4, Key3, Key3Length, NULL, eANI_BOOLEAN_FALSE);
2681 ccmCfgSetInt(pMac, WNI_CFG_WEP_KEY_LENGTH, WepKeyLength, NULL, eANI_BOOLEAN_FALSE);
2682 ccmCfgSetInt(pMac, WNI_CFG_WEP_DEFAULT_KEYID, WepDefaultKeyId, NULL, eANI_BOOLEAN_FALSE);
2683}
2684
Jeff Johnson295189b2012-06-20 16:38:30 -07002685static void csrSetCfgSsid( tpAniSirGlobal pMac, tSirMacSSid *pSSID )
2686{
2687 tANI_U32 len = 0;
2688 if(pSSID->length <= WNI_CFG_SSID_LEN)
2689 {
2690 len = pSSID->length;
2691 }
2692 ccmCfgSetStr(pMac, WNI_CFG_SSID, (tANI_U8 *)pSSID->ssId, len, NULL, eANI_BOOLEAN_FALSE);
2693}
2694
Jeff Johnson295189b2012-06-20 16:38:30 -07002695eHalStatus csrSetQosToCfg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrMediaAccessType qosType )
2696{
2697 eHalStatus status = eHAL_STATUS_SUCCESS;
2698 tANI_U32 QoSEnabled;
2699 tANI_U32 WmeEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07002700 // set the CFG enable/disable variables based on the qosType being configured...
2701 switch( qosType )
2702 {
Jeff Johnson295189b2012-06-20 16:38:30 -07002703 case eCSR_MEDIUM_ACCESS_WMM_eDCF_802dot1p:
2704 QoSEnabled = FALSE;
2705 WmeEnabled = TRUE;
2706 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002707 case eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP:
2708 QoSEnabled = FALSE;
2709 WmeEnabled = TRUE;
2710 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002711 case eCSR_MEDIUM_ACCESS_WMM_eDCF_NoClassify:
2712 QoSEnabled = FALSE;
2713 WmeEnabled = TRUE;
2714 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002715 case eCSR_MEDIUM_ACCESS_11e_eDCF:
2716 QoSEnabled = TRUE;
2717 WmeEnabled = FALSE;
2718 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002719 case eCSR_MEDIUM_ACCESS_11e_HCF:
2720 QoSEnabled = TRUE;
2721 WmeEnabled = FALSE;
2722 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002723 default:
2724 case eCSR_MEDIUM_ACCESS_DCF:
2725 QoSEnabled = FALSE;
2726 WmeEnabled = FALSE;
2727 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002728 }
2729 //save the WMM setting for later use
2730 pMac->roam.roamSession[sessionId].fWMMConnection = (tANI_BOOLEAN)WmeEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07002731 status = ccmCfgSetInt(pMac, WNI_CFG_QOS_ENABLED, QoSEnabled, NULL, eANI_BOOLEAN_FALSE);
2732 status = ccmCfgSetInt(pMac, WNI_CFG_WME_ENABLED, WmeEnabled, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002733 return (status);
2734}
Jeff Johnson295189b2012-06-20 16:38:30 -07002735static eHalStatus csrGetRateSet( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, eCsrPhyMode phyMode, tSirBssDescription *pBssDesc,
2736 tDot11fBeaconIEs *pIes, tSirMacRateSet *pOpRateSet, tSirMacRateSet *pExRateSet)
2737{
2738 eHalStatus status = eHAL_STATUS_FAILURE;
2739 int i;
2740 eCsrCfgDot11Mode cfgDot11Mode;
2741 tANI_U8 *pDstRate;
Jeff Johnson295189b2012-06-20 16:38:30 -07002742 palZeroMemory(pMac->hHdd, pOpRateSet, sizeof(tSirMacRateSet));
2743 palZeroMemory(pMac->hHdd, pExRateSet, sizeof(tSirMacRateSet));
Jeff Johnson295189b2012-06-20 16:38:30 -07002744#if defined(VOSS_ENABLED)
2745 VOS_ASSERT( pIes != NULL );
2746#endif
2747
2748 if( NULL != pIes )
2749 {
2750 csrIsPhyModeMatch( pMac, phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07002751 // Originally, we thought that for 11a networks, the 11a rates are always
2752 // in the Operational Rate set & for 11b and 11g networks, the 11b rates
2753 // appear in the Operational Rate set. Consequently, in either case, we
2754 // would blindly put the rates we support into our Operational Rate set
2755 // (including the basic rates, which we have already verified are
2756 // supported earlier in the roaming decision).
Jeff Johnson295189b2012-06-20 16:38:30 -07002757 // However, it turns out that this is not always the case. Some AP's
2758 // (e.g. D-Link DI-784) ram 11g rates into the Operational Rate set,
2759 // too. Now, we're a little more careful:
2760 pDstRate = pOpRateSet->rate;
2761 if(pIes->SuppRates.present)
2762 {
2763 for ( i = 0; i < pIes->SuppRates.num_rates; i++ )
2764 {
2765 if ( csrRatesIsDot11RateSupported( pMac, pIes->SuppRates.rates[ i ] ) )
2766 {
2767 *pDstRate++ = pIes->SuppRates.rates[ i ];
2768 pOpRateSet->numRates++;;
2769 }
2770 }
2771 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002772 if ( eCSR_CFG_DOT11_MODE_11G == cfgDot11Mode ||
2773 eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode ||
2774 eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode ||
2775 eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
2776 {
2777 // If there are Extended Rates in the beacon, we will reflect those
2778 // extended rates that we support in out Extended Operational Rate
2779 // set:
2780 pDstRate = pExRateSet->rate;
2781 if(pIes->ExtSuppRates.present)
2782 {
2783 for ( i = 0; i < pIes->ExtSuppRates.num_rates; i++ )
2784 {
2785 if ( csrRatesIsDot11RateSupported( pMac, pIes->ExtSuppRates.rates[ i ] ) )
2786 {
2787 *pDstRate++ = pIes->ExtSuppRates.rates[ i ];
2788 pExRateSet->numRates++;
2789 }
2790 }
2791 }
2792 }
2793 }//Parsing BSSDesc
2794 else
2795 {
2796 smsLog(pMac, LOGE, FL("failed to parse BssDesc\n"));
2797 }
2798 if (pOpRateSet->numRates > 0 || pExRateSet->numRates > 0) status = eHAL_STATUS_SUCCESS;
2799 return status;
2800}
2801
2802static void csrSetCfgRateSet( tpAniSirGlobal pMac, eCsrPhyMode phyMode, tCsrRoamProfile *pProfile,
2803 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
2804{
2805 int i;
2806 tANI_U8 *pDstRate;
2807 eCsrCfgDot11Mode cfgDot11Mode;
2808 tANI_U8 OperationalRates[ CSR_DOT11_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2809 tANI_U32 OperationalRatesLength = 0;
2810 tANI_U8 ExtendedOperationalRates[ CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2811 tANI_U32 ExtendedOperationalRatesLength = 0;
2812 tANI_U8 ProprietaryOperationalRates[ 4 ]; // leave enough room for the max number of proprietary rates
2813 tANI_U32 ProprietaryOperationalRatesLength = 0;
2814 tANI_U32 PropRatesEnable = 0;
2815 tANI_U8 MCSRateIdxSet[ SIZE_OF_SUPPORTED_MCS_SET ];
2816 tANI_U32 MCSRateLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002817#if defined(VOSS_ENABLED)
2818 VOS_ASSERT( pIes != NULL );
2819#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002820 if( NULL != pIes )
2821 {
2822 csrIsPhyModeMatch( pMac, phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07002823 // Originally, we thought that for 11a networks, the 11a rates are always
2824 // in the Operational Rate set & for 11b and 11g networks, the 11b rates
2825 // appear in the Operational Rate set. Consequently, in either case, we
2826 // would blindly put the rates we support into our Operational Rate set
2827 // (including the basic rates, which we have already verified are
2828 // supported earlier in the roaming decision).
Jeff Johnson295189b2012-06-20 16:38:30 -07002829 // However, it turns out that this is not always the case. Some AP's
2830 // (e.g. D-Link DI-784) ram 11g rates into the Operational Rate set,
2831 // too. Now, we're a little more careful:
2832 pDstRate = OperationalRates;
2833 if(pIes->SuppRates.present)
2834 {
2835 for ( i = 0; i < pIes->SuppRates.num_rates; i++ )
2836 {
2837 if ( csrRatesIsDot11RateSupported( pMac, pIes->SuppRates.rates[ i ] ) &&
2838 ( OperationalRatesLength < CSR_DOT11_SUPPORTED_RATES_MAX ))
2839 {
2840 *pDstRate++ = pIes->SuppRates.rates[ i ];
2841 OperationalRatesLength++;
2842 }
2843 }
2844 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002845 if ( eCSR_CFG_DOT11_MODE_11G == cfgDot11Mode ||
2846 eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode ||
2847 eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode ||
2848 eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
2849 {
2850 // If there are Extended Rates in the beacon, we will reflect those
2851 // extended rates that we support in out Extended Operational Rate
2852 // set:
2853 pDstRate = ExtendedOperationalRates;
2854 if(pIes->ExtSuppRates.present)
2855 {
2856 for ( i = 0; i < pIes->ExtSuppRates.num_rates; i++ )
2857 {
2858 if ( csrRatesIsDot11RateSupported( pMac, pIes->ExtSuppRates.rates[ i ] ) &&
2859 ( ExtendedOperationalRatesLength < CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ))
2860 {
2861 *pDstRate++ = pIes->ExtSuppRates.rates[ i ];
2862 ExtendedOperationalRatesLength++;
2863 }
2864 }
2865 }
2866 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002867 // Enable proprietary MAC features if peer node is Airgo node and STA
2868 // user wants to use them
2869 if( pIes->Airgo.present && pMac->roam.configParam.ProprietaryRatesEnabled )
2870 {
2871 PropRatesEnable = 1;
2872 }
2873 else
2874 {
2875 PropRatesEnable = 0;
2876 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002877 // For ANI network companions, we need to populate the proprietary rate
2878 // set with any proprietary rates we found in the beacon, only if user
2879 // allows them...
2880 if ( PropRatesEnable && pIes->Airgo.PropSuppRates.present &&
2881 ( pIes->Airgo.PropSuppRates.num_rates > 0 ))
2882 {
2883 ProprietaryOperationalRatesLength = pIes->Airgo.PropSuppRates.num_rates;
2884 if ( ProprietaryOperationalRatesLength > sizeof(ProprietaryOperationalRates) )
2885 {
2886 ProprietaryOperationalRatesLength = sizeof (ProprietaryOperationalRates);
2887 }
2888 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates, pIes->Airgo.PropSuppRates.rates, ProprietaryOperationalRatesLength );
2889 }
2890 else {
2891 // No proprietary modes...
2892 ProprietaryOperationalRatesLength = 0;
2893 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002894 /* Get MCS Rate */
2895 pDstRate = MCSRateIdxSet;
2896 if ( pIes->HTCaps.present )
2897 {
2898 for ( i = 0; i < VALID_MAX_MCS_INDEX; i++ )
2899 {
2900 if ( (unsigned int)pIes->HTCaps.supportedMCSSet[0] & (1 << i) )
2901 {
2902 MCSRateLength++;
2903 *pDstRate++ = i;
2904 }
2905 }
2906 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002907 // Set the operational rate set CFG variables...
2908 ccmCfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET, OperationalRates,
2909 OperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2910 ccmCfgSetStr(pMac, WNI_CFG_EXTENDED_OPERATIONAL_RATE_SET, ExtendedOperationalRates,
2911 ExtendedOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2912 ccmCfgSetStr(pMac, WNI_CFG_PROPRIETARY_OPERATIONAL_RATE_SET,
2913 ProprietaryOperationalRates,
2914 ProprietaryOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2915 ccmCfgSetInt(pMac, WNI_CFG_PROPRIETARY_ANI_FEATURES_ENABLED, PropRatesEnable, NULL, eANI_BOOLEAN_FALSE);
2916 ccmCfgSetStr(pMac, WNI_CFG_CURRENT_MCS_SET, MCSRateIdxSet,
2917 MCSRateLength, NULL, eANI_BOOLEAN_FALSE);
2918 }//Parsing BSSDesc
2919 else
2920 {
2921 smsLog(pMac, LOGE, FL("failed to parse BssDesc\n"));
2922 }
2923}
2924
Jeff Johnson295189b2012-06-20 16:38:30 -07002925static void csrSetCfgRateSetFromProfile( tpAniSirGlobal pMac,
2926 tCsrRoamProfile *pProfile )
2927{
2928 tSirMacRateSetIE DefaultSupportedRates11a = { SIR_MAC_RATESET_EID,
2929 { 8,
2930 { SIR_MAC_RATE_6,
2931 SIR_MAC_RATE_9,
2932 SIR_MAC_RATE_12,
2933 SIR_MAC_RATE_18,
2934 SIR_MAC_RATE_24,
2935 SIR_MAC_RATE_36,
2936 SIR_MAC_RATE_48,
2937 SIR_MAC_RATE_54 } } };
Jeff Johnson295189b2012-06-20 16:38:30 -07002938 tSirMacRateSetIE DefaultSupportedRates11b = { SIR_MAC_RATESET_EID,
2939 { 4,
2940 { SIR_MAC_RATE_1,
2941 SIR_MAC_RATE_2,
2942 SIR_MAC_RATE_5_5,
2943 SIR_MAC_RATE_11 } } };
2944
2945
2946 tSirMacPropRateSet DefaultSupportedPropRates = { 3,
2947 { SIR_MAC_RATE_72,
2948 SIR_MAC_RATE_96,
2949 SIR_MAC_RATE_108 } };
2950 eCsrCfgDot11Mode cfgDot11Mode;
2951 eCsrBand eBand;
2952 tANI_U8 OperationalRates[ CSR_DOT11_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2953 tANI_U32 OperationalRatesLength = 0;
2954 tANI_U8 ExtendedOperationalRates[ CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2955 tANI_U32 ExtendedOperationalRatesLength = 0;
2956 tANI_U8 ProprietaryOperationalRates[ 4 ]; // leave enough room for the max number of proprietary rates
2957 tANI_U32 ProprietaryOperationalRatesLength = 0;
2958 tANI_U32 PropRatesEnable = 0;
2959 tANI_U8 operationChannel = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002960 if(pProfile->ChannelInfo.ChannelList)
2961 {
2962 operationChannel = pProfile->ChannelInfo.ChannelList[0];
2963 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002964#ifdef WLAN_SOFTAP_FEATURE
2965 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, pProfile, operationChannel, &eBand );
2966#else
2967 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel, &eBand );
2968#endif
2969 // For 11a networks, the 11a rates go into the Operational Rate set. For 11b and 11g
2970 // networks, the 11b rates appear in the Operational Rate set. In either case,
2971 // we can blindly put the rates we support into our Operational Rate set
2972 // (including the basic rates, which we have already verified are supported
2973 // earlier in the roaming decision).
2974 if ( eCSR_BAND_5G == eBand )
2975 {
2976 // 11a rates into the Operational Rate Set.
2977 OperationalRatesLength = DefaultSupportedRates11a.supportedRateSet.numRates *
2978 sizeof(*DefaultSupportedRates11a.supportedRateSet.rate);
2979 palCopyMemory( pMac->hHdd, OperationalRates,
2980 DefaultSupportedRates11a.supportedRateSet.rate,
2981 OperationalRatesLength );
2982
2983 // Nothing in the Extended rate set.
2984 ExtendedOperationalRatesLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002985 // populate proprietary rates if user allows them
2986 if ( pMac->roam.configParam.ProprietaryRatesEnabled )
2987 {
2988 ProprietaryOperationalRatesLength = DefaultSupportedPropRates.numPropRates *
2989 sizeof(*DefaultSupportedPropRates.propRate);
2990 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates,
2991 DefaultSupportedPropRates.propRate,
2992 ProprietaryOperationalRatesLength );
2993 }
2994 else
2995 {
2996 // No proprietary modes
2997 ProprietaryOperationalRatesLength = 0;
2998 }
2999 }
3000 else if ( eCSR_CFG_DOT11_MODE_11B == cfgDot11Mode )
3001 {
3002 // 11b rates into the Operational Rate Set.
3003 OperationalRatesLength = DefaultSupportedRates11b.supportedRateSet.numRates *
3004 sizeof(*DefaultSupportedRates11b.supportedRateSet.rate);
3005 palCopyMemory( pMac->hHdd, OperationalRates,
3006 DefaultSupportedRates11b.supportedRateSet.rate,
3007 OperationalRatesLength );
3008 // Nothing in the Extended rate set.
3009 ExtendedOperationalRatesLength = 0;
3010 // No proprietary modes
3011 ProprietaryOperationalRatesLength = 0;
3012 }
3013 else
3014 {
3015 // 11G
3016
3017 // 11b rates into the Operational Rate Set.
3018 OperationalRatesLength = DefaultSupportedRates11b.supportedRateSet.numRates *
3019 sizeof(*DefaultSupportedRates11b.supportedRateSet.rate);
3020 palCopyMemory( pMac->hHdd, OperationalRates,
3021 DefaultSupportedRates11b.supportedRateSet.rate,
3022 OperationalRatesLength );
3023
3024 // 11a rates go in the Extended rate set.
3025 ExtendedOperationalRatesLength = DefaultSupportedRates11a.supportedRateSet.numRates *
3026 sizeof(*DefaultSupportedRates11a.supportedRateSet.rate);
3027 palCopyMemory( pMac->hHdd, ExtendedOperationalRates,
3028 DefaultSupportedRates11a.supportedRateSet.rate,
3029 ExtendedOperationalRatesLength );
3030
3031 // populate proprietary rates if user allows them
3032 if ( pMac->roam.configParam.ProprietaryRatesEnabled )
3033 {
3034 ProprietaryOperationalRatesLength = DefaultSupportedPropRates.numPropRates *
3035 sizeof(*DefaultSupportedPropRates.propRate);
3036 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates,
3037 DefaultSupportedPropRates.propRate,
3038 ProprietaryOperationalRatesLength );
3039 }
3040 else
3041 {
3042 // No proprietary modes
3043 ProprietaryOperationalRatesLength = 0;
3044 }
3045 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003046 // set this to 1 if prop. rates need to be advertised in to the IBSS beacon and user wants to use them
3047 if ( ProprietaryOperationalRatesLength && pMac->roam.configParam.ProprietaryRatesEnabled )
3048 {
3049 PropRatesEnable = 1;
3050 }
3051 else
3052 {
3053 PropRatesEnable = 0;
3054 }
3055
3056 // Set the operational rate set CFG variables...
3057 ccmCfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET, OperationalRates,
3058 OperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3059 ccmCfgSetStr(pMac, WNI_CFG_EXTENDED_OPERATIONAL_RATE_SET, ExtendedOperationalRates,
3060 ExtendedOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3061 ccmCfgSetStr(pMac, WNI_CFG_PROPRIETARY_OPERATIONAL_RATE_SET,
3062 ProprietaryOperationalRates,
3063 ProprietaryOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3064 ccmCfgSetInt(pMac, WNI_CFG_PROPRIETARY_ANI_FEATURES_ENABLED, PropRatesEnable, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003065}
Jeff Johnson295189b2012-06-20 16:38:30 -07003066void csrRoamCcmCfgSetCallback(tHalHandle hHal, tANI_S32 result)
3067{
3068 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
Jeff Johnsone7245742012-09-05 17:12:55 -07003069
Jeff Johnson295189b2012-06-20 16:38:30 -07003070 tListElem *pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
3071 tANI_U32 sessionId;
3072 tSmeCmd *pCommand = NULL;
3073
3074 if(NULL == pEntry)
3075 {
3076 smsLog(pMac, LOGW, " CFG_CNF with active list empty\n");
3077 return;
3078 }
3079 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
3080 sessionId = pCommand->sessionId;
3081
3082 if(CSR_IS_ROAM_JOINING(pMac, sessionId) && CSR_IS_ROAM_SUBSTATE_CONFIG(pMac, sessionId))
3083 {
3084 csrRoamingStateConfigCnfProcessor(pMac, (tANI_U32)result);
3085 }
3086}
3087
Jeff Johnson295189b2012-06-20 16:38:30 -07003088//This function is very dump. It is here because PE still need WNI_CFG_PHY_MODE
3089tANI_U32 csrRoamGetPhyModeFromDot11Mode(eCsrCfgDot11Mode dot11Mode, eCsrBand band)
3090{
3091 if(eCSR_CFG_DOT11_MODE_11B == dot11Mode)
3092 {
3093 return (WNI_CFG_PHY_MODE_11B);
3094 }
3095 else
3096 {
3097 if(eCSR_BAND_24 == band)
3098 return (WNI_CFG_PHY_MODE_11G);
3099 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003100 return (WNI_CFG_PHY_MODE_11A);
3101}
Jeff Johnson295189b2012-06-20 16:38:30 -07003102
Jeff Johnsone7245742012-09-05 17:12:55 -07003103
3104#ifdef WLAN_FEATURE_11AC
3105ePhyChanBondState csrGetHTCBStateFromVHTCBState(ePhyChanBondState aniCBMode)
3106{
3107 switch ( aniCBMode )
3108 {
3109 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3110 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3111 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3112 return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
3113 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3114 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3115 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3116 return PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
3117 case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
3118 default :
3119 return PHY_SINGLE_CHANNEL_CENTERED;
3120 }
3121}
3122#endif
3123
Jeff Johnson295189b2012-06-20 16:38:30 -07003124//pIes may be NULL
3125eHalStatus csrRoamSetBssConfigCfg(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
3126 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig,
3127 tDot11fBeaconIEs *pIes)
3128{
3129 eHalStatus status = eHAL_STATUS_SUCCESS;
3130 tANI_U32 cfgCb = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
3131 tANI_U8 channel = 0;
3132 //Make sure we have the domain info for the BSS we try to connect to.
3133 //Do we need to worry about sequence for OSs that are not Windows??
3134 if(pBssDesc)
3135 {
3136 if(csrLearnCountryInformation(pMac, pBssDesc, pIes, eANI_BOOLEAN_TRUE))
3137 {
3138 //Make sure the 11d info from this BSSDesc can be applied
3139 pMac->scan.fAmbiguous11dInfoFound = eANI_BOOLEAN_FALSE;
3140 csrApplyCountryInformation( pMac, TRUE );
3141 }
3142 }
3143
3144 //Qos
3145 csrSetQosToCfg( pMac, sessionId, pBssConfig->qosType );
3146 //SSID
3147 csrSetCfgSsid(pMac, &pBssConfig->SSID );
3148 //fragment threshold
3149 //ccmCfgSetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD, csrGetFragThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
3150 //RTS threshold
3151 //ccmCfgSetInt(pMac, WNI_CFG_RTS_THRESHOLD, csrGetRTSThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
3152
3153 //ccmCfgSetInt(pMac, WNI_CFG_DOT11_MODE, csrTranslateToWNICfgDot11Mode(pMac, pBssConfig->uCfgDot11Mode), NULL, eANI_BOOLEAN_FALSE);
3154
3155 //Auth type
3156 ccmCfgSetInt(pMac, WNI_CFG_AUTHENTICATION_TYPE, pBssConfig->authType, NULL, eANI_BOOLEAN_FALSE);
3157 //encryption type
3158 csrSetCfgPrivacy(pMac, pProfile, (tANI_BOOLEAN)pBssConfig->BssCap.privacy );
3159 //short slot time
3160 ccmCfgSetInt(pMac, WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED, pBssConfig->uShortSlotTime, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003161#ifdef WLAN_SOFTAP_FEATURE
3162 //11d
3163 ccmCfgSetInt(pMac, WNI_CFG_11D_ENABLED,
3164 ((pBssConfig->f11hSupport) ? pBssConfig->f11hSupport : pProfile->ieee80211d),
3165 NULL, eANI_BOOLEAN_FALSE);
3166#endif
3167 /*//11h
3168 ccmCfgSetInt(pMac, WNI_CFG_11H_ENABLED, pMac->roam.configParam.Is11hSupportEnabled, NULL, eANI_BOOLEAN_FALSE);
3169 */
3170 ccmCfgSetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, pBssConfig->uPowerLimit, NULL, eANI_BOOLEAN_FALSE);
3171 //CB
Jeff Johnsone7245742012-09-05 17:12:55 -07003172
Jeff Johnson295189b2012-06-20 16:38:30 -07003173 if(CSR_IS_INFRA_AP(pProfile) || CSR_IS_WDS_AP(pProfile))
3174 {
3175 channel = pProfile->operationChannel;
3176 }
3177 else
3178 {
3179 if(pBssDesc)
3180 {
3181 channel = pBssDesc->channelId;
3182 }
3183 }
3184 if(0 != channel)
3185 {
3186 if(CSR_IS_CHANNEL_24GHZ(channel))
3187 {//for now if we are on 2.4 Ghz, CB will be always disabled
3188 cfgCb = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
3189 }
3190 else
3191 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003192 cfgCb = pBssConfig->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003193 }
3194 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003195#ifdef WLAN_FEATURE_11AC
3196 if(cfgCb > 2 )
3197 {
3198 if(!WDA_getFwWlanFeatCaps(DOT11AC)) {
3199 cfgCb = csrGetHTCBStateFromVHTCBState(cfgCb);
3200 }
3201 else
3202 {
3203 ccmCfgSetInt(pMac, WNI_CFG_VHT_CHANNEL_WIDTH, pMac->roam.configParam.nVhtChannelWidth, NULL, eANI_BOOLEAN_FALSE);
3204 }
3205 }
3206 else
3207#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003208 ccmCfgSetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, cfgCb, NULL, eANI_BOOLEAN_FALSE);
3209 //Rate
3210 //Fixed Rate
3211 if(pBssDesc)
3212 {
3213 csrSetCfgRateSet(pMac, (eCsrPhyMode)pProfile->phyMode, pProfile, pBssDesc, pIes);
3214 }
3215 else
3216 {
3217 csrSetCfgRateSetFromProfile(pMac, pProfile);
3218 }
3219 //Make this the last CFG to set. The callback will trigger a join_req
3220 //Join time out
3221 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_CONFIG, sessionId );
3222
3223 ccmCfgSetInt(pMac, WNI_CFG_JOIN_FAILURE_TIMEOUT, pBssConfig->uJoinTimeOut, (tCcmCfgSetCallback)csrRoamCcmCfgSetCallback, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003224 return (status);
3225}
3226
Jeff Johnson295189b2012-06-20 16:38:30 -07003227eHalStatus csrRoamStopNetwork( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
3228 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
3229{
3230 eHalStatus status;
3231 tBssConfigParam *pBssConfig;
3232 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003233
3234 if(!pSession)
3235 {
3236 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3237 return eHAL_STATUS_FAILURE;
3238 }
3239
Jeff Johnson295189b2012-06-20 16:38:30 -07003240 status = palAllocateMemory(pMac->hHdd, (void **)&pBssConfig, sizeof(tBssConfigParam));
3241 if(HAL_STATUS_SUCCESS(status))
3242 {
3243 palZeroMemory(pMac->hHdd, pBssConfig, sizeof(tBssConfigParam));
3244 status = csrRoamPrepareBssConfig(pMac, pProfile, pBssDesc, pBssConfig, pIes);
3245 if(HAL_STATUS_SUCCESS(status))
3246 {
3247 pSession->bssParams.uCfgDot11Mode = pBssConfig->uCfgDot11Mode;
Jeff Johnsone7245742012-09-05 17:12:55 -07003248 /* This will allow to pass cbMode during join req */
3249 pSession->bssParams.cbMode= pBssConfig->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003250 //For IBSS, we need to prepare some more information
3251 if( csrIsBssTypeIBSS(pProfile->BSSType) || CSR_IS_WDS( pProfile )
3252#ifdef WLAN_SOFTAP_FEATURE
3253 || CSR_IS_INFRA_AP(pProfile)
3254#endif
3255 )
3256 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003257 csrRoamPrepareBssParams(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07003258 }
3259 // If we are in an IBSS, then stop the IBSS...
3260 ////Not worry about WDS connection for now
3261 if ( csrIsConnStateIbss( pMac, sessionId ) )
3262 {
3263 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
3264 }
3265 else
3266 {
3267 // if we are in an Infrastructure association....
3268 if ( csrIsConnStateInfra( pMac, sessionId ) )
3269 {
3270 // and the new Bss is an Ibss OR we are roaming from Infra to Infra
3271 // across SSIDs (roaming to a new SSID)... //
3272 //Not worry about WDS connection for now
3273 if ( pBssDesc && ( ( csrIsIbssBssDesc( pBssDesc ) ) ||
3274 !csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc, pIes ) ) )
3275 {
3276 // then we need to disassociate from the Infrastructure network...
3277 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
3278 }
3279 else
3280 {
3281 // In an Infrastucture and going to an Infrastructure network with the same SSID. This
3282 // calls for a Reassociation sequence. So issue the CFG sets for this new AP.
3283 if ( pBssDesc )
3284 {
3285 // Set parameters for this Bss.
3286 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
3287 }
3288 }
3289 }
3290 else
3291 {
3292 // Neiher in IBSS nor in Infra. We can go ahead and set the CFG for tne new network...
3293 // Nothing to stop.
3294 if ( pBssDesc || CSR_IS_WDS_AP( pProfile )
3295#ifdef WLAN_SOFTAP_FEATURE
3296 || CSR_IS_INFRA_AP(pProfile)
3297#endif
3298 )
3299 {
3300 // Set parameters for this Bss.
3301 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
3302 }
3303 }
3304 }
3305 }//Success getting BSS config info
3306 palFreeMemory(pMac->hHdd, pBssConfig);
3307 }//Allocate memory
3308
3309 return (status);
3310}
3311
Jeff Johnson295189b2012-06-20 16:38:30 -07003312eCsrJoinState csrRoamJoin( tpAniSirGlobal pMac, tANI_U32 sessionId,
3313 tCsrScanResultInfo *pScanResult, tCsrRoamProfile *pProfile )
3314{
3315 eCsrJoinState eRoamState = eCsrContinueRoaming;
3316 eHalStatus status;
3317 tSirBssDescription *pBssDesc = &pScanResult->BssDescriptor;
3318 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)( pScanResult->pvIes ); //This may be NULL
3319 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003320
3321 if(!pSession)
3322 {
3323 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3324 return (eCsrStopRoaming);
3325 }
3326
Jeff Johnson295189b2012-06-20 16:38:30 -07003327 if( CSR_IS_WDS_STA( pProfile ) )
3328 {
3329 status = csrRoamStartWds( pMac, sessionId, pProfile, pBssDesc );
3330 if( !HAL_STATUS_SUCCESS( status ) )
3331 {
3332 eRoamState = eCsrStopRoaming;
3333 }
3334 }
3335 else
3336 {
3337 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal))) )
3338 {
3339 smsLog(pMac, LOGE, FL(" fail to parse IEs"));
3340 return (eCsrStopRoaming);
3341 }
3342 if ( csrIsInfraBssDesc( pBssDesc ) )
3343 {
3344 // If we are connected in infrastructure mode and the Join Bss description is for the same BssID, then we are
3345 // attempting to join the AP we are already connected with. In that case, see if the Bss or Sta capabilities
3346 // have changed and handle the changes (without disturbing the current association).
3347
3348 if ( csrIsConnStateConnectedInfra(pMac, sessionId) &&
3349 csrIsBssIdEqual( pMac, pBssDesc, pSession->pConnectBssDesc ) &&
3350 csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc, pIesLocal )
3351 )
3352 {
3353 // Check to see if the Auth type has changed in the Profile. If so, we don't want to Reassociate
3354 // with Authenticating first. To force this, stop the current association (Disassociate) and
3355 // then re 'Join' the AP, wihch will force an Authentication (with the new Auth type) followed by
3356 // a new Association.
3357 if(csrIsSameProfile(pMac, &pSession->connectedProfile, pProfile))
3358 {
3359 smsLog(pMac, LOGW, FL(" detect same profile authType = %d encryType = %d\n"), pProfile->AuthType, pProfile->EncryptionType);
3360 if(csrRoamIsSameProfileKeys(pMac, &pSession->connectedProfile, pProfile))
3361 {
3362 eRoamState = eCsrReassocToSelfNoCapChange;
3363 }
3364 else
3365 {
3366 tBssConfigParam bssConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07003367 //The key changes
3368 palZeroMemory(pMac->hHdd, &bssConfig, sizeof(bssConfig));
3369 status = csrRoamPrepareBssConfig(pMac, pProfile, pBssDesc, &bssConfig, pIesLocal);
3370 if(HAL_STATUS_SUCCESS(status))
3371 {
3372 pSession->bssParams.uCfgDot11Mode = bssConfig.uCfgDot11Mode;
Jeff Johnsone7245742012-09-05 17:12:55 -07003373 pSession->bssParams.cbMode = bssConfig.cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003374 //Reapply the config including Keys so reassoc is happening.
3375 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, &bssConfig, pIesLocal);
3376 if(!HAL_STATUS_SUCCESS(status))
3377 {
3378 eRoamState = eCsrStopRoaming;
3379 }
3380 }
3381 else
3382 {
3383 eRoamState = eCsrStopRoaming;
3384 }
3385 }//same profile
3386 }
3387 else
3388 {
3389 if(!HAL_STATUS_SUCCESS(csrRoamIssueDisassociate( pMac, sessionId,
3390 eCSR_ROAM_SUBSTATE_DISASSOC_REQ, FALSE )))
3391 {
3392 smsLog(pMac, LOGW, FL(" fail to issue disassociate\n"));
3393 eRoamState = eCsrStopRoaming;
3394 }
3395 }
3396 }
3397 else
3398 {
3399 // note: we used to pre-auth here with open authentication networks but that was not working so well.
3400 // we had a lot of join timeouts when testing at Samsung. removing this step helped associations
3401 // work much better.
3402 //
3403 //
3404 // stop the existing network before attempting to join the new network...
3405 if(!HAL_STATUS_SUCCESS(csrRoamStopNetwork(pMac, sessionId, pProfile, pBssDesc, pIesLocal)))
3406 {
3407 eRoamState = eCsrStopRoaming;
3408 }
3409 }
3410 }//Infra
3411 else
3412 {
3413 if(!HAL_STATUS_SUCCESS(csrRoamStopNetwork(pMac, sessionId, pProfile, pBssDesc, pIesLocal)))
3414 {
3415 eRoamState = eCsrStopRoaming;
3416 }
3417 }
3418 if( pIesLocal && !pScanResult->pvIes )
3419 {
3420 palFreeMemory(pMac->hHdd, pIesLocal);
3421 }
3422 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003423 return( eRoamState );
3424}
3425
Jeff Johnson295189b2012-06-20 16:38:30 -07003426eHalStatus csrRoamShouldRoam(tpAniSirGlobal pMac, tANI_U32 sessionId,
3427 tSirBssDescription *pBssDesc, tANI_U32 roamId)
3428{
3429 eHalStatus status = eHAL_STATUS_SUCCESS;
3430 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07003431 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
3432 roamInfo.pBssDesc = pBssDesc;
3433 status = csrRoamCallCallback(pMac, sessionId, &roamInfo, roamId, eCSR_ROAM_SHOULD_ROAM, eCSR_ROAM_RESULT_NONE);
3434 return (status);
3435}
Jeff Johnson295189b2012-06-20 16:38:30 -07003436//In case no matching BSS is found, use whatever default we can find
3437static void csrRoamAssignDefaultParam( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3438{
3439 //Need to get all negotiated types in place first
3440 //auth type
3441 switch( pCommand->u.roamCmd.roamProfile.AuthType.authType[0] ) //Take the prefered Auth type.
3442 {
3443 default:
3444 case eCSR_AUTH_TYPE_WPA:
3445 case eCSR_AUTH_TYPE_WPA_PSK:
3446 case eCSR_AUTH_TYPE_WPA_NONE:
3447 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
3448 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
3449 break;
3450
3451 case eCSR_AUTH_TYPE_SHARED_KEY:
3452 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_SHARED_KEY;
3453 break;
3454
3455 case eCSR_AUTH_TYPE_AUTOSWITCH:
3456 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_AUTOSWITCH;
3457 break;
3458 }
3459 pCommand->u.roamCmd.roamProfile.negotiatedUCEncryptionType =
3460 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0];
3461 //In this case, the multicast encryption needs to follow the uncast ones.
3462 pCommand->u.roamCmd.roamProfile.negotiatedMCEncryptionType =
3463 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0];
3464}
3465
3466static eCsrJoinState csrRoamJoinNextBss( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fUseSameBss )
3467{
3468 eHalStatus status;
3469 tCsrScanResult *pScanResult = NULL;
3470 eCsrJoinState eRoamState = eCsrStopRoaming;
3471 tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
3472 tANI_BOOLEAN fDone = eANI_BOOLEAN_FALSE;
3473 tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
3474#ifndef WLAN_MDM_CODE_REDUCTION_OPT
3475 v_U8_t acm_mask = 0;
3476#endif
3477 tANI_U32 sessionId = pCommand->sessionId;
3478 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
3479 tCsrRoamProfile *pProfile = &pCommand->u.roamCmd.roamProfile;
3480 tANI_U8 concurrentChannel = 0;
Jeff Johnson32d95a32012-09-10 13:15:23 -07003481
3482 if(!pSession)
3483 {
3484 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3485 return (eCsrStopRoaming);
3486 }
3487
Jeff Johnson295189b2012-06-20 16:38:30 -07003488 do
3489 {
3490 // Check for Cardbus eject condition, before trying to Roam to any BSS
3491 //***if( !balIsCardPresent(pAdapter) ) break;
3492
3493 if(NULL != pBSSList)
3494 {
3495 // When handling AP's capability change, continue to associate to
3496 // same BSS and make sure pRoamBssEntry is not Null.
3497 if((eANI_BOOLEAN_FALSE == fUseSameBss) || (pCommand->u.roamCmd.pRoamBssEntry == NULL))
3498 {
3499 if(pCommand->u.roamCmd.pRoamBssEntry == NULL)
3500 {
3501 //Try the first BSS
3502 pCommand->u.roamCmd.pLastRoamBss = NULL;
3503 pCommand->u.roamCmd.pRoamBssEntry = csrLLPeekHead(&pBSSList->List, LL_ACCESS_LOCK);
3504 }
3505 else
3506 {
3507 pCommand->u.roamCmd.pRoamBssEntry = csrLLNext(&pBSSList->List, pCommand->u.roamCmd.pRoamBssEntry, LL_ACCESS_LOCK);
3508 if(NULL == pCommand->u.roamCmd.pRoamBssEntry)
3509 {
3510 //Done with all the BSSs
3511 //In this case, will tell HDD the completion
3512 break;
3513 }
3514 else
3515 {
3516 //We need to indicate to HDD that we are done with this one.
3517 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
3518 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss; //this shall not be NULL
3519 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
3520 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
3521 pRoamInfo = &roamInfo;
3522 }
3523 }
3524 while(pCommand->u.roamCmd.pRoamBssEntry)
3525 {
3526 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
Jeff Johnson295189b2012-06-20 16:38:30 -07003527 /*If concurrency enabled take the concurrent connected channel first. */
3528 /* Valid multichannel concurrent sessions exempted */
Jeff Johnsone7245742012-09-05 17:12:55 -07003529 if (vos_concurrent_sessions_running() &&
3530 !csrIsValidMcConcurrentSession(pMac, sessionId, &pScanResult->Result.BssDescriptor))
Jeff Johnson295189b2012-06-20 16:38:30 -07003531 {
3532 concurrentChannel =
3533 csrGetConcurrentOperationChannel(pMac);
3534 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO_HIGH, "%s: "
3535 " csr Concurrent Channel = %d", __FUNCTION__, concurrentChannel);
Jeff Johnson295189b2012-06-20 16:38:30 -07003536 if ((concurrentChannel) &&
3537 (concurrentChannel ==
3538 pScanResult->Result.BssDescriptor.channelId))
3539 {
3540 //make this 0 because we do not want the
3541 //below check to pass as we don't want to
3542 //connect on other channel
3543 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
3544 FL("Concurrent channel match =%d"),
3545 concurrentChannel);
3546 concurrentChannel = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003547 }
3548 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003549
3550 if (!concurrentChannel)
3551 {
3552
3553 if(HAL_STATUS_SUCCESS(csrRoamShouldRoam(pMac,
3554 sessionId, &pScanResult->Result.BssDescriptor,
3555 pCommand->u.roamCmd.roamId)))
3556 {
3557 //Ok to roam this
3558 break;
3559 }
3560 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003561 else
3562 {
3563 eRoamState = eCsrStopRoamingDueToConcurrency;
3564 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003565 pCommand->u.roamCmd.pRoamBssEntry = csrLLNext(&pBSSList->List, pCommand->u.roamCmd.pRoamBssEntry, LL_ACCESS_LOCK);
3566 if(NULL == pCommand->u.roamCmd.pRoamBssEntry)
3567 {
3568 //Done with all the BSSs
3569 fDone = eANI_BOOLEAN_TRUE;
3570 break;
3571 }
3572 }
3573 if(fDone)
3574 {
3575 break;
3576 }
3577 }
3578 }
3579 //We have something to roam, tell HDD when it is infra.
3580 //For IBSS, the indication goes back to HDD via eCSR_ROAM_IBSS_IND
3581 //For WDS, the indication is eCSR_ROAM_WDS_IND
3582 if( CSR_IS_INFRASTRUCTURE( pProfile ) )
3583 {
3584 if(pRoamInfo)
3585 {
3586 pSession->bRefAssocStartCnt--;
3587 //Complete the last association attemp because a new one is about to be tried
3588 csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.roamCmd.roamId,
3589 eCSR_ROAM_ASSOCIATION_COMPLETION,
3590 eCSR_ROAM_RESULT_NOT_ASSOCIATED);
3591 }
3592 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
3593 if(pScanResult)
3594 {
3595 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
Jeff Johnson295189b2012-06-20 16:38:30 -07003596 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, &pScanResult->Result.BssDescriptor, &pIesLocal))) )
3597 {
3598 smsLog(pMac, LOGE, FL(" cannot parse IEs\n"));
3599 fDone = eANI_BOOLEAN_TRUE;
3600 eRoamState = eCsrStopRoaming;
3601 break;
3602 }
3603 roamInfo.pBssDesc = &pScanResult->Result.BssDescriptor;
3604 pCommand->u.roamCmd.pLastRoamBss = roamInfo.pBssDesc;
3605 //No need to put uapsd_mask in if the BSS doesn't support uAPSD
3606 if( pCommand->u.roamCmd.roamProfile.uapsd_mask &&
3607 CSR_IS_QOS_BSS(pIesLocal) &&
3608 CSR_IS_UAPSD_BSS(pIesLocal) )
3609 {
3610#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson295189b2012-06-20 16:38:30 -07003611 acm_mask = sme_QosGetACMMask(pMac, &pScanResult->Result.BssDescriptor,
3612 pIesLocal);
3613 pCommand->u.roamCmd.roamProfile.uapsd_mask &= ~(acm_mask);
3614#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
Jeff Johnson295189b2012-06-20 16:38:30 -07003615 }
3616 else
3617 {
3618 pCommand->u.roamCmd.roamProfile.uapsd_mask = 0;
3619 }
3620 if( pIesLocal && !pScanResult->Result.pvIes)
3621 {
3622 palFreeMemory(pMac->hHdd, pIesLocal);
3623 }
3624 }
3625 else
3626 {
3627 pCommand->u.roamCmd.roamProfile.uapsd_mask = 0;
3628 }
3629 roamInfo.pProfile = pProfile;
3630 pSession->bRefAssocStartCnt++;
3631 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
3632 eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
3633 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003634 if ( NULL == pCommand->u.roamCmd.pRoamBssEntry )
3635 {
3636 // If this is a start IBSS profile, then we need to start the IBSS.
3637 if ( CSR_IS_START_IBSS(pProfile) )
3638 {
3639 tANI_BOOLEAN fSameIbss = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003640 // Attempt to start this IBSS...
3641 csrRoamAssignDefaultParam( pMac, pCommand );
3642 status = csrRoamStartIbss( pMac, sessionId, pProfile, &fSameIbss );
3643 if(HAL_STATUS_SUCCESS(status))
3644 {
3645 if ( fSameIbss )
3646 {
3647 eRoamState = eCsrStartIbssSameIbss;
3648 }
3649 else
3650 {
3651 eRoamState = eCsrContinueRoaming;
3652 }
3653 }
3654 else
3655 {
3656 //it somehow fail need to stop
3657 eRoamState = eCsrStopRoaming;
3658 }
3659 break;
3660 }
3661 else if ( (CSR_IS_WDS_AP(pProfile))
3662#ifdef WLAN_SOFTAP_FEATURE
3663 || (CSR_IS_INFRA_AP(pProfile))
3664#endif
3665 )
3666 {
3667 // Attempt to start this WDS...
3668 csrRoamAssignDefaultParam( pMac, pCommand );
3669 /* For AP WDS, we dont have any BSSDescription */
3670 status = csrRoamStartWds( pMac, sessionId, pProfile, NULL );
3671 if(HAL_STATUS_SUCCESS(status))
3672 {
3673 eRoamState = eCsrContinueRoaming;
3674 }
3675 else
3676 {
3677 //it somehow fail need to stop
3678 eRoamState = eCsrStopRoaming;
3679 }
3680 }
3681 else
3682 {
3683 //Nothing we can do
3684 smsLog(pMac, LOGW, FL("cannot continue without BSS list\n"));
3685 eRoamState = eCsrStopRoaming;
3686 break;
3687 }
3688 }
3689 else //We have BSS
3690 {
3691 //Need to assign these value because they are used in csrIsSameProfile
3692 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
3693 pCommand->u.roamCmd.roamProfile.negotiatedUCEncryptionType = pScanResult->ucEncryptionType; //Negotiated while building scan result.
3694 pCommand->u.roamCmd.roamProfile.negotiatedMCEncryptionType = pScanResult->mcEncryptionType;
3695 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = pScanResult->authType;
3696 if ( CSR_IS_START_IBSS(&pCommand->u.roamCmd.roamProfile) )
3697 {
3698 if(csrIsSameProfile(pMac, &pSession->connectedProfile, pProfile))
3699 {
3700 eRoamState = eCsrStartIbssSameIbss;
3701 break;
3702 }
3703 }
3704 if( pCommand->u.roamCmd.fReassocToSelfNoCapChange )
3705 {
3706 //trying to connect to the one already connected
3707 pCommand->u.roamCmd.fReassocToSelfNoCapChange = eANI_BOOLEAN_FALSE;
3708 eRoamState = eCsrReassocToSelfNoCapChange;
3709 break;
3710 }
3711 // Attempt to Join this Bss...
3712 eRoamState = csrRoamJoin( pMac, sessionId, &pScanResult->Result, pProfile );
3713 break;
3714 }
3715
3716 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07003717 if( (eCsrStopRoaming == eRoamState) && (CSR_IS_INFRASTRUCTURE( pProfile )) )
3718 {
3719 //Need to indicate association_completion if association_start has been done
3720 if(pSession->bRefAssocStartCnt > 0)
3721 {
3722 pSession->bRefAssocStartCnt--;
3723 //Complete the last association attemp because a new one is about to be tried
3724 csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.roamCmd.roamId,
3725 eCSR_ROAM_ASSOCIATION_COMPLETION,
3726 eCSR_ROAM_RESULT_NOT_ASSOCIATED);
3727 }
3728 }
3729
3730 return( eRoamState );
3731}
3732
Jeff Johnson295189b2012-06-20 16:38:30 -07003733static eHalStatus csrRoam( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3734{
3735 eHalStatus status = eHAL_STATUS_SUCCESS;
3736 eCsrJoinState RoamState;
3737 tANI_U32 sessionId = pCommand->sessionId;
3738
Jeff Johnson295189b2012-06-20 16:38:30 -07003739 //***if( hddIsRadioStateOn( pAdapter ) )
3740 {
3741 // Attept to join a Bss...
3742 RoamState = csrRoamJoinNextBss( pMac, pCommand, eANI_BOOLEAN_FALSE );
Jeff Johnsone7245742012-09-05 17:12:55 -07003743
Jeff Johnson295189b2012-06-20 16:38:30 -07003744 // if nothing to join..
Jeff Johnsone7245742012-09-05 17:12:55 -07003745 if (( eCsrStopRoaming == RoamState ) || ( eCsrStopRoamingDueToConcurrency == RoamState))
Jeff Johnson295189b2012-06-20 16:38:30 -07003746 {
3747 tANI_BOOLEAN fComplete = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003748 // and if connected in Infrastructure mode...
3749 if ( csrIsConnStateInfra(pMac, sessionId) )
3750 {
3751 //... then we need to issue a disassociation
3752 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISASSOC_NOTHING_TO_JOIN, FALSE );
3753 if(!HAL_STATUS_SUCCESS(status))
3754 {
3755 smsLog(pMac, LOGW, FL(" failed to issue disassociate, status = %d\n"), status);
3756 //roam command is completed by caller in the failed case
3757 fComplete = eANI_BOOLEAN_TRUE;
3758 }
3759 }
3760 else if( csrIsConnStateIbss(pMac, sessionId) )
3761 {
3762 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3763 if(!HAL_STATUS_SUCCESS(status))
3764 {
3765 smsLog(pMac, LOGW, FL(" failed to issue stop bss, status = %d\n"), status);
3766 //roam command is completed by caller in the failed case
3767 fComplete = eANI_BOOLEAN_TRUE;
3768 }
3769 }
3770#ifdef WLAN_SOFTAP_FEATURE
3771 else if (csrIsConnStateConnectedInfraAp(pMac, sessionId))
3772 {
3773 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3774 if(!HAL_STATUS_SUCCESS(status))
3775 {
3776 smsLog(pMac, LOGW, FL(" failed to issue stop bss, status = %d\n"), status);
3777 //roam command is completed by caller in the failed case
3778 fComplete = eANI_BOOLEAN_TRUE;
3779 }
3780 }
3781#endif
3782 else
3783 {
3784 fComplete = eANI_BOOLEAN_TRUE;
3785 }
3786 if(fComplete)
3787 {
3788 // ... otherwise, we can complete the Roam command here.
Jeff Johnsone7245742012-09-05 17:12:55 -07003789 if(eCsrStopRoamingDueToConcurrency == RoamState)
3790 {
3791 csrRoamComplete( pMac, eCsrJoinFailureDueToConcurrency, NULL );
3792 }
3793 else
3794 {
3795 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
3796 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003797 }
3798 }
3799 else if ( eCsrReassocToSelfNoCapChange == RoamState )
3800 {
3801 csrRoamComplete( pMac, eCsrSilentlyStopRoamingSaveState, NULL );
3802 }
3803 else if ( eCsrStartIbssSameIbss == RoamState )
3804 {
3805 csrRoamComplete( pMac, eCsrSilentlyStopRoaming, NULL );
3806 }
3807 }//hddIsRadioStateOn
3808
3809 return status;
3810}
Jeff Johnson295189b2012-06-20 16:38:30 -07003811eHalStatus csrProcessFTReassocRoamCommand ( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3812{
3813 tANI_U32 sessionId;
3814 tCsrRoamSession *pSession;
3815 tCsrScanResult *pScanResult = NULL;
3816 tSirBssDescription *pBssDesc = NULL;
3817 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003818 sessionId = pCommand->sessionId;
3819 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003820
3821 if(!pSession)
3822 {
3823 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3824 return eHAL_STATUS_FAILURE;
3825 }
3826
Jeff Johnson295189b2012-06-20 16:38:30 -07003827 if(CSR_IS_ROAMING(pSession) && pSession->fCancelRoaming)
3828 {
3829 //the roaming is cancelled. Simply complete the command
3830 smsLog(pMac, LOG1, FL(" Roam command cancelled\n"));
3831 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
3832 return eHAL_STATUS_FAILURE;
3833 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003834 if (pCommand->u.roamCmd.pRoamBssEntry)
3835 {
3836 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
3837 pBssDesc = &pScanResult->Result.BssDescriptor;
3838 }
3839 else
3840 {
3841 //the roaming is cancelled. Simply complete the command
3842 smsLog(pMac, LOG1, FL(" Roam command cancelled\n"));
3843 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
3844 return eHAL_STATUS_FAILURE;
3845 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003846 status = csrRoamIssueReassociate(pMac, sessionId, pBssDesc,
3847 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ), &pCommand->u.roamCmd.roamProfile);
3848 return status;
3849}
3850
Jeff Johnson295189b2012-06-20 16:38:30 -07003851eHalStatus csrRoamProcessCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3852{
3853 eHalStatus status = eHAL_STATUS_SUCCESS;
3854 tCsrRoamInfo roamInfo;
3855 tANI_U32 sessionId = pCommand->sessionId;
3856 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003857
3858 if(!pSession)
3859 {
3860 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3861 return eHAL_STATUS_FAILURE;
3862 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003863
3864 switch ( pCommand->u.roamCmd.roamReason )
3865 {
3866 case eCsrForcedDisassoc:
3867 csrFreeRoamProfile(pMac, sessionId);
3868 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, FALSE );
3869 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003870 case eCsrSmeIssuedDisassocForHandoff:
3871 //Not to free pMac->roam.pCurRoamProfile (via csrFreeRoamProfile) because it is needed after disconnect
3872#if 0 // TODO : Confirm this change
3873 status = csrRoamProcessDisassociate( pMac, pCommand, FALSE );
3874#else
3875 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, FALSE );
3876#endif
3877
3878 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003879 case eCsrForcedDisassocMICFailure:
3880 csrFreeRoamProfile(pMac, sessionId);
3881 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, TRUE );
3882 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003883 case eCsrForcedDeauth:
3884 csrFreeRoamProfile(pMac, sessionId);
3885 status = csrRoamProcessDisassocDeauth( pMac, pCommand, FALSE, FALSE );
3886 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003887 case eCsrHddIssuedReassocToSameAP:
3888 case eCsrSmeIssuedReassocToSameAP:
3889 {
3890 tDot11fBeaconIEs *pIes = NULL;
3891
Jeff Johnson295189b2012-06-20 16:38:30 -07003892 if( pSession->pConnectBssDesc )
3893 {
3894 status = csrGetParsedBssDescriptionIEs(pMac, pSession->pConnectBssDesc, &pIes);
3895 if(!HAL_STATUS_SUCCESS(status) )
3896 {
3897 smsLog(pMac, LOGE, FL(" fail to parse IEs\n"));
3898 }
3899 else
3900 {
3901 roamInfo.reasonCode = eCsrRoamReasonStaCapabilityChanged;
3902 csrRoamCallCallback(pMac, pSession->sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
3903 pSession->roamingReason = eCsrReassocRoaming;
Jeff Johnson295189b2012-06-20 16:38:30 -07003904 roamInfo.pBssDesc = pSession->pConnectBssDesc;
3905 roamInfo.pProfile = &pCommand->u.roamCmd.roamProfile;
3906 pSession->bRefAssocStartCnt++;
3907 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
3908 eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
3909
3910 smsLog(pMac, LOG1, FL(" calling csrRoamIssueReassociate\n"));
3911 csrRoamIssueReassociate( pMac, sessionId, pSession->pConnectBssDesc, pIes,
3912 &pCommand->u.roamCmd.roamProfile );
3913 palFreeMemory(pMac->hHdd, pIes);
3914 pIes = NULL;
3915 }
3916 }
3917 break;
3918 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003919 case eCsrCapsChange:
3920 smsLog(pMac, LOGE, FL("received eCsrCapsChange \n"));
3921 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
3922 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE);
3923 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003924 case eCsrSmeIssuedFTReassoc:
3925 smsLog(pMac, LOGE, FL("received FT Reassoc Req \n"));
3926 status = csrProcessFTReassocRoamCommand(pMac, pCommand);
3927 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07003928
Jeff Johnson295189b2012-06-20 16:38:30 -07003929 case eCsrStopBss:
3930 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
3931 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3932 break;
3933
3934 case eCsrForcedDisassocSta:
3935 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
3936 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_DISASSOC_REQ, sessionId);
3937 status = csrSendMBDisassocReqMsg( pMac, sessionId, pCommand->u.roamCmd.peerMac,
3938 pCommand->u.roamCmd.reason);
3939 break;
3940
3941 case eCsrForcedDeauthSta:
3942 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
3943 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_DEAUTH_REQ, sessionId);
3944 status = csrSendMBDeauthReqMsg( pMac, sessionId, pCommand->u.roamCmd.peerMac,
3945 pCommand->u.roamCmd.reason);
3946 break;
3947
3948 default:
3949 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
3950
3951 if( pCommand->u.roamCmd.fUpdateCurRoamProfile )
3952 {
3953 //Remember the roaming profile
3954 csrFreeRoamProfile(pMac, sessionId);
3955 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pSession->pCurRoamProfile, sizeof(tCsrRoamProfile))))
3956 {
3957 palZeroMemory(pMac->hHdd, pSession->pCurRoamProfile, sizeof(tCsrRoamProfile));
3958 csrRoamCopyProfile(pMac, pSession->pCurRoamProfile, &pCommand->u.roamCmd.roamProfile);
3959 }
3960 }
3961
3962 //At this point, original uapsd_mask is saved in pCurRoamProfile
3963 //uapsd_mask in the pCommand may change from this point on.
3964
3965 // Attempt to roam with the new scan results (if we need to..)
3966 status = csrRoam( pMac, pCommand );
3967 break;
3968 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003969 return (status);
3970}
3971
Jeff Johnson295189b2012-06-20 16:38:30 -07003972void csrReinitRoamCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
3973{
3974 if(pCommand->u.roamCmd.fReleaseBssList)
3975 {
3976 csrScanResultPurge(pMac, pCommand->u.roamCmd.hBSSList);
3977 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_FALSE;
3978 pCommand->u.roamCmd.hBSSList = CSR_INVALID_SCANRESULT_HANDLE;
3979 }
3980 if(pCommand->u.roamCmd.fReleaseProfile)
3981 {
3982 csrReleaseProfile(pMac, &pCommand->u.roamCmd.roamProfile);
3983 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
3984 }
3985 pCommand->u.roamCmd.pRoamBssEntry = NULL;
3986 //Because u.roamCmd is union and share with scanCmd and StatusChange
3987 palZeroMemory(pMac->hHdd, &pCommand->u.roamCmd, sizeof(tRoamCmd));
3988}
3989
Jeff Johnson295189b2012-06-20 16:38:30 -07003990void csrReinitWmStatusChangeCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
3991{
3992 palZeroMemory(pMac->hHdd, &pCommand->u.wmStatusChangeCmd, sizeof(tWmStatusChangeCmd));
3993}
Jeff Johnson295189b2012-06-20 16:38:30 -07003994void csrRoamComplete( tpAniSirGlobal pMac, eCsrRoamCompleteResult Result, void *Context )
3995{
3996 tListElem *pEntry;
3997 tSmeCmd *pCommand;
3998 tANI_BOOLEAN fReleaseCommand = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003999 smsLog( pMac, LOG2, "roamQ: Roam Completion ...\n" );
Jeff Johnson295189b2012-06-20 16:38:30 -07004000 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
4001 if ( pEntry )
4002 {
4003 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07004004 // If the head of the queue is Active and it is a ROAM command, remove
4005 // and put this on the Free queue.
4006 if ( eSmeCommandRoam == pCommand->command )
4007 {
4008 //we need to process the result first before removing it from active list because state changes
4009 //still happening insides roamQProcessRoamResults so no other roam command should be issued
4010 fReleaseCommand = csrRoamProcessResults( pMac, pCommand, Result, Context );
4011 if( fReleaseCommand )
4012 {
4013 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
4014 {
4015 csrReleaseCommandRoam( pMac, pCommand );
4016 }
4017 else
4018 {
4019 smsLog( pMac, LOGE, " **********csrRoamComplete fail to release command reason %d\n",
4020 pCommand->u.roamCmd.roamReason );
4021 }
4022 }
4023 else
4024 {
4025 smsLog( pMac, LOGE, " **********csrRoamComplete fail to release command reason %d\n",
4026 pCommand->u.roamCmd.roamReason );
4027 }
4028 }
4029 else
4030 {
4031 smsLog( pMac, LOGW, "CSR: Roam Completion called but ROAM command is not ACTIVE ...\n" );
4032 }
4033 }
4034 else
4035 {
4036 smsLog( pMac, LOGW, "CSR: Roam Completion called but NO commands are ACTIVE ...\n" );
4037 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004038 if( fReleaseCommand )
4039 {
4040 smeProcessPendingQueue( pMac );
4041 }
4042}
4043
Jeff Johnson295189b2012-06-20 16:38:30 -07004044void csrResetPMKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId )
4045{
4046 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07004047 if(!pSession)
4048 {
4049 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4050 return;
4051 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004052 palZeroMemory( pMac->hHdd, &(pSession->PmkidCandidateInfo[0]), sizeof(tPmkidCandidateInfo) * CSR_MAX_PMKID_ALLOWED );
4053 pSession->NumPmkidCandidate = 0;
4054}
Jeff Johnson295189b2012-06-20 16:38:30 -07004055#ifdef FEATURE_WLAN_WAPI
4056void csrResetBKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId )
4057{
4058 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07004059 if(!pSession)
4060 {
4061 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4062 return;
4063 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004064 palZeroMemory( pMac->hHdd, &(pSession->BkidCandidateInfo[0]), sizeof(tBkidCandidateInfo) * CSR_MAX_BKID_ALLOWED );
4065 pSession->NumBkidCandidate = 0;
4066}
4067#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07004068extern tANI_U8 csrWpaOui[][ CSR_WPA_OUI_SIZE ];
4069
Jeff Johnson295189b2012-06-20 16:38:30 -07004070static eHalStatus csrRoamSaveSecurityRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrAuthType authType,
4071 tSirBssDescription *pSirBssDesc,
4072 tDot11fBeaconIEs *pIes)
4073{
4074 eHalStatus status = eHAL_STATUS_SUCCESS;
4075 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
4076 tDot11fBeaconIEs *pIesLocal = pIes;
Jeff Johnson32d95a32012-09-10 13:15:23 -07004077
4078 if(!pSession)
4079 {
4080 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4081 return eHAL_STATUS_FAILURE;
4082 }
4083
Jeff Johnson295189b2012-06-20 16:38:30 -07004084 if((eCSR_AUTH_TYPE_WPA == authType) ||
4085 (eCSR_AUTH_TYPE_WPA_PSK == authType) ||
4086 (eCSR_AUTH_TYPE_RSN == authType) ||
4087 (eCSR_AUTH_TYPE_RSN_PSK == authType)
4088#if defined WLAN_FEATURE_VOWIFI_11R
4089 ||
4090 (eCSR_AUTH_TYPE_FT_RSN == authType) ||
4091 (eCSR_AUTH_TYPE_FT_RSN_PSK == authType)
4092#endif /* FEATURE_WLAN_WAPI */
4093#ifdef FEATURE_WLAN_WAPI
4094 ||
4095 (eCSR_AUTH_TYPE_WAPI_WAI_PSK == authType) ||
4096 (eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE == authType)
4097#endif /* FEATURE_WLAN_WAPI */
4098 )
4099 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004100 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesLocal))) )
4101 {
4102 smsLog(pMac, LOGE, FL(" cannot parse IEs\n"));
4103 }
4104 if( pIesLocal )
4105 {
4106 tANI_U32 nIeLen;
4107 tANI_U8 *pIeBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07004108 if((eCSR_AUTH_TYPE_RSN == authType) ||
4109#if defined WLAN_FEATURE_VOWIFI_11R
4110 (eCSR_AUTH_TYPE_FT_RSN == authType) ||
4111 (eCSR_AUTH_TYPE_FT_RSN_PSK == authType) ||
4112#endif /* WLAN_FEATURE_VOWIFI_11R */
4113 (eCSR_AUTH_TYPE_RSN_PSK == authType))
4114 {
4115 if(pIesLocal->RSN.present)
4116 {
4117 //Calculate the actual length
4118 nIeLen = 8 //version + gp_cipher_suite + pwise_cipher_suite_count
4119 + pIesLocal->RSN.pwise_cipher_suite_count * 4 //pwise_cipher_suites
4120 + 2 //akm_suite_count
4121 + pIesLocal->RSN.akm_suite_count * 4 //akm_suites
4122 + 2; //reserved
4123 if( pIesLocal->RSN.pmkid_count )
4124 {
4125 nIeLen += 2 + pIesLocal->RSN.pmkid_count * 4; //pmkid
4126 }
4127 //nIeLen doesn't count EID and length fields
4128 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnRspIE, nIeLen + 2))))
4129 {
4130 pSession->pWpaRsnRspIE[0] = DOT11F_EID_RSN;
4131 pSession->pWpaRsnRspIE[1] = (tANI_U8)nIeLen;
4132 //copy upto akm_suites
4133 pIeBuf = pSession->pWpaRsnRspIE + 2;
4134 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->RSN.version, 8);
4135 pIeBuf += 8;
4136 if( pIesLocal->RSN.pwise_cipher_suite_count )
4137 {
4138 //copy pwise_cipher_suites
4139 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.pwise_cipher_suites,
4140 pIesLocal->RSN.pwise_cipher_suite_count * 4);
4141 pIeBuf += pIesLocal->RSN.pwise_cipher_suite_count * 4;
4142 }
4143 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->RSN.akm_suite_count, 2);
4144 pIeBuf += 2;
4145 if( pIesLocal->RSN.akm_suite_count )
4146 {
4147 //copy akm_suites
4148 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.akm_suites,
4149 pIesLocal->RSN.akm_suite_count * 4);
4150 pIeBuf += pIesLocal->RSN.akm_suite_count * 4;
4151 }
4152 //copy the rest
4153 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.akm_suites +
4154 pIesLocal->RSN.akm_suite_count * 4,
4155 2 + pIesLocal->RSN.pmkid_count * 4);
4156 pSession->nWpaRsnRspIeLength = nIeLen + 2;
4157 }
4158 }
4159 }
4160 else if((eCSR_AUTH_TYPE_WPA == authType) ||
4161 (eCSR_AUTH_TYPE_WPA_PSK == authType))
4162 {
4163 if(pIesLocal->WPA.present)
4164 {
4165 //Calculate the actual length
4166 nIeLen = 12 //OUI + version + multicast_cipher + unicast_cipher_count
4167 + pIesLocal->WPA.unicast_cipher_count * 4 //unicast_ciphers
4168 + 2 //auth_suite_count
4169 + pIesLocal->WPA.auth_suite_count * 4; //auth_suites
4170 // The WPA capabilities follows the Auth Suite (two octects)--
4171 // this field is optional, and we always "send" zero, so just
4172 // remove it. This is consistent with our assumptions in the
4173 // frames compiler; c.f. bug 15234:
4174 //nIeLen doesn't count EID and length fields
4175 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnRspIE, nIeLen + 2))))
4176 {
4177 pSession->pWpaRsnRspIE[0] = DOT11F_EID_WPA;
4178 pSession->pWpaRsnRspIE[1] = (tANI_U8)nIeLen;
4179 pIeBuf = pSession->pWpaRsnRspIE + 2;
4180 //Copy WPA OUI
4181 palCopyMemory(pMac->hHdd, pIeBuf, &csrWpaOui[1], 4);
4182 pIeBuf += 4;
4183 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WPA.version, 8 +
4184 pIesLocal->WPA.unicast_cipher_count * 4);
4185 pIeBuf += 8 + pIesLocal->WPA.unicast_cipher_count * 4;
4186 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WPA.auth_suite_count, 2 +
4187 pIesLocal->WPA.auth_suite_count * 4);
4188 pIeBuf += pIesLocal->WPA.auth_suite_count * 4;
4189 pSession->nWpaRsnRspIeLength = nIeLen + 2;
4190 }
4191 }
4192 }
4193#ifdef FEATURE_WLAN_WAPI
4194 else if((eCSR_AUTH_TYPE_WAPI_WAI_PSK == authType) ||
4195 (eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE == authType))
4196 {
4197 if(pIesLocal->WAPI.present)
4198 {
4199 //Calculate the actual length
4200 nIeLen = 4 //version + akm_suite_count
4201 + pIesLocal->WAPI.akm_suite_count * 4 // akm_suites
4202 + 2 //pwise_cipher_suite_count
4203 + pIesLocal->WAPI.unicast_cipher_suite_count * 4 //pwise_cipher_suites
4204 + 6; //gp_cipher_suite + preauth + reserved
4205 if( pIesLocal->WAPI.bkid_count )
4206 {
4207 nIeLen += 2 + pIesLocal->WAPI.bkid_count * 4; //bkid
4208 }
4209
4210 //nIeLen doesn't count EID and length fields
4211 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWapiRspIE, nIeLen + 2))))
4212 {
4213 pSession->pWapiRspIE[0] = DOT11F_EID_WAPI;
4214 pSession->pWapiRspIE[1] = (tANI_U8)nIeLen;
4215 pIeBuf = pSession->pWapiRspIE + 2;
4216 //copy upto akm_suite_count
4217 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.version, 4);
4218 pIeBuf += 4;
4219 if( pIesLocal->WAPI.akm_suite_count )
4220 {
4221 //copy akm_suites
4222 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.akm_suites,
4223 pIesLocal->WAPI.akm_suite_count * 4);
4224 pIeBuf += pIesLocal->WAPI.akm_suite_count * 4;
4225 }
4226 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.unicast_cipher_suite_count, 2);
4227 pIeBuf += 2;
Jeff Johnson295189b2012-06-20 16:38:30 -07004228 if( pIesLocal->WAPI.unicast_cipher_suite_count )
4229 {
4230 //copy pwise_cipher_suites
4231 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.unicast_cipher_suites,
4232 pIesLocal->WAPI.unicast_cipher_suite_count * 4);
4233 pIeBuf += pIesLocal->WAPI.unicast_cipher_suite_count * 4;
4234 }
4235 //gp_cipher_suite + preauth + reserved + bkid_count
4236 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.multicast_cipher_suite, 8);
4237 pIeBuf += 8;
4238 if( pIesLocal->WAPI.bkid_count )
4239 {
4240 //copy akm_suites
4241 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.bkid, pIesLocal->WAPI.bkid_count * 4);
4242 pIeBuf += pIesLocal->WAPI.bkid_count * 4;
4243 }
4244 pSession->nWapiRspIeLength = nIeLen + 2;
4245 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004246 }
4247 }
4248#endif /* FEATURE_WLAN_WAPI */
4249 if( !pIes )
4250 {
4251 //locally allocated
4252 palFreeMemory(pMac->hHdd, pIesLocal);
4253 }
4254 }
4255 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004256 return (status);
4257}
4258
Jeff Johnson295189b2012-06-20 16:38:30 -07004259static void csrCheckAndUpdateACWeight( tpAniSirGlobal pMac, tDot11fBeaconIEs *pIEs )
4260{
4261 v_U8_t bACWeights[WLANTL_MAX_AC];
4262 v_U8_t paramBk, paramBe, paramVi, paramVo;
4263 v_BOOL_t fWeightChange = VOS_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004264 //Compare two ACs' EDCA parameters, from low to high (BK, BE, VI, VO)
4265 //The "formula" is, if lower AC's AIFSN+CWMin is bigger than a fixed amount
4266 //of the higher AC one, make the higher AC has the same weight as the lower AC.
4267 //This doesn't address the case where the lower AC needs a real higher weight
4268 if( pIEs->WMMParams.present )
4269 {
4270 //no change to the lowest ones
4271 bACWeights[WLANTL_AC_BK] = pMac->roam.ucACWeights[WLANTL_AC_BK];
4272 bACWeights[WLANTL_AC_BE] = pMac->roam.ucACWeights[WLANTL_AC_BE];
4273 bACWeights[WLANTL_AC_VI] = pMac->roam.ucACWeights[WLANTL_AC_VI];
4274 bACWeights[WLANTL_AC_VO] = pMac->roam.ucACWeights[WLANTL_AC_VO];
4275 paramBk = pIEs->WMMParams.acbk_aifsn + pIEs->WMMParams.acbk_acwmin;
4276 paramBe = pIEs->WMMParams.acbe_aifsn + pIEs->WMMParams.acbe_acwmin;
4277 paramVi = pIEs->WMMParams.acvi_aifsn + pIEs->WMMParams.acvi_acwmin;
4278 paramVo = pIEs->WMMParams.acvo_aifsn + pIEs->WMMParams.acvo_acwmin;
4279 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramBe) )
4280 {
4281 bACWeights[WLANTL_AC_BE] = bACWeights[WLANTL_AC_BK];
4282 fWeightChange = VOS_TRUE;
4283 }
4284 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramVi) )
4285 {
4286 bACWeights[WLANTL_AC_VI] = bACWeights[WLANTL_AC_BK];
4287 fWeightChange = VOS_TRUE;
4288 }
4289 else if( SME_DETECT_AC_WEIGHT_DIFF(paramBe, paramVi) )
4290 {
4291 bACWeights[WLANTL_AC_VI] = bACWeights[WLANTL_AC_BE];
4292 fWeightChange = VOS_TRUE;
4293 }
4294 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramVo) )
4295 {
4296 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_BK];
4297 fWeightChange = VOS_TRUE;
4298 }
4299 else if( SME_DETECT_AC_WEIGHT_DIFF(paramBe, paramVo) )
4300 {
4301 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_BE];
4302 fWeightChange = VOS_TRUE;
4303 }
4304 else if( SME_DETECT_AC_WEIGHT_DIFF(paramVi, paramVo) )
4305 {
4306 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_VI];
4307 fWeightChange = VOS_TRUE;
4308 }
4309 if(fWeightChange)
4310 {
4311 smsLog(pMac, LOGE, FL(" change AC weights (%d-%d-%d-%d)\n"), bACWeights[0], bACWeights[1],
4312 bACWeights[2], bACWeights[3]);
4313 WLANTL_SetACWeights(pMac->roam.gVosContext, bACWeights);
4314 }
4315 }
4316}
Jeff Johnson295189b2012-06-20 16:38:30 -07004317#ifdef WLAN_FEATURE_VOWIFI_11R
4318//Returns whether the current association is a 11r assoc or not
4319tANI_BOOLEAN csrRoamIs11rAssoc(tpAniSirGlobal pMac)
4320{
4321#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
4322 return csrNeighborRoamIs11rAssoc(pMac);
4323#else
4324 return eANI_BOOLEAN_FALSE;
4325#endif
4326}
4327#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004328#ifdef FEATURE_WLAN_CCX
4329//Returns whether the current association is a CCX assoc or not
4330tANI_BOOLEAN csrRoamIsCCXAssoc(tpAniSirGlobal pMac)
4331{
4332#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
4333 return csrNeighborRoamIsCCXAssoc(pMac);
4334#else
4335 return eANI_BOOLEAN_FALSE;
4336#endif
4337}
4338#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004339#ifdef FEATURE_WLAN_LFR
4340//Returns whether "Legacy Fast Roaming" is currently enabled...or not
4341tANI_BOOLEAN csrRoamIsFastRoamEnabled(tpAniSirGlobal pMac)
4342{
4343 return pMac->roam.configParam.isFastRoamIniFeatureEnabled;
4344}
4345#endif
4346
Jeff Johnson295189b2012-06-20 16:38:30 -07004347//Return true means the command can be release, else not
4348static tANI_BOOLEAN csrRoamProcessResults( tpAniSirGlobal pMac, tSmeCmd *pCommand,
4349 eCsrRoamCompleteResult Result, void *Context )
4350{
4351 tANI_BOOLEAN fReleaseCommand = eANI_BOOLEAN_TRUE;
4352 tSirBssDescription *pSirBssDesc = NULL;
4353 tSirMacAddr BroadcastMac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
4354 tCsrScanResult *pScanResult = NULL;
4355 tCsrRoamInfo roamInfo;
4356 sme_QosAssocInfo assocInfo;
4357 sme_QosCsrEventIndType ind_qos;//indication for QoS module in SME
4358 tANI_U8 acm_mask = 0; //HDD needs the ACM mask in the assoc rsp callback
4359 tDot11fBeaconIEs *pIes = NULL;
4360 tANI_U32 sessionId = pCommand->sessionId;
4361 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
4362 tCsrRoamProfile *pProfile = &pCommand->u.roamCmd.roamProfile;
4363 eRoamCmdStatus roamStatus;
4364 eCsrRoamResult roamResult;
4365 eHalStatus status;
4366 tANI_U32 key_timeout_interval = 0;
4367#ifdef WLAN_SOFTAP_FEATURE
4368 tSirSmeStartBssRsp *pSmeStartBssRsp = NULL;
4369#endif
4370
Jeff Johnson32d95a32012-09-10 13:15:23 -07004371 if(!pSession)
4372 {
4373 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4374 return eANI_BOOLEAN_FALSE;
4375 }
4376
Jeff Johnson295189b2012-06-20 16:38:30 -07004377 smsLog( pMac, LOG1, FL("Processing ROAM results...\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004378 switch( Result )
4379 {
4380 case eCsrJoinSuccess:
4381 // reset the IDLE timer
4382 // !!
4383 // !! fall through to the next CASE statement here is intentional !!
4384 // !!
4385 case eCsrReassocSuccess:
4386 if(eCsrReassocSuccess == Result)
4387 {
4388 ind_qos = SME_QOS_CSR_REASSOC_COMPLETE;
4389 }
4390 else
4391 {
4392 ind_qos = SME_QOS_CSR_ASSOC_COMPLETE;
4393 }
4394 // Success Join Response from LIM. Tell NDIS we are connected and save the
4395 // Connected state...
4396 smsLog(pMac, LOGW, FL("receives association indication\n"));
4397 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
4398 //always free the memory here
4399 if(pSession->pWpaRsnRspIE)
4400 {
4401 pSession->nWpaRsnRspIeLength = 0;
4402 palFreeMemory(pMac->hHdd, pSession->pWpaRsnRspIE);
4403 pSession->pWpaRsnRspIE = NULL;
4404 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004405#ifdef FEATURE_WLAN_WAPI
4406 if(pSession->pWapiRspIE)
4407 {
4408 pSession->nWapiRspIeLength = 0;
4409 palFreeMemory(pMac->hHdd, pSession->pWapiRspIE);
4410 pSession->pWapiRspIE = NULL;
4411 }
4412#endif /* FEATURE_WLAN_WAPI */
4413#ifdef FEATURE_WLAN_BTAMP_UT_RF
4414 //Reset counter so no join retry is needed.
4415 pSession->maxRetryCount = 0;
4416 csrRoamStopJoinRetryTimer(pMac, sessionId);
4417#endif
4418 /* This creates problem since we have not saved the connected profile.
4419 So moving this after saving the profile
4420 */
4421 //csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED );
4422 if( CSR_IS_INFRASTRUCTURE( pProfile ) )
4423 {
4424 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED;
4425 }
4426 else
4427 {
4428 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED;
4429 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004430 //Use the last connected bssdesc for reassoc-ing to the same AP.
4431 //NOTE: What to do when reassoc to a different AP???
4432 if( (eCsrHddIssuedReassocToSameAP == pCommand->u.roamCmd.roamReason) ||
4433 (eCsrSmeIssuedReassocToSameAP == pCommand->u.roamCmd.roamReason) )
4434 {
4435 pSirBssDesc = pSession->pConnectBssDesc;
4436 if(pSirBssDesc)
4437 {
4438 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4439 }
4440 }
4441 else
4442 {
4443
4444 if(pCommand->u.roamCmd.pRoamBssEntry)
4445 {
4446 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
4447 if(pScanResult != NULL)
4448 {
4449 pSirBssDesc = &pScanResult->Result.BssDescriptor;
4450 //this can be NULL
4451 pIes = (tDot11fBeaconIEs *)( pScanResult->Result.pvIes );
4452 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4453 }
4454 }
4455 }
4456 if( pSirBssDesc )
4457 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004458 roamInfo.staId = HAL_STA_INVALID_IDX;
Jeff Johnson295189b2012-06-20 16:38:30 -07004459 csrRoamSaveConnectedInfomation(pMac, sessionId, pProfile, pSirBssDesc, pIes);
4460 //Save WPA/RSN IE
4461 csrRoamSaveSecurityRspIE(pMac, sessionId, pProfile->negotiatedAuthType, pSirBssDesc, pIes);
4462#ifdef FEATURE_WLAN_CCX
4463 roamInfo.isCCXAssoc = pSession->connectedProfile.isCCXAssoc;
4464#endif
4465
4466 // csrRoamStateChange also affects sub-state. Hence, csrRoamStateChange happens first and then
4467 // substate change.
4468 // Moving even save profile above so that below mentioned conditon is also met.
4469 // JEZ100225: Moved to after saving the profile. Fix needed in main/latest
4470 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07004471 // Make sure the Set Context is issued before link indication to NDIS. After link indication is
4472 // made to NDIS, frames could start flowing. If we have not set context with LIM, the frames
4473 // will be dropped for the security context may not be set properly.
4474 //
4475 // this was causing issues in the 2c_wlan_wep WHQL test when the SetContext was issued after the link
4476 // indication. (Link Indication happens in the profFSMSetConnectedInfra call).
4477 //
4478 // this reordering was done on titan_prod_usb branch and is being replicated here.
4479 //
4480
4481 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ) &&
4482 !pProfile->bWPSAssociation)
4483 {
4484 // Issue the set Context request to LIM to establish the Unicast STA context
4485 if( !HAL_STATUS_SUCCESS( csrRoamIssueSetContextReq( pMac, sessionId,
4486 pProfile->negotiatedUCEncryptionType,
4487 pSirBssDesc, &(pSirBssDesc->bssId),
4488 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ) ) ) // NO keys... these key parameters don't matter.
4489 {
4490 smsLog( pMac, LOGE, FL(" Set context for unicast fail\n") );
4491 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
4492 }
4493 // Issue the set Context request to LIM to establish the Broadcast STA context
4494 csrRoamIssueSetContextReq( pMac, sessionId, pProfile->negotiatedMCEncryptionType,
4495 pSirBssDesc, &BroadcastMac,
4496 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
4497 }
4498 else
4499 {
4500 //Need to wait for supplicant authtication
4501 roamInfo.fAuthRequired = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004502 //Set the subestate to WaitForKey in case authentiation is needed
4503 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_WAIT_FOR_KEY, sessionId );
4504
Jeff Johnson295189b2012-06-20 16:38:30 -07004505 if(pProfile->bWPSAssociation)
4506 {
4507 key_timeout_interval = CSR_WAIT_FOR_WPS_KEY_TIMEOUT_PERIOD;
4508 }
4509 else
4510 {
4511 key_timeout_interval = CSR_WAIT_FOR_KEY_TIMEOUT_PERIOD;
4512 }
4513
4514 //Save sessionId in case of timeout
4515 pMac->roam.WaitForKeyTimerInfo.sessionId = (tANI_U8)sessionId;
4516 //This time should be long enough for the rest of the process plus setting key
4517 if(!HAL_STATUS_SUCCESS( csrRoamStartWaitForKeyTimer( pMac, key_timeout_interval ) ) )
4518 {
4519 //Reset our state so nothting is blocked.
4520 smsLog( pMac, LOGE, FL(" Failed to start pre-auth timer\n") );
4521 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
4522 }
4523 }
4524
4525 assocInfo.pBssDesc = pSirBssDesc; //could be NULL
4526 assocInfo.pProfile = pProfile;
Jeff Johnson295189b2012-06-20 16:38:30 -07004527 if(Context)
4528 {
4529 tSirSmeJoinRsp *pJoinRsp = (tSirSmeJoinRsp *)Context;
4530 tANI_U32 len;
Jeff Johnson295189b2012-06-20 16:38:30 -07004531 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4532 len = pJoinRsp->assocReqLength + pJoinRsp->assocRspLength + pJoinRsp->beaconLength;
4533#ifdef WLAN_FEATURE_VOWIFI_11R
4534 len += pJoinRsp->parsedRicRspLen;
4535#endif /* WLAN_FEATURE_VOWIFI_11R */
4536#ifdef FEATURE_WLAN_CCX
4537 len += pJoinRsp->tspecIeLen;
4538#endif
4539 if(len)
4540 {
4541 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd,
4542 (void **)&pSession->connectedInfo.pbFrames, len)))
4543 {
4544 if(HAL_STATUS_SUCCESS( palCopyMemory(pMac->hHdd,
4545 pSession->connectedInfo.pbFrames, pJoinRsp->frames, len) ))
4546 {
4547 pSession->connectedInfo.nAssocReqLength = pJoinRsp->assocReqLength;
4548 pSession->connectedInfo.nAssocRspLength = pJoinRsp->assocRspLength;
4549 pSession->connectedInfo.nBeaconLength = pJoinRsp->beaconLength;
4550#ifdef WLAN_FEATURE_VOWIFI_11R
4551 pSession->connectedInfo.nRICRspLength = pJoinRsp->parsedRicRspLen;
4552#endif /* WLAN_FEATURE_VOWIFI_11R */
4553#ifdef FEATURE_WLAN_CCX
4554 pSession->connectedInfo.nTspecIeLength = pJoinRsp->tspecIeLen;
4555#endif
4556 roamInfo.nAssocReqLength = pJoinRsp->assocReqLength;
4557 roamInfo.nAssocRspLength = pJoinRsp->assocRspLength;
4558 roamInfo.nBeaconLength = pJoinRsp->beaconLength;
4559 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4560 }
4561 else
4562 {
4563 smsLog(pMac, LOGE, "%s: Copying of memory failed for %d bytes !!!\n",
4564 __FUNCTION__, len);
4565 palFreeMemory( pMac->hHdd, pSession->connectedInfo.pbFrames );
4566 pSession->connectedInfo.pbFrames = NULL;
4567 }
4568 }
4569 }
4570 if(pCommand->u.roamCmd.fReassoc)
4571 {
4572 roamInfo.fReassocReq = roamInfo.fReassocRsp = eANI_BOOLEAN_TRUE;
4573 }
4574 pSession->connectedInfo.staId = ( tANI_U8 )pJoinRsp->staId;
4575 roamInfo.staId = ( tANI_U8 )pJoinRsp->staId;
4576 roamInfo.ucastSig = ( tANI_U8 )pJoinRsp->ucastSig;
4577 roamInfo.bcastSig = ( tANI_U8 )pJoinRsp->bcastSig;
4578 }
4579 else
4580 {
4581 if(pCommand->u.roamCmd.fReassoc)
4582 {
4583 roamInfo.fReassocReq = roamInfo.fReassocRsp = eANI_BOOLEAN_TRUE;
4584 roamInfo.nAssocReqLength = pSession->connectedInfo.nAssocReqLength;
4585 roamInfo.nAssocRspLength = pSession->connectedInfo.nAssocRspLength;
4586 roamInfo.nBeaconLength = pSession->connectedInfo.nBeaconLength;
4587 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4588 }
4589 }
4590#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4591 // Indicate SME-QOS with reassoc success event, only after
4592 // copying the frames
4593 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, ind_qos, &assocInfo);
4594#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004595 roamInfo.pBssDesc = pSirBssDesc;
4596 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4597 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4598#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4599 acm_mask = sme_QosGetACMMask(pMac, pSirBssDesc, NULL);
4600#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
4601 pSession->connectedProfile.acm_mask = acm_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004602#ifdef FEATURE_WLAN_UAPSD_FW_TRG_FRAMES
4603 //start UAPSD if uapsd_mask is not 0 because HDD will configure for trigger frame
4604 //It may be better to let QoS do this????
4605 if( pSession->connectedProfile.modifyProfileFields.uapsd_mask )
4606 {
4607 smsLog(pMac, LOGE, " uapsd_mask (0x%X) set, request UAPSD now\n",
4608 pSession->connectedProfile.modifyProfileFields.uapsd_mask);
4609 pmcStartUapsd( pMac, NULL, NULL );
4610 }
4611#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004612 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
4613 if( pSession->bRefAssocStartCnt > 0 )
4614 {
4615 pSession->bRefAssocStartCnt--;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07004616 //Remove this code once SLM_Sessionization is supported
4617 //BMPS_WORKAROUND_NOT_NEEDED
4618 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) && ( csrIsConcurrentSessionRunning( pMac )))
Jeff Johnsone7245742012-09-05 17:12:55 -07004619 {
4620 pMac->roam.configParam.doBMPSWorkaround = 1;
4621 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004622 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_ASSOCIATED);
4623 }
4624
4625 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_NONE, eANI_BOOLEAN_TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004626 // reset the PMKID candidate list
4627 csrResetPMKIDCandidateList( pMac, sessionId );
4628 //Update TL's AC weight base on the current EDCA parameters
4629 //These parameters may change in the course of the connection, that sictuation
4630 //is not taken care here. This change is mainly to address a WIFI WMM test where
4631 //BE has a equal or higher TX priority than VI.
4632 //We only do this for infra link
4633 if( csrIsConnStateConnectedInfra(pMac, sessionId ) && pIes )
4634 {
4635 csrCheckAndUpdateACWeight(pMac, pIes);
4636 }
4637#ifdef FEATURE_WLAN_WAPI
4638 // reset the BKID candidate list
4639 csrResetBKIDCandidateList( pMac, sessionId );
4640#endif /* FEATURE_WLAN_WAPI */
4641 }
4642 else
4643 {
4644 smsLog(pMac, LOGW, " Roam command doesn't have a BSS desc\n");
4645 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004646 csrScanCancelIdleScan(pMac);
4647 //Not to signal link up because keys are yet to be set.
4648 //The linkup function will overwrite the sub-state that we need to keep at this point.
4649 if( !CSR_IS_WAIT_FOR_KEY(pMac, sessionId) )
4650 {
4651 csrRoamLinkUp(pMac, pSession->connectedProfile.bssid);
4652 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004653 //Check if BMPS is required and start the BMPS retry timer. Timer period is large
4654 //enough to let security and DHCP handshake succeed before entry into BMPS
4655 if (pmcShouldBmpsTimerRun(pMac))
4656 {
4657 if (pmcStartTrafficTimer(pMac, BMPS_TRAFFIC_TIMER_ALLOW_SECURITY_DHCP)
4658 != eHAL_STATUS_SUCCESS)
4659 {
4660 smsLog(pMac, LOGP, FL("Cannot start BMPS Retry timer"));
4661 }
4662 smsLog(pMac, LOG2, FL("BMPS Retry Timer already running or started"));
4663 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004664 break;
4665
Jeff Johnson295189b2012-06-20 16:38:30 -07004666 case eCsrStartBssSuccess:
4667 // on the StartBss Response, LIM is returning the Bss Description that we
4668 // are beaconing. Add this Bss Description to our scan results and
4669 // chain the Profile to this Bss Description. On a Start BSS, there was no
4670 // detected Bss description (no partner) so we issued the Start Bss to
4671 // start the Ibss without any Bss description. Lim was kind enough to return
4672 // the Bss Description that we start beaconing for the newly started Ibss.
4673 smsLog(pMac, LOG2, FL("receives start BSS ok indication\n"));
4674 status = eHAL_STATUS_FAILURE;
4675#ifdef WLAN_SOFTAP_FEATURE
4676 pSmeStartBssRsp = (tSirSmeStartBssRsp *)Context;
4677#endif
4678 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4679 if( CSR_IS_IBSS( pProfile ) )
4680 {
4681 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED;
4682 }
4683#ifdef WLAN_SOFTAP_FEATURE
4684 else if (CSR_IS_INFRA_AP(pProfile))
4685 {
4686 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED;
4687 }
4688#endif
4689 else
4690 {
4691 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED;
4692 }
4693 if( !CSR_IS_WDS_STA( pProfile ) )
4694 {
4695 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
4696#ifdef WLAN_SOFTAP_FEATURE
4697 pSirBssDesc = &pSmeStartBssRsp->bssDescription;
4698#else
4699 pSirBssDesc = (tSirBssDescription *)Context;
4700#endif
4701 if( !HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs( pMac, pSirBssDesc, &pIes )) )
4702 {
4703 smsLog(pMac, LOG2, FL("cannot parse IBSS IEs\n"));
4704 roamInfo.pBssDesc = pSirBssDesc;
4705 //We need to associate_complete it first, becasue Associate_start already indicated.
4706 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4707 eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_IBSS_START_FAILED );
4708 break;
4709 }
4710#ifdef WLAN_SOFTAP_FEATURE
4711 if (!CSR_IS_INFRA_AP(pProfile))
4712#endif
4713 {
4714 pScanResult = csrScanAppendBssDescription( pMac, pSirBssDesc, pIes );
4715 }
4716 csrRoamSaveConnectedBssDesc(pMac, sessionId, pSirBssDesc);
4717 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
4718 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4719 if(pSirBssDesc)
4720 {
4721 csrRoamSaveConnectedInfomation(pMac, sessionId, pProfile, pSirBssDesc, pIes);
4722 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4723 }
4724 //We are doen with the IEs so free it
4725 palFreeMemory(pMac->hHdd, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07004726#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4727 {
4728 vos_log_ibss_pkt_type *pIbssLog;
4729 tANI_U32 bi;
4730
4731 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
4732 if(pIbssLog)
4733 {
4734 if(CSR_INVALID_SCANRESULT_HANDLE == pCommand->u.roamCmd.hBSSList)
4735 {
4736 //We start the IBSS (didn't find any matched IBSS out there)
4737 pIbssLog->eventId = WLAN_IBSS_EVENT_START_IBSS_RSP;
4738 }
4739 else
4740 {
4741 pIbssLog->eventId = WLAN_IBSS_EVENT_JOIN_IBSS_RSP;
4742 }
4743 if(pSirBssDesc)
4744 {
4745 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pSirBssDesc->bssId, 6);
4746 pIbssLog->operatingChannel = pSirBssDesc->channelId;
4747 }
4748 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &bi)))
4749 {
4750 //***U8 is not enough for beacon interval
4751 pIbssLog->beaconInterval = (v_U8_t)bi;
4752 }
4753 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
4754 }
4755 }
4756#endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4757 //Only set context for non-WDS_STA. We don't even need it for WDS_AP. But since the encryption
4758 //is WPA2-PSK so it won't matter.
Jeff Johnson295189b2012-06-20 16:38:30 -07004759#ifdef WLAN_SOFTAP_FEATURE
4760 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ) && !CSR_IS_INFRA_AP( pSession->pCurRoamProfile ))
4761 {
4762#else
4763 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ))
4764 {
4765#endif
4766 // Issue the set Context request to LIM to establish the Broadcast STA context for the Ibss.
4767 csrRoamIssueSetContextReq( pMac, sessionId,
4768 pProfile->negotiatedMCEncryptionType,
4769 pSirBssDesc, &BroadcastMac,
4770 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
4771 }
4772 }
4773 else
4774 {
4775 //Keep the state to eCSR_ROAMING_STATE_JOINING
4776 //Need to send join_req.
4777 if(pCommand->u.roamCmd.pRoamBssEntry)
4778 {
4779 if((pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link)))
4780 {
4781 pSirBssDesc = &pScanResult->Result.BssDescriptor;
4782 pIes = (tDot11fBeaconIEs *)( pScanResult->Result.pvIes );
4783 // Set the roaming substate to 'join attempt'...
4784 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_JOIN_REQ, sessionId);
4785 status = csrSendJoinReqMsg( pMac, sessionId, pSirBssDesc, pProfile, pIes );
4786 }
4787 }
4788 else
4789 {
4790 smsLog( pMac, LOGE, " StartBSS for WDS station with no BssDesc\n" );
4791 VOS_ASSERT( 0 );
4792 }
4793 }
4794 //Only tell upper layer is we start the BSS because Vista doesn't like multiple connection
4795 //indications. If we don't start the BSS ourself, handler of eSIR_SME_JOINED_NEW_BSS will
4796 //trigger the connection start indication in Vista
4797 if( !CSR_IS_JOIN_TO_IBSS( pProfile ) )
4798 {
4799 roamStatus = eCSR_ROAM_IBSS_IND;
4800 roamResult = eCSR_ROAM_RESULT_IBSS_STARTED;
4801 if( CSR_IS_WDS( pProfile ) )
4802 {
4803 roamStatus = eCSR_ROAM_WDS_IND;
4804 roamResult = eCSR_ROAM_RESULT_WDS_STARTED;
4805 }
4806#ifdef WLAN_SOFTAP_FEATURE
4807 if( CSR_IS_INFRA_AP( pProfile ) )
4808 {
4809 roamStatus = eCSR_ROAM_INFRA_IND;
4810 roamResult = eCSR_ROAM_RESULT_INFRA_STARTED;
4811 }
4812#endif
4813
4814 //Only tell upper layer is we start the BSS because Vista doesn't like multiple connection
4815 //indications. If we don't start the BSS ourself, handler of eSIR_SME_JOINED_NEW_BSS will
4816 //trigger the connection start indication in Vista
4817 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4818 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4819 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4820 if(CSR_INVALID_SCANRESULT_HANDLE == pCommand->u.roamCmd.hBSSList)
4821 {
4822 //We start the IBSS (didn't find any matched IBSS out there)
4823 roamInfo.pBssDesc = pSirBssDesc;
4824 }
4825#ifdef WLAN_SOFTAP_FEATURE
4826 roamInfo.staId = (tANI_U8)pSmeStartBssRsp->staId;
4827#endif
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07004828 //Remove this code once SLM_Sessionization is supported
4829 //BMPS_WORKAROUND_NOT_NEEDED
4830 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) &&
Mohit Khanna349bc392012-09-11 17:24:52 -07004831 ( csrIsConcurrentSessionRunning( pMac )))
Jeff Johnsone7245742012-09-05 17:12:55 -07004832 {
4833 pMac->roam.configParam.doBMPSWorkaround = 1;
4834 }
Mohit Khanna349bc392012-09-11 17:24:52 -07004835
Jeff Johnson295189b2012-06-20 16:38:30 -07004836 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, roamStatus, roamResult );
4837 }
4838
4839 csrScanCancelIdleScan(pMac);
4840 //Only use this timer for ibss. BAP has its own timer for WDS
4841 if( CSR_IS_IBSS( pProfile) && CSR_INVALID_SCANRESULT_HANDLE != pCommand->u.roamCmd.hBSSList)
4842 {
4843 //start the join IBSS timer
4844 csrRoamStartIbssJoinTimer(pMac, sessionId, CSR_IBSS_JOIN_TIMEOUT_PERIOD); //interval
4845 pSession->ibss_join_pending = TRUE;
4846 }
4847 if( HAL_STATUS_SUCCESS( status ) )
4848 {
4849 //Already sent join_req for the WDS station
4850 fReleaseCommand = eANI_BOOLEAN_FALSE;
4851 }
4852 else if( CSR_IS_WDS_STA( pProfile ) )
4853 {
4854 //need to send stop BSS because we fail to send join_req
4855 csrRoamIssueDisassociateCmd( pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED );
4856 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4857 eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_STOPPED );
4858 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004859 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004860 case eCsrStartBssFailure:
4861#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4862 {
4863 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07004864 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
4865 if(pIbssLog)
4866 {
4867 pIbssLog->status = WLAN_IBSS_STATUS_FAILURE;
4868 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
4869 }
4870 }
4871#endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07004872 roamStatus = eCSR_ROAM_IBSS_IND;
4873 roamResult = eCSR_ROAM_RESULT_IBSS_STARTED;
4874 if( CSR_IS_WDS( pProfile ) )
4875 {
4876 roamStatus = eCSR_ROAM_WDS_IND;
4877 roamResult = eCSR_ROAM_RESULT_WDS_STARTED;
4878 }
4879#ifdef WLAN_SOFTAP_FEATURE
4880 if( CSR_IS_INFRA_AP( pProfile ) )
4881 {
4882 roamStatus = eCSR_ROAM_INFRA_IND;
4883 roamResult = eCSR_ROAM_RESULT_INFRA_START_FAILED;
4884 }
4885#endif
4886 if(Context)
4887 {
4888 pSirBssDesc = (tSirBssDescription *)Context;
4889 }
4890 else
4891 {
4892 pSirBssDesc = NULL;
4893 }
4894 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4895 roamInfo.pBssDesc = pSirBssDesc;
4896 //We need to associate_complete it first, becasue Associate_start already indicated.
4897 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, roamStatus, roamResult );
4898 csrSetDefaultDot11Mode( pMac );
4899 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004900 case eCsrSilentlyStopRoaming:
4901 // We are here because we try to start the same IBSS
4902 //No message to PE
4903 // return the roaming state to Joined.
4904 smsLog(pMac, LOGW, FL("receives silently roaming indication\n"));
4905 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
4906 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
4907 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4908 roamInfo.pBssDesc = pSession->pConnectBssDesc;
4909 if( roamInfo.pBssDesc )
4910 {
4911 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &roamInfo.pBssDesc->bssId, sizeof(tCsrBssid));
4912 }
4913 //Since there is no change in the current state, simply pass back no result otherwise
4914 //HDD may be mistakenly mark to disconnected state.
4915 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4916 eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_NONE );
Jeff Johnson295189b2012-06-20 16:38:30 -07004917 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004918 case eCsrSilentlyStopRoamingSaveState:
4919 //We are here because we try to connect to the same AP
4920 //No message to PE
4921 smsLog(pMac, LOGW, FL("receives silently stop roaming indication\n"));
4922 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
4923
4924 //to aviod resetting the substate to NONE
4925 pMac->roam.curState[sessionId] = eCSR_ROAMING_STATE_JOINED;
4926 //No need to change substate to wai_for_key because there is no state change
4927 roamInfo.pBssDesc = pSession->pConnectBssDesc;
4928 if( roamInfo.pBssDesc )
4929 {
4930 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &roamInfo.pBssDesc->bssId, sizeof(tCsrBssid));
4931 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004932 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4933 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4934 roamInfo.nBeaconLength = pSession->connectedInfo.nBeaconLength;
4935 roamInfo.nAssocReqLength = pSession->connectedInfo.nAssocReqLength;
4936 roamInfo.nAssocRspLength = pSession->connectedInfo.nAssocRspLength;
4937 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4938 roamInfo.staId = pSession->connectedInfo.staId;
4939 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
4940#if defined(VOSS_ENABLED)
4941 VOS_ASSERT( roamInfo.staId != 0 );
4942#endif
4943 pSession->bRefAssocStartCnt--;
4944 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4945 eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_ASSOCIATED);
4946 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_ASSOCIATED, eANI_BOOLEAN_TRUE);
4947 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004948 case eCsrReassocFailure:
4949#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4950 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_REASSOC_FAILURE, NULL);
4951#endif
4952 case eCsrJoinWdsFailure:
4953 smsLog(pMac, LOGW, FL("failed to join WDS\n"));
4954 csrFreeConnectBssDesc(pMac, sessionId);
4955 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
4956 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4957 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4958 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
4959 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4960 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4961 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4962 eCSR_ROAM_WDS_IND,
4963 eCSR_ROAM_RESULT_WDS_NOT_ASSOCIATED);
4964 //Need to issue stop_bss
4965 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004966 case eCsrJoinFailure:
4967 case eCsrNothingToJoin:
Jeff Johnsone7245742012-09-05 17:12:55 -07004968 case eCsrJoinFailureDueToConcurrency:
Jeff Johnson295189b2012-06-20 16:38:30 -07004969 default:
4970 {
4971 smsLog(pMac, LOGW, FL("receives no association indication\n"));
4972 if( CSR_IS_INFRASTRUCTURE( &pSession->connectedProfile ) ||
4973 CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ( pMac, sessionId ) )
4974 {
4975 //do not free for the other profiles as we need to send down stop BSS later
4976 csrFreeConnectBssDesc(pMac, sessionId);
4977 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
4978 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4979 csrSetDefaultDot11Mode( pMac );
4980 }
4981
4982 switch( pCommand->u.roamCmd.roamReason )
4983 {
4984 // If this transition is because of an 802.11 OID, then we transition
4985 // back to INIT state so we sit waiting for more OIDs to be issued and
4986 // we don't start the IDLE timer.
Jeff Johnsone7245742012-09-05 17:12:55 -07004987 case eCsrSmeIssuedFTReassoc:
Jeff Johnson295189b2012-06-20 16:38:30 -07004988 case eCsrSmeIssuedAssocToSimilarAP:
4989 case eCsrHddIssued:
4990 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
4991 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4992 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
4993 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4994 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07004995 /* Defeaturize this later if needed */
4996#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
4997 /* If Join fails while Handoff is in progress, indicate disassociated event to supplicant to reconnect */
4998 if (csrRoamIsHandoffInProgress(pMac))
4999 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005000 /* Should indicate neighbor roam algorithm about the connect failure here */
5001 csrNeighborRoamIndicateConnect(pMac, (tANI_U8)sessionId, VOS_STATUS_E_FAILURE);
5002 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005003#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005004 if(pSession->bRefAssocStartCnt > 0)
5005 {
5006 pSession->bRefAssocStartCnt--;
Jeff Johnsone7245742012-09-05 17:12:55 -07005007 if(eCsrJoinFailureDueToConcurrency == Result)
5008 {
5009 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
5010 eCSR_ROAM_ASSOCIATION_COMPLETION,
5011 eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL);
5012 }
5013 else
5014 {
5015 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
Jeff Johnson295189b2012-06-20 16:38:30 -07005016 eCSR_ROAM_ASSOCIATION_COMPLETION,
5017 eCSR_ROAM_RESULT_FAILURE);
Jeff Johnsone7245742012-09-05 17:12:55 -07005018 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005019 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005020 smsLog(pMac, LOG1, FL(" roam(reason %d) failed\n"), pCommand->u.roamCmd.roamReason);
5021#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5022 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5023#endif
5024 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5025 csrScanStartIdleScan(pMac);
5026#ifdef FEATURE_WLAN_BTAMP_UT_RF
5027 //For WDS STA. To fix the issue where the WDS AP side may be too busy by
5028 //BT activity and not able to recevie WLAN traffic. Retry the join
5029 if( CSR_IS_WDS_STA(pProfile) )
5030 {
5031 csrRoamStartJoinRetryTimer(pMac, sessionId, CSR_JOIN_RETRY_TIMEOUT_PERIOD);
5032 }
5033#endif
5034 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005035 case eCsrHddIssuedReassocToSameAP:
5036 case eCsrSmeIssuedReassocToSameAP:
5037 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId);
5038
5039 csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.roamCmd.roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
5040#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5041 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5042#endif
5043 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5044 csrScanStartIdleScan(pMac);
5045 break;
5046 case eCsrForcedDisassoc:
5047 case eCsrForcedDeauth:
5048 case eCsrSmeIssuedIbssJoinFailure:
5049 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId);
5050
5051 if(eCsrSmeIssuedIbssJoinFailure == pCommand->u.roamCmd.roamReason)
5052 {
5053 // Notify HDD that IBSS join failed
5054 csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_IBSS_JOIN_FAILED);
5055 }
5056 else
5057 {
5058 csrRoamCallCallback(pMac, sessionId, NULL,
5059 pCommand->u.roamCmd.roamId,
5060 eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
5061 }
5062#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5063 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5064#endif
5065 csrRoamLinkDown(pMac, sessionId);
5066 csrScanStartIdleScan(pMac);
5067 break;
5068 case eCsrForcedIbssLeave:
5069 csrRoamCallCallback(pMac, sessionId, NULL,
5070 pCommand->u.roamCmd.roamId,
5071 eCSR_ROAM_IBSS_LEAVE,
5072 eCSR_ROAM_RESULT_IBSS_STOP);
5073 break;
5074 case eCsrForcedDisassocMICFailure:
5075 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5076
5077 csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.roamCmd.roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_MIC_FAILURE);
5078#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5079 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_REQ, NULL);
5080#endif
5081 csrScanStartIdleScan(pMac);
5082 break;
5083#ifdef WLAN_SOFTAP_FEATURE
5084 case eCsrStopBss:
5085 csrRoamCallCallback(pMac, sessionId, NULL,
5086 pCommand->u.roamCmd.roamId,
5087 eCSR_ROAM_INFRA_IND,
5088 eCSR_ROAM_RESULT_INFRA_STOPPED);
5089 break;
5090 case eCsrForcedDisassocSta:
5091 case eCsrForcedDeauthSta:
5092 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId);
5093 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
5094 {
5095 pSession = CSR_GET_SESSION(pMac, sessionId);
5096 if (!pSession)
5097 break;
5098
5099 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
5100 {
5101 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
5102 palCopyMemory(pMac->hHdd, roamInfo.peerMac,
5103 pCommand->u.roamCmd.peerMac, sizeof(tSirMacAddr));
5104 roamInfo.reasonCode = eCSR_ROAM_RESULT_FORCED;
5105 roamInfo.statusCode = eSIR_SME_SUCCESS;
5106 status = csrRoamCallCallback(pMac, sessionId,
5107 &roamInfo, pCommand->u.roamCmd.roamId,
5108 eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
5109 }
5110 }
5111 break;
5112#endif
5113 case eCsrLostLink1:
5114 // if lost link roam1 failed, then issue lost link Scan2 ...
5115 csrScanRequestLostLink2(pMac, sessionId);
5116 break;
5117 case eCsrLostLink2:
5118 // if lost link roam2 failed, then issue lost link scan3 ...
5119 csrScanRequestLostLink3(pMac, sessionId);
5120 break;
5121 case eCsrLostLink3:
5122 default:
5123 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5124
5125 //We are done with one round of lostlink roaming here
5126 csrScanHandleFailedLostlink3(pMac, sessionId);
5127 break;
5128 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005129 break;
5130 }
5131 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005132 return ( fReleaseCommand );
5133}
5134
Jeff Johnson295189b2012-06-20 16:38:30 -07005135eHalStatus csrRoamRegisterCallback(tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext)
5136{
5137 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07005138 return (status);
5139}
5140
Jeff Johnson295189b2012-06-20 16:38:30 -07005141eHalStatus csrRoamCopyProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pDstProfile, tCsrRoamProfile *pSrcProfile)
5142{
5143 eHalStatus status = eHAL_STATUS_SUCCESS;
5144 tANI_U32 size = 0;
5145
5146 do
5147 {
5148 palZeroMemory(pMac->hHdd, pDstProfile, sizeof(tCsrRoamProfile));
5149 if(pSrcProfile->BSSIDs.numOfBSSIDs)
5150 {
5151 size = sizeof(tCsrBssid) * pSrcProfile->BSSIDs.numOfBSSIDs;
5152 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->BSSIDs.bssid, size);
5153 if(!HAL_STATUS_SUCCESS(status))
5154 {
5155 break;
5156 }
5157 pDstProfile->BSSIDs.numOfBSSIDs = pSrcProfile->BSSIDs.numOfBSSIDs;
5158 palCopyMemory(pMac->hHdd, pDstProfile->BSSIDs.bssid, pSrcProfile->BSSIDs.bssid, size);
5159 }
5160 if(pSrcProfile->SSIDs.numOfSSIDs)
5161 {
5162 size = sizeof(tCsrSSIDInfo) * pSrcProfile->SSIDs.numOfSSIDs;
5163 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->SSIDs.SSIDList, size);
5164 if(!HAL_STATUS_SUCCESS(status))
5165 {
5166 break;
5167 }
5168 pDstProfile->SSIDs.numOfSSIDs = pSrcProfile->SSIDs.numOfSSIDs;
5169 palCopyMemory(pMac->hHdd, pDstProfile->SSIDs.SSIDList, pSrcProfile->SSIDs.SSIDList, size);
5170 }
5171 if(pSrcProfile->nWPAReqIELength)
5172 {
5173 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pWPAReqIE, pSrcProfile->nWPAReqIELength);
5174 if(!HAL_STATUS_SUCCESS(status))
5175 {
5176 break;
5177 }
5178 pDstProfile->nWPAReqIELength = pSrcProfile->nWPAReqIELength;
5179 palCopyMemory(pMac->hHdd, pDstProfile->pWPAReqIE, pSrcProfile->pWPAReqIE, pSrcProfile->nWPAReqIELength);
5180 }
5181 if(pSrcProfile->nRSNReqIELength)
5182 {
5183 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pRSNReqIE, pSrcProfile->nRSNReqIELength);
5184 if(!HAL_STATUS_SUCCESS(status))
5185 {
5186 break;
5187 }
5188 pDstProfile->nRSNReqIELength = pSrcProfile->nRSNReqIELength;
5189 palCopyMemory(pMac->hHdd, pDstProfile->pRSNReqIE, pSrcProfile->pRSNReqIE, pSrcProfile->nRSNReqIELength);
5190 }
5191#ifdef FEATURE_WLAN_WAPI
5192 if(pSrcProfile->nWAPIReqIELength)
5193 {
5194 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pWAPIReqIE, pSrcProfile->nWAPIReqIELength);
5195 if(!HAL_STATUS_SUCCESS(status))
5196 {
5197 break;
5198 }
5199 pDstProfile->nWAPIReqIELength = pSrcProfile->nWAPIReqIELength;
5200 palCopyMemory(pMac->hHdd, pDstProfile->pWAPIReqIE, pSrcProfile->pWAPIReqIE, pSrcProfile->nWAPIReqIELength);
5201 }
5202#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07005203 if(pSrcProfile->nAddIEScanLength)
5204 {
5205 status = palAllocateMemory(pMac->hHdd,
5206 (void **)&pDstProfile->pAddIEScan, pSrcProfile->nAddIEScanLength);
5207 if(!HAL_STATUS_SUCCESS(status))
5208 {
5209 break;
5210 }
5211 pDstProfile->nAddIEScanLength = pSrcProfile->nAddIEScanLength;
5212 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEScan, pSrcProfile->pAddIEScan,
5213 pSrcProfile->nAddIEScanLength);
5214 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005215 if(pSrcProfile->nAddIEAssocLength)
5216 {
5217 status = palAllocateMemory(pMac->hHdd,
5218 (void **)&pDstProfile->pAddIEAssoc, pSrcProfile->nAddIEAssocLength);
5219 if(!HAL_STATUS_SUCCESS(status))
5220 {
5221 break;
5222 }
5223 pDstProfile->nAddIEAssocLength = pSrcProfile->nAddIEAssocLength;
5224 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEAssoc, pSrcProfile->pAddIEAssoc,
5225 pSrcProfile->nAddIEAssocLength);
5226 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005227 if(pSrcProfile->ChannelInfo.ChannelList)
5228 {
5229 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.numOfChannels);
5230 if(!HAL_STATUS_SUCCESS(status))
5231 {
5232 break;
5233 }
5234 pDstProfile->ChannelInfo.numOfChannels = pSrcProfile->ChannelInfo.numOfChannels;
5235 palCopyMemory(pMac->hHdd, pDstProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.numOfChannels);
5236 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005237 pDstProfile->AuthType = pSrcProfile->AuthType;
5238 pDstProfile->EncryptionType = pSrcProfile->EncryptionType;
5239 pDstProfile->mcEncryptionType = pSrcProfile->mcEncryptionType;
5240 pDstProfile->negotiatedUCEncryptionType = pSrcProfile->negotiatedUCEncryptionType;
5241 pDstProfile->negotiatedMCEncryptionType = pSrcProfile->negotiatedMCEncryptionType;
5242 pDstProfile->negotiatedAuthType = pSrcProfile->negotiatedAuthType;
5243 pDstProfile->BSSType = pSrcProfile->BSSType;
5244 pDstProfile->phyMode = pSrcProfile->phyMode;
5245 pDstProfile->csrPersona = pSrcProfile->csrPersona;
5246
5247#ifdef FEATURE_WLAN_WAPI
5248 if(csrIsProfileWapi(pSrcProfile))
5249 {
5250 if(pDstProfile->phyMode & eCSR_DOT11_MODE_11n)
5251 {
5252 pDstProfile->phyMode &= ~eCSR_DOT11_MODE_11n;
5253 }
5254 }
5255#endif /* FEATURE_WLAN_WAPI */
5256 pDstProfile->CBMode = pSrcProfile->CBMode;
5257 /*Save the WPS info*/
5258 pDstProfile->bWPSAssociation = pSrcProfile->bWPSAssociation;
5259 pDstProfile->uapsd_mask = pSrcProfile->uapsd_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07005260 pDstProfile->beaconInterval = pSrcProfile->beaconInterval;
5261#ifdef WLAN_SOFTAP_FEATURE
5262 pDstProfile->privacy = pSrcProfile->privacy;
5263 pDstProfile->fwdWPSPBCProbeReq = pSrcProfile->fwdWPSPBCProbeReq;
5264 pDstProfile->csr80211AuthType = pSrcProfile->csr80211AuthType;
5265 pDstProfile->dtimPeriod = pSrcProfile->dtimPeriod;
5266 pDstProfile->ApUapsdEnable = pSrcProfile->ApUapsdEnable;
5267 pDstProfile->SSIDs.SSIDList[0].ssidHidden = pSrcProfile->SSIDs.SSIDList[0].ssidHidden;
5268 pDstProfile->protEnabled = pSrcProfile->protEnabled;
5269 pDstProfile->obssProtEnabled = pSrcProfile->obssProtEnabled;
5270 pDstProfile->cfg_protection = pSrcProfile->cfg_protection;
5271 pDstProfile->wps_state = pSrcProfile->wps_state;
5272 pDstProfile->ieee80211d = pSrcProfile->ieee80211d;
5273#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005274 palCopyMemory(pMac->hHdd, &pDstProfile->Keys, &pSrcProfile->Keys, sizeof(pDstProfile->Keys));
Jeff Johnson295189b2012-06-20 16:38:30 -07005275#ifdef WLAN_FEATURE_VOWIFI_11R
5276 if (pSrcProfile->MDID.mdiePresent)
5277 {
5278 pDstProfile->MDID.mdiePresent = 1;
5279 pDstProfile->MDID.mobilityDomain = pSrcProfile->MDID.mobilityDomain;
5280 }
5281#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005282 }while(0);
5283
5284 if(!HAL_STATUS_SUCCESS(status))
5285 {
5286 csrReleaseProfile(pMac, pDstProfile);
5287 pDstProfile = NULL;
5288 }
5289
5290 return (status);
5291}
Jeff Johnson295189b2012-06-20 16:38:30 -07005292eHalStatus csrRoamCopyConnectedProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pDstProfile )
5293{
5294 eHalStatus status = eHAL_STATUS_SUCCESS;
5295 tCsrRoamConnectedProfile *pSrcProfile = &pMac->roam.roamSession[sessionId].connectedProfile;
5296 do
5297 {
5298 palZeroMemory(pMac->hHdd, pDstProfile, sizeof(tCsrRoamProfile));
5299 if(pSrcProfile->bssid)
5300 {
5301 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->BSSIDs.bssid, sizeof(tCsrBssid));
5302 if(!HAL_STATUS_SUCCESS(status))
5303 {
5304 break;
5305 }
5306 pDstProfile->BSSIDs.numOfBSSIDs = 1;
5307 palCopyMemory(pMac->hHdd, pDstProfile->BSSIDs.bssid, pSrcProfile->bssid, sizeof(tCsrBssid));
5308 }
5309 if(pSrcProfile->SSID.ssId)
5310 {
5311 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->SSIDs.SSIDList, sizeof(tCsrSSIDInfo));
5312 if(!HAL_STATUS_SUCCESS(status))
5313 {
5314 break;
5315 }
5316 pDstProfile->SSIDs.numOfSSIDs = 1;
5317 pDstProfile->SSIDs.SSIDList[0].handoffPermitted = pSrcProfile->handoffPermitted;
5318 pDstProfile->SSIDs.SSIDList[0].ssidHidden = pSrcProfile->ssidHidden;
5319 palCopyMemory(pMac->hHdd, &pDstProfile->SSIDs.SSIDList[0].SSID, &pSrcProfile->SSID, sizeof(tSirMacSSid));
5320 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005321 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->ChannelInfo.ChannelList, 1);
5322 if(!HAL_STATUS_SUCCESS(status))
5323 {
5324 break;
5325 }
5326 pDstProfile->ChannelInfo.numOfChannels = 1;
5327 pDstProfile->ChannelInfo.ChannelList[0] = pSrcProfile->operationChannel;
Jeff Johnson295189b2012-06-20 16:38:30 -07005328 pDstProfile->AuthType.numEntries = 1;
5329 pDstProfile->AuthType.authType[0] = pSrcProfile->AuthType;
5330 pDstProfile->negotiatedAuthType = pSrcProfile->AuthType;
5331 pDstProfile->EncryptionType.numEntries = 1;
5332 pDstProfile->EncryptionType.encryptionType[0] = pSrcProfile->EncryptionType;
5333 pDstProfile->negotiatedUCEncryptionType = pSrcProfile->EncryptionType;
5334 pDstProfile->mcEncryptionType.numEntries = 1;
5335 pDstProfile->mcEncryptionType.encryptionType[0] = pSrcProfile->mcEncryptionType;
5336 pDstProfile->negotiatedMCEncryptionType = pSrcProfile->mcEncryptionType;
5337 pDstProfile->BSSType = pSrcProfile->BSSType;
5338 pDstProfile->CBMode = pSrcProfile->CBMode;
5339 palCopyMemory(pMac->hHdd, &pDstProfile->Keys, &pSrcProfile->Keys, sizeof(pDstProfile->Keys));
5340#ifdef WLAN_FEATURE_VOWIFI_11R
5341 if (pSrcProfile->MDID.mdiePresent)
5342 {
5343 pDstProfile->MDID.mdiePresent = 1;
5344 pDstProfile->MDID.mobilityDomain = pSrcProfile->MDID.mobilityDomain;
5345 }
5346#endif
5347
5348 }while(0);
5349
5350 if(!HAL_STATUS_SUCCESS(status))
5351 {
5352 csrReleaseProfile(pMac, pDstProfile);
5353 pDstProfile = NULL;
5354 }
5355
5356 return (status);
5357}
5358
Jeff Johnson295189b2012-06-20 16:38:30 -07005359eHalStatus csrRoamIssueConnect(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5360 tScanResultHandle hBSSList,
5361 eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate,
5362 tANI_BOOLEAN fClearScan)
5363{
5364 eHalStatus status = eHAL_STATUS_SUCCESS;
5365 tSmeCmd *pCommand;
5366
5367 pCommand = csrGetCommandBuffer(pMac);
5368 if(NULL == pCommand)
5369 {
5370 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5371 status = eHAL_STATUS_RESOURCES;
5372 }
5373 else
5374 {
5375 if( fClearScan )
5376 {
5377 csrScanCancelIdleScan(pMac);
5378 csrScanAbortMacScanNotForConnect(pMac);
5379 }
5380 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
5381 if(NULL == pProfile)
5382 {
5383 //We can roam now
5384 //Since pProfile is NULL, we need to build our own profile, set everything to default
5385 //We can only support open and no encryption
5386 pCommand->u.roamCmd.roamProfile.AuthType.numEntries = 1;
5387 pCommand->u.roamCmd.roamProfile.AuthType.authType[0] = eCSR_AUTH_TYPE_OPEN_SYSTEM;
5388 pCommand->u.roamCmd.roamProfile.EncryptionType.numEntries = 1;
5389 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_NONE;
5390 pCommand->u.roamCmd.roamProfile.csrPersona = VOS_STA_MODE;
5391 }
5392 else
5393 {
5394 //make a copy of the profile
5395 status = csrRoamCopyProfile(pMac, &pCommand->u.roamCmd.roamProfile, pProfile);
5396 if(HAL_STATUS_SUCCESS(status))
5397 {
5398 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_TRUE;
5399 }
5400 }
5401 pCommand->command = eSmeCommandRoam;
5402 pCommand->sessionId = (tANI_U8)sessionId;
5403 pCommand->u.roamCmd.hBSSList = hBSSList;
5404 pCommand->u.roamCmd.roamId = roamId;
5405 pCommand->u.roamCmd.roamReason = reason;
5406 //We need to free the BssList when the command is done
5407 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_TRUE;
5408 pCommand->u.roamCmd.fUpdateCurRoamProfile = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005409 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
5410 FL("CSR PERSONA=%d"),
5411 pCommand->u.roamCmd.roamProfile.csrPersona);
Jeff Johnson295189b2012-06-20 16:38:30 -07005412 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
5413 if( !HAL_STATUS_SUCCESS( status ) )
5414 {
5415 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
5416 csrReleaseCommandRoam( pMac, pCommand );
5417 }
5418 }
5419
5420 return (status);
5421}
Jeff Johnson295189b2012-06-20 16:38:30 -07005422eHalStatus csrRoamIssueReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5423 tCsrRoamModifyProfileFields *pMmodProfileFields,
5424 eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate)
5425{
5426 eHalStatus status = eHAL_STATUS_SUCCESS;
5427 tSmeCmd *pCommand;
5428
5429 pCommand = csrGetCommandBuffer(pMac);
5430 if(NULL == pCommand)
5431 {
5432 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5433 status = eHAL_STATUS_RESOURCES;
5434 }
5435 else
5436 {
5437 csrScanCancelIdleScan(pMac);
5438 csrScanAbortMacScanNotForConnect(pMac);
5439 if(pProfile)
5440 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005441 //This is likely trying to reassoc to different profile
5442 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
5443 //make a copy of the profile
5444 status = csrRoamCopyProfile(pMac, &pCommand->u.roamCmd.roamProfile, pProfile);
5445 pCommand->u.roamCmd.fUpdateCurRoamProfile = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005446 }
5447 else
5448 {
5449 status = csrRoamCopyConnectedProfile(pMac, sessionId, &pCommand->u.roamCmd.roamProfile);
5450 //how to update WPA/WPA2 info in roamProfile??
5451 pCommand->u.roamCmd.roamProfile.uapsd_mask = pMmodProfileFields->uapsd_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07005452 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005453 if(HAL_STATUS_SUCCESS(status))
5454 {
5455 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_TRUE;
5456 }
5457 pCommand->command = eSmeCommandRoam;
5458 pCommand->sessionId = (tANI_U8)sessionId;
5459 pCommand->u.roamCmd.roamId = roamId;
5460 pCommand->u.roamCmd.roamReason = reason;
5461 //We need to free the BssList when the command is done
5462 //For reassoc there is no BSS list, so the boolean set to false
5463 pCommand->u.roamCmd.hBSSList = CSR_INVALID_SCANRESULT_HANDLE;
5464 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_FALSE;
5465 pCommand->u.roamCmd.fReassoc = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005466 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
5467 if( !HAL_STATUS_SUCCESS( status ) )
5468 {
5469 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
5470 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5471 csrReleaseCommandRoam( pMac, pCommand );
5472 }
5473 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005474 return (status);
5475}
5476
Jeff Johnson295189b2012-06-20 16:38:30 -07005477eHalStatus csrRoamConnectWithBSSList(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5478 tScanResultHandle hBssListIn, tANI_U32 *pRoamId)
5479{
5480 eHalStatus status = eHAL_STATUS_FAILURE;
5481 tScanResultHandle hBSSList;
5482 tANI_U32 roamId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005483 status = csrScanCopyResultList(pMac, hBssListIn, &hBSSList);
5484 if(HAL_STATUS_SUCCESS(status))
5485 {
5486 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5487 if(pRoamId)
5488 {
5489 *pRoamId = roamId;
5490 }
5491 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5492 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5493 if(!HAL_STATUS_SUCCESS(status))
5494 {
5495 smsLog(pMac, LOGE, FL("failed to start a join process\n"));
5496 csrScanResultPurge(pMac, hBSSList);
5497 }
5498 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005499 return (status);
5500}
5501
Jeff Johnson295189b2012-06-20 16:38:30 -07005502eHalStatus csrRoamConnect(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5503 tScanResultHandle hBssListIn, tANI_U32 *pRoamId)
5504{
5505 eHalStatus status = eHAL_STATUS_SUCCESS;
5506 tScanResultHandle hBSSList;
5507 tCsrScanResultFilter *pScanFilter;
5508 tANI_U32 roamId = 0;
5509 tANI_BOOLEAN fCallCallback = eANI_BOOLEAN_FALSE;
5510 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07005511 if (NULL == pProfile)
5512 {
5513 smsLog(pMac, LOGP, FL("No profile specified"));
5514 return eHAL_STATUS_FAILURE;
5515 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005516 smsLog(pMac, LOG1, FL("called BSSType = %d authtype = %d encryType = %d\n"),
5517 pProfile->BSSType, pProfile->AuthType.authType[0], pProfile->EncryptionType.encryptionType[0]);
Jeff Johnson295189b2012-06-20 16:38:30 -07005518 if( CSR_IS_WDS( pProfile ) &&
5519 !HAL_STATUS_SUCCESS( status = csrIsBTAMPAllowed( pMac, pProfile->operationChannel ) ) )
5520 {
5521 return status;
5522 }
5523 csrRoamCancelRoaming(pMac, sessionId);
5524 csrScanRemoveFreshScanCommand(pMac, sessionId);
5525 csrScanCancelIdleScan(pMac);
5526 //Only abort the scan if it is not used for other roam/connect purpose
5527 csrScanAbortMacScan(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07005528#ifdef WLAN_SOFTAP_FEATURE
5529 if (!vos_concurrent_sessions_running() && (VOS_STA_SAP_MODE == pProfile->csrPersona))//In case of AP mode we do not want idle mode scan
5530 {
5531 csrScanDisable(pMac);
5532 }
5533#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005534 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssued);
5535 //Check whether ssid changes
5536 if(csrIsConnStateConnected(pMac, sessionId))
5537 {
5538 if(pProfile->SSIDs.numOfSSIDs && !csrIsSsidInList(pMac, &pSession->connectedProfile.SSID, &pProfile->SSIDs))
5539 {
5540 csrRoamIssueDisassociateCmd(pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED);
5541 }
5542 }
5543#ifdef FEATURE_WLAN_BTAMP_UT_RF
5544 pSession->maxRetryCount = CSR_JOIN_MAX_RETRY_COUNT;
5545#endif
5546 if(CSR_INVALID_SCANRESULT_HANDLE != hBssListIn)
5547 {
5548 smsLog(pMac, LOGW, FL("is called with BSSList\n"));
5549 status = csrRoamConnectWithBSSList(pMac, sessionId, pProfile, hBssListIn, pRoamId);
5550 if(pRoamId)
5551 {
5552 roamId = *pRoamId;
5553 }
5554 if(!HAL_STATUS_SUCCESS(status))
5555 {
5556 fCallCallback = eANI_BOOLEAN_TRUE;
5557 }
5558 }
5559 else
5560 {
5561 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
5562 if(HAL_STATUS_SUCCESS(status))
5563 {
5564 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
5565 //Try to connect to any BSS
5566 if(NULL == pProfile)
5567 {
5568 //No encryption
5569 pScanFilter->EncryptionType.numEntries = 1;
5570 pScanFilter->EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_NONE;
5571 }//we don't have a profile
5572 else
5573 {
5574 //Here is the profile we need to connect to
5575 status = csrRoamPrepareFilterFromProfile(pMac, pProfile, pScanFilter);
5576 }//We have a profile
5577 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5578 if(pRoamId)
5579 {
5580 *pRoamId = roamId;
5581 }
5582
5583 if(HAL_STATUS_SUCCESS(status))
5584 {
5585 /*Save the WPS info*/
5586 if(NULL != pProfile)
5587 {
5588 pScanFilter->bWPSAssociation = pProfile->bWPSAssociation;
5589 }
5590 else
5591 {
5592 pScanFilter->bWPSAssociation = 0;
5593 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005594 do
5595 {
5596 if( (pProfile && CSR_IS_WDS_AP( pProfile ) )
5597#ifdef WLAN_SOFTAP_FEATURE
5598 || (pProfile && CSR_IS_INFRA_AP ( pProfile ))
5599#endif
5600 )
5601 {
5602 //This can be start right away
5603 status = csrRoamIssueConnect(pMac, sessionId, pProfile, NULL, eCsrHddIssued,
5604 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5605 if(!HAL_STATUS_SUCCESS(status))
5606 {
5607 fCallCallback = eANI_BOOLEAN_TRUE;
5608 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005609 break;
5610 }
5611 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
Mohit Khanna23863762012-09-11 17:40:09 -07005612 smsLog(pMac, LOG1, "************ csrScanGetResult Status ********* %d\n", status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005613 if(HAL_STATUS_SUCCESS(status))
5614 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005615 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5616 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5617 if(!HAL_STATUS_SUCCESS(status))
5618 {
5619 csrScanResultPurge(pMac, hBSSList);
5620 fCallCallback = eANI_BOOLEAN_TRUE;
5621 }
5622 }//Have scan result
5623 else if(NULL != pProfile)
5624 {
5625 //Check whether it is for start ibss
5626 if(CSR_IS_START_IBSS(pProfile))
5627 {
5628 status = csrRoamIssueConnect(pMac, sessionId, pProfile, NULL, eCsrHddIssued,
5629 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5630 if(!HAL_STATUS_SUCCESS(status))
5631 {
5632 smsLog(pMac, LOGE, " CSR failed to issue startIBSS command with status = 0x%08X\n", status);
5633 fCallCallback = eANI_BOOLEAN_TRUE;
5634 }
5635 }
5636 else
5637 {
5638 //scan for this SSID
5639 status = csrScanForSSID(pMac, sessionId, pProfile, roamId);
5640 if(!HAL_STATUS_SUCCESS(status))
5641 {
5642 fCallCallback = eANI_BOOLEAN_TRUE;
5643 }
5644 }
5645 }
5646 else
5647 {
5648 fCallCallback = eANI_BOOLEAN_TRUE;
5649 }
5650 } while (0);
5651 if(NULL != pProfile)
5652 {
5653 //we need to free memory for filter if profile exists
5654 csrFreeScanFilter(pMac, pScanFilter);
5655 }
5656 }//Got the scan filter from profile
5657
5658 palFreeMemory(pMac->hHdd, pScanFilter);
5659 }//allocated memory for pScanFilter
5660 }//No Bsslist coming in
5661 //tell the caller if we fail to trigger a join request
5662 if( fCallCallback )
5663 {
5664 csrRoamCallCallback(pMac, sessionId, NULL, roamId, eCSR_ROAM_FAILED, eCSR_ROAM_RESULT_FAILURE);
5665 }
5666
5667 return (status);
5668}
Jeff Johnson295189b2012-06-20 16:38:30 -07005669eHalStatus csrRoamReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5670 tCsrRoamModifyProfileFields modProfileFields,
5671 tANI_U32 *pRoamId)
5672{
5673 eHalStatus status = eHAL_STATUS_SUCCESS;
5674 tANI_BOOLEAN fCallCallback = eANI_BOOLEAN_TRUE;
5675 tANI_U32 roamId = 0;
5676 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07005677 if (NULL == pProfile)
5678 {
5679 smsLog(pMac, LOGP, FL("No profile specified"));
5680 return eHAL_STATUS_FAILURE;
5681 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005682 smsLog(pMac, LOG1, FL("called BSSType = %d authtype = %d encryType = %d\n"), pProfile->BSSType, pProfile->AuthType.authType[0], pProfile->EncryptionType.encryptionType[0]);
5683 csrRoamCancelRoaming(pMac, sessionId);
5684 csrScanRemoveFreshScanCommand(pMac, sessionId);
5685 csrScanCancelIdleScan(pMac);
5686 csrScanAbortMacScanNotForConnect(pMac);
5687 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssuedReassocToSameAP);
Jeff Johnson295189b2012-06-20 16:38:30 -07005688 if(csrIsConnStateConnected(pMac, sessionId))
5689 {
5690 if(pProfile)
5691 {
5692 if(pProfile->SSIDs.numOfSSIDs &&
5693 csrIsSsidInList(pMac, &pSession->connectedProfile.SSID, &pProfile->SSIDs))
5694 {
5695 fCallCallback = eANI_BOOLEAN_FALSE;
5696 }
5697 else
5698 {
5699 smsLog(pMac, LOG1, FL("Not connected to the same SSID asked in the profile\n"));
5700 }
5701 }
5702 else if(!palEqualMemory(pMac->hHdd, &modProfileFields,
5703 &pSession->connectedProfile.modifyProfileFields,
5704 sizeof(tCsrRoamModifyProfileFields)))
5705 {
5706 fCallCallback = eANI_BOOLEAN_FALSE;
5707 }
5708 else
5709 {
5710 smsLog(pMac, LOG1, FL("Either the profile is NULL or none of the fields "
5711 "in tCsrRoamModifyProfileFields got modified\n"));
5712 }
5713 }
5714 else
5715 {
5716 smsLog(pMac, LOG1, FL("Not connected! No need to reassoc\n"));
5717 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005718 if(!fCallCallback)
5719 {
5720 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5721 if(pRoamId)
5722 {
5723 *pRoamId = roamId;
5724 }
5725
Jeff Johnson295189b2012-06-20 16:38:30 -07005726 status = csrRoamIssueReassoc(pMac, sessionId, pProfile, &modProfileFields,
5727 eCsrHddIssuedReassocToSameAP, roamId, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07005728 }
5729 else
5730 {
5731 status = csrRoamCallCallback(pMac, sessionId, NULL, roamId,
5732 eCSR_ROAM_FAILED, eCSR_ROAM_RESULT_FAILURE);
5733 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005734 return status;
5735}
Jeff Johnson295189b2012-06-20 16:38:30 -07005736eHalStatus csrRoamJoinLastProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
5737{
5738 eHalStatus status = eHAL_STATUS_FAILURE;
5739 tScanResultHandle hBSSList = NULL;
5740 tCsrScanResultFilter *pScanFilter = NULL;
5741 tANI_U32 roamId;
5742 tCsrRoamProfile *pProfile = NULL;
5743 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07005744
5745 if(!pSession)
5746 {
5747 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
5748 return eHAL_STATUS_FAILURE;
5749 }
5750
Jeff Johnson295189b2012-06-20 16:38:30 -07005751 do
5752 {
5753 if(pSession->pCurRoamProfile)
5754 {
5755 csrScanCancelIdleScan(pMac);
5756 csrScanAbortMacScanNotForConnect(pMac);
5757 //We have to make a copy of pCurRoamProfile because it will be free inside csrRoamIssueConnect
5758 status = palAllocateMemory(pMac->hHdd, (void **)&pProfile, sizeof(tCsrRoamProfile));
5759 if(!HAL_STATUS_SUCCESS(status))
5760 break;
5761 palZeroMemory(pMac->hHdd, pProfile, sizeof(tCsrRoamProfile));
5762 status = csrRoamCopyProfile(pMac, pProfile, pSession->pCurRoamProfile);
5763 if(!HAL_STATUS_SUCCESS(status))
5764 break;
5765 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
5766 if(!HAL_STATUS_SUCCESS(status))
5767 {
5768 break;
5769 }
5770 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
5771 status = csrRoamPrepareFilterFromProfile(pMac, pProfile, pScanFilter);
5772 if(!HAL_STATUS_SUCCESS(status))
5773 {
5774 break;
5775 }
5776 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5777 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
5778 if(HAL_STATUS_SUCCESS(status))
5779 {
5780 //we want to put the last connected BSS to the very beginning, if possible
5781 csrMoveBssToHeadFromBSSID(pMac, &pSession->connectedProfile.bssid, hBSSList);
5782 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5783 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5784 if(!HAL_STATUS_SUCCESS(status))
5785 {
5786 csrScanResultPurge(pMac, hBSSList);
5787 break;
5788 }
5789 }
5790 else
5791 {
5792 //Do a scan on this profile
5793 //scan for this SSID only in case the AP suppresses SSID
5794 status = csrScanForSSID(pMac, sessionId, pProfile, roamId);
5795 if(!HAL_STATUS_SUCCESS(status))
5796 {
5797 break;
5798 }
5799 }
5800 }//We have a profile
5801 else
5802 {
5803 smsLog(pMac, LOGW, FL("cannot find a roaming profile\n"));
5804 break;
5805 }
5806 }while(0);
5807 if(pScanFilter)
5808 {
5809 csrFreeScanFilter(pMac, pScanFilter);
5810 palFreeMemory(pMac->hHdd, pScanFilter);
5811 }
5812 if(NULL != pProfile)
5813 {
5814 csrReleaseProfile(pMac, pProfile);
5815 palFreeMemory(pMac->hHdd, pProfile);
5816 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005817 return (status);
5818}
Jeff Johnson295189b2012-06-20 16:38:30 -07005819eHalStatus csrRoamReconnect(tpAniSirGlobal pMac, tANI_U32 sessionId)
5820{
5821 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005822 if(csrIsConnStateConnected(pMac, sessionId))
5823 {
5824 status = csrRoamIssueDisassociateCmd(pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED);
5825 if(HAL_STATUS_SUCCESS(status))
5826 {
5827 status = csrRoamJoinLastProfile(pMac, sessionId);
5828 }
5829 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005830 return (status);
5831}
5832
Jeff Johnson295189b2012-06-20 16:38:30 -07005833eHalStatus csrRoamConnectToLastProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
5834{
5835 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005836 smsLog(pMac, LOGW, FL("is called\n"));
5837 csrRoamCancelRoaming(pMac, sessionId);
5838 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssued);
5839 if(csrIsConnStateDisconnected(pMac, sessionId))
5840 {
5841 status = csrRoamJoinLastProfile(pMac, sessionId);
5842 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005843 return (status);
5844}
5845
Jeff Johnson295189b2012-06-20 16:38:30 -07005846eHalStatus csrRoamProcessDisassocDeauth( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fDisassoc, tANI_BOOLEAN fMICFailure )
5847{
5848 eHalStatus status = eHAL_STATUS_SUCCESS;
5849 tANI_BOOLEAN fComplete = eANI_BOOLEAN_FALSE;
5850 eCsrRoamSubState NewSubstate;
5851 tANI_U32 sessionId = pCommand->sessionId;
5852
5853 // change state to 'Roaming'...
5854 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
5855
5856 if ( csrIsConnStateIbss( pMac, sessionId ) )
5857 {
5858 // If we are in an IBSS, then stop the IBSS...
5859 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
5860 fComplete = (!HAL_STATUS_SUCCESS(status));
5861 }
5862 else if ( csrIsConnStateInfra( pMac, sessionId ) )
5863 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07005864 smsLog(pMac, LOG1, FL(" restore AC weights (%d-%d-%d-%d)\n"), pMac->roam.ucACWeights[0], pMac->roam.ucACWeights[1],
Jeff Johnson295189b2012-06-20 16:38:30 -07005865 pMac->roam.ucACWeights[2], pMac->roam.ucACWeights[3]);
5866 //Restore AC weight in case we change it
5867 WLANTL_SetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
5868 // in Infrasturcture, we need to disassociate from the Infrastructure network...
5869 NewSubstate = eCSR_ROAM_SUBSTATE_DISASSOC_FORCED;
5870 if(eCsrSmeIssuedDisassocForHandoff == pCommand->u.roamCmd.roamReason)
5871 {
5872 NewSubstate = eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF;
5873 }
5874 if( fDisassoc )
5875 {
5876 status = csrRoamIssueDisassociate( pMac, sessionId, NewSubstate, fMICFailure );
5877 }
5878 else
5879 {
5880 status = csrRoamIssueDeauth( pMac, sessionId, eCSR_ROAM_SUBSTATE_DEAUTH_REQ );
5881 }
5882 fComplete = (!HAL_STATUS_SUCCESS(status));
5883 }
5884 else if ( csrIsConnStateWds( pMac, sessionId ) )
5885 {
5886 if( CSR_IS_WDS_AP( &pMac->roam.roamSession[sessionId].connectedProfile ) )
5887 {
5888 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
5889 fComplete = (!HAL_STATUS_SUCCESS(status));
5890 }
5891 //This has to be WDS station
5892 else if( csrIsConnStateConnectedWds( pMac, sessionId ) ) //This has to be WDS station
5893 {
5894
5895 pCommand->u.roamCmd.fStopWds = eANI_BOOLEAN_TRUE;
5896 if( fDisassoc )
5897 {
5898 status = csrRoamIssueDisassociate( pMac, sessionId,
5899 eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, fMICFailure );
5900 fComplete = (!HAL_STATUS_SUCCESS(status));
5901 }
5902 }
5903 } else {
5904 // we got a dis-assoc request while not connected to any peer
5905 // just complete the command
5906 fComplete = eANI_BOOLEAN_TRUE;
5907 status = eHAL_STATUS_FAILURE;
5908 }
5909 if(fComplete)
5910 {
5911 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
5912 }
5913
5914 if(HAL_STATUS_SUCCESS(status))
5915 {
5916 if ( csrIsConnStateInfra( pMac, sessionId ) )
5917 {
5918 //Set the state to disconnect here
5919 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
5920 }
5921 }
5922 return (status);
5923}
5924
Jeff Johnson295189b2012-06-20 16:38:30 -07005925/* This is been removed from latest code base */
5926/*
5927static eHalStatus csrRoamProcessStopBss( tpAniSirGlobal pMac, tSmeCmd *pCommand )
5928{
5929 eHalStatus status;
5930 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07005931 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING );
5932 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
Jeff Johnson295189b2012-06-20 16:38:30 -07005933 return ( status );
5934}
5935*/
5936
Jeff Johnson295189b2012-06-20 16:38:30 -07005937eHalStatus csrRoamIssueDisassociateCmd( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason )
5938{
5939 eHalStatus status = eHAL_STATUS_SUCCESS;
5940 tSmeCmd *pCommand;
5941 tANI_BOOLEAN fHighPriority = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005942 do
5943 {
5944 smsLog( pMac, LOGE, FL(" reason = %d\n"), reason );
5945 pCommand = csrGetCommandBuffer( pMac );
5946 if ( !pCommand )
5947 {
5948 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5949 status = eHAL_STATUS_RESOURCES;
5950 break;
5951 }
5952 //Change the substate in case it is wait-for-key
5953 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
5954 {
5955 csrRoamStopWaitForKeyTimer( pMac );
5956 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
5957 }
5958 pCommand->command = eSmeCommandRoam;
5959 pCommand->sessionId = (tANI_U8)sessionId;
5960 switch ( reason )
5961 {
5962 case eCSR_DISCONNECT_REASON_MIC_ERROR:
5963 pCommand->u.roamCmd.roamReason = eCsrForcedDisassocMICFailure;
5964 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005965 case eCSR_DISCONNECT_REASON_DEAUTH:
5966 pCommand->u.roamCmd.roamReason = eCsrForcedDeauth;
5967 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005968 case eCSR_DISCONNECT_REASON_HANDOFF:
5969 fHighPriority = eANI_BOOLEAN_TRUE;
5970 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedDisassocForHandoff;
5971 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005972 case eCSR_DISCONNECT_REASON_UNSPECIFIED:
5973 case eCSR_DISCONNECT_REASON_DISASSOC:
5974 pCommand->u.roamCmd.roamReason = eCsrForcedDisassoc;
5975 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005976 case eCSR_DISCONNECT_REASON_IBSS_JOIN_FAILURE:
5977 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedIbssJoinFailure;
5978 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005979 case eCSR_DISCONNECT_REASON_IBSS_LEAVE:
5980 pCommand->u.roamCmd.roamReason = eCsrForcedIbssLeave;
5981 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005982 default:
5983 break;
5984 }
5985 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
5986 if( !HAL_STATUS_SUCCESS( status ) )
5987 {
5988 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
5989 csrReleaseCommandRoam( pMac, pCommand );
5990 }
5991 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07005992 return( status );
5993}
5994
Jeff Johnson295189b2012-06-20 16:38:30 -07005995eHalStatus csrRoamIssueStopBssCmd( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_BOOLEAN fHighPriority )
5996{
5997 eHalStatus status = eHAL_STATUS_SUCCESS;
5998 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07005999 pCommand = csrGetCommandBuffer( pMac );
6000 if ( NULL != pCommand )
6001 {
6002 //Change the substate in case it is wait-for-key
6003 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId) )
6004 {
6005 csrRoamStopWaitForKeyTimer( pMac );
6006 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
6007 }
6008 pCommand->command = eSmeCommandRoam;
6009 pCommand->sessionId = (tANI_U8)sessionId;
6010 pCommand->u.roamCmd.roamReason = eCsrStopBss;
6011 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6012 if( !HAL_STATUS_SUCCESS( status ) )
6013 {
6014 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6015 csrReleaseCommandRoam( pMac, pCommand );
6016 }
6017 }
6018 else
6019 {
6020 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6021 status = eHAL_STATUS_RESOURCES;
6022 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006023 return ( status );
6024}
6025
Jeff Johnson295189b2012-06-20 16:38:30 -07006026eHalStatus csrRoamDisconnectInternal(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason)
6027{
6028 eHalStatus status = eHAL_STATUS_SUCCESS;
6029 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006030
6031 if(!pSession)
6032 {
6033 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6034 return eHAL_STATUS_FAILURE;
6035 }
6036
Jeff Johnson295189b2012-06-20 16:38:30 -07006037#ifdef FEATURE_WLAN_BTAMP_UT_RF
6038 //Stop te retry
6039 pSession->maxRetryCount = 0;
6040 csrRoamStopJoinRetryTimer(pMac, sessionId);
6041#endif
6042 //Not to call cancel roaming here
6043 //Only issue disconnect when necessary
6044 if(csrIsConnStateConnected(pMac, sessionId) || csrIsBssTypeIBSS(pSession->connectedProfile.BSSType)
6045 || csrIsBssTypeWDS(pSession->connectedProfile.BSSType)
6046 || csrIsRoamCommandWaitingForSession(pMac, sessionId) )
6047
6048 {
6049 smsLog(pMac, LOG2, FL("called\n"));
6050 status = csrRoamIssueDisassociateCmd(pMac, sessionId, reason);
6051 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006052 return (status);
6053}
6054
Jeff Johnson295189b2012-06-20 16:38:30 -07006055eHalStatus csrRoamDisconnect(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason)
6056{
6057 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006058
6059 if(!pSession)
6060 {
6061 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6062 return eHAL_STATUS_FAILURE;
6063 }
6064
Jeff Johnson295189b2012-06-20 16:38:30 -07006065 csrRoamCancelRoaming(pMac, sessionId);
6066 pSession->ibss_join_pending = FALSE;
6067 csrRoamStopIbssJoinTimer(pMac, sessionId);
6068 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrForcedDisassoc);
6069
6070 return (csrRoamDisconnectInternal(pMac, sessionId, reason));
6071}
6072
Jeff Johnson295189b2012-06-20 16:38:30 -07006073eHalStatus csrRoamSaveConnectedInfomation(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
6074 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes)
6075{
6076 eHalStatus status = eHAL_STATUS_SUCCESS;
6077 tDot11fBeaconIEs *pIesTemp = pIes;
6078 tANI_U8 index;
6079 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
6080 tCsrRoamConnectedProfile *pConnectProfile = &pSession->connectedProfile;
Jeff Johnson32d95a32012-09-10 13:15:23 -07006081
6082 if(!pSession)
6083 {
6084 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6085 return eHAL_STATUS_FAILURE;
6086 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006087
6088 palZeroMemory(pMac->hHdd, &pSession->connectedProfile, sizeof(tCsrRoamConnectedProfile));
6089 pConnectProfile->AuthType = pProfile->negotiatedAuthType;
6090 pConnectProfile->AuthInfo = pProfile->AuthType;
6091 pConnectProfile->CBMode = pProfile->CBMode; //*** this may not be valid
6092 pConnectProfile->EncryptionType = pProfile->negotiatedUCEncryptionType;
6093 pConnectProfile->EncryptionInfo = pProfile->EncryptionType;
6094 pConnectProfile->mcEncryptionType = pProfile->negotiatedMCEncryptionType;
6095 pConnectProfile->mcEncryptionInfo = pProfile->mcEncryptionType;
6096 pConnectProfile->BSSType = pProfile->BSSType;
6097 pConnectProfile->modifyProfileFields.uapsd_mask = pProfile->uapsd_mask;
6098 pConnectProfile->operationChannel = pSirBssDesc->channelId;
Jeff Johnsone7245742012-09-05 17:12:55 -07006099 pConnectProfile->beaconInterval = pSirBssDesc->beaconInterval;
6100
Jeff Johnson295189b2012-06-20 16:38:30 -07006101 palCopyMemory(pMac->hHdd, &pConnectProfile->Keys, &pProfile->Keys, sizeof(tCsrKeys));
6102 //Save bssid
6103 csrGetBssIdBssDesc(pMac, pSirBssDesc, &pConnectProfile->bssid);
6104#ifdef WLAN_FEATURE_VOWIFI_11R
6105 if (pSirBssDesc->mdiePresent)
6106 {
6107 pConnectProfile->MDID.mdiePresent = 1;
6108 pConnectProfile->MDID.mobilityDomain = (pSirBssDesc->mdie[1] << 8) | (pSirBssDesc->mdie[0]);
6109 }
6110#endif
6111#ifdef FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -07006112 if ((csrIsProfileCCX(pProfile) ||
6113 ((pIesTemp->CCXVersion.present)
6114 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
6115 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
6116 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
6117 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
6118 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
6119 && (!(csrIsProfile11r( pProfile )))
6120 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -07006121 {
6122 pConnectProfile->isCCXAssoc = 1;
6123 }
6124#endif
6125 //save ssid
6126 if( NULL == pIesTemp )
6127 {
6128 status = csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesTemp);
6129 }
6130 if(HAL_STATUS_SUCCESS(status))
6131 {
6132 if(pIesTemp->SSID.present)
6133 {
6134 pConnectProfile->SSID.length = pIesTemp->SSID.num_ssid;
6135 palCopyMemory(pMac->hHdd, pConnectProfile->SSID.ssId,
6136 pIesTemp->SSID.ssid, pIesTemp->SSID.num_ssid);
6137 }
6138
6139 //Save the bss desc
6140 status = csrRoamSaveConnectedBssDesc(pMac, sessionId, pSirBssDesc);
Jeff Johnson295189b2012-06-20 16:38:30 -07006141 if( CSR_IS_QOS_BSS(pIesTemp) )
6142 {
6143 pConnectProfile->qap = TRUE;
6144 }
6145 else
6146 {
6147 pConnectProfile->qap = FALSE;
6148 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006149 if ( NULL == pIes )
6150 {
6151 //Free memory if it allocated locally
6152 palFreeMemory(pMac->hHdd, pIesTemp);
6153 }
6154 }
6155 //Save Qos connection
6156 pConnectProfile->qosConnection = pMac->roam.roamSession[sessionId].fWMMConnection;
6157
6158 if(!HAL_STATUS_SUCCESS(status))
6159 {
6160 csrFreeConnectBssDesc(pMac, sessionId);
6161 }
6162 for(index = 0; index < pProfile->SSIDs.numOfSSIDs; index++)
6163 {
6164 if((pProfile->SSIDs.SSIDList[index].SSID.length == pConnectProfile->SSID.length) &&
6165 palEqualMemory(pMac->hHdd, pProfile->SSIDs.SSIDList[index].SSID.ssId,
6166 pConnectProfile->SSID.ssId, pConnectProfile->SSID.length))
6167 {
6168 pConnectProfile->handoffPermitted = pProfile->SSIDs.SSIDList[index].handoffPermitted;
6169 break;
6170 }
6171 pConnectProfile->handoffPermitted = FALSE;
6172 }
6173
6174 return (status);
6175}
6176
Jeff Johnson295189b2012-06-20 16:38:30 -07006177static void csrRoamJoinRspProcessor( tpAniSirGlobal pMac, tSirSmeJoinRsp *pSmeJoinRsp )
6178{
6179 tListElem *pEntry = NULL;
6180 tSmeCmd *pCommand = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006181 //The head of the active list is the request we sent
6182 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6183 if(pEntry)
6184 {
6185 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6186 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006187 if ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode )
6188 {
6189 if(pCommand && eCsrSmeIssuedAssocToSimilarAP == pCommand->u.roamCmd.roamReason)
6190 {
6191#ifndef WLAN_MDM_CODE_REDUCTION_OPT
6192 sme_QosCsrEventInd(pMac, pSmeJoinRsp->sessionId, SME_QOS_CSR_HANDOFF_COMPLETE, NULL);
6193#endif
6194 }
6195 csrRoamComplete( pMac, eCsrJoinSuccess, (void *)pSmeJoinRsp );
6196 }
6197 else
6198 {
6199 tANI_U32 roamId = 0;
6200 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pSmeJoinRsp->sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006201 if(!pSession)
6202 {
6203 smsLog(pMac, LOGE, FL(" session %d not found "), pSmeJoinRsp->sessionId);
6204 return;
6205 }
6206
Jeff Johnson295189b2012-06-20 16:38:30 -07006207
6208 //The head of the active list is the request we sent
6209 //Try to get back the same profile and roam again
6210 if(pCommand)
6211 {
6212 roamId = pCommand->u.roamCmd.roamId;
6213 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006214 pSession->joinFailStatusCode.statusCode = pSmeJoinRsp->statusCode;
6215 pSession->joinFailStatusCode.reasonCode = pSmeJoinRsp->protStatusCode;
6216 smsLog( pMac, LOGW, "SmeJoinReq failed with statusCode= 0x%08lX [%d]\n", pSmeJoinRsp->statusCode, pSmeJoinRsp->statusCode );
6217#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
6218 /* If Join fails while Handoff is in progress, indicate disassociated event to supplicant to reconnect */
6219 if (csrRoamIsHandoffInProgress(pMac))
6220 {
6221 csrRoamCallCallback(pMac, pSmeJoinRsp->sessionId, NULL, roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
6222 /* Should indicate neighbor roam algorithm about the connect failure here */
6223 csrNeighborRoamIndicateConnect(pMac, pSmeJoinRsp->sessionId, VOS_STATUS_E_FAILURE);
6224 }
6225#endif
6226 if (pCommand)
6227 {
6228 if(CSR_IS_WDS_STA( &pCommand->u.roamCmd.roamProfile ))
6229 {
6230 pCommand->u.roamCmd.fStopWds = eANI_BOOLEAN_TRUE;
6231 pSession->connectedProfile.BSSType = eCSR_BSS_TYPE_WDS_STA;
6232 csrRoamReissueRoamCommand(pMac);
6233 }
6234 else if( CSR_IS_WDS( &pCommand->u.roamCmd.roamProfile ) )
6235 {
6236 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6237 }
6238 else
6239 {
6240 csrRoam(pMac, pCommand);
6241 }
6242 }
6243 else
6244 {
6245 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6246 }
6247 } /*else: ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode ) */
6248}
6249
Jeff Johnson295189b2012-06-20 16:38:30 -07006250eHalStatus csrRoamIssueJoin( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pSirBssDesc,
6251 tDot11fBeaconIEs *pIes,
6252 tCsrRoamProfile *pProfile, tANI_U32 roamId )
6253{
6254 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -07006255 smsLog( pMac, LOG1, "Attempting to Join Bssid= %02x-%02x-%02x-%02x-%02x-%02x\n",
6256 pSirBssDesc->bssId[ 0 ],pSirBssDesc->bssId[ 1 ],pSirBssDesc->bssId[ 2 ],
6257 pSirBssDesc->bssId[ 3 ],pSirBssDesc->bssId[ 4 ],pSirBssDesc->bssId[ 5 ] );
6258
6259 // Set the roaming substate to 'join attempt'...
6260 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_JOIN_REQ, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07006261 // attempt to Join this BSS...
6262 status = csrSendJoinReqMsg( pMac, sessionId, pSirBssDesc, pProfile, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07006263 return (status);
6264}
6265
Jeff Johnson295189b2012-06-20 16:38:30 -07006266static eHalStatus csrRoamIssueReassociate( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pSirBssDesc,
6267 tDot11fBeaconIEs *pIes, tCsrRoamProfile *pProfile)
6268{
6269 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07006270 // Set the roaming substate to 'join attempt'...
6271 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_REASSOC_REQ, sessionId );
6272
6273 smsLog(pMac, LOGE, FL(" calling csrSendSmeReassocReqMsg\n"));
6274
6275 // attempt to Join this BSS...
6276 return csrSendSmeReassocReqMsg( pMac, sessionId, pSirBssDesc, pIes, pProfile );
6277}
6278
Jeff Johnson295189b2012-06-20 16:38:30 -07006279void csrRoamReissueRoamCommand(tpAniSirGlobal pMac)
6280{
6281 tListElem *pEntry;
6282 tSmeCmd *pCommand;
6283 tCsrRoamInfo roamInfo;
6284 tANI_U32 sessionId;
6285 tCsrRoamSession *pSession;
6286
6287 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6288 if(pEntry)
6289 {
6290 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6291 if ( eSmeCommandRoam == pCommand->command )
6292 {
6293 sessionId = pCommand->sessionId;
6294 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006295
6296 if(!pSession)
6297 {
6298 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6299 return;
6300 }
6301
Jeff Johnson295189b2012-06-20 16:38:30 -07006302 if( pCommand->u.roamCmd.fStopWds )
6303 {
6304 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
6305 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
6306 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
6307 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
6308#ifdef WLAN_SOFTAP_FEATURE
6309 if (CSR_IS_WDS(&pSession->connectedProfile)){
6310#endif
6311 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED;
6312 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
6313 eCSR_ROAM_WDS_IND,
6314 eCSR_ROAM_RESULT_WDS_DISASSOCIATED);
6315#ifdef WLAN_SOFTAP_FEATURE
6316 }else if (CSR_IS_INFRA_AP(&pSession->connectedProfile)){
6317 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED;
6318 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
6319 eCSR_ROAM_INFRA_IND,
6320 eCSR_ROAM_RESULT_INFRA_DISASSOCIATED);
6321 }
6322
6323#endif
6324
Jeff Johnson295189b2012-06-20 16:38:30 -07006325 if( !HAL_STATUS_SUCCESS( csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ ) ) )
6326 {
6327 smsLog(pMac, LOGE, " Failed to reissue stop_bss command for WDS after disassociated\n");
6328 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6329 }
6330 }
6331 else if(eCsrStopRoaming == csrRoamJoinNextBss(pMac, pCommand, eANI_BOOLEAN_TRUE))
6332 {
6333 smsLog(pMac, LOGW, " Failed to reissue join command after disassociated\n");
6334 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6335 }
6336 }
6337 else
6338 {
6339 smsLog(pMac, LOGW, " Command is not roaming after disassociated\n");
6340 }
6341 }
6342 else
6343 {
6344 smsLog(pMac, LOGE, " Disassoc rsp cannot continue because no command is available\n");
6345 }
6346}
6347
Jeff Johnson295189b2012-06-20 16:38:30 -07006348tANI_BOOLEAN csrIsRoamCommandWaitingForSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
6349{
6350 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6351 tListElem *pEntry;
6352 tSmeCmd *pCommand = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006353 //alwasy lock active list before locking pending list
6354 csrLLLock( &pMac->sme.smeCmdActiveList );
6355 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6356 if(pEntry)
6357 {
6358 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6359 if( ( eSmeCommandRoam == pCommand->command ) && ( sessionId == pCommand->sessionId ) )
6360 {
6361 fRet = eANI_BOOLEAN_TRUE;
6362 }
6363 }
6364 if(eANI_BOOLEAN_FALSE == fRet)
6365 {
6366 csrLLLock(&pMac->sme.smeCmdPendingList);
6367 pEntry = csrLLPeekHead(&pMac->sme.smeCmdPendingList, LL_ACCESS_NOLOCK);
6368 while(pEntry)
6369 {
6370 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6371 if( ( eSmeCommandRoam == pCommand->command ) && ( sessionId == pCommand->sessionId ) )
6372 {
6373 fRet = eANI_BOOLEAN_TRUE;
6374 break;
6375 }
6376 pEntry = csrLLNext(&pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK);
6377 }
6378 csrLLUnlock(&pMac->sme.smeCmdPendingList);
6379 }
6380 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006381 return (fRet);
6382}
6383
Jeff Johnson295189b2012-06-20 16:38:30 -07006384tANI_BOOLEAN csrIsRoamCommandWaiting(tpAniSirGlobal pMac)
6385{
6386 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6387 tANI_U32 i;
Jeff Johnson295189b2012-06-20 16:38:30 -07006388 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
6389 {
6390 if( CSR_IS_SESSION_VALID( pMac, i ) && ( fRet = csrIsRoamCommandWaitingForSession( pMac, i ) ) )
6391 {
6392 break;
6393 }
6394 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006395 return ( fRet );
6396}
6397
Jeff Johnson295189b2012-06-20 16:38:30 -07006398tANI_BOOLEAN csrIsCommandWaiting(tpAniSirGlobal pMac)
6399{
6400 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006401 //alwasy lock active list before locking pending list
6402 csrLLLock( &pMac->sme.smeCmdActiveList );
6403 fRet = csrLLIsListEmpty(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6404 if(eANI_BOOLEAN_FALSE == fRet)
6405 {
6406 fRet = csrLLIsListEmpty(&pMac->sme.smeCmdPendingList, LL_ACCESS_LOCK);
6407 }
6408 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006409 return (fRet);
6410}
6411
Jeff Johnson295189b2012-06-20 16:38:30 -07006412tANI_BOOLEAN csrIsScanForRoamCommandActive( tpAniSirGlobal pMac )
6413{
6414 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6415 tListElem *pEntry;
6416 tCsrCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07006417 //alwasy lock active list before locking pending list
6418 csrLLLock( &pMac->sme.smeCmdActiveList );
6419 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6420 if( pEntry )
6421 {
6422 pCommand = GET_BASE_ADDR(pEntry, tCsrCmd, Link);
6423 if( ( eCsrRoamCommandScan == pCommand->command ) &&
6424 ( ( eCsrScanForSsid == pCommand->u.scanCmd.reason ) ||
6425 ( eCsrScanForCapsChange == pCommand->u.scanCmd.reason ) ||
6426 ( eCsrScanP2PFindPeer == pCommand->u.scanCmd.reason ) ) )
6427 {
6428 fRet = eANI_BOOLEAN_TRUE;
6429 }
6430 }
6431 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006432 return (fRet);
6433}
Jeff Johnson295189b2012-06-20 16:38:30 -07006434eHalStatus csrRoamIssueReassociateCmd( tpAniSirGlobal pMac, tANI_U32 sessionId )
6435{
6436 eHalStatus status = eHAL_STATUS_SUCCESS;
6437 tSmeCmd *pCommand = NULL;
6438 tANI_BOOLEAN fHighPriority = eANI_BOOLEAN_TRUE;
6439 tANI_BOOLEAN fRemoveCmd = FALSE;
6440 tListElem *pEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -07006441 // Delete the old assoc command. All is setup for reassoc to be serialized
6442 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
6443 if ( pEntry )
6444 {
6445 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
6446 if ( !pCommand )
6447 {
6448 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6449 return eHAL_STATUS_RESOURCES;
6450 }
6451 if ( eSmeCommandRoam == pCommand->command )
6452 {
6453 if (pCommand->u.roamCmd.roamReason == eCsrSmeIssuedAssocToSimilarAP)
6454 {
6455 fRemoveCmd = csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK );
6456 }
6457 else
6458 {
6459 smsLog( pMac, LOGE, FL(" Unexpected active roam command present \n") );
6460 }
6461 if (fRemoveCmd == FALSE)
6462 {
6463 // Implies we did not get the serialized assoc command we
6464 // were expecting
6465 pCommand = NULL;
6466 }
6467 }
6468 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006469 if(NULL == pCommand)
6470 {
6471 smsLog( pMac, LOGE, FL(" fail to get command buffer as expected based on previous connect roam command\n") );
6472 return eHAL_STATUS_RESOURCES;
6473 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006474 do
6475 {
6476 //Change the substate in case it is wait-for-key
6477 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
6478 {
6479 csrRoamStopWaitForKeyTimer( pMac );
6480 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
6481 }
6482 pCommand->command = eSmeCommandRoam;
6483 pCommand->sessionId = (tANI_U8)sessionId;
6484 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedFTReassoc;
Jeff Johnson295189b2012-06-20 16:38:30 -07006485 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6486 if( !HAL_STATUS_SUCCESS( status ) )
6487 {
6488 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6489 csrReleaseCommandRoam( pMac, pCommand );
6490 }
6491 } while( 0 );
6492
Jeff Johnson295189b2012-06-20 16:38:30 -07006493 return( status );
6494}
6495static void csrRoamingStateConfigCnfProcessor( tpAniSirGlobal pMac, tANI_U32 result )
6496{
6497 tListElem *pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6498 tCsrScanResult *pScanResult = NULL;
6499 tSirBssDescription *pBssDesc = NULL;
6500 tSmeCmd *pCommand = NULL;
6501 tANI_U32 sessionId;
6502 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07006503 if(NULL == pEntry)
6504 {
6505 smsLog(pMac, LOGW, " CFG_CNF with active list empty\n");
6506 return;
6507 }
6508 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6509 sessionId = pCommand->sessionId;
6510 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006511
6512 if(!pSession)
6513 {
6514 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6515 return;
6516 }
6517
Jeff Johnson295189b2012-06-20 16:38:30 -07006518 if(CSR_IS_ROAMING(pSession) && pSession->fCancelRoaming)
6519 {
6520 //the roaming is cancelled. Simply complete the command
6521 smsLog(pMac, LOGW, FL(" Roam command cancelled\n"));
6522 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
6523 }
6524 else
6525 {
6526 if ( CCM_IS_RESULT_SUCCESS(result) )
6527 {
6528 smsLog(pMac, LOG2, "Cfg sequence complete\n");
6529 // Successfully set the configuration parameters for the new Bss. Attempt to
6530 // join the roaming Bss.
6531 if(pCommand->u.roamCmd.pRoamBssEntry)
6532 {
6533 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
6534 pBssDesc = &pScanResult->Result.BssDescriptor;
6535 }
6536 if ( csrIsBssTypeIBSS( pCommand->u.roamCmd.roamProfile.BSSType ) ||
6537 CSR_IS_WDS( &pCommand->u.roamCmd.roamProfile )
6538#ifdef WLAN_SOFTAP_FEATURE
6539 || CSR_IS_INFRA_AP(&pCommand->u.roamCmd.roamProfile)
6540#endif
6541 )
6542 {
6543 if(!HAL_STATUS_SUCCESS(csrRoamIssueStartBss( pMac, sessionId,
6544 &pSession->bssParams, &pCommand->u.roamCmd.roamProfile,
6545 pBssDesc, pCommand->u.roamCmd.roamId )))
6546 {
6547 smsLog(pMac, LOGW, " CSR start BSS failed\n");
6548 //We need to complete the command
6549 csrRoamComplete(pMac, eCsrStartBssFailure, NULL);
6550 }
6551 }
6552 else
6553 {
6554 if (!pCommand->u.roamCmd.pRoamBssEntry)
6555 {
6556 smsLog(pMac, LOGW, " pRoamBssEntry is NULL\n");
6557 //We need to complete the command
6558 csrRoamComplete(pMac, eCsrJoinFailure, NULL);
6559 return;
6560 }
6561 // If we are roaming TO an Infrastructure BSS...
6562 VOS_ASSERT(pScanResult != NULL);
6563 if ( csrIsInfraBssDesc( pBssDesc ) )
6564 {
6565 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
Jeff Johnson295189b2012-06-20 16:38:30 -07006566 if(pIesLocal || (HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal))) )
6567 {
6568 // ..and currently in an Infrastructure connection....
6569 if( csrIsConnStateConnectedInfra( pMac, sessionId ) )
6570 {
6571 // ...and the SSIDs are equal, then we Reassoc.
6572 if ( csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc,
6573 pIesLocal ) )
6574 // ..and currently in an infrastructure connection
6575 {
6576 // then issue a Reassoc.
6577 pCommand->u.roamCmd.fReassoc = eANI_BOOLEAN_TRUE;
6578 csrRoamIssueReassociate( pMac, sessionId, pBssDesc, pIesLocal,
6579 &pCommand->u.roamCmd.roamProfile );
6580 }
6581 else
6582 {
6583
6584 // otherwise, we have to issue a new Join request to LIM because we disassociated from the
6585 // previously associated AP.
6586 if(!HAL_STATUS_SUCCESS(csrRoamIssueJoin( pMac, sessionId, pBssDesc,
6587 pIesLocal,
6588 &pCommand->u.roamCmd.roamProfile, pCommand->u.roamCmd.roamId )))
6589 {
6590 //try something else
6591 csrRoam( pMac, pCommand );
6592 }
6593 }
6594 }
6595 else
6596 {
6597 eHalStatus status = eHAL_STATUS_SUCCESS;
6598
6599 /* We need to come with other way to figure out that this is because of HO in BMP
6600 The below API will be only available for Android as it uses a different HO algorithm */
6601 /* Reassoc request will be used only for CCX and 11r handoff whereas other legacy roaming should
6602 * use join request */
6603#ifdef WLAN_FEATURE_VOWIFI_11R
6604 if (csrRoamIsHandoffInProgress(pMac) &&
6605 csrRoamIs11rAssoc(pMac))
6606 {
6607 status = csrRoamIssueReassociate(pMac, sessionId, pBssDesc,
6608 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ), &pCommand->u.roamCmd.roamProfile);
6609 }
6610 else
6611#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006612#ifdef FEATURE_WLAN_CCX
6613 if (csrRoamIsHandoffInProgress(pMac) &&
6614 csrRoamIsCCXAssoc(pMac))
6615 {
6616 // Now serialize the reassoc command.
6617 status = csrRoamIssueReassociateCmd(pMac, sessionId);
6618 }
6619 else
6620#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07006621#ifdef FEATURE_WLAN_LFR
6622 if (csrRoamIsHandoffInProgress(pMac) &&
6623 csrRoamIsFastRoamEnabled(pMac))
6624 {
6625 // Now serialize the reassoc command.
6626 status = csrRoamIssueReassociateCmd(pMac, sessionId);
6627 }
6628 else
6629#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006630 // else we are not connected and attempting to Join. Issue the
6631 // Join request.
6632 {
6633 status = csrRoamIssueJoin( pMac, sessionId, pBssDesc,
6634 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ),
6635 &pCommand->u.roamCmd.roamProfile, pCommand->u.roamCmd.roamId );
6636 }
6637 if(!HAL_STATUS_SUCCESS(status))
6638 {
6639 //try something else
6640 csrRoam( pMac, pCommand );
6641 }
6642 }
6643 if( !pScanResult->Result.pvIes )
6644 {
6645 //Locally allocated
6646 palFreeMemory(pMac->hHdd, pIesLocal);
6647 }
6648 }
6649 }//if ( csrIsInfraBssDesc( pBssDesc ) )
6650 else
6651 {
6652 smsLog(pMac, LOGW, FL(" found BSSType mismatching the one in BSS description\n"));
6653 }
6654 }//else
6655 }//if ( WNI_CFG_SUCCESS == result )
6656 else
6657 {
6658 // In the event the configuration failed, for infra let the roam processor
6659 //attempt to join something else...
6660 if( pCommand->u.roamCmd.pRoamBssEntry && CSR_IS_INFRASTRUCTURE( &pCommand->u.roamCmd.roamProfile ) )
6661 {
6662 csrRoam(pMac, pCommand);
6663 }
6664 else
6665 {
6666 //We need to complete the command
6667 if ( csrIsBssTypeIBSS( pCommand->u.roamCmd.roamProfile.BSSType ) )
6668 {
6669 csrRoamComplete(pMac, eCsrStartBssFailure, NULL);
6670 }
6671 else
6672 {
6673 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6674 }
6675 }
6676 }
6677 }//we have active entry
6678}
6679
Jeff Johnson295189b2012-06-20 16:38:30 -07006680static void csrRoamRoamingStateAuthRspProcessor( tpAniSirGlobal pMac, tSirSmeAuthRsp *pSmeAuthRsp )
6681{
6682 //No one is sending eWNI_SME_AUTH_REQ to PE.
6683 smsLog(pMac, LOGW, FL("is no-op\n"));
6684 if ( eSIR_SME_SUCCESS == pSmeAuthRsp->statusCode )
6685 {
6686 smsLog( pMac, LOGW, "CSR SmeAuthReq Successful\n" );
6687 // Successfully authenticated with a new Bss. Attempt to stop the current Bss and
6688 // join the new one...
6689 /***pBssDesc = profGetRoamingBssDesc( pAdapter, &pHddProfile );
Jeff Johnson295189b2012-06-20 16:38:30 -07006690 roamStopNetwork( pAdapter, &pBssDesc->SirBssDescription );***/
6691 }
6692 else {
6693 smsLog( pMac, LOGW, "CSR SmeAuthReq failed with statusCode= 0x%08lX [%d]\n", pSmeAuthRsp->statusCode, pSmeAuthRsp->statusCode );
6694 /***profHandleLostLinkAfterReset(pAdapter);
6695 // In the event the authenticate fails, let the roam processor attempt to join something else...
6696 roamRoam( pAdapter );***/
6697 }
6698}
6699
Jeff Johnson295189b2012-06-20 16:38:30 -07006700static void csrRoamRoamingStateReassocRspProcessor( tpAniSirGlobal pMac, tpSirSmeJoinRsp pSmeJoinRsp )
6701{
6702 eCsrRoamCompleteResult result;
6703 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
6704 tCsrRoamInfo roamInfo;
6705 tANI_U32 roamId = 0;
6706
6707 if ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode )
6708 {
6709 smsLog( pMac, LOGW, "CSR SmeReassocReq Successful\n" );
6710 result = eCsrReassocSuccess;
Jeff Johnson295189b2012-06-20 16:38:30 -07006711 /* Defeaturize this part later if needed */
6712#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
6713 /* Since the neighbor roam algorithm uses reassoc req for handoff instead of join,
6714 * we need the response contents while processing the result in csrRoamProcessResults() */
6715 if (csrRoamIsHandoffInProgress(pMac))
6716 {
6717 /* Need to dig more on indicating events to SME QoS module */
6718 sme_QosCsrEventInd(pMac, pSmeJoinRsp->sessionId, SME_QOS_CSR_HANDOFF_COMPLETE, NULL);
6719 csrRoamComplete( pMac, result, pSmeJoinRsp);
6720 }
6721 else
6722#endif
6723 {
6724 csrRoamComplete( pMac, result, NULL );
6725 }
6726 }
6727 /* Should we handle this similar to handling the join failure? Is it ok
6728 * to call csrRoamComplete() with state as CsrJoinFailure */
6729 else
6730 {
6731 smsLog( pMac, LOGW, "CSR SmeReassocReq failed with statusCode= 0x%08lX [%d]\n", pSmeJoinRsp->statusCode, pSmeJoinRsp->statusCode );
6732 result = eCsrReassocFailure;
6733#ifdef WLAN_FEATURE_VOWIFI_11R
6734 if ((eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE == pSmeJoinRsp->statusCode) ||
6735 (eSIR_SME_FT_REASSOC_FAILURE == pSmeJoinRsp->statusCode))
6736 {
6737 // Inform HDD to turn off FT flag in HDD
6738 if (pNeighborRoamInfo)
6739 {
6740 vos_mem_zero(&roamInfo, sizeof(tCsrRoamInfo));
6741 csrRoamCallCallback(pMac, pNeighborRoamInfo->csrSessionId,
6742 &roamInfo, roamId, eCSR_ROAM_FT_REASSOC_FAILED, eSIR_SME_SUCCESS);
6743 }
6744 }
6745#endif
6746 // In the event that the Reassociation fails, then we need to Disassociate the current association and keep
6747 // roaming. Note that we will attempt to Join the AP instead of a Reassoc since we may have attempted a
6748 // 'Reassoc to self', which AP's that don't support Reassoc will force a Disassoc.
6749 //The disassoc rsp message will remove the command from active list
6750 if(!HAL_STATUS_SUCCESS(csrRoamIssueDisassociate( pMac, pSmeJoinRsp->sessionId,
6751 eCSR_ROAM_SUBSTATE_DISASSOC_REASSOC_FAILURE, FALSE )))
6752 {
6753 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
6754 }
6755 }
6756}
6757
Jeff Johnson295189b2012-06-20 16:38:30 -07006758static void csrRoamRoamingStateStopBssRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSmeRsp)
6759{
Jeff Johnson295189b2012-06-20 16:38:30 -07006760#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
6761 {
6762 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07006763 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
6764 if(pIbssLog)
6765 {
6766 pIbssLog->eventId = WLAN_IBSS_EVENT_STOP_RSP;
6767 if(eSIR_SME_SUCCESS != pSmeRsp->statusCode)
6768 {
6769 pIbssLog->status = WLAN_IBSS_STATUS_FAILURE;
6770 }
6771 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
6772 }
6773 }
6774#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07006775 pMac->roam.roamSession[pSmeRsp->sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
6776 if(CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ( pMac, pSmeRsp->sessionId))
6777 {
6778 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6779 }
6780 else if(CSR_IS_ROAM_SUBSTATE_DISCONNECT_CONTINUE( pMac, pSmeRsp->sessionId))
6781 {
6782 csrRoamReissueRoamCommand(pMac);
6783 }
6784}
6785
Jeff Johnson295189b2012-06-20 16:38:30 -07006786void csrRoamRoamingStateDisassocRspProcessor( tpAniSirGlobal pMac, tSirSmeDisassocRsp *pSmeRsp )
6787{
6788 tSirResultCodes statusCode;
6789#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
6790 tScanResultHandle hBSSList;
6791 tANI_BOOLEAN fCallCallback, fRemoveCmd;
6792 eHalStatus status;
6793 tCsrRoamInfo roamInfo;
6794 tCsrScanResultFilter *pScanFilter = NULL;
6795 tANI_U32 roamId = 0;
6796 tCsrRoamProfile *pCurRoamProfile = NULL;
6797 tListElem *pEntry = NULL;
6798 tSmeCmd *pCommand = NULL;
6799#endif
6800 tANI_U32 sessionId;
6801 tCsrRoamSession *pSession;
Jeff Johnsone7245742012-09-05 17:12:55 -07006802
Jeff Johnson295189b2012-06-20 16:38:30 -07006803 tSirSmeDisassocRsp SmeDisassocRsp;
6804
6805 csrSerDesUnpackDiassocRsp((tANI_U8 *)pSmeRsp, &SmeDisassocRsp);
6806 sessionId = SmeDisassocRsp.sessionId;
6807 statusCode = SmeDisassocRsp.statusCode;
6808
6809 smsLog( pMac, LOG2, "csrRoamRoamingStateDisassocRspProcessor sessionId %d\n", sessionId);
6810
6811 if ( csrIsConnStateInfra( pMac, sessionId ) )
6812 {
6813 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
6814 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006815 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006816
6817 if(!pSession)
6818 {
6819 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6820 return;
6821 }
6822
Jeff Johnson295189b2012-06-20 16:38:30 -07006823 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_NO_JOIN( pMac, sessionId ) )
6824 {
6825 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6826 }
6827 else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_FORCED( pMac, sessionId ) ||
6828 CSR_IS_ROAM_SUBSTATE_DISASSOC_REQ( pMac, sessionId ) )
6829 {
6830 if ( eSIR_SME_SUCCESS == statusCode )
6831 {
6832 smsLog( pMac, LOG2, "CSR SmeDisassocReq force disassociated Successfully\n" );
6833 //A callback to HDD will be issued from csrRoamComplete so no need to do anything here
6834 }
6835 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6836 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006837 else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac, sessionId ) )
6838 {
6839 smsLog( pMac, LOGE, "CSR SmeDisassocReq due to HO\n" );
6840#if defined (WLAN_FEATURE_NEIGHBOR_ROAMING)
6841 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
6842 if ( pEntry )
6843 {
6844 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07006845 // If the head of the queue is Active and it is a ROAM command, remove
6846 // and put this on the Free queue.
6847 if ( eSmeCommandRoam == pCommand->command )
6848 {
Jeff Johnsone7245742012-09-05 17:12:55 -07006849
Jeff Johnson295189b2012-06-20 16:38:30 -07006850 //we need to process the result first before removing it from active list because state changes
6851 //still happening insides roamQProcessRoamResults so no other roam command should be issued
6852 fRemoveCmd = csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK );
6853 if(pCommand->u.roamCmd.fReleaseProfile)
6854 {
6855 csrReleaseProfile(pMac, &pCommand->u.roamCmd.roamProfile);
6856 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
6857 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006858 if( fRemoveCmd )
6859 {
6860 csrReleaseCommandRoam( pMac, pCommand );
6861 }
6862 else
6863 {
6864 smsLog( pMac, LOGE, " ********csrRoamRoamingStateDisassocRspProcessor fail to remove cmd reason %d\n",
6865 pCommand->u.roamCmd.roamReason );
6866 }
6867 }
6868 else
6869 {
6870 smsLog( pMac, LOGW, "CSR: Roam Completion called but ROAM command is not ACTIVE ...\n" );
6871 }
6872 }
6873 else
6874 {
6875 smsLog( pMac, LOGW, "CSR: Roam Completion called but NO commands are ACTIVE ...\n" );
6876 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006877 //notify HDD for handoff, providing the BSSID too
6878 roamInfo.reasonCode = eCsrRoamReasonBetterAP;
6879
6880 palCopyMemory(pMac->hHdd, roamInfo.bssid, pMac->roam.neighborRoamInfo.csrNeighborRoamProfile.BSSIDs.bssid, sizeof(tSirMacAddr));
6881
Jeff Johnsone7245742012-09-05 17:12:55 -07006882 csrRoamCallCallback(pMac,sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
Jeff Johnson295189b2012-06-20 16:38:30 -07006883
6884 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
6885 if(HAL_STATUS_SUCCESS(status))
6886 {
6887 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
6888 status = csrRoamPrepareFilterFromProfile(pMac, &pMac->roam.neighborRoamInfo.csrNeighborRoamProfile, pScanFilter);
6889 if(!HAL_STATUS_SUCCESS(status))
6890 {
6891 smsLog(pMac, LOGE, FL(" csrRoamPrepareFilterFromProfile fail to create scan filter\n"));
6892 }
6893
6894 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
6895 if(HAL_STATUS_SUCCESS(status))
6896 {
6897 //copy over the connected profile to apply the same for this connection as well
6898 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pCurRoamProfile, sizeof(tCsrRoamProfile))))
6899 {
6900 palZeroMemory(pMac->hHdd, pCurRoamProfile, sizeof(tCsrRoamProfile));
6901 csrRoamCopyProfile(pMac, pCurRoamProfile, pSession->pCurRoamProfile);
6902 }
6903 //make sure to put it at the head of the cmd queue
6904 status = csrRoamIssueConnect(pMac, sessionId, pCurRoamProfile,
6905 hBSSList, eCsrSmeIssuedAssocToSimilarAP,
6906 roamId, eANI_BOOLEAN_TRUE, eANI_BOOLEAN_FALSE);
6907 if(!HAL_STATUS_SUCCESS(status))
6908 {
6909 //msg
6910 fCallCallback = eANI_BOOLEAN_TRUE;
6911 }
6912 /* Notify sub-modules like QoS etc. that handoff happening */
6913 sme_QosCsrEventInd(pMac, sessionId, SME_QOS_CSR_HANDOFF_ASSOC_REQ, NULL);
6914 palFreeMemory(pMac->hHdd, pCurRoamProfile);
6915 }
6916 else
6917 {
6918 //msg
6919 smsLog( pMac, LOGE,"csrRoamRoamingStateDisassocRspProcessor: csrScanGetResult failed");
6920 // should have asserted, sending up roam complete instead. Let upper layer
6921 // decide what to do next
6922 csrCallRoamingCompletionCallback(pMac, pSession, &roamInfo, 0, eCSR_ROAM_RESULT_FAILURE);
6923 }
6924 }
6925 else
6926 {
6927 smsLog(pMac, LOGE, FL(" fail to allocate memory for scan filter\n"));
6928 csrCallRoamingCompletionCallback(pMac, pSession, &roamInfo, 0, eCSR_ROAM_RESULT_FAILURE);
6929 }
6930 if( pScanFilter )
6931 {
Jeff Johnsone7245742012-09-05 17:12:55 -07006932
Jeff Johnson295189b2012-06-20 16:38:30 -07006933 csrFreeScanFilter(pMac, pScanFilter);
6934 palFreeMemory( pMac->hHdd, pScanFilter );
6935 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006936#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07006937
Jeff Johnson295189b2012-06-20 16:38:30 -07006938 } //else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac ) )
6939 else if ( CSR_IS_ROAM_SUBSTATE_REASSOC_FAIL( pMac, sessionId ) )
6940 {
6941 // Disassoc due to Reassoc failure falls into this codepath....
6942 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
6943 }
6944 else
6945 {
6946 if ( eSIR_SME_SUCCESS == statusCode )
6947 {
6948 // Successfully disassociated from the 'old' Bss...
6949 //
6950 // We get Disassociate response in three conditions.
6951 // - First is the case where we are disasociating from an Infra Bss to start an IBSS.
6952 // - Second is the when we are disassociating from an Infra Bss to join an IBSS or a new
6953 // Infrastructure network.
6954 // - Third is where we are doing an Infra to Infra roam between networks with different
6955 // SSIDs. In all cases, we set the new Bss configuration here and attempt to join
6956
6957 smsLog( pMac, LOG2, "CSR SmeDisassocReq disassociated Successfully\n" );
6958 }
6959 else
6960 {
6961 smsLog( pMac, LOGE, "SmeDisassocReq failed with statusCode= 0x%08lX\n", statusCode );
6962 }
6963 //We are not done yet. Get the data and continue roaming
6964 csrRoamReissueRoamCommand(pMac);
6965 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006966}
6967
Jeff Johnson295189b2012-06-20 16:38:30 -07006968static void csrRoamRoamingStateDeauthRspProcessor( tpAniSirGlobal pMac, tSirSmeDeauthRsp *pSmeRsp )
6969{
6970 tSirResultCodes statusCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07006971 //No one is sending eWNI_SME_DEAUTH_REQ to PE.
6972 smsLog(pMac, LOGW, FL("is no-op\n"));
6973 statusCode = csrGetDeAuthRspStatusCode( pSmeRsp );
6974 if ( CSR_IS_ROAM_SUBSTATE_DEAUTH_REQ( pMac, pSmeRsp->sessionId) )
6975 {
6976 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6977 }
6978 else
6979 {
6980 if ( eSIR_SME_SUCCESS == statusCode )
6981 {
6982 // Successfully deauth from the 'old' Bss...
6983 //
6984 smsLog( pMac, LOG2, "CSR SmeDeauthReq disassociated Successfully\n" );
6985 }
6986 else
6987 {
6988 smsLog( pMac, LOGW, "SmeDeauthReq failed with statusCode= 0x%08lX\n", statusCode );
6989 }
6990 //We are not done yet. Get the data and continue roaming
6991 csrRoamReissueRoamCommand(pMac);
6992 }
6993}
6994
Jeff Johnson295189b2012-06-20 16:38:30 -07006995static void csrRoamRoamingStateStartBssRspProcessor( tpAniSirGlobal pMac, tSirSmeStartBssRsp *pSmeStartBssRsp )
6996{
6997 eCsrRoamCompleteResult result;
6998
6999 if ( eSIR_SME_SUCCESS == pSmeStartBssRsp->statusCode )
7000 {
7001 smsLog( pMac, LOGW, "SmeStartBssReq Successful\n" );
7002 result = eCsrStartBssSuccess;
7003 }
7004 else
7005 {
7006 smsLog( pMac, LOGW, "SmeStartBssReq failed with statusCode= 0x%08lX\n", pSmeStartBssRsp->statusCode );
7007 //Let csrRoamComplete decide what to do
7008 result = eCsrStartBssFailure;
7009 }
7010#ifdef WLAN_SOFTAP_FEATURE
7011 csrRoamComplete( pMac, result, pSmeStartBssRsp);
7012#else
7013 csrRoamComplete( pMac, result, &pSmeStartBssRsp->bssDescription );
7014#endif
7015}
7016
Jeff Johnson295189b2012-06-20 16:38:30 -07007017/*
7018 We need to be careful on whether to cast pMsgBuf (pSmeRsp) to other type of strucutres.
7019 It depends on how the message is constructed. If the message is sent by limSendSmeRsp,
7020 the pMsgBuf is only a generic response and can only be used as pointer to tSirSmeRsp.
7021 For the messages where sender allocates memory for specific structures, then it can be
7022 cast accordingly.
7023*/
7024void csrRoamingStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
7025{
7026 tSirSmeRsp *pSmeRsp;
7027 tSmeIbssPeerInd *pIbssPeerInd;
7028 tCsrRoamInfo roamInfo;
7029 // TODO Session Id need to be acquired in this function
7030 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07007031 pSmeRsp = (tSirSmeRsp *)pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07007032 smsLog( pMac, LOG2, "Message %d[0x%04X] received in substate %d\n",
7033 pSmeRsp->messageType, pSmeRsp->messageType,
7034 pMac->roam.curSubState[pSmeRsp->sessionId] );
7035#if defined ANI_PRODUCT_TYPE_AP
7036 pSmeRsp->messageType = pal_be16_to_cpu(pSmeRsp->messageType);
7037 pSmeRsp->length = pal_be16_to_cpu(pSmeRsp->length);
7038 pSmeRsp->statusCode = pal_be32_to_cpu(pSmeRsp->statusCode);
7039#else
7040 pSmeRsp->messageType = (pSmeRsp->messageType);
7041 pSmeRsp->length = (pSmeRsp->length);
7042 pSmeRsp->statusCode = (pSmeRsp->statusCode);
7043#endif
7044 switch (pSmeRsp->messageType)
7045 {
7046
7047 case eWNI_SME_JOIN_RSP: // in Roaming state, process the Join response message...
7048 if (CSR_IS_ROAM_SUBSTATE_JOIN_REQ(pMac, pSmeRsp->sessionId))
7049 {
7050 //We sent a JOIN_REQ
7051 csrRoamJoinRspProcessor( pMac, (tSirSmeJoinRsp *)pSmeRsp );
7052 }
7053 break;
7054
7055 case eWNI_SME_AUTH_RSP: // or the Authenticate response message...
7056 if (CSR_IS_ROAM_SUBSTATE_AUTH_REQ( pMac, pSmeRsp->sessionId) )
7057 {
7058 //We sent a AUTH_REQ
7059 csrRoamRoamingStateAuthRspProcessor( pMac, (tSirSmeAuthRsp *)pSmeRsp );
7060 }
7061 break;
7062
7063 case eWNI_SME_REASSOC_RSP: // or the Reassociation response message...
7064 if (CSR_IS_ROAM_SUBSTATE_REASSOC_REQ( pMac, pSmeRsp->sessionId) )
7065 {
7066 csrRoamRoamingStateReassocRspProcessor( pMac, (tpSirSmeJoinRsp )pSmeRsp );
7067 }
7068 break;
7069
7070 case eWNI_SME_STOP_BSS_RSP: // or the Stop Bss response message...
7071 {
7072 csrRoamRoamingStateStopBssRspProcessor(pMac, pSmeRsp);
7073 }
7074 break;
7075
7076 case eWNI_SME_DISASSOC_RSP: // or the Disassociate response message...
7077 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_REQ( pMac, pSmeRsp->sessionId ) ||
7078 CSR_IS_ROAM_SUBSTATE_DISASSOC_NO_JOIN( pMac, pSmeRsp->sessionId ) ||
7079 CSR_IS_ROAM_SUBSTATE_REASSOC_FAIL( pMac, pSmeRsp->sessionId ) ||
7080 CSR_IS_ROAM_SUBSTATE_DISASSOC_FORCED( pMac, pSmeRsp->sessionId ) ||
7081 CSR_IS_ROAM_SUBSTATE_DISCONNECT_CONTINUE( pMac, pSmeRsp->sessionId ) ||
7082//HO
7083 CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac, pSmeRsp->sessionId ) )
7084 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07007085 smsLog(pMac, LOG1, FL("eWNI_SME_DISASSOC_RSP subState = %d\n"), pMac->roam.curSubState[pSmeRsp->sessionId]);
Jeff Johnson295189b2012-06-20 16:38:30 -07007086 csrRoamRoamingStateDisassocRspProcessor( pMac, (tSirSmeDisassocRsp *)pSmeRsp );
7087 }
7088 break;
7089
7090 case eWNI_SME_DEAUTH_RSP: // or the Deauthentication response message...
7091 if ( CSR_IS_ROAM_SUBSTATE_DEAUTH_REQ( pMac, pSmeRsp->sessionId ) )
7092 {
7093 csrRoamRoamingStateDeauthRspProcessor( pMac, (tSirSmeDeauthRsp *)pSmeRsp );
7094 }
7095 break;
7096
7097 case eWNI_SME_START_BSS_RSP: // or the Start BSS response message...
7098 if (CSR_IS_ROAM_SUBSTATE_START_BSS_REQ( pMac, pSmeRsp->sessionId ) )
7099 {
7100 csrRoamRoamingStateStartBssRspProcessor( pMac, (tSirSmeStartBssRsp *)pSmeRsp );
7101 }
7102 break;
7103
7104 case WNI_CFG_SET_CNF: // process the Config Confirm messages when we are in 'Config' substate...
7105 if ( CSR_IS_ROAM_SUBSTATE_CONFIG( pMac, pSmeRsp->sessionId ) )
7106 {
7107 csrRoamingStateConfigCnfProcessor( pMac, ((tCsrCfgSetRsp *)pSmeRsp)->respStatus );
7108 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007109 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07007110 //In case CSR issues STOP_BSS, we need to tell HDD about peer departed becasue PE is removing them
7111 case eWNI_SME_IBSS_PEER_DEPARTED_IND:
7112 pIbssPeerInd = (tSmeIbssPeerInd*)pSmeRsp;
7113 smsLog(pMac, LOGE, "CSR: Peer departed notification from LIM in joining state\n");
7114 palZeroMemory( pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo) );
7115 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
7116 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
7117 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
7118 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
7119 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
7120 eCSR_ROAM_CONNECT_STATUS_UPDATE,
7121 eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
7122 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07007123 default:
7124 smsLog( pMac, LOG1, "Unexpected message type = %d[0x%X] received in substate %d\n",
7125 pSmeRsp->messageType, pSmeRsp->messageType,
7126 pMac->roam.curSubState[pSmeRsp->sessionId] );
7127
7128 //If we are connected, check the link status change
7129 if(!csrIsConnStateDisconnected(pMac, sessionId))
7130 {
7131 csrRoamCheckForLinkStatusChange( pMac, pSmeRsp );
7132 }
7133 break;
7134 }
7135}
7136
Jeff Johnson295189b2012-06-20 16:38:30 -07007137void csrRoamJoinedStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
7138{
7139 tSirSmeRsp *pSirMsg = (tSirSmeRsp *)pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07007140 switch (pSirMsg->messageType)
7141 {
7142 case eWNI_SME_GET_STATISTICS_RSP:
Mohit Khanna23863762012-09-11 17:40:09 -07007143 smsLog( pMac, LOG2, FL("Stats rsp from PE\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07007144 csrRoamStatsRspProcessor( pMac, pSirMsg );
7145 break;
7146#ifdef WLAN_SOFTAP_FEATURE
7147 case eWNI_SME_UPPER_LAYER_ASSOC_CNF:
7148 {
7149 tCsrRoamSession *pSession;
7150 tSirSmeAssocIndToUpperLayerCnf *pUpperLayerAssocCnf;
7151 tCsrRoamInfo roamInfo;
7152 tCsrRoamInfo *pRoamInfo = NULL;
7153 tANI_U32 sessionId;
7154 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007155 smsLog( pMac, LOG1, FL("ASSOCIATION confirmation can be given to upper layer \n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07007156 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
7157 pRoamInfo = &roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07007158 pUpperLayerAssocCnf = (tSirSmeAssocIndToUpperLayerCnf *)pMsgBuf;
7159 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pUpperLayerAssocCnf->bssId, &sessionId );
7160 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07007161
7162 if(!pSession)
7163 {
7164 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
7165 return;
7166 }
7167
Jeff Johnson295189b2012-06-20 16:38:30 -07007168 pRoamInfo->statusCode = eSIR_SME_SUCCESS; //send the status code as Success
7169 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
Jeff Johnson295189b2012-06-20 16:38:30 -07007170 pRoamInfo->staId = (tANI_U8)pUpperLayerAssocCnf->aid;
7171 pRoamInfo->rsnIELen = (tANI_U8)pUpperLayerAssocCnf->rsnIE.length;
7172 pRoamInfo->prsnIE = pUpperLayerAssocCnf->rsnIE.rsnIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07007173 pRoamInfo->addIELen = (tANI_U8)pUpperLayerAssocCnf->addIE.length;
7174 pRoamInfo->paddIE = pUpperLayerAssocCnf->addIE.addIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07007175 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pUpperLayerAssocCnf->peerMacAddr, sizeof(tSirMacAddr));
7176 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pUpperLayerAssocCnf->bssId, sizeof(tCsrBssid));
Jeff Johnson295189b2012-06-20 16:38:30 -07007177 pRoamInfo->wmmEnabledSta = pUpperLayerAssocCnf->wmmEnabledSta;
Jeff Johnson295189b2012-06-20 16:38:30 -07007178 if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile) )
7179 {
7180 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED;
7181 pRoamInfo->fReassocReq = pUpperLayerAssocCnf->reassocReq;
7182 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_CNF);
7183 }
7184 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
7185 {
7186 vos_sleep( 100 );
7187 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED;//Sta
7188 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND);//Sta
7189 }
7190
Jeff Johnson295189b2012-06-20 16:38:30 -07007191 }
7192 break;
7193#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07007194 default:
7195 csrRoamCheckForLinkStatusChange( pMac, pSirMsg );
7196 break;
7197 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007198}
7199
Jeff Johnson295189b2012-06-20 16:38:30 -07007200eHalStatus csrRoamIssueSetContextReq( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrEncryptionType EncryptType,
7201 tSirBssDescription *pBssDescription,
7202 tSirMacAddr *bssId, tANI_BOOLEAN addKey,
7203 tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
7204 tANI_U8 keyId, tANI_U16 keyLength,
7205 tANI_U8 *pKey, tANI_U8 paeRole )
7206{
7207 eHalStatus status = eHAL_STATUS_SUCCESS;
7208 tAniEdType edType;
7209
7210 if(eCSR_ENCRYPT_TYPE_UNKNOWN == EncryptType)
7211 {
7212 EncryptType = eCSR_ENCRYPT_TYPE_NONE; //***
7213 }
7214
7215 edType = csrTranslateEncryptTypeToEdType( EncryptType );
7216
7217 // Allow 0 keys to be set for the non-WPA encrypt types... For WPA encrypt types, the num keys must be non-zero
7218 // or LIM will reject the set context (assumes the SET_CONTEXT does not occur until the keys are distrubuted).
7219 if ( CSR_IS_ENC_TYPE_STATIC( EncryptType ) ||
7220 addKey )
7221 {
7222 tCsrRoamSetKey setKey;
Jeff Johnson295189b2012-06-20 16:38:30 -07007223 setKey.encType = EncryptType;
7224 setKey.keyDirection = aniKeyDirection; //Tx, Rx or Tx-and-Rx
7225 palCopyMemory( pMac->hHdd, &setKey.peerMac, bssId, sizeof(tCsrBssid) );
7226 setKey.paeRole = paeRole; //0 for supplicant
7227 setKey.keyId = keyId; // Kye index
7228 setKey.keyLength = keyLength;
7229 if( keyLength )
7230 {
7231 palCopyMemory( pMac->hHdd, setKey.Key, pKey, keyLength );
7232 }
7233 status = csrRoamIssueSetKeyCommand( pMac, sessionId, &setKey, 0 );
7234 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007235 return (status);
7236}
7237
Jeff Johnson295189b2012-06-20 16:38:30 -07007238static eHalStatus csrRoamIssueSetKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
7239 tCsrRoamSetKey *pSetKey, tANI_U32 roamId )
7240{
7241 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
7242 tSmeCmd *pCommand = NULL;
7243#ifdef FEATURE_WLAN_CCX
7244 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7245#endif /* FEATURE_WLAN_CCX */
7246
7247 do
7248 {
7249 pCommand = csrGetCommandBuffer(pMac);
7250 if(NULL == pCommand)
7251 {
7252 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7253 status = eHAL_STATUS_RESOURCES;
7254 break;
7255 }
7256 pCommand->command = eSmeCommandSetKey;
7257 pCommand->sessionId = (tANI_U8)sessionId;
7258 // validate the key length, Adjust if too long...
7259 // for static WEP the keys are not set thru' SetContextReq
7260 if ( ( eCSR_ENCRYPT_TYPE_WEP40 == pSetKey->encType ) ||
7261 ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pSetKey->encType ) )
7262 {
7263 //KeyLength maybe 0 for static WEP
7264 if( pSetKey->keyLength )
7265 {
7266 if ( pSetKey->keyLength < CSR_WEP40_KEY_LEN )
7267 {
7268 smsLog( pMac, LOGW, "Invalid WEP40 keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7269 break;
7270 }
7271
7272 pCommand->u.setKeyCmd.keyLength = CSR_WEP40_KEY_LEN;
7273 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WEP40_KEY_LEN );
7274 }
7275 }
7276 else if ( ( eCSR_ENCRYPT_TYPE_WEP104 == pSetKey->encType ) ||
7277 ( eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pSetKey->encType ) )
7278 {
7279 //KeyLength maybe 0 for static WEP
7280 if( pSetKey->keyLength )
7281 {
7282 if ( pSetKey->keyLength < CSR_WEP104_KEY_LEN )
7283 {
7284 smsLog( pMac, LOGW, "Invalid WEP104 keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7285 break;
7286 }
7287
7288 pCommand->u.setKeyCmd.keyLength = CSR_WEP104_KEY_LEN;
7289 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WEP104_KEY_LEN );
7290 }
7291 }
7292 else if ( eCSR_ENCRYPT_TYPE_TKIP == pSetKey->encType )
7293 {
7294 if ( pSetKey->keyLength < CSR_TKIP_KEY_LEN )
7295 {
7296 smsLog( pMac, LOGW, "Invalid TKIP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7297 break;
7298 }
7299 pCommand->u.setKeyCmd.keyLength = CSR_TKIP_KEY_LEN;
7300 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_TKIP_KEY_LEN );
7301 }
7302 else if ( eCSR_ENCRYPT_TYPE_AES == pSetKey->encType )
7303 {
7304 if ( pSetKey->keyLength < CSR_AES_KEY_LEN )
7305 {
7306 smsLog( pMac, LOGW, "Invalid AES/CCMP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7307 break;
7308 }
7309 pCommand->u.setKeyCmd.keyLength = CSR_AES_KEY_LEN;
7310 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_AES_KEY_LEN );
7311 }
7312#ifdef FEATURE_WLAN_WAPI
7313 else if ( eCSR_ENCRYPT_TYPE_WPI == pSetKey->encType )
7314 {
7315 if ( pSetKey->keyLength < CSR_WAPI_KEY_LEN )
7316 {
7317 smsLog( pMac, LOGW, "Invalid WAPI keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7318 break;
7319 }
7320 pCommand->u.setKeyCmd.keyLength = CSR_WAPI_KEY_LEN;
7321 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WAPI_KEY_LEN );
7322 }
7323#endif /* FEATURE_WLAN_WAPI */
7324#ifdef FEATURE_WLAN_CCX
7325 else if ( eCSR_ENCRYPT_TYPE_KRK == pSetKey->encType )
7326 {
7327 if ( pSetKey->keyLength < CSR_KRK_KEY_LEN )
7328 {
7329 smsLog( pMac, LOGW, "Invalid KRK keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7330 break;
7331 }
7332 palCopyMemory( pMac->hHdd, pSession->ccxCckmInfo.krk, pSetKey->Key, CSR_KRK_KEY_LEN );
7333 pSession->ccxCckmInfo.reassoc_req_num=1;
7334 pSession->ccxCckmInfo.krk_plumbed = eANI_BOOLEAN_TRUE;
7335 status = eHAL_STATUS_SUCCESS;
7336 break;
7337 }
7338#endif /* FEATURE_WLAN_CCX */
Jeff Johnsone7245742012-09-05 17:12:55 -07007339
Jeff Johnson295189b2012-06-20 16:38:30 -07007340#ifdef WLAN_FEATURE_11W
7341 //Check for 11w BIP
7342 else if ( eCSR_ENCRYPT_TYPE_AES_CMAC == pSetKey->encType )
7343 {
7344 tANI_U16 count = 0;
7345 if ( pSetKey->keyLength < CSR_AES_KEY_LEN )
7346 {
7347 smsLog( pMac, LOGW, "Invalid AES/CCMP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7348 break;
7349 }
7350 pCommand->u.setKeyCmd.keyLength = CSR_AES_KEY_LEN;
7351 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_AES_KEY_LEN );
7352 }
7353#endif
7354 status = eHAL_STATUS_SUCCESS;
7355 pCommand->u.setKeyCmd.roamId = roamId;
7356 pCommand->u.setKeyCmd.encType = pSetKey->encType;
7357 pCommand->u.setKeyCmd.keyDirection = pSetKey->keyDirection; //Tx, Rx or Tx-and-Rx
7358 palCopyMemory( pMac->hHdd, &pCommand->u.setKeyCmd.peerMac, &pSetKey->peerMac, sizeof(tCsrBssid) );
7359 pCommand->u.setKeyCmd.paeRole = pSetKey->paeRole; //0 for supplicant
7360 pCommand->u.setKeyCmd.keyId = pSetKey->keyId;
7361 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.keyRsc, pSetKey->keyRsc, CSR_MAX_RSC_LEN );
7362 //Always put set key to the head of the Q because it is the only thing to get executed in case of WT_KEY state
7363
7364 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_TRUE);
7365 if( !HAL_STATUS_SUCCESS( status ) )
7366 {
7367 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
7368 }
7369 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07007370 // Free the command if there has been a failure, or it is a
7371 // "local" operation like the set CCX CCKM KRK key.
7372 if( (!HAL_STATUS_SUCCESS( status ) && ( NULL != pCommand ))
7373#ifdef FEATURE_WLAN_CCX
7374 || ( eCSR_ENCRYPT_TYPE_KRK == pSetKey->encType )
7375#endif /* FEATURE_WLAN_CCX */
7376 )
7377 {
7378 csrReleaseCommandSetKey( pMac, pCommand );
7379 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007380 return( status );
7381}
7382
Jeff Johnson295189b2012-06-20 16:38:30 -07007383eHalStatus csrRoamIssueRemoveKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
7384 tCsrRoamRemoveKey *pRemoveKey, tANI_U32 roamId )
7385{
7386 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
7387 tSmeCmd *pCommand = NULL;
7388 tANI_BOOLEAN fImediate = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07007389 do
7390 {
7391 if( !csrIsSetKeyAllowed(pMac, sessionId) )
7392 {
7393 smsLog( pMac, LOGW, FL(" wrong state not allowed to set key\n") );
7394 status = eHAL_STATUS_CSR_WRONG_STATE;
7395 break;
7396 }
7397 pCommand = csrGetCommandBuffer(pMac);
7398 if(NULL == pCommand)
7399 {
7400 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7401 status = eHAL_STATUS_RESOURCES;
7402 break;
7403 }
7404 pCommand->command = eSmeCommandRemoveKey;
7405 pCommand->sessionId = (tANI_U8)sessionId;
7406 pCommand->u.removeKeyCmd.roamId = roamId;
7407 pCommand->u.removeKeyCmd.encType = pRemoveKey->encType;
7408 palCopyMemory( pMac->hHdd, &pCommand->u.removeKeyCmd.peerMac, &pRemoveKey->peerMac, sizeof(tSirMacAddr) );
7409 pCommand->u.removeKeyCmd.keyId = pRemoveKey->keyId;
7410 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
7411 {
7412 //in this case, put it to the end of the Q incase there is a set key pending.
7413 fImediate = eANI_BOOLEAN_FALSE;
7414 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007415 smsLog( pMac, LOGE, FL("keyType=%d, keyId=%d, PeerMac=%02x, %02x, %02x, %02x, %02x, %02x\n"),
7416 pRemoveKey->encType, pRemoveKey->keyId,
7417 pCommand->u.removeKeyCmd.peerMac[0],
7418 pCommand->u.removeKeyCmd.peerMac[1],
7419 pCommand->u.removeKeyCmd.peerMac[2],
7420 pCommand->u.removeKeyCmd.peerMac[3],
7421 pCommand->u.removeKeyCmd.peerMac[4],
7422 pCommand->u.removeKeyCmd.peerMac[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -07007423 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
7424 if( !HAL_STATUS_SUCCESS( status ) )
7425 {
7426 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
7427 break;
7428 }
7429 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07007430 if( !HAL_STATUS_SUCCESS( status ) && ( NULL != pCommand ) )
7431 {
7432 csrReleaseCommandRemoveKey( pMac, pCommand );
7433 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007434 return (status );
7435}
7436
Jeff Johnson295189b2012-06-20 16:38:30 -07007437eHalStatus csrRoamProcessSetKeyCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
7438{
7439 eHalStatus status;
7440 tANI_U8 numKeys = ( pCommand->u.setKeyCmd.keyLength ) ? 1 : 0;
7441 tAniEdType edType = csrTranslateEncryptTypeToEdType( pCommand->u.setKeyCmd.encType );
7442 tANI_BOOLEAN fUnicast = ( pCommand->u.setKeyCmd.peerMac[0] == 0xFF ) ? eANI_BOOLEAN_FALSE : eANI_BOOLEAN_TRUE;
7443 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007444#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7445 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7446 WLAN_VOS_DIAG_EVENT_DEF(setKeyEvent, vos_event_wlan_security_payload_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07007447 if(eCSR_ENCRYPT_TYPE_NONE != edType)
7448 {
7449 palZeroMemory(pMac->hHdd, &setKeyEvent, sizeof(vos_event_wlan_security_payload_type));
7450 if( *(( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac) & 0x01 )
7451 {
7452 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_REQ;
7453 setKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pCommand->u.setKeyCmd.encType);
7454 setKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
7455 }
7456 else
7457 {
7458 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_REQ;
7459 setKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pCommand->u.setKeyCmd.encType);
7460 setKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
7461 }
7462 palCopyMemory( pMac->hHdd, setKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
7463 if(CSR_IS_ENC_TYPE_STATIC(edType))
7464 {
7465 tANI_U32 defKeyId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007466 //It has to be static WEP here
7467 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_WEP_DEFAULT_KEYID, &defKeyId)))
7468 {
7469 setKeyEvent.keyId = (v_U8_t)defKeyId;
7470 }
7471 }
7472 else
7473 {
7474 setKeyEvent.keyId = pCommand->u.setKeyCmd.keyId;
7475 }
7476 setKeyEvent.authMode = (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
7477 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
7478 }
7479#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007480 if( csrIsSetKeyAllowed(pMac, sessionId) )
7481 {
7482 status = csrSendMBSetContextReqMsg( pMac, sessionId,
7483 ( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac,
7484 numKeys, edType, fUnicast, pCommand->u.setKeyCmd.keyDirection,
7485 pCommand->u.setKeyCmd.keyId, pCommand->u.setKeyCmd.keyLength,
7486 pCommand->u.setKeyCmd.Key, pCommand->u.setKeyCmd.paeRole,
7487 pCommand->u.setKeyCmd.keyRsc);
7488 }
7489 else
7490 {
7491 smsLog( pMac, LOGW, FL(" cannot process not connected\n") );
7492 //Set this status so the error handling take care of the case.
7493 status = eHAL_STATUS_CSR_WRONG_STATE;
7494 }
7495 if( !HAL_STATUS_SUCCESS(status) )
7496 {
7497 smsLog( pMac, LOGE, FL(" error status %d\n"), status );
7498 csrRoamCallCallback( pMac, sessionId, NULL, pCommand->u.setKeyCmd.roamId, eCSR_ROAM_SET_KEY_COMPLETE, eCSR_ROAM_RESULT_FAILURE);
Jeff Johnson295189b2012-06-20 16:38:30 -07007499#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7500 if(eCSR_ENCRYPT_TYPE_NONE != edType)
7501 {
7502 if( *(( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac) & 0x01 )
7503 {
7504 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_RSP;
7505 }
7506 else
7507 {
7508 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_RSP;
7509 }
7510 setKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
7511 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
7512 }
7513#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007514 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007515 return ( status );
7516}
7517
Jeff Johnson295189b2012-06-20 16:38:30 -07007518eHalStatus csrRoamProcessRemoveKeyCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
7519{
7520 eHalStatus status;
7521 tpSirSmeRemoveKeyReq pMsg = NULL;
7522 tANI_U16 wMsgLen = sizeof(tSirSmeRemoveKeyReq);
7523 tANI_U8 *p;
7524 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007525#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7526 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7527 WLAN_VOS_DIAG_EVENT_DEF(removeKeyEvent, vos_event_wlan_security_payload_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07007528 palZeroMemory(pMac->hHdd, &removeKeyEvent, sizeof(vos_event_wlan_security_payload_type));
7529 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_REQ;
7530 removeKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
7531 removeKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
7532 palCopyMemory( pMac->hHdd, removeKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
7533 removeKeyEvent.keyId = pCommand->u.removeKeyCmd.keyId;
7534 removeKeyEvent.authMode = (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
7535 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
7536#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007537 if( csrIsSetKeyAllowed(pMac, sessionId) )
7538 {
7539 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, wMsgLen );
7540 }
7541 else
7542 {
7543 smsLog( pMac, LOGW, FL(" wrong state not allowed to set key\n") );
7544 //Set the error status so error handling kicks in below
7545 status = eHAL_STATUS_CSR_WRONG_STATE;
7546 }
7547 if( HAL_STATUS_SUCCESS( status ) )
7548 {
7549 palZeroMemory(pMac->hHdd, pMsg, wMsgLen);
7550 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_REMOVEKEY_REQ);
7551 pMsg->length = pal_cpu_to_be16(wMsgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -07007552 pMsg->sessionId = (tANI_U8)sessionId;
7553 pMsg->transactionId = 0;
7554 p = (tANI_U8 *)pMsg + sizeof(pMsg->messageType) + sizeof(pMsg->length) +
7555 sizeof(pMsg->sessionId) + sizeof(pMsg->transactionId);
7556 // bssId - copy from session Info
7557 palCopyMemory( pMac->hHdd, p, &pMac->roam.roamSession[sessionId].connectedProfile.bssid, sizeof(tSirMacAddr) );
7558 p += sizeof(tSirMacAddr);
7559 // peerMacAddr
7560 palCopyMemory( pMac->hHdd, p, pCommand->u.removeKeyCmd.peerMac, sizeof(tSirMacAddr) );
7561 p += sizeof(tSirMacAddr);
7562 // edType
7563 *p = (tANI_U8)csrTranslateEncryptTypeToEdType( pCommand->u.removeKeyCmd.encType );
7564 p++;
7565 // weptype
7566 if( ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pCommand->u.removeKeyCmd.encType ) ||
7567 ( eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pCommand->u.removeKeyCmd.encType ) )
7568 {
7569 *p = (tANI_U8)eSIR_WEP_STATIC;
7570 }
7571 else
7572 {
7573 *p = (tANI_U8)eSIR_WEP_DYNAMIC;
7574 }
7575 p++;
7576 //keyid
7577 *p = pCommand->u.removeKeyCmd.keyId;
7578 p++;
7579 *p = (pCommand->u.removeKeyCmd.peerMac[0] == 0xFF ) ? 0 : 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07007580 status = palSendMBMessage(pMac->hHdd, pMsg);
7581 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007582 if( !HAL_STATUS_SUCCESS( status ) )
7583 {
7584 smsLog( pMac, LOGE, FL(" error status \n"), status );
Jeff Johnson295189b2012-06-20 16:38:30 -07007585#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7586 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_RSP;
7587 removeKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;;
7588 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
7589#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007590 csrRoamCallCallback( pMac, sessionId, NULL, pCommand->u.removeKeyCmd.roamId, eCSR_ROAM_REMOVE_KEY_COMPLETE, eCSR_ROAM_RESULT_FAILURE);
7591 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007592 return ( status );
7593}
7594
Jeff Johnson295189b2012-06-20 16:38:30 -07007595eHalStatus csrRoamSetKey( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamSetKey *pSetKey, tANI_U32 roamId )
7596{
7597 eHalStatus status;
7598
7599 if( !csrIsSetKeyAllowed(pMac, sessionId) )
7600 {
7601 status = eHAL_STATUS_CSR_WRONG_STATE;
7602 }
7603 else
7604 {
7605 status = csrRoamIssueSetKeyCommand( pMac, sessionId, pSetKey, roamId );
7606 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007607 return ( status );
7608}
7609
Jeff Johnson295189b2012-06-20 16:38:30 -07007610/*
7611 Prepare a filter base on a profile for parsing the scan results.
7612 Upon successful return, caller MUST call csrFreeScanFilter on
7613 pScanFilter when it is done with the filter.
7614*/
7615eHalStatus csrRoamPrepareFilterFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
7616 tCsrScanResultFilter *pScanFilter)
7617{
7618 eHalStatus status = eHAL_STATUS_SUCCESS;
7619 tANI_U32 size = 0;
7620 tANI_U8 index = 0;
7621
7622 do
7623 {
7624 if(pProfile->BSSIDs.numOfBSSIDs)
7625 {
7626 size = sizeof(tCsrBssid) * pProfile->BSSIDs.numOfBSSIDs;
7627 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->BSSIDs.bssid, size);
7628 if(!HAL_STATUS_SUCCESS(status))
7629 {
7630 break;
7631 }
7632 pScanFilter->BSSIDs.numOfBSSIDs = pProfile->BSSIDs.numOfBSSIDs;
7633 palCopyMemory(pMac->hHdd, pScanFilter->BSSIDs.bssid, pProfile->BSSIDs.bssid, size);
7634 }
7635 if(pProfile->SSIDs.numOfSSIDs)
7636 {
7637 if( !CSR_IS_WDS_STA( pProfile ) )
7638 {
7639 pScanFilter->SSIDs.numOfSSIDs = pProfile->SSIDs.numOfSSIDs;
7640 }
7641 else
7642 {
7643 //For WDS station
7644 //We always use index 1 for self SSID. Index 0 for peer's SSID that we want to join
7645 pScanFilter->SSIDs.numOfSSIDs = 1;
7646 }
7647 size = sizeof(tCsrSSIDInfo) * pProfile->SSIDs.numOfSSIDs;
7648 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->SSIDs.SSIDList, size);
7649 if(!HAL_STATUS_SUCCESS(status))
7650 {
7651 break;
7652 }
7653 palCopyMemory(pMac->hHdd, pScanFilter->SSIDs.SSIDList, pProfile->SSIDs.SSIDList, size);
7654 }
7655 if(!pProfile->ChannelInfo.ChannelList || (pProfile->ChannelInfo.ChannelList[0] == 0) )
7656 {
7657 pScanFilter->ChannelInfo.numOfChannels = 0;
7658 pScanFilter->ChannelInfo.ChannelList = NULL;
7659 }
7660 else if(pProfile->ChannelInfo.numOfChannels)
7661 {
7662 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->ChannelInfo.ChannelList, sizeof(*pScanFilter->ChannelInfo.ChannelList) * pProfile->ChannelInfo.numOfChannels);
7663 pScanFilter->ChannelInfo.numOfChannels = 0;
7664 if(HAL_STATUS_SUCCESS(status))
7665 {
7666 for(index = 0; index < pProfile->ChannelInfo.numOfChannels; index++)
7667 {
7668 if(csrRoamIsChannelValid(pMac, pProfile->ChannelInfo.ChannelList[index]))
7669 {
7670 pScanFilter->ChannelInfo.ChannelList[pScanFilter->ChannelInfo.numOfChannels]
7671 = pProfile->ChannelInfo.ChannelList[index];
7672 pScanFilter->ChannelInfo.numOfChannels++;
7673 }
7674 else
7675 {
7676 smsLog(pMac, LOG1, FL("process a channel (%d) that is invalid\n"), pProfile->ChannelInfo.ChannelList[index]);
7677 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007678 }
7679 }
7680 else
7681 {
7682 break;
7683 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007684 }
7685 else
7686 {
7687 smsLog(pMac, LOGW, FL("Channel list empty\n"));
7688 status = eHAL_STATUS_FAILURE;
7689 break;
7690 }
7691 pScanFilter->uapsd_mask = pProfile->uapsd_mask;
7692 pScanFilter->authType = pProfile->AuthType;
7693 pScanFilter->EncryptionType = pProfile->EncryptionType;
7694 pScanFilter->mcEncryptionType = pProfile->mcEncryptionType;
7695 pScanFilter->BSSType = pProfile->BSSType;
7696 pScanFilter->phyMode = pProfile->phyMode;
7697#ifdef FEATURE_WLAN_WAPI
7698 //check if user asked for WAPI with 11n or auto mode, in that case modify
7699 //the phymode to 11g
7700 if(csrIsProfileWapi(pProfile))
7701 {
7702 if(pScanFilter->phyMode & eCSR_DOT11_MODE_11n)
7703 {
7704 pScanFilter->phyMode &= ~eCSR_DOT11_MODE_11n;
7705 }
7706 if(pScanFilter->phyMode & eCSR_DOT11_MODE_AUTO)
7707 {
7708 pScanFilter->phyMode &= ~eCSR_DOT11_MODE_AUTO;
7709 }
7710 if(!pScanFilter->phyMode)
7711 {
7712 pScanFilter->phyMode = eCSR_DOT11_MODE_11g;
7713 }
7714 }
7715#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07007716 /*Save the WPS info*/
7717 pScanFilter->bWPSAssociation = pProfile->bWPSAssociation;
Jeff Johnson295189b2012-06-20 16:38:30 -07007718 if( pProfile->countryCode[0] )
7719 {
7720 //This causes the matching function to use countryCode as one of the criteria.
7721 palCopyMemory( pMac->hHdd, pScanFilter->countryCode, pProfile->countryCode,
7722 WNI_CFG_COUNTRY_CODE_LEN );
7723 }
7724#ifdef WLAN_FEATURE_VOWIFI_11R
7725 if (pProfile->MDID.mdiePresent)
7726 {
7727 pScanFilter->MDID.mdiePresent = 1;
7728 pScanFilter->MDID.mobilityDomain = pProfile->MDID.mobilityDomain;
7729 }
7730#endif
7731
7732 }while(0);
7733
7734 if(!HAL_STATUS_SUCCESS(status))
7735 {
7736 csrFreeScanFilter(pMac, pScanFilter);
7737 }
7738
7739 return(status);
7740}
7741
Jeff Johnson295189b2012-06-20 16:38:30 -07007742tANI_BOOLEAN csrRoamIssueWmStatusChange( tpAniSirGlobal pMac, tANI_U32 sessionId,
7743 eCsrRoamWmStatusChangeTypes Type, tSirSmeRsp *pSmeRsp )
7744{
7745 tANI_BOOLEAN fCommandQueued = eANI_BOOLEAN_FALSE;
7746 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07007747 do
7748 {
7749 // Validate the type is ok...
7750 if ( ( eCsrDisassociated != Type ) && ( eCsrDeauthenticated != Type ) ) break;
7751 pCommand = csrGetCommandBuffer( pMac );
7752 if ( !pCommand )
7753 {
7754 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7755 break;
7756 }
7757 //Change the substate in case it is waiting for key
7758 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
7759 {
7760 csrRoamStopWaitForKeyTimer( pMac );
7761 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
7762 }
7763 pCommand->command = eSmeCommandWmStatusChange;
7764 pCommand->sessionId = (tANI_U8)sessionId;
7765 pCommand->u.wmStatusChangeCmd.Type = Type;
7766 if ( eCsrDisassociated == Type )
7767 {
7768 palCopyMemory( pMac->hHdd, &pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg, pSmeRsp,
7769 sizeof( pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg ) );
7770 }
7771 else
7772 {
7773 palCopyMemory( pMac->hHdd, &pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg, pSmeRsp,
7774 sizeof( pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg ) );
7775 }
7776 if( HAL_STATUS_SUCCESS( csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_TRUE) ) )
7777 {
7778 fCommandQueued = eANI_BOOLEAN_TRUE;
7779 }
7780 else
7781 {
7782 smsLog( pMac, LOGE, FL(" fail to send message \n") );
7783 csrReleaseCommandWmStatusChange( pMac, pCommand );
7784 }
7785
Jeff Johnson295189b2012-06-20 16:38:30 -07007786 /* AP has issued Dissac/Deauth, Set the operating mode value to configured value */
7787 csrSetDefaultDot11Mode( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -07007788 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07007789 return( fCommandQueued );
7790}
7791
Jeff Johnson295189b2012-06-20 16:38:30 -07007792static void csrUpdateRssi(tpAniSirGlobal pMac, void* pMsg)
7793{
7794 v_S7_t rssi = 0;
7795 tAniGetRssiReq *pGetRssiReq = (tAniGetRssiReq*)pMsg;
7796 if(pGetRssiReq)
7797 {
7798 if(NULL != pGetRssiReq->pVosContext)
7799 {
7800 WLANTL_GetRssi(pGetRssiReq->pVosContext, pGetRssiReq->staId, &rssi);
7801 }
7802 else
7803 {
7804 smsLog( pMac, LOGE, FL("pGetRssiReq->pVosContext is NULL\n"));
7805 return;
7806 }
7807
7808 if(NULL != pGetRssiReq->rssiCallback)
7809 {
7810 ((tCsrRssiCallback)(pGetRssiReq->rssiCallback))(rssi, pGetRssiReq->staId, pGetRssiReq->pDevContext);
7811 }
7812 else
7813 {
7814 smsLog( pMac, LOGE, FL("pGetRssiReq->rssiCallback is NULL\n"));
7815 return;
7816 }
7817 }
7818 else
7819 {
7820 smsLog( pMac, LOGE, FL("pGetRssiReq is NULL\n"));
7821 }
7822 return;
7823}
Jeff Johnsone7245742012-09-05 17:12:55 -07007824static void csrRoamRssiIndHdlr(tpAniSirGlobal pMac, void* pMsg)
7825{
7826 WLANTL_TlIndicationReq *pTlRssiInd = (WLANTL_TlIndicationReq*)pMsg;
7827 if(pTlRssiInd)
7828 {
7829 if(NULL != pTlRssiInd->tlCallback)
7830 {
7831 ((WLANTL_RSSICrossThresholdCBType)(pTlRssiInd->tlCallback))
7832 (pTlRssiInd->pAdapter, pTlRssiInd->rssiNotification, pTlRssiInd->pUserCtxt);
7833 }
7834 else
7835 {
7836 smsLog( pMac, LOGE, FL("pTlRssiInd->tlCallback is NULL\n"));
7837 }
7838 }
7839 else
7840 {
7841 smsLog( pMac, LOGE, FL("pTlRssiInd is NULL\n"));
7842 }
7843 return;
7844}
Jeff Johnson295189b2012-06-20 16:38:30 -07007845
7846void csrRoamCheckForLinkStatusChange( tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg )
7847{
7848 tSirSmeAssocInd *pAssocInd;
7849 tSirSmeDisassocInd *pDisassocInd;
7850 tSirSmeDeauthInd *pDeauthInd;
7851 tSirSmeWmStatusChangeNtf *pStatusChangeMsg;
7852 tSirSmeNewBssInfo *pNewBss;
7853 tSmeIbssPeerInd *pIbssPeerInd;
7854 tSirMacAddr Broadcastaddr = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
7855 tSirSmeApNewCaps *pApNewCaps;
7856 eCsrRoamResult result = eCSR_ROAM_RESULT_NONE;
7857 eRoamCmdStatus roamStatus = eCSR_ROAM_FAILED;
7858 tCsrRoamInfo *pRoamInfo = NULL;
7859 tCsrRoamInfo roamInfo;
7860 eHalStatus status;
7861 tANI_U32 sessionId = CSR_SESSION_ID_INVALID;
7862 tCsrRoamSession *pSession = NULL;
7863 tpSirSmeSwitchChannelInd pSwitchChnInd;
7864 tSmeMaxAssocInd *pSmeMaxAssocInd;
Jeff Johnson295189b2012-06-20 16:38:30 -07007865#if defined ANI_PRODUCT_TYPE_AP
7866 pSirMsg->messageType = pal_be16_to_cpu(pSirMsg->messageType);
7867 pSirMsg->length = pal_be16_to_cpu(pSirMsg->length);
7868 pSirMsg->statusCode = pal_be32_to_cpu(pSirMsg->statusCode);
7869#else
7870 pSirMsg->messageType = (pSirMsg->messageType);
7871 pSirMsg->length = (pSirMsg->length);
7872 pSirMsg->statusCode = (pSirMsg->statusCode);
7873#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07007874 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
Jeff Johnson295189b2012-06-20 16:38:30 -07007875 switch( pSirMsg->messageType )
7876 {
7877 case eWNI_SME_ASSOC_IND:
7878 {
7879 tCsrRoamSession *pSession;
7880 smsLog( pMac, LOG1, FL("ASSOCIATION Indication from SME\n"));
7881 pAssocInd = (tSirSmeAssocInd *)pSirMsg;
7882 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pAssocInd->bssId, &sessionId );
7883 if( HAL_STATUS_SUCCESS( status ) )
7884 {
7885 pSession = CSR_GET_SESSION(pMac, sessionId);
7886
Jeff Johnson32d95a32012-09-10 13:15:23 -07007887 if(!pSession)
7888 {
7889 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
7890 return;
7891 }
7892
Jeff Johnson295189b2012-06-20 16:38:30 -07007893 pRoamInfo = &roamInfo;
7894
7895 // Required for indicating the frames to upper layer
7896 pRoamInfo->assocReqLength = pAssocInd->assocReqLength;
7897 pRoamInfo->assocReqPtr = pAssocInd->assocReqPtr;
7898
7899 pRoamInfo->beaconPtr = pAssocInd->beaconPtr;
7900 pRoamInfo->beaconLength = pAssocInd->beaconLength;
7901 pRoamInfo->statusCode = eSIR_SME_SUCCESS; //send the status code as Success
7902 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
7903
7904 pRoamInfo->staId = (tANI_U8)pAssocInd->staId;
7905 pRoamInfo->rsnIELen = (tANI_U8)pAssocInd->rsnIE.length;
7906 pRoamInfo->prsnIE = pAssocInd->rsnIE.rsnIEdata;
7907
7908 pRoamInfo->addIELen = (tANI_U8)pAssocInd->addIE.length;
7909 pRoamInfo->paddIE = pAssocInd->addIE.addIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07007910 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
7911 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pAssocInd->bssId, sizeof(tCsrBssid));
7912#ifdef WLAN_SOFTAP_FEATURE
7913 pRoamInfo->wmmEnabledSta = pAssocInd->wmmEnabledSta;
7914 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
7915#endif
7916 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND);//Sta
7917#ifdef WLAN_SOFTAP_FEATURE
7918 if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile))
7919 {
7920 if( CSR_IS_ENC_TYPE_STATIC( pSession->pCurRoamProfile->negotiatedUCEncryptionType ))
7921 {
7922 csrRoamIssueSetContextReq( pMac, sessionId, pSession->pCurRoamProfile->negotiatedUCEncryptionType,
7923 pSession->pConnectBssDesc,
7924 &(pRoamInfo->peerMac),
7925 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
7926 pRoamInfo->fAuthRequired = FALSE;
7927 }
7928 else
7929 {
7930 pRoamInfo->fAuthRequired = TRUE;
7931 }
7932 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_IND);
7933 if (!HAL_STATUS_SUCCESS(status))
7934 pRoamInfo->statusCode = eSIR_SME_ASSOC_REFUSED;// Refused due to Mac filtering
7935 }
7936#endif
7937 /* Send Association completion message to PE */
7938 status = csrSendAssocCnfMsg( pMac, pAssocInd, status );//Sta
7939
7940 /* send a message to CSR itself just to avoid the EAPOL frames going
7941 * OTA before association response */
Jeff Johnson295189b2012-06-20 16:38:30 -07007942 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
7943 {
7944 status = csrSendAssocIndToUpperLayerCnfMsg(pMac, pAssocInd, status, sessionId);
7945 }
7946#ifdef WLAN_SOFTAP_FEATURE
7947 else if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile) && (pRoamInfo->statusCode != eSIR_SME_ASSOC_REFUSED))
7948 {
7949 pRoamInfo->fReassocReq = pAssocInd->reassocReq;
7950 //status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_CNF);
7951 status = csrSendAssocIndToUpperLayerCnfMsg(pMac, pAssocInd, status, sessionId);
7952 }
7953#endif
7954 }
7955 }
7956 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07007957 case eWNI_SME_DISASSOC_IND:
7958 smsLog( pMac, LOGE, FL("DISASSOCIATION Indication from MAC\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07007959 // Check if AP dis-associated us because of MIC failure. If so,
7960 // then we need to take action immediately and not wait till the
7961 // the WmStatusChange requests is pushed and processed
7962 pDisassocInd = (tSirSmeDisassocInd *)pSirMsg;
7963 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pDisassocInd->bssId, &sessionId );
7964 if( HAL_STATUS_SUCCESS( status ) )
7965 {
7966 // If we are in neighbor preauth done state then on receiving
7967 // disassoc or deauth we dont roam instead we just disassoc
7968 // from current ap and then go to disconnected state
7969 // This happens for CCX and 11r FT connections ONLY.
7970#ifdef WLAN_FEATURE_VOWIFI_11R
7971 if (csrRoamIs11rAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
7972 {
7973 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
7974 }
7975#endif
7976#ifdef FEATURE_WLAN_CCX
7977 if (csrRoamIsCCXAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
7978 {
7979 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
7980 }
7981#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07007982#ifdef FEATURE_WLAN_LFR
7983 if (csrRoamIsFastRoamEnabled(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
7984 {
7985 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
7986 }
7987#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07007988 pSession = CSR_GET_SESSION( pMac, sessionId );
7989
Jeff Johnson32d95a32012-09-10 13:15:23 -07007990 if(!pSession)
7991 {
7992 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
7993 return;
7994 }
7995
Jeff Johnson295189b2012-06-20 16:38:30 -07007996 if ( csrIsConnStateInfra( pMac, sessionId ) )
7997 {
7998 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
7999 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008000#ifndef WLAN_MDM_CODE_REDUCTION_OPT
8001 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
8002#endif
8003 csrRoamLinkDown(pMac, sessionId);
8004 csrRoamIssueWmStatusChange( pMac, sessionId, eCsrDisassociated, pSirMsg );
8005#ifdef WLAN_SOFTAP_FEATURE
8006 if(CSR_IS_INFRA_AP(&pSession->connectedProfile))
8007 {
8008
8009 pRoamInfo = &roamInfo;
8010
8011 pRoamInfo->statusCode = pDisassocInd->statusCode;
8012 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8013
8014 pRoamInfo->staId = (tANI_U8)pDisassocInd->staId;
8015
8016 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDisassocInd->peerMacAddr, sizeof(tSirMacAddr));
8017 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pDisassocInd->bssId, sizeof(tCsrBssid));
8018
8019 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_DISASSOC_IND);
8020 }
8021#endif
8022 }
8023 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008024 case eWNI_SME_DEAUTH_IND:
8025 smsLog( pMac, LOG1, FL("DEAUTHENTICATION Indication from MAC\n"));
8026 pDeauthInd = (tpSirSmeDeauthInd)pSirMsg;
8027 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pDeauthInd->bssId, &sessionId );
8028 if( HAL_STATUS_SUCCESS( status ) )
8029 {
8030 // If we are in neighbor preauth done state then on receiving
8031 // disassoc or deauth we dont roam instead we just disassoc
8032 // from current ap and then go to disconnected state
8033 // This happens for CCX and 11r FT connections ONLY.
8034#ifdef WLAN_FEATURE_VOWIFI_11R
8035 if (csrRoamIs11rAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8036 {
8037 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8038 }
8039#endif
8040#ifdef FEATURE_WLAN_CCX
8041 if (csrRoamIsCCXAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8042 {
8043 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8044 }
8045#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07008046#ifdef FEATURE_WLAN_LFR
8047 if (csrRoamIsFastRoamEnabled(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8048 {
8049 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8050 }
8051#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008052 pSession = CSR_GET_SESSION( pMac, sessionId );
8053
Jeff Johnson32d95a32012-09-10 13:15:23 -07008054 if(!pSession)
8055 {
8056 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8057 return;
8058 }
8059
Jeff Johnson295189b2012-06-20 16:38:30 -07008060 if ( csrIsConnStateInfra( pMac, sessionId ) )
8061 {
8062 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
8063 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008064#ifndef WLAN_MDM_CODE_REDUCTION_OPT
8065 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
8066#endif
8067 csrRoamLinkDown(pMac, sessionId);
8068 csrRoamIssueWmStatusChange( pMac, sessionId, eCsrDeauthenticated, pSirMsg );
8069#ifdef WLAN_SOFTAP_FEATURE
8070 if(CSR_IS_INFRA_AP(&pSession->connectedProfile))
8071 {
8072
8073 pRoamInfo = &roamInfo;
8074
8075 pRoamInfo->statusCode = pDeauthInd->statusCode;
8076 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8077
8078 pRoamInfo->staId = (tANI_U8)pDeauthInd->staId;
8079
8080 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDeauthInd->peerMacAddr, sizeof(tSirMacAddr));
8081 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pDeauthInd->bssId, sizeof(tCsrBssid));
8082
8083 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_DEAUTH_IND);
8084 }
8085#endif
8086 }
8087 break;
8088
8089 case eWNI_SME_SWITCH_CHL_REQ: // in case of STA, the SWITCH_CHANNEL originates from its AP
8090 smsLog( pMac, LOGW, FL("eWNI_SME_SWITCH_CHL_REQ from SME\n"));
8091 pSwitchChnInd = (tpSirSmeSwitchChannelInd)pSirMsg;
8092 //Update with the new channel id.
8093 //The channel id is hidden in the statusCode.
8094 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pSwitchChnInd->bssId, &sessionId );
8095 if( HAL_STATUS_SUCCESS( status ) )
8096 {
8097 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008098 if(!pSession)
8099 {
8100 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8101 return;
8102 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008103 pSession->connectedProfile.operationChannel = (tANI_U8)pSwitchChnInd->newChannelId;
8104 if(pSession->pConnectBssDesc)
8105 {
8106 pSession->pConnectBssDesc->channelId = (tANI_U8)pSwitchChnInd->newChannelId;
8107 }
8108 }
8109 break;
8110
8111 case eWNI_SME_DEAUTH_RSP:
8112 smsLog( pMac, LOGW, FL("eWNI_SME_DEAUTH_RSP from SME\n"));
8113#ifdef WLAN_SOFTAP_FEATURE
8114 {
8115 tSirSmeDeauthRsp* pDeauthRsp = (tSirSmeDeauthRsp *)pSirMsg;
8116 sessionId = pDeauthRsp->sessionId;
8117 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
8118 {
8119 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07008120 if(!pSession)
8121 {
8122 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8123 return;
8124 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008125 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
8126 {
8127 pRoamInfo = &roamInfo;
8128 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8129 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDeauthRsp->peerMacAddr, sizeof(tSirMacAddr));
8130 pRoamInfo->reasonCode = eCSR_ROAM_RESULT_FORCED;
8131 pRoamInfo->statusCode = pDeauthRsp->statusCode;
8132 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
8133 }
8134 }
8135 }
8136#endif
8137 break;
8138
8139 case eWNI_SME_DISASSOC_RSP:
8140 smsLog( pMac, LOGW, FL("eWNI_SME_DISASSOC_RSP from SME subState = %d\n"), pMac->roam.curSubState[sessionId]);
8141#ifdef WLAN_SOFTAP_FEATURE
8142 {
8143 tSirSmeDisassocRsp *pDisassocRsp = (tSirSmeDisassocRsp *)pSirMsg;
8144 sessionId = pDisassocRsp->sessionId;
8145 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
8146 {
8147 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07008148 if(!pSession)
8149 {
8150 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8151 return;
8152 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008153 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
8154 {
8155 pRoamInfo = &roamInfo;
8156 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8157 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDisassocRsp->peerMacAddr, sizeof(tSirMacAddr));
8158 pRoamInfo->reasonCode = eCSR_ROAM_RESULT_FORCED;
8159 pRoamInfo->statusCode = pDisassocRsp->statusCode;
8160 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
8161 }
8162 }
8163 }
8164#endif
8165 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008166 case eWNI_SME_MIC_FAILURE_IND:
8167 {
8168 tpSirSmeMicFailureInd pMicInd = (tpSirSmeMicFailureInd)pSirMsg;
8169 tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
8170 eCsrRoamResult result = eCSR_ROAM_RESULT_MIC_ERROR_UNICAST;
Jeff Johnson295189b2012-06-20 16:38:30 -07008171#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8172 {
8173 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008174 if(!pSession)
8175 {
8176 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8177 return;
8178 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008179 WLAN_VOS_DIAG_EVENT_DEF(secEvent, vos_event_wlan_security_payload_type);
8180 palZeroMemory(pMac->hHdd, &secEvent, sizeof(vos_event_wlan_security_payload_type));
8181 secEvent.eventId = WLAN_SECURITY_EVENT_MIC_ERROR;
8182 secEvent.encryptionModeMulticast =
8183 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8184 secEvent.encryptionModeUnicast =
8185 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8186 secEvent.authMode =
8187 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8188 palCopyMemory( pMac->hHdd, secEvent.bssid, pSession->connectedProfile.bssid, 6 );
8189 WLAN_VOS_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
8190 }
8191#endif//FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008192 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pMicInd->bssId, &sessionId );
8193 if( HAL_STATUS_SUCCESS( status ) )
8194 {
8195 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
8196 roamInfo.u.pMICFailureInfo = &pMicInd->info;
8197 pRoamInfo = &roamInfo;
8198 if(pMicInd->info.multicast)
8199 {
8200 result = eCSR_ROAM_RESULT_MIC_ERROR_GROUP;
8201 }
8202 else
8203 {
8204 result = eCSR_ROAM_RESULT_MIC_ERROR_UNICAST;
8205 }
8206 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_MIC_ERROR_IND, result);
8207 }
8208 }
8209 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008210#ifdef WLAN_SOFTAP_FEATURE
8211 case eWNI_SME_WPS_PBC_PROBE_REQ_IND:
8212 {
8213 tpSirSmeProbeReqInd pProbeReqInd = (tpSirSmeProbeReqInd)pSirMsg;
8214 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07008215 smsLog( pMac, LOG1, FL("WPS PBC Probe request Indication from SME\n"));
8216
8217 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pProbeReqInd->bssId, &sessionId );
8218 if( HAL_STATUS_SUCCESS( status ) )
8219 {
8220 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
8221 roamInfo.u.pWPSPBCProbeReq = &pProbeReqInd->WPSPBCProbeReq;
8222 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_WPS_PBC_PROBE_REQ_IND,
8223 eCSR_ROAM_RESULT_WPS_PBC_PROBE_REQ_IND);
8224 }
8225 }
8226 break;
8227#endif
8228
Jeff Johnson295189b2012-06-20 16:38:30 -07008229 case eWNI_SME_WM_STATUS_CHANGE_NTF:
8230 pStatusChangeMsg = (tSirSmeWmStatusChangeNtf *)pSirMsg;
8231 switch( pStatusChangeMsg->statusChangeCode )
8232 {
8233 case eSIR_SME_IBSS_ACTIVE:
8234 sessionId = csrFindIbssSession( pMac );
8235 if( CSR_SESSION_ID_INVALID != sessionId )
8236 {
8237 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008238 if(!pSession)
8239 {
8240 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8241 return;
8242 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008243 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_CONNECTED;
8244 if(pSession->pConnectBssDesc)
8245 {
8246 palCopyMemory(pMac->hHdd, &roamInfo.bssid, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
8247 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
8248 pRoamInfo = &roamInfo;
8249 }
8250 else
8251 {
8252 smsLog(pMac, LOGE, " CSR eSIR_SME_IBSS_NEW_PEER connected BSS is empty\n");
8253 }
8254 result = eCSR_ROAM_RESULT_IBSS_CONNECT;
8255 roamStatus = eCSR_ROAM_CONNECT_STATUS_UPDATE;
8256 }
8257 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008258 case eSIR_SME_IBSS_INACTIVE:
8259 sessionId = csrFindIbssSession( pMac );
8260 if( CSR_SESSION_ID_INVALID != sessionId )
8261 {
8262 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008263 if(!pSession)
8264 {
8265 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8266 return;
8267 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008268 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED;
8269 result = eCSR_ROAM_RESULT_IBSS_INACTIVE;
8270 roamStatus = eCSR_ROAM_CONNECT_STATUS_UPDATE;
8271 }
8272 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008273 case eSIR_SME_JOINED_NEW_BSS: // IBSS coalescing.
8274 sessionId = csrFindIbssSession( pMac );
8275 if( CSR_SESSION_ID_INVALID != sessionId )
8276 {
8277 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008278 if(!pSession)
8279 {
8280 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8281 return;
8282 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008283 // update the connection state information
8284 pNewBss = &pStatusChangeMsg->statusChangeInfo.newBssInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07008285#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8286 {
8287 vos_log_ibss_pkt_type *pIbssLog;
8288 tANI_U32 bi;
Jeff Johnson295189b2012-06-20 16:38:30 -07008289 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8290 if(pIbssLog)
8291 {
8292 pIbssLog->eventId = WLAN_IBSS_EVENT_COALESCING;
8293 if(pNewBss)
8294 {
8295 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pNewBss->bssId, 6);
8296 if(pNewBss->ssId.length)
8297 {
8298 palCopyMemory(pMac->hHdd, pIbssLog->ssid, pNewBss->ssId.ssId, pNewBss->ssId.length);
8299 }
8300 pIbssLog->operatingChannel = pNewBss->channelNumber;
8301 }
8302 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &bi)))
8303 {
8304 //***U8 is not enough for beacon interval
8305 pIbssLog->beaconInterval = (v_U8_t)bi;
8306 }
8307 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8308 }
8309 }
8310#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008311 csrRoamUpdateConnectedProfileFromNewBss( pMac, sessionId, pNewBss );
8312 csrRoamIssueSetContextReq( pMac, sessionId, pSession->connectedProfile.EncryptionType,
8313 pSession->pConnectBssDesc,
8314 &Broadcastaddr,
8315 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 );
8316 result = eCSR_ROAM_RESULT_IBSS_COALESCED;
8317 roamStatus = eCSR_ROAM_IBSS_IND;
8318 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pNewBss->bssId, sizeof(tCsrBssid));
8319 pRoamInfo = &roamInfo;
8320 //This BSSID is th ereal BSSID, let's save it
8321 if(pSession->pConnectBssDesc)
8322 {
8323 palCopyMemory(pMac->hHdd, pSession->pConnectBssDesc->bssId, &pNewBss->bssId, sizeof(tCsrBssid));
8324 }
8325 // Stop the join IBSS timer in case of join, for
8326 // genuine merge do nothing
8327 if(pSession->ibss_join_pending)
8328 {
8329 pSession->ibss_join_pending = FALSE;
8330 csrRoamStopIbssJoinTimer(pMac, sessionId);
8331 result = eCSR_ROAM_RESULT_IBSS_JOIN_SUCCESS;
8332 }
8333 }
8334 smsLog(pMac, LOGW, "CSR: eSIR_SME_JOINED_NEW_BSS received from PE\n");
8335 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008336 // detection by LIM that the capabilities of the associated AP have changed.
8337 case eSIR_SME_AP_CAPS_CHANGED:
8338 pApNewCaps = &pStatusChangeMsg->statusChangeInfo.apNewCaps;
8339 smsLog(pMac, LOGW, "CSR handling eSIR_SME_AP_CAPS_CHANGED\n");
8340 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pApNewCaps->bssId, &sessionId );
8341 if( HAL_STATUS_SUCCESS( status ) )
8342 {
8343 csrScanForCapabilityChange( pMac, pApNewCaps );
8344 result = eCSR_ROAM_RESULT_CAP_CHANGED;
8345 roamStatus = eCSR_ROAM_GEN_INFO;
8346 }
8347 break;
8348
8349 default:
8350 roamStatus = eCSR_ROAM_FAILED;
8351 result = eCSR_ROAM_RESULT_NONE;
8352 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008353 } // end switch on statusChangeCode
8354 if(eCSR_ROAM_RESULT_NONE != result)
8355 {
8356 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, roamStatus, result);
8357 }
8358 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008359 case eWNI_SME_IBSS_NEW_PEER_IND:
8360 pIbssPeerInd = (tSmeIbssPeerInd *)pSirMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -07008361#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8362 {
8363 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07008364 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8365 if(pIbssLog)
8366 {
8367 pIbssLog->eventId = WLAN_IBSS_EVENT_PEER_JOIN;
8368 palCopyMemory(pMac->hHdd, pIbssLog->peerMacAddr, &pIbssPeerInd->peerAddr, 6);
8369 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8370 }
8371 }
8372#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008373 sessionId = csrFindIbssSession( pMac );
8374 if( CSR_SESSION_ID_INVALID != sessionId )
8375 {
8376 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008377
8378 if(!pSession)
8379 {
8380 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8381 return;
8382 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008383 // Issue the set Context request to LIM to establish the Unicast STA context for the new peer...
8384 if(pSession->pConnectBssDesc)
8385 {
8386 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
8387 palCopyMemory(pMac->hHdd, &roamInfo.bssid, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
8388 if(pIbssPeerInd->mesgLen > sizeof(tSmeIbssPeerInd))
8389 {
8390 status = palAllocateMemory(pMac->hHdd, (void **)&roamInfo.pbFrames,
8391 (pIbssPeerInd->mesgLen - sizeof(tSmeIbssPeerInd)));
8392 if(HAL_STATUS_SUCCESS(status))
8393 {
8394 roamInfo.nBeaconLength = (pIbssPeerInd->mesgLen - sizeof(tSmeIbssPeerInd));
8395 palCopyMemory(pMac->hHdd, roamInfo.pbFrames, ((tANI_U8 *)pIbssPeerInd) + sizeof(tSmeIbssPeerInd),
8396 roamInfo.nBeaconLength);
8397 }
8398 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
8399 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
8400 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
8401 status = palAllocateMemory(pMac->hHdd, (void **)&roamInfo.pBssDesc,
8402 pSession->pConnectBssDesc->length);
8403 if(HAL_STATUS_SUCCESS(status))
8404 {
8405 palCopyMemory(pMac->hHdd, roamInfo.pBssDesc, pSession->pConnectBssDesc,
8406 pSession->pConnectBssDesc->length);
8407 }
8408 if(HAL_STATUS_SUCCESS(status))
8409 {
8410 pRoamInfo = &roamInfo;
8411 }
8412 else
8413 {
8414 if(roamInfo.pbFrames)
8415 {
8416 palFreeMemory(pMac->hHdd, roamInfo.pbFrames);
8417 }
8418 if(roamInfo.pBssDesc)
8419 {
8420 palFreeMemory(pMac->hHdd, roamInfo.pBssDesc);
8421 }
8422 }
8423 }
8424 else
8425 {
8426 pRoamInfo = &roamInfo;
8427 }
8428 csrRoamIssueSetContextReq( pMac, sessionId, pSession->connectedProfile.EncryptionType,
8429 pSession->pConnectBssDesc,
8430 &(pIbssPeerInd->peerAddr),
8431 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
8432 }
8433 else
8434 {
8435 smsLog(pMac, LOGW, " CSR eSIR_SME_IBSS_NEW_PEER connected BSS is empty\n");
8436 }
8437 //send up the sec type for the new peer
8438 if (pRoamInfo)
8439 {
8440 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8441 }
8442 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0,
8443 eCSR_ROAM_CONNECT_STATUS_UPDATE, eCSR_ROAM_RESULT_IBSS_NEW_PEER);
8444 if(pRoamInfo)
8445 {
8446 if(roamInfo.pbFrames)
8447 {
8448 palFreeMemory(pMac->hHdd, roamInfo.pbFrames);
8449 }
8450 if(roamInfo.pBssDesc)
8451 {
8452 palFreeMemory(pMac->hHdd, roamInfo.pBssDesc);
8453 }
8454 }
8455 }
8456 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008457 case eWNI_SME_IBSS_PEER_DEPARTED_IND:
8458 pIbssPeerInd = (tSmeIbssPeerInd*)pSirMsg;
8459 sessionId = csrFindIbssSession( pMac );
8460 if( CSR_SESSION_ID_INVALID != sessionId )
8461 {
Jeff Johnson295189b2012-06-20 16:38:30 -07008462#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8463 {
8464 vos_log_ibss_pkt_type *pIbssLog;
8465
8466 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8467 if(pIbssLog)
8468 {
8469 pIbssLog->eventId = WLAN_IBSS_EVENT_PEER_LEAVE;
8470 if(pIbssPeerInd)
8471 {
8472 palCopyMemory(pMac->hHdd, pIbssLog->peerMacAddr, &pIbssPeerInd->peerAddr, 6);
8473 }
8474 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8475 }
8476 }
8477#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008478 smsLog(pMac, LOGW, "CSR: Peer departed notification from LIM\n");
8479 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
8480 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
8481 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
8482 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
8483 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
8484 eCSR_ROAM_CONNECT_STATUS_UPDATE, eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
8485 }
8486 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008487 case eWNI_SME_SETCONTEXT_RSP:
8488 {
8489 tSirSmeSetContextRsp *pRsp = (tSirSmeSetContextRsp *)pSirMsg;
8490 tListElem *pEntry;
8491 tSmeCmd *pCommand;
8492
8493 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
8494 if ( pEntry )
8495 {
8496 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
8497 if ( eSmeCommandSetKey == pCommand->command )
8498 {
8499 sessionId = pCommand->sessionId;
8500 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008501
8502 if(!pSession)
8503 {
8504 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8505 return;
8506 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008507
8508#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8509 if(eCSR_ENCRYPT_TYPE_NONE != pSession->connectedProfile.EncryptionType)
8510 {
8511 WLAN_VOS_DIAG_EVENT_DEF(setKeyEvent, vos_event_wlan_security_payload_type);
8512 palZeroMemory(pMac->hHdd, &setKeyEvent, sizeof(vos_event_wlan_security_payload_type));
8513 if( pRsp->peerMacAddr[0] & 0x01 )
8514 {
8515 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_RSP;
8516 }
8517 else
8518 {
8519 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_RSP;
8520 }
8521 setKeyEvent.encryptionModeMulticast =
8522 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8523 setKeyEvent.encryptionModeUnicast =
8524 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8525 palCopyMemory( pMac->hHdd, setKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
8526 setKeyEvent.authMode =
8527 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8528 if( eSIR_SUCCESS != pRsp->statusCode )
8529 {
8530 setKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
8531 }
8532 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
8533 }
8534#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
8535 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId) )
8536 {
8537 //We are done with authentication, whethere succeed or not
8538 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
8539
8540 csrRoamStopWaitForKeyTimer( pMac );
8541 //We do it here because this linkup function is not called after association
8542 //when a key needs to be set.
8543 if( csrIsConnStateConnectedInfra(pMac, sessionId) )
8544 {
8545 csrRoamLinkUp(pMac, pSession->connectedProfile.bssid);
8546 }
8547 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008548 if( eSIR_SME_SUCCESS == pRsp->statusCode )
Jeff Johnson295189b2012-06-20 16:38:30 -07008549 {
8550 palCopyMemory( pMac, &roamInfo.peerMac, &pRsp->peerMacAddr, sizeof(tCsrBssid) );
Jeff Johnsone7245742012-09-05 17:12:55 -07008551 //Make sure we install the GTK before indicating to HDD as authenticated
8552 //This is to prevent broadcast packets go out after PTK and before GTK.
8553 if( palEqualMemory( pMac->hHdd, &Broadcastaddr, pRsp->peerMacAddr,
8554 sizeof(tSirMacAddr) ) )
8555 {
8556 result = eCSR_ROAM_RESULT_AUTHENTICATED;
8557 }
8558 else
8559 {
8560 result = eCSR_ROAM_RESULT_NONE;
8561 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008562 pRoamInfo = &roamInfo;
8563 }
8564 else
8565 {
8566 result = eCSR_ROAM_RESULT_FAILURE;
8567 smsLog( pMac, LOGE, "CSR: Roam Completion setkey command failed(%d) PeerMac %02X-%02X-%02X-%02X-%02X-%02X...\n",
8568 pRsp->statusCode, pRsp->peerMacAddr[0], pRsp->peerMacAddr[1], pRsp->peerMacAddr[2],
8569 pRsp->peerMacAddr[3], pRsp->peerMacAddr[4], pRsp->peerMacAddr[5] );
8570 }
8571 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.setKeyCmd.roamId,
8572 eCSR_ROAM_SET_KEY_COMPLETE, result);
Jeff Johnson295189b2012-06-20 16:38:30 -07008573 // Indicate SME_QOS that the SET_KEY is completed, so that SME_QOS
8574 // can go ahead and initiate the TSPEC if any are pending
8575 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_SET_KEY_SUCCESS_IND, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -07008576#ifdef FEATURE_WLAN_CCX
8577 //Send Adjacent AP repot to new AP.
8578 if (result == eCSR_ROAM_RESULT_AUTHENTICATED &&
8579 pSession->isPrevApInfoValid &&
8580 pSession->connectedProfile.isCCXAssoc)
8581 {
8582#ifdef WLAN_FEATURE_VOWIFI
8583 csrCcxSendAdjacentApRepMsg(pMac, pSession);
8584#endif
8585 pSession->isPrevApInfoValid = FALSE;
8586 }
8587#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008588 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
8589 {
8590 csrReleaseCommandSetKey( pMac, pCommand );
8591 }
8592 }
8593 else
8594 {
8595 smsLog( pMac, LOGE, "CSR: Roam Completion called but setkey command is not ACTIVE ...\n" );
8596 }
8597 }
8598 else
8599 {
8600 smsLog( pMac, LOGE, "CSR: SetKey Completion called but NO commands are ACTIVE ...\n" );
8601 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008602 smeProcessPendingQueue( pMac );
8603 }
8604 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008605 case eWNI_SME_REMOVEKEY_RSP:
8606 {
8607 tSirSmeRemoveKeyRsp *pRsp = (tSirSmeRemoveKeyRsp *)pSirMsg;
8608 tListElem *pEntry;
8609 tSmeCmd *pCommand;
8610
8611 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
8612 if ( pEntry )
8613 {
8614 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
8615 if ( eSmeCommandRemoveKey == pCommand->command )
8616 {
8617 sessionId = pCommand->sessionId;
8618 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008619
8620 if(!pSession)
8621 {
8622 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8623 return;
8624 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008625#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8626 {
8627 WLAN_VOS_DIAG_EVENT_DEF(removeKeyEvent, vos_event_wlan_security_payload_type);
8628 palZeroMemory(pMac->hHdd, &removeKeyEvent, sizeof(vos_event_wlan_security_payload_type));
8629 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_RSP;
8630 removeKeyEvent.encryptionModeMulticast =
8631 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8632 removeKeyEvent.encryptionModeUnicast =
8633 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8634 palCopyMemory( pMac->hHdd, removeKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
8635 removeKeyEvent.authMode =
8636 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8637 if( eSIR_SUCCESS != pRsp->statusCode )
8638 {
8639 removeKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
8640 }
8641 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
8642 }
8643#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson43971f52012-07-17 12:26:56 -07008644 if( eSIR_SME_SUCCESS == pRsp->statusCode )
Jeff Johnson295189b2012-06-20 16:38:30 -07008645 {
8646 palCopyMemory( pMac, &roamInfo.peerMac, &pRsp->peerMacAddr, sizeof(tCsrBssid) );
8647 result = eCSR_ROAM_RESULT_NONE;
8648 pRoamInfo = &roamInfo;
8649 }
8650 else
8651 {
8652 result = eCSR_ROAM_RESULT_FAILURE;
8653 }
8654 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.setKeyCmd.roamId,
8655 eCSR_ROAM_REMOVE_KEY_COMPLETE, result);
8656 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
8657 {
8658 csrReleaseCommandRemoveKey( pMac, pCommand );
8659 }
8660 }
8661 else
8662 {
8663 smsLog( pMac, LOGW, "CSR: Roam Completion called but setkey command is not ACTIVE ...\n" );
8664 }
8665 }
8666 else
8667 {
8668 smsLog( pMac, LOGW, "CSR: SetKey Completion called but NO commands are ACTIVE ...\n" );
8669 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008670 smeProcessPendingQueue( pMac );
8671 }
8672 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008673 case eWNI_SME_GET_STATISTICS_RSP:
Mohit Khanna23863762012-09-11 17:40:09 -07008674 smsLog( pMac, LOG2, FL("Stats rsp from PE\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008675 csrRoamStatsRspProcessor( pMac, pSirMsg );
8676 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008677 case eWNI_SME_GET_RSSI_REQ:
Mohit Khanna23863762012-09-11 17:40:09 -07008678 smsLog( pMac, LOG2, FL("GetRssiReq from self\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008679 csrUpdateRssi( pMac, pSirMsg );
8680 break;
8681
Jeff Johnson295189b2012-06-20 16:38:30 -07008682#ifdef WLAN_FEATURE_VOWIFI_11R
8683 case eWNI_SME_FT_PRE_AUTH_RSP:
8684 csrRoamFTPreAuthRspProcessor( pMac, (tpSirFTPreAuthRsp)pSirMsg );
8685 break;
8686#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008687 case eWNI_SME_MAX_ASSOC_EXCEEDED:
8688 pSmeMaxAssocInd = (tSmeMaxAssocInd*)pSirMsg;
8689 smsLog( pMac, LOG1, FL("send indication that max assoc have been reached and the new peer cannot be accepted\n"));
8690 sessionId = pSmeMaxAssocInd->sessionId;
8691 roamInfo.sessionId = sessionId;
8692 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pSmeMaxAssocInd->peerMac, sizeof(tCsrBssid));
8693 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
8694 eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_MAX_ASSOC_EXCEEDED);
8695 break;
8696
8697 case eWNI_SME_BTAMP_LOG_LINK_IND:
8698 smsLog( pMac, LOG1, FL("Establish logical link req from HCI serialized through MC thread\n"));
8699 btampEstablishLogLinkHdlr( pSirMsg );
8700 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07008701 case eWNI_SME_RSSI_IND:
8702 smsLog( pMac, LOG1, FL("RSSI indication from TL serialized through MC thread\n"));
8703 csrRoamRssiIndHdlr( pMac, pSirMsg );
8704 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008705
8706 default:
8707 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008708 } // end switch on message type
Jeff Johnson295189b2012-06-20 16:38:30 -07008709}
8710
Jeff Johnson295189b2012-06-20 16:38:30 -07008711void csrCallRoamingCompletionCallback(tpAniSirGlobal pMac, tCsrRoamSession *pSession,
8712 tCsrRoamInfo *pRoamInfo, tANI_U32 roamId, eCsrRoamResult roamResult)
8713{
8714 if(pSession)
8715 {
8716 if(pSession->bRefAssocStartCnt)
8717 {
8718 pSession->bRefAssocStartCnt--;
8719 VOS_ASSERT( pSession->bRefAssocStartCnt == 0);
8720 //Need to call association_completion because there is an assoc_start pending.
8721 csrRoamCallCallback(pMac, pSession->sessionId, NULL, roamId,
8722 eCSR_ROAM_ASSOCIATION_COMPLETION,
8723 eCSR_ROAM_RESULT_FAILURE);
8724 }
8725 csrRoamCallCallback(pMac, pSession->sessionId, pRoamInfo, roamId, eCSR_ROAM_ROAMING_COMPLETION, roamResult);
8726 }
8727 else
8728 {
8729 smsLog(pMac, LOGW, FL(" pSession is NULL"));
8730 }
8731}
8732
8733
8734eHalStatus csrRoamStartRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamingReason roamingReason)
8735{
8736 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07008737 if(CSR_IS_LOSTLINK_ROAMING(roamingReason) &&
8738 (eANI_BOOLEAN_FALSE == pMac->roam.roamSession[sessionId].fCancelRoaming))
8739 {
8740 status = csrScanRequestLostLink1( pMac, sessionId );
8741 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008742 return(status);
8743}
8744
Jeff Johnson295189b2012-06-20 16:38:30 -07008745//return a boolean to indicate whether roaming completed or continue.
8746tANI_BOOLEAN csrRoamCompleteRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId,
8747 tANI_BOOLEAN fForce, eCsrRoamResult roamResult)
8748{
8749 tANI_BOOLEAN fCompleted = eANI_BOOLEAN_TRUE;
8750 tANI_TIMESTAMP roamTime = (tANI_TIMESTAMP)(pMac->roam.configParam.nRoamingTime * PAL_TICKS_PER_SECOND);
8751 tANI_TIMESTAMP curTime = (tANI_TIMESTAMP)palGetTickCount(pMac->hHdd);
8752 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07008753 //Check whether time is up
8754 if(pSession->fCancelRoaming || fForce ||
8755 ((curTime - pSession->roamingStartTime) > roamTime) ||
8756 eCsrReassocRoaming == pSession->roamingReason ||
8757 eCsrDynamicRoaming == pSession->roamingReason)
8758 {
8759 smsLog(pMac, LOGW, FL(" indicates roaming completion\n"));
8760 if(pSession->fCancelRoaming && CSR_IS_LOSTLINK_ROAMING(pSession->roamingReason))
8761 {
8762 //roaming is cancelled, tell HDD to indicate disconnect
8763 //Because LIM overload deauth_ind for both deauth frame and missed beacon
8764 //we need to use this logic to detinguish it. For missed beacon, LIM set reason
8765 //to be eSIR_BEACON_MISSED
8766 if(eSIR_BEACON_MISSED == pSession->roamingStatusCode)
8767 {
8768 roamResult = eCSR_ROAM_RESULT_LOSTLINK;
8769 }
8770 else if(eCsrLostlinkRoamingDisassoc == pSession->roamingReason)
8771 {
8772 roamResult = eCSR_ROAM_RESULT_DISASSOC_IND;
8773 }
8774 else if(eCsrLostlinkRoamingDeauth == pSession->roamingReason)
8775 {
8776 roamResult = eCSR_ROAM_RESULT_DEAUTH_IND;
8777 }
8778 else
8779 {
8780 roamResult = eCSR_ROAM_RESULT_LOSTLINK;
8781 }
8782 }
8783 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, roamResult);
8784 pSession->roamingReason = eCsrNotRoaming;
8785 }
8786 else
8787 {
8788 pSession->roamResult = roamResult;
8789 if(!HAL_STATUS_SUCCESS(csrRoamStartRoamingTimer(pMac, sessionId, PAL_TIMER_TO_SEC_UNIT)))
8790 {
8791 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, roamResult);
8792 pSession->roamingReason = eCsrNotRoaming;
8793 }
8794 else
8795 {
8796 fCompleted = eANI_BOOLEAN_FALSE;
8797 }
8798 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008799 return(fCompleted);
8800}
8801
Jeff Johnson295189b2012-06-20 16:38:30 -07008802void csrRoamCancelRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId)
8803{
8804 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008805
8806 if(!pSession)
8807 {
8808 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8809 return;
8810 }
8811
Jeff Johnson295189b2012-06-20 16:38:30 -07008812 if(CSR_IS_ROAMING(pSession))
8813 {
8814 smsLog(pMac, LOGW, " Cancelling roaming\n");
8815 pSession->fCancelRoaming = eANI_BOOLEAN_TRUE;
8816 if(CSR_IS_ROAM_JOINING(pMac, sessionId) && CSR_IS_ROAM_SUBSTATE_CONFIG(pMac, sessionId))
8817 {
8818 //No need to do anything in here because the handler takes care of it
8819 }
8820 else
8821 {
8822 eCsrRoamResult roamResult = CSR_IS_LOSTLINK_ROAMING(pSession->roamingReason) ?
8823 eCSR_ROAM_RESULT_LOSTLINK : eCSR_ROAM_RESULT_NONE;
8824 //Roaming is stopped after here
8825 csrRoamCompleteRoaming(pMac, sessionId, eANI_BOOLEAN_TRUE, roamResult);
8826 //Since CSR may be in lostlink roaming situation, abort all roaming related activities
8827 csrScanAbortMacScan(pMac);
8828 csrRoamStopRoamingTimer(pMac, sessionId);
8829 }
8830 }
8831}
8832
Jeff Johnson295189b2012-06-20 16:38:30 -07008833void csrRoamRoamingTimerHandler(void *pv)
8834{
8835 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
8836 tpAniSirGlobal pMac = pInfo->pMac;
8837 tANI_U32 sessionId = pInfo->sessionId;
8838 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008839
8840 if(!pSession)
8841 {
8842 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8843 return;
8844 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008845
8846 if(eANI_BOOLEAN_FALSE == pSession->fCancelRoaming)
8847 {
8848 if(!HAL_STATUS_SUCCESS(csrRoamStartRoaming(pMac, sessionId, pSession->roamingReason)))
8849 {
8850 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, pSession->roamResult);
8851 pSession->roamingReason = eCsrNotRoaming;
8852 }
8853 }
8854}
8855
Jeff Johnson295189b2012-06-20 16:38:30 -07008856eHalStatus csrRoamStartRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
8857{
8858 eHalStatus status;
8859 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008860
8861 if(!pSession)
8862 {
8863 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8864 return eHAL_STATUS_FAILURE;
8865 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008866
8867 smsLog(pMac, LOG1, " csrScanStartRoamingTimer \n ");
8868 pSession->roamingTimerInfo.sessionId = (tANI_U8)sessionId;
8869 status = palTimerStart(pMac->hHdd, pSession->hTimerRoaming, interval, eANI_BOOLEAN_FALSE);
8870
8871 return (status);
8872}
8873
Jeff Johnson295189b2012-06-20 16:38:30 -07008874eHalStatus csrRoamStopRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
8875{
8876 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerRoaming));
8877}
8878
Jeff Johnson295189b2012-06-20 16:38:30 -07008879void csrRoamWaitForKeyTimeOutHandler(void *pv)
8880{
8881 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
8882 tpAniSirGlobal pMac = pInfo->pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -07008883 if( CSR_IS_WAIT_FOR_KEY( pMac, pInfo->sessionId ) )
8884 {
8885 smsLog(pMac, LOGW, " SME pre-auth state timeout. \n ");
8886 //Change the substate so command queue is unblocked.
8887 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, pInfo->sessionId);
8888 }
8889
8890}
8891
Jeff Johnson295189b2012-06-20 16:38:30 -07008892eHalStatus csrRoamStartWaitForKeyTimer(tpAniSirGlobal pMac, tANI_U32 interval)
8893{
8894 eHalStatus status;
8895
8896 smsLog(pMac, LOG1, " csrScanStartWaitForKeyTimer \n ");
8897 status = palTimerStart(pMac->hHdd, pMac->roam.hTimerWaitForKey, interval, eANI_BOOLEAN_FALSE);
8898
8899 return (status);
8900}
8901
Jeff Johnson295189b2012-06-20 16:38:30 -07008902eHalStatus csrRoamStopWaitForKeyTimer(tpAniSirGlobal pMac)
8903{
8904 return (palTimerStop(pMac->hHdd, pMac->roam.hTimerWaitForKey));
8905}
8906
Jeff Johnson295189b2012-06-20 16:38:30 -07008907void csrRoamIbssJoinTimerHandler(void *pv)
8908{
8909 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
8910 tpAniSirGlobal pMac = pInfo->pMac;
8911 eCsrRoamDisconnectReason reason = eCSR_DISCONNECT_REASON_IBSS_JOIN_FAILURE;
8912 tANI_U32 sessionId = pInfo->sessionId;
8913 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008914
8915 if(!pSession)
8916 {
8917 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8918 return;
8919 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008920
8921 pSession->ibss_join_pending = FALSE;
8922 // JEZ100225: As of main/latest "tip", we are no longer doing this. Check on this.
8923 //csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_IBS_IND, eCSR_ROAM_RESULT_IBSS_JOIN_FAILED);
8924 // Send an IBSS stop request to PE
8925 csrRoamDisconnectInternal(pMac, sessionId, reason);
Jeff Johnson295189b2012-06-20 16:38:30 -07008926}
Jeff Johnson295189b2012-06-20 16:38:30 -07008927eHalStatus csrRoamStartIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
8928{
8929 eHalStatus status;
8930 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008931
8932 if(!pSession)
8933 {
8934 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8935 return eHAL_STATUS_FAILURE;
8936 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008937
8938 smsLog(pMac, LOG1, " csrRoamStartIbssJoinTimer \n ");
8939 pSession->ibssJoinTimerInfo.sessionId = (tANI_U8)sessionId;
8940 status = palTimerStart(pMac->hHdd, pSession->hTimerIbssJoining, interval, eANI_BOOLEAN_FALSE);
8941
8942 return (status);
8943}
Jeff Johnson295189b2012-06-20 16:38:30 -07008944eHalStatus csrRoamStopIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
8945{
8946 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerIbssJoining));
8947}
Jeff Johnson295189b2012-06-20 16:38:30 -07008948void csrRoamCompletion(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamInfo *pRoamInfo, tSmeCmd *pCommand,
8949 eCsrRoamResult roamResult, tANI_BOOLEAN fSuccess)
8950{
8951 eRoamCmdStatus roamStatus = csrGetRoamCompleteStatus(pMac, sessionId);
8952 tANI_U32 roamId = 0;
8953
8954 if(pCommand)
8955 {
8956 roamId = pCommand->u.roamCmd.roamId;
8957#if defined(VOSS_ENABLED)
8958 VOS_ASSERT( sessionId == pCommand->sessionId );
8959#endif
8960 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008961 if(eCSR_ROAM_ROAMING_COMPLETION == roamStatus)
8962 {
8963 //if success, force roaming completion
8964 csrRoamCompleteRoaming(pMac, sessionId, fSuccess, roamResult);
8965 }
8966 else
8967 {
8968 VOS_ASSERT((CSR_GET_SESSION( pMac, sessionId ))->bRefAssocStartCnt == 0);
8969 smsLog(pMac, LOGW, FL(" indicates association completion. roamResult = %d\n"), roamResult);
8970 csrRoamCallCallback(pMac, sessionId, pRoamInfo, roamId, roamStatus, roamResult);
8971 }
8972}
8973
Jeff Johnson295189b2012-06-20 16:38:30 -07008974eHalStatus csrRoamLostLink( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 type, tSirSmeRsp *pSirMsg)
8975{
8976 eHalStatus status = eHAL_STATUS_SUCCESS;
8977 tSirSmeDeauthInd *pDeauthIndMsg = NULL;
8978 tSirSmeDisassocInd *pDisassocIndMsg = NULL;
8979 eCsrRoamResult result = eCSR_ROAM_RESULT_LOSTLINK;
8980 tCsrRoamInfo *pRoamInfo = NULL;
8981 tCsrRoamInfo roamInfo;
8982 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
8983 //Only need to roam for infra station. In this case P2P client will roam as well
8984 tANI_BOOLEAN fToRoam = CSR_IS_INFRASTRUCTURE(&pSession->connectedProfile);
Jeff Johnson295189b2012-06-20 16:38:30 -07008985 pSession->fCancelRoaming = eANI_BOOLEAN_FALSE;
8986 if ( eWNI_SME_DISASSOC_IND == type )
8987 {
8988 result = eCSR_ROAM_RESULT_DISASSOC_IND;
8989 pDisassocIndMsg = (tSirSmeDisassocInd *)pSirMsg;
8990 pSession->roamingStatusCode = pDisassocIndMsg->statusCode;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07008991 pSession->joinFailStatusCode.reasonCode = pDisassocIndMsg->reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07008992 }
8993 else if ( eWNI_SME_DEAUTH_IND == type )
8994 {
8995 result = eCSR_ROAM_RESULT_DEAUTH_IND;
8996 pDeauthIndMsg = (tSirSmeDeauthInd *)pSirMsg;
8997 pSession->roamingStatusCode = pDeauthIndMsg->statusCode;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07008998 pSession->joinFailStatusCode.reasonCode = pDeauthIndMsg->reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07008999 }
9000 else
9001 {
9002 smsLog(pMac, LOGW, FL("gets an unknown type (%d)\n"), type);
9003 result = eCSR_ROAM_RESULT_NONE;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009004 pSession->joinFailStatusCode.reasonCode = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07009005 }
9006
9007 // call profile lost link routine here
9008#ifdef WLAN_SOFTAP_FEATURE
9009 if(!CSR_IS_INFRA_AP(&pSession->connectedProfile))
9010#endif
9011 {
9012 csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_LOSTLINK_DETECTED, result);
9013 }
9014
9015 if ( eWNI_SME_DISASSOC_IND == type )
9016 {
9017 status = csrSendMBDisassocCnfMsg(pMac, pDisassocIndMsg);
9018 }
9019 else if ( eWNI_SME_DEAUTH_IND == type )
9020 {
9021 status = csrSendMBDeauthCnfMsg(pMac, pDeauthIndMsg);
9022 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009023 if(!HAL_STATUS_SUCCESS(status))
9024 {
9025 //If fail to send confirmation to PE, not to trigger roaming
9026 fToRoam = eANI_BOOLEAN_FALSE;
9027 }
9028
9029 //tell HDD to disconnect
9030 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
9031 roamInfo.statusCode = (tSirResultCodes)pSession->roamingStatusCode;
9032 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
9033#ifdef WLAN_SOFTAP_FEATURE
9034 if( eWNI_SME_DISASSOC_IND == type)
9035 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009036 //staMacAddr
9037 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDisassocIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9038 roamInfo.staId = (tANI_U8)pDisassocIndMsg->staId;
9039 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009040 else if( eWNI_SME_DEAUTH_IND == type )
9041 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009042 //staMacAddr
9043 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDeauthIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9044 roamInfo.staId = (tANI_U8)pDeauthIndMsg->staId;
9045 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009046#endif
9047 smsLog(pMac, LOGW, FL("roamInfo.staId (%d)\n"), roamInfo.staId);
9048 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_LOSTLINK, result);
9049 if(fToRoam)
9050 {
9051 //Only remove the connected BSS in infrastructure mode
9052 csrRoamRemoveConnectedBssFromScanCache(pMac, &pSession->connectedProfile);
9053 //Not to do anying for lostlink with WDS
9054 if( pMac->roam.configParam.nRoamingTime )
9055 {
9056 if(HAL_STATUS_SUCCESS(status = csrRoamStartRoaming(pMac, sessionId,
9057 ( eWNI_SME_DEAUTH_IND == type ) ?
9058 eCsrLostlinkRoamingDeauth : eCsrLostlinkRoamingDisassoc)))
9059 {
9060 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
9061 //For IBSS, we need to give some more info to HDD
9062 if(csrIsBssTypeIBSS(pSession->connectedProfile.BSSType))
9063 {
9064 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
9065 roamInfo.statusCode = (tSirResultCodes)pSession->roamingStatusCode;
9066 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
9067 }
9068 else
9069 {
9070 roamInfo.reasonCode = eCsrRoamReasonSmeIssuedForLostLink;
9071 }
Jeff Johnsone7245742012-09-05 17:12:55 -07009072 pRoamInfo = &roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07009073 pSession->roamingReason = ( eWNI_SME_DEAUTH_IND == type ) ?
9074 eCsrLostlinkRoamingDeauth : eCsrLostlinkRoamingDisassoc;
9075 pSession->roamingStartTime = (tANI_TIMESTAMP)palGetTickCount(pMac->hHdd);
9076 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_LOSTLINK);
9077 }
9078 else
9079 {
9080 smsLog(pMac, LOGW, " %s Fail to start roaming, status = %d", __FUNCTION__, status);
9081 fToRoam = eANI_BOOLEAN_FALSE;
9082 }
9083 }
9084 else
9085 {
9086 //We are told not to roam, indicate lostlink
9087 fToRoam = eANI_BOOLEAN_FALSE;
9088 }
9089 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009090 if(!fToRoam)
9091 {
9092 if( eWNI_SME_DISASSOC_IND == type)
9093 {
9094 //staMacAddr
9095 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDisassocIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9096 roamInfo.staId = (tANI_U8)pDisassocIndMsg->staId;
9097 }
9098 else if( eWNI_SME_DEAUTH_IND == type )
9099 {
9100 //staMacAddr
9101 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDeauthIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9102 roamInfo.staId = (tANI_U8)pDeauthIndMsg->staId;
9103 }
9104 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_LOSTLINK, result);
9105
9106 /*No need to start idle scan in case of IBSS/SAP
9107 Still enable idle scan for polling in case concurrent sessions are running */
9108 if(CSR_IS_INFRASTRUCTURE(&pSession->connectedProfile))
9109 {
9110 csrScanStartIdleScan(pMac);
9111 }
9112 }
9113
9114 return (status);
9115}
9116
Jeff Johnson295189b2012-06-20 16:38:30 -07009117eHalStatus csrRoamLostLinkAfterhandoffFailure( tpAniSirGlobal pMac,tANI_U32 sessionId)
9118{
9119 eHalStatus status = eHAL_STATUS_SUCCESS;
9120 tListElem *pEntry = NULL;
9121 tSmeCmd *pCommand = NULL;
9122 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009123
9124 if(!pSession)
9125 {
9126 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9127 return eHAL_STATUS_FAILURE;
9128 }
9129
Jeff Johnson295189b2012-06-20 16:38:30 -07009130 pSession->fCancelRoaming = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07009131 //Only remove the connected BSS in infrastructure mode
9132 csrRoamRemoveConnectedBssFromScanCache(pMac, &pSession->connectedProfile);
9133 if(pMac->roam.configParam.nRoamingTime)
9134 {
9135 if(HAL_STATUS_SUCCESS(status = csrRoamStartRoaming(pMac,sessionId, pSession->roamingReason)))
9136 {
9137 //before starting the lost link logic release the roam command for handoff
9138 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
9139 if(pEntry)
9140 {
9141 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
9142 }
9143 if(pCommand)
9144 {
9145 if (( eSmeCommandRoam == pCommand->command ) &&
9146 ( eCsrSmeIssuedAssocToSimilarAP == pCommand->u.roamCmd.roamReason))
9147 {
9148 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
9149 {
9150 csrReleaseCommandRoam( pMac, pCommand );
9151 }
9152 }
9153 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009154 smsLog( pMac, LOGW, "Lost link roaming started ...\n");
9155 }
9156 }
9157 else
9158 {
9159 //We are told not to roam, indicate lostlink
9160 status = eHAL_STATUS_FAILURE;
9161 }
9162
9163 return (status);
9164}
Jeff Johnson295189b2012-06-20 16:38:30 -07009165void csrRoamWmStatusChangeComplete( tpAniSirGlobal pMac )
9166{
9167 tListElem *pEntry;
9168 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07009169 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
9170 if ( pEntry )
9171 {
9172 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
9173 if ( eSmeCommandWmStatusChange == pCommand->command )
9174 {
9175 // Nothing to process in a Lost Link completion.... It just kicks off a
9176 // roaming sequence.
9177 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
9178 {
9179 csrReleaseCommandWmStatusChange( pMac, pCommand );
9180 }
9181 else
9182 {
9183 smsLog( pMac, LOGE, " ******csrRoamWmStatusChangeComplete fail to release command\n");
9184 }
9185
9186 }
9187 else
9188 {
9189 smsLog( pMac, LOGW, "CSR: WmStatusChange Completion called but LOST LINK command is not ACTIVE ...\n" );
9190 }
9191 }
9192 else
9193 {
9194 smsLog( pMac, LOGW, "CSR: WmStatusChange Completion called but NO commands are ACTIVE ...\n" );
9195 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009196 smeProcessPendingQueue( pMac );
9197}
9198
Jeff Johnson295189b2012-06-20 16:38:30 -07009199void csrRoamProcessWmStatusChangeCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
9200{
9201 eHalStatus status = eHAL_STATUS_FAILURE;
9202 tSirSmeRsp *pSirSmeMsg;
9203 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pCommand->sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009204
9205 if(!pSession)
9206 {
9207 smsLog(pMac, LOGE, FL(" session %d not found "), pCommand->sessionId);
9208 return;
9209 }
9210
Jeff Johnson295189b2012-06-20 16:38:30 -07009211 switch ( pCommand->u.wmStatusChangeCmd.Type )
9212 {
9213 case eCsrDisassociated:
9214 pSirSmeMsg = (tSirSmeRsp *)&pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg;
9215 status = csrRoamLostLink(pMac, pCommand->sessionId, eWNI_SME_DISASSOC_IND, pSirSmeMsg);
9216 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009217 case eCsrDeauthenticated:
9218 pSirSmeMsg = (tSirSmeRsp *)&pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg;
9219 status = csrRoamLostLink(pMac, pCommand->sessionId, eWNI_SME_DEAUTH_IND, pSirSmeMsg);
9220 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009221 default:
9222 smsLog(pMac, LOGW, FL("gets an unknown command %d\n"), pCommand->u.wmStatusChangeCmd.Type);
9223 break;
9224 }
9225 //For WDS, we want to stop BSS as well when it is indicated that it is disconnected.
9226 if( CSR_IS_CONN_WDS(&pSession->connectedProfile) )
9227 {
9228 if( !HAL_STATUS_SUCCESS(csrRoamIssueStopBssCmd( pMac, pCommand->sessionId, eANI_BOOLEAN_TRUE )) )
9229 {
9230 //This is not good
9231 smsLog(pMac, LOGE, FL(" failed to issue stopBSS command\n"));
9232 }
9233 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009234 // Lost Link just triggers a roaming sequence. We can complte the Lost Link
9235 // command here since there is nothing else to do.
9236 csrRoamWmStatusChangeComplete( pMac );
9237}
9238
Jeff Johnson295189b2012-06-20 16:38:30 -07009239//This function returns band and mode information.
9240//The only tricky part is that if phyMode is set to 11abg, this function may return eCSR_CFG_DOT11_MODE_11B
9241//instead of eCSR_CFG_DOT11_MODE_11G if everything is set to auto-pick.
9242#ifdef WLAN_SOFTAP_FEATURE
9243static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
9244 tANI_U8 operationChn, eCsrBand *pBand )
9245#else
9246static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, eCsrPhyMode phyModeIn,
9247 tANI_U8 operationChn, eCsrBand *pBand )
9248#endif
9249{
Jeff Johnson295189b2012-06-20 16:38:30 -07009250#ifdef WLAN_SOFTAP_FEATURE
9251 eCsrPhyMode phyModeIn = (eCsrPhyMode)pProfile->phyMode;
9252 eCsrCfgDot11Mode cfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(pProfile, phyModeIn,
9253 pMac->roam.configParam.ProprietaryRatesEnabled);
9254#else
9255 eCsrCfgDot11Mode cfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(phyModeIn,
9256 pMac->roam.configParam.ProprietaryRatesEnabled);
9257#endif
9258 eCsrBand eBand;
9259
9260 //If the global setting for dot11Mode is set to auto/abg, we overwrite the setting in the profile.
9261#ifdef WLAN_SOFTAP_FEATURE
9262 if( ((!CSR_IS_INFRA_AP(pProfile )&& !CSR_IS_WDS(pProfile )) &&
9263 ((eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode) ||
9264 (eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode))) ||
9265 (eCSR_CFG_DOT11_MODE_AUTO == cfgDot11Mode) || (eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode) )
9266#else
9267 if( (eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode) ||
9268 (eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode) ||
9269 (eCSR_CFG_DOT11_MODE_AUTO == cfgDot11Mode) || (eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode) )
Jeff Johnson295189b2012-06-20 16:38:30 -07009270#endif
9271 {
9272 switch( pMac->roam.configParam.uCfgDot11Mode )
9273 {
9274 case eCSR_CFG_DOT11_MODE_11A:
9275 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9276 eBand = eCSR_BAND_5G;
9277 break;
9278 case eCSR_CFG_DOT11_MODE_11B:
9279 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9280 eBand = eCSR_BAND_24;
9281 break;
9282 case eCSR_CFG_DOT11_MODE_11G:
9283 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
9284 eBand = eCSR_BAND_24;
9285 break;
9286 case eCSR_CFG_DOT11_MODE_11N:
9287 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
9288 eBand = eCSR_BAND_24;
9289 break;
9290 //case eCSR_CFG_DOT11_MODE_BEST:
9291 // cfgDot11Mode = eCSR_CFG_DOT11_MODE_BEST;
9292 // eBand = eCSR_BAND_24;
9293 // break;
9294 default:
9295 // Global dot11 Mode setting is 11a/b/g.
9296 // use the channel number to determine the Mode setting.
9297 if ( eCSR_OPERATING_CHANNEL_AUTO == operationChn )
9298 {
9299 eBand = pMac->roam.configParam.eBand;
9300 if(eCSR_BAND_24 == eBand)
9301 {
9302 //See reason in else if ( CSR_IS_CHANNEL_24GHZ(operationChn) ) to pick 11B
9303 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9304 }
9305 else
9306 {
9307 //prefer 5GHz
9308 eBand = eCSR_BAND_5G;
9309 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9310 }
9311 }
9312 else if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9313 {
9314 // channel is a 2.4GHz channel. Set mode to 11g.
9315 //
9316 // !!LAC - WiFi tests require IBSS networks to start in 11b mode without any change to the
9317 // default parameter settings on the adapter. We use ACU to start an IBSS through creation
9318 // of a startIBSS profile. this startIBSS profile has Auto MACProtocol and the
9319 // adapter property setting for dot11Mode is also AUTO. So in this case, let's start
9320 // the IBSS network in 11b mode instead of 11g mode.
9321 //
9322 // so this is for Auto=profile->MacProtocol && Auto=Global.dot11Mode && profile->channel is < 14,
9323 // then start the IBSS in b mode.
9324 //
9325 // Note: we used to have this start as an 11g IBSS for best performance... now to specify that
9326 // the user will have to set the do11Mode in the property page to 11g to force it.
9327 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9328 eBand = eCSR_BAND_24;
9329 }
9330 else
9331 {
9332 // else, it's a 5.0GHz channel. Set mode to 11a.
9333 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9334 eBand = eCSR_BAND_5G;
9335 }
9336 break;
9337 }//switch
9338 }//if( eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
9339 else
9340 {
9341 //dot11 mode is set, lets pick the band
9342 if ( eCSR_OPERATING_CHANNEL_AUTO == operationChn )
9343 {
9344 // channel is Auto also.
9345 eBand = pMac->roam.configParam.eBand;
9346 if(eCSR_BAND_ALL == eBand)
9347 {
9348 //prefer 5GHz
9349 eBand = eCSR_BAND_5G;
9350 }
9351 }
9352 else if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9353 {
9354 eBand = eCSR_BAND_24;
9355 }
9356 else
9357 {
9358 eBand = eCSR_BAND_5G;
9359 }
9360 }
9361 if(pBand)
9362 {
9363 *pBand = eBand;
9364 }
9365
9366 if (operationChn == 14){
9367 smsLog(pMac, LOGE, FL(" Switching to Dot11B mode \n"));
9368 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9369 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009370 return( cfgDot11Mode );
9371}
9372
Jeff Johnson295189b2012-06-20 16:38:30 -07009373eHalStatus csrRoamIssueStopBss( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamSubState NewSubstate )
9374{
9375 eHalStatus status;
9376 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009377
9378 if(!pSession)
9379 {
9380 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9381 return eHAL_STATUS_FAILURE;
9382 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009383
9384#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
9385 {
9386 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07009387 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
9388 if(pIbssLog)
9389 {
9390 pIbssLog->eventId = WLAN_IBSS_EVENT_STOP_REQ;
9391 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
9392 }
9393 }
9394#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07009395 pSession->ibss_join_pending = FALSE;
9396 csrRoamStopIbssJoinTimer(pMac, sessionId );
9397 // Set the roaming substate to 'stop Bss request'...
9398 csrRoamSubstateChange( pMac, NewSubstate, sessionId );
9399
9400 // attempt to stop the Bss (reason code is ignored...)
9401 status = csrSendMBStopBssReqMsg( pMac, sessionId );
9402
9403 return (status);
9404}
9405
Jeff Johnson295189b2012-06-20 16:38:30 -07009406//pNumChan is a caller allocated space with the sizeof pChannels
9407eHalStatus csrGetCfgValidChannels(tpAniSirGlobal pMac, tANI_U8 *pChannels, tANI_U32 *pNumChan)
9408{
9409
9410 return (ccmCfgGetStr(pMac, WNI_CFG_VALID_CHANNEL_LIST,
9411 (tANI_U8 *)pChannels,
9412 pNumChan));
9413}
9414
Jeff Johnson295189b2012-06-20 16:38:30 -07009415tANI_BOOLEAN csrRoamIsChannelValid( tpAniSirGlobal pMac, tANI_U8 channel )
9416{
9417 tANI_BOOLEAN fValid = FALSE;
9418 tANI_U32 idxValidChannels;
9419 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9420
9421 if (HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, pMac->roam.validChannelList, &len)))
9422 {
9423 for ( idxValidChannels = 0; ( idxValidChannels < len ); idxValidChannels++ )
9424 {
9425 if ( channel == pMac->roam.validChannelList[ idxValidChannels ] )
9426 {
9427 fValid = TRUE;
9428 break;
9429 }
9430 }
9431 }
9432 pMac->roam.numValidChannels = len;
9433 return fValid;
9434}
9435
Jeff Johnson295189b2012-06-20 16:38:30 -07009436tANI_BOOLEAN csrRoamIsValid40MhzChannel(tpAniSirGlobal pMac, tANI_U8 channel)
9437{
9438 tANI_BOOLEAN fValid = eANI_BOOLEAN_FALSE;
9439 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -07009440 for(i = 0; i < pMac->scan.base40MHzChannels.numChannels; i++)
9441 {
9442 if(channel == pMac->scan.base40MHzChannels.channelList[i])
9443 {
9444 fValid = eANI_BOOLEAN_TRUE;
9445 break;
9446 }
9447 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009448 return (fValid);
9449}
9450
Jeff Johnson295189b2012-06-20 16:38:30 -07009451//This function check and validate whether the NIC can do CB (40MHz)
Jeff Johnsone7245742012-09-05 17:12:55 -07009452 static ePhyChanBondState csrGetCBModeFromIes(tpAniSirGlobal pMac, tANI_U8 primaryChn, tDot11fBeaconIEs *pIes)
Jeff Johnson295189b2012-06-20 16:38:30 -07009453{
Jeff Johnsone7245742012-09-05 17:12:55 -07009454 ePhyChanBondState eRet = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -07009455 tANI_U8 centerChn;
9456 tANI_U32 ChannelBondingMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009457 if(CSR_IS_CHANNEL_24GHZ(primaryChn))
9458 {
9459 ChannelBondingMode = pMac->roam.configParam.channelBondingMode24GHz;
9460 }
9461 else
9462 {
9463 ChannelBondingMode = pMac->roam.configParam.channelBondingMode5GHz;
9464 }
9465 //Figure what the other side's CB mode
9466 if(WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != ChannelBondingMode)
9467 {
9468 if(pIes->HTCaps.present && (eHT_CHANNEL_WIDTH_40MHZ == pIes->HTCaps.supportedChannelWidthSet))
9469 {
9470 if(pIes->HTInfo.present)
9471 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009472 /* This is called during INFRA STA/CLIENT and should use the merged value of
9473 * supported channel width and recommended tx width as per standard
9474 */
9475 smsLog(pMac, LOG1, "scws %u rtws %u sco %u\n",
9476 pIes->HTCaps.supportedChannelWidthSet,
9477 pIes->HTInfo.recommendedTxWidthSet,
9478 pIes->HTInfo.secondaryChannelOffset);
9479
9480 if (pIes->HTInfo.recommendedTxWidthSet == eHT_CHANNEL_WIDTH_40MHZ)
9481 eRet = (ePhyChanBondState)pIes->HTInfo.secondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07009482 else
Jeff Johnsone7245742012-09-05 17:12:55 -07009483 eRet = PHY_SINGLE_CHANNEL_CENTERED;
9484 switch (eRet) {
9485 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
9486 centerChn = primaryChn + CSR_CB_CENTER_CHANNEL_OFFSET;
9487 break;
9488 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
9489 centerChn = primaryChn - CSR_CB_CENTER_CHANNEL_OFFSET;
9490 break;
9491 case PHY_SINGLE_CHANNEL_CENTERED:
9492 default:
9493 centerChn = primaryChn;
9494 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009495 }
Jeff Johnsone7245742012-09-05 17:12:55 -07009496 if((PHY_SINGLE_CHANNEL_CENTERED != eRet) && !csrRoamIsValid40MhzChannel(pMac, centerChn))
Jeff Johnson295189b2012-06-20 16:38:30 -07009497 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009498 smsLog(pMac, LOGE, " Invalid center channel (%d), disable 40MHz mode\n", centerChn);
9499 //eRet = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -07009500 }
9501 }
9502 }
9503 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009504 return eRet;
9505}
Jeff Johnson295189b2012-06-20 16:38:30 -07009506tANI_BOOLEAN csrIsEncryptionInList( tpAniSirGlobal pMac, tCsrEncryptionList *pCipherList, eCsrEncryptionType encryptionType )
9507{
9508 tANI_BOOLEAN fFound = FALSE;
9509 tANI_U32 idx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009510 for( idx = 0; idx < pCipherList->numEntries; idx++ )
9511 {
9512 if( pCipherList->encryptionType[idx] == encryptionType )
9513 {
9514 fFound = TRUE;
9515 break;
9516 }
9517 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009518 return fFound;
9519}
Jeff Johnson295189b2012-06-20 16:38:30 -07009520tANI_BOOLEAN csrIsAuthInList( tpAniSirGlobal pMac, tCsrAuthList *pAuthList, eCsrAuthType authType )
9521{
9522 tANI_BOOLEAN fFound = FALSE;
9523 tANI_U32 idx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009524 for( idx = 0; idx < pAuthList->numEntries; idx++ )
9525 {
9526 if( pAuthList->authType[idx] == authType )
9527 {
9528 fFound = TRUE;
9529 break;
9530 }
9531 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009532 return fFound;
9533}
Jeff Johnson295189b2012-06-20 16:38:30 -07009534tANI_BOOLEAN csrIsSameProfile(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pProfile1, tCsrRoamProfile *pProfile2)
9535{
9536 tANI_BOOLEAN fCheck = eANI_BOOLEAN_FALSE;
9537 tCsrScanResultFilter *pScanFilter = NULL;
9538 eHalStatus status = eHAL_STATUS_SUCCESS;
9539
9540 if(pProfile1 && pProfile2)
9541 {
9542 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
9543 if(HAL_STATUS_SUCCESS(status))
9544 {
9545 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
9546 status = csrRoamPrepareFilterFromProfile(pMac, pProfile2, pScanFilter);
9547 if(HAL_STATUS_SUCCESS(status))
9548 {
9549 fCheck = eANI_BOOLEAN_FALSE;
9550 do
9551 {
9552 tANI_U32 i;
9553 for(i = 0; i < pScanFilter->SSIDs.numOfSSIDs; i++)
9554 {
9555 fCheck = csrIsSsidMatch( pMac, pScanFilter->SSIDs.SSIDList[i].SSID.ssId,
9556 pScanFilter->SSIDs.SSIDList[i].SSID.length,
9557 pProfile1->SSID.ssId, pProfile1->SSID.length, eANI_BOOLEAN_FALSE );
9558 if ( fCheck ) break;
9559 }
9560 if(!fCheck)
9561 {
9562 break;
9563 }
9564 if( !csrIsAuthInList( pMac, &pProfile2->AuthType, pProfile1->AuthType)
9565 || pProfile2->BSSType != pProfile1->BSSType
9566 || !csrIsEncryptionInList( pMac, &pProfile2->EncryptionType, pProfile1->EncryptionType )
9567 )
9568 {
9569 fCheck = eANI_BOOLEAN_FALSE;
9570 break;
9571 }
9572#ifdef WLAN_FEATURE_VOWIFI_11R
9573 if (pProfile1->MDID.mdiePresent || pProfile2->MDID.mdiePresent)
9574 {
9575 if (pProfile1->MDID.mobilityDomain != pProfile2->MDID.mobilityDomain)
9576 {
9577 fCheck = eANI_BOOLEAN_FALSE;
9578 break;
9579 }
9580 }
9581#endif
9582 //Match found
9583 fCheck = eANI_BOOLEAN_TRUE;
9584 }while(0);
9585 csrFreeScanFilter(pMac, pScanFilter);
9586 }
9587 palFreeMemory(pMac->hHdd, pScanFilter);
9588 }
9589 }
9590
9591 return (fCheck);
9592}
9593
Jeff Johnson295189b2012-06-20 16:38:30 -07009594tANI_BOOLEAN csrRoamIsSameProfileKeys(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pConnProfile, tCsrRoamProfile *pProfile2)
9595{
9596 tANI_BOOLEAN fCheck = eANI_BOOLEAN_FALSE;
9597 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -07009598 do
9599 {
9600 //Only check for static WEP
9601 if(!csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, eCSR_ENCRYPT_TYPE_WEP40_STATICKEY) &&
9602 !csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, eCSR_ENCRYPT_TYPE_WEP104_STATICKEY))
9603 {
9604 fCheck = eANI_BOOLEAN_TRUE;
9605 break;
9606 }
9607 if(!csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, pConnProfile->EncryptionType)) break;
9608 if(pConnProfile->Keys.defaultIndex != pProfile2->Keys.defaultIndex) break;
9609 for(i = 0; i < CSR_MAX_NUM_KEY; i++)
9610 {
9611 if(pConnProfile->Keys.KeyLength[i] != pProfile2->Keys.KeyLength[i]) break;
9612 if(!palEqualMemory(pMac->hHdd, &pConnProfile->Keys.KeyMaterial[i],
9613 &pProfile2->Keys.KeyMaterial[i], pProfile2->Keys.KeyLength[i]))
9614 {
9615 break;
9616 }
9617 }
9618 if( i == CSR_MAX_NUM_KEY)
9619 {
9620 fCheck = eANI_BOOLEAN_TRUE;
9621 }
9622 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07009623 return (fCheck);
9624}
9625
Jeff Johnson295189b2012-06-20 16:38:30 -07009626//IBSS
9627
Jeff Johnson295189b2012-06-20 16:38:30 -07009628tANI_U8 csrRoamGetIbssStartChannelNumber50( tpAniSirGlobal pMac )
9629{
9630 tANI_U8 channel = 0;
9631 tANI_U32 idx;
9632 tANI_U32 idxValidChannels;
9633 tANI_BOOLEAN fFound = FALSE;
9634 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9635
9636 if(eCSR_OPERATING_CHANNEL_ANY != pMac->roam.configParam.AdHocChannel5G)
9637 {
9638 channel = pMac->roam.configParam.AdHocChannel5G;
9639 if(!csrRoamIsChannelValid(pMac, channel))
9640 {
9641 channel = 0;
9642 }
9643 }
9644 if (0 == channel && HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &len)))
9645 {
9646 for ( idx = 0; ( idx < CSR_NUM_IBSS_START_CHANNELS_50 ) && !fFound; idx++ )
9647 {
9648 for ( idxValidChannels = 0; ( idxValidChannels < len ) && !fFound; idxValidChannels++ )
9649 {
9650 if ( csrStartIbssChannels50[ idx ] == pMac->roam.validChannelList[ idxValidChannels ] )
9651 {
9652 fFound = TRUE;
9653 channel = csrStartIbssChannels50[ idx ];
9654 }
9655 }
9656 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009657 // this is rare, but if it does happen, we find anyone in 11a bandwidth and return the first 11a channel found!
9658 if (!fFound)
9659 {
9660 for ( idxValidChannels = 0; idxValidChannels < len ; idxValidChannels++ )
9661 {
9662 if ( CSR_IS_CHANNEL_5GHZ(pMac->roam.validChannelList[ idx ]) ) // the max channel# in 11g is 14
9663 {
9664 channel = csrStartIbssChannels50[ idx ];
9665 break;
9666 }
9667 }
9668 }
9669 }//if
9670
9671 return( channel );
9672}
9673
Jeff Johnson295189b2012-06-20 16:38:30 -07009674tANI_U8 csrRoamGetIbssStartChannelNumber24( tpAniSirGlobal pMac )
9675{
9676 tANI_U8 channel = 1;
9677 tANI_U32 idx;
9678 tANI_U32 idxValidChannels;
9679 tANI_BOOLEAN fFound = FALSE;
9680 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9681
9682 if(eCSR_OPERATING_CHANNEL_ANY != pMac->roam.configParam.AdHocChannel24)
9683 {
9684 channel = pMac->roam.configParam.AdHocChannel24;
9685 if(!csrRoamIsChannelValid(pMac, channel))
9686 {
9687 channel = 0;
9688 }
9689 }
9690
9691 if (0 == channel && HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &len)))
9692 {
9693 for ( idx = 0; ( idx < CSR_NUM_IBSS_START_CHANNELS_24 ) && !fFound; idx++ )
9694 {
9695 for ( idxValidChannels = 0; ( idxValidChannels < len ) && !fFound; idxValidChannels++ )
9696 {
9697 if ( csrStartIbssChannels24[ idx ] == pMac->roam.validChannelList[ idxValidChannels ] )
9698 {
9699 fFound = TRUE;
9700 channel = csrStartIbssChannels24[ idx ];
9701 }
9702 }
9703 }
9704 }
9705
9706 return( channel );
9707}
9708
Jeff Johnson295189b2012-06-20 16:38:30 -07009709static void csrRoamGetBssStartParms( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
9710 tCsrRoamStartBssParams *pParam )
9711{
9712 eCsrCfgDot11Mode cfgDot11Mode;
9713 eCsrBand eBand;
9714 tANI_U8 channel = 0;
9715 tSirNwType nwType;
9716 tANI_U8 operationChannel = 0;
9717
9718 if(pProfile->ChannelInfo.numOfChannels && pProfile->ChannelInfo.ChannelList)
9719 {
9720 operationChannel = pProfile->ChannelInfo.ChannelList[0];
9721 }
9722
9723#ifdef WLAN_SOFTAP_FEATURE
9724 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, pProfile, operationChannel, &eBand );
9725#else
9726 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel, &eBand );
9727#endif
9728
9729#ifdef WLAN_FEATURE_P2P
9730 if( ( (pProfile->csrPersona == VOS_P2P_CLIENT_MODE) ||
9731 (pProfile->csrPersona == VOS_P2P_GO_MODE) )
9732 && ( cfgDot11Mode == eCSR_CFG_DOT11_MODE_11B)
9733 )
9734 {
9735 /* This should never happen */
9736 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_FATAL,
9737 FL("For P2PClient/P2P-GO (persona %d) cfgDot11Mode is 11B\n"),
9738 pProfile->csrPersona);
9739 VOS_ASSERT(0);
9740 }
9741#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009742 switch( cfgDot11Mode )
9743 {
9744 case eCSR_CFG_DOT11_MODE_11G:
9745 nwType = eSIR_11G_NW_TYPE;
9746 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009747 case eCSR_CFG_DOT11_MODE_11B:
9748 nwType = eSIR_11B_NW_TYPE;
9749 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009750 case eCSR_CFG_DOT11_MODE_11A:
9751 nwType = eSIR_11A_NW_TYPE;
9752 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009753 default:
9754 case eCSR_CFG_DOT11_MODE_11N:
9755 case eCSR_CFG_DOT11_MODE_TAURUS:
9756 //Because LIM only verifies it against 11a, 11b or 11g, set only 11g or 11a here
9757 if(eCSR_BAND_24 == eBand)
9758 {
9759 nwType = eSIR_11G_NW_TYPE;
9760 }
9761 else
9762 {
9763 nwType = eSIR_11A_NW_TYPE;
9764 }
9765 break;
9766 }
9767
9768 pParam->extendedRateSet.numRates = 0;
9769
9770 switch ( nwType )
9771 {
9772 default:
9773 smsLog(pMac, LOGE, FL("sees an unknown pSirNwType (%d)\n"), nwType);
9774 case eSIR_11A_NW_TYPE:
9775
9776 pParam->operationalRateSet.numRates = 8;
9777
9778 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_6 | CSR_DOT11_BASIC_RATE_MASK;
9779 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_9;
9780 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_12 | CSR_DOT11_BASIC_RATE_MASK;
9781 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_18;
9782 pParam->operationalRateSet.rate[4] = SIR_MAC_RATE_24 | CSR_DOT11_BASIC_RATE_MASK;
9783 pParam->operationalRateSet.rate[5] = SIR_MAC_RATE_36;
9784 pParam->operationalRateSet.rate[6] = SIR_MAC_RATE_48;
9785 pParam->operationalRateSet.rate[7] = SIR_MAC_RATE_54;
9786
9787 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
9788 {
9789 channel = csrRoamGetIbssStartChannelNumber50( pMac );
9790 if( 0 == channel &&
9791 CSR_IS_PHY_MODE_DUAL_BAND(pProfile->phyMode) &&
9792 CSR_IS_PHY_MODE_DUAL_BAND(pMac->roam.configParam.phyMode)
9793 )
9794 {
9795 //We could not find a 5G channel by auto pick, let's try 2.4G channels
9796 //We only do this here because csrRoamGetPhyModeBandForBss always picks 11a for AUTO
9797 nwType = eSIR_11B_NW_TYPE;
9798 channel = csrRoamGetIbssStartChannelNumber24( pMac );
9799 pParam->operationalRateSet.numRates = 4;
9800 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
9801 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
9802 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
9803 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
9804 }
9805 }
9806 else
9807 {
9808 channel = operationChannel;
9809 }
9810 break;
9811
9812 case eSIR_11B_NW_TYPE:
9813 pParam->operationalRateSet.numRates = 4;
9814 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
9815 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
9816 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
9817 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
Jeff Johnson295189b2012-06-20 16:38:30 -07009818 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
9819 {
9820 channel = csrRoamGetIbssStartChannelNumber24( pMac );
9821 }
9822 else
9823 {
9824 channel = operationChannel;
9825 }
9826
9827 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009828 case eSIR_11G_NW_TYPE:
9829#ifdef WLAN_FEATURE_P2P
9830 /* For P2P Client and P2P GO, disable 11b rates */
9831 if( (pProfile->csrPersona == VOS_P2P_CLIENT_MODE) ||
9832 (pProfile->csrPersona == VOS_P2P_GO_MODE)
9833 )
9834 {
9835 pParam->operationalRateSet.numRates = 8;
9836
9837 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_6 | CSR_DOT11_BASIC_RATE_MASK;
9838 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_9;
9839 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_12 | CSR_DOT11_BASIC_RATE_MASK;
9840 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_18;
9841 pParam->operationalRateSet.rate[4] = SIR_MAC_RATE_24 | CSR_DOT11_BASIC_RATE_MASK;
9842 pParam->operationalRateSet.rate[5] = SIR_MAC_RATE_36;
9843 pParam->operationalRateSet.rate[6] = SIR_MAC_RATE_48;
9844 pParam->operationalRateSet.rate[7] = SIR_MAC_RATE_54;
9845 }
9846 else
9847#endif
9848 {
9849 pParam->operationalRateSet.numRates = 4;
Jeff Johnson295189b2012-06-20 16:38:30 -07009850 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
9851 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
9852 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
9853 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
9854
9855 pParam->extendedRateSet.numRates = 8;
Jeff Johnson295189b2012-06-20 16:38:30 -07009856 pParam->extendedRateSet.rate[0] = SIR_MAC_RATE_6;
9857 pParam->extendedRateSet.rate[1] = SIR_MAC_RATE_9;
9858 pParam->extendedRateSet.rate[2] = SIR_MAC_RATE_12;
9859 pParam->extendedRateSet.rate[3] = SIR_MAC_RATE_18;
9860 pParam->extendedRateSet.rate[4] = SIR_MAC_RATE_24;
9861 pParam->extendedRateSet.rate[5] = SIR_MAC_RATE_36;
9862 pParam->extendedRateSet.rate[6] = SIR_MAC_RATE_48;
9863 pParam->extendedRateSet.rate[7] = SIR_MAC_RATE_54;
9864 }
9865
9866 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
9867 {
9868 channel = csrRoamGetIbssStartChannelNumber24( pMac );
9869 }
9870 else
9871 {
9872 channel = operationChannel;
9873 }
9874
9875 break;
9876 }
9877 pParam->operationChn = channel;
9878 pParam->sirNwType = nwType;
9879}
9880
Jeff Johnson295189b2012-06-20 16:38:30 -07009881static void csrRoamGetBssStartParmsFromBssDesc( tpAniSirGlobal pMac, tSirBssDescription *pBssDesc,
9882 tDot11fBeaconIEs *pIes, tCsrRoamStartBssParams *pParam )
9883{
9884
9885 if( pParam )
9886 {
9887 pParam->sirNwType = pBssDesc->nwType;
Jeff Johnsone7245742012-09-05 17:12:55 -07009888 pParam->cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -07009889 pParam->operationChn = pBssDesc->channelId;
9890 palCopyMemory( pMac->hHdd, &pParam->bssid, pBssDesc->bssId, sizeof(tCsrBssid) );
9891
9892 if( pIes )
9893 {
9894 if(pIes->SuppRates.present)
9895 {
9896 pParam->operationalRateSet.numRates = pIes->SuppRates.num_rates;
9897 if(pIes->SuppRates.num_rates > SIR_MAC_RATESET_EID_MAX)
9898 {
9899 smsLog(pMac, LOGE, FL("num_rates :%d is more than SIR_MAC_RATESET_EID_MAX, resetting to SIR_MAC_RATESET_EID_MAX\n"),
9900 pIes->SuppRates.num_rates);
9901 pIes->SuppRates.num_rates = SIR_MAC_RATESET_EID_MAX;
9902 }
9903 palCopyMemory(pMac->hHdd, pParam->operationalRateSet.rate, pIes->SuppRates.rates,
9904 sizeof(*pIes->SuppRates.rates) * pIes->SuppRates.num_rates);
9905 }
9906 if( pIes->SSID.present )
9907 {
9908 pParam->ssId.length = pIes->SSID.num_ssid;
9909 palCopyMemory(pMac->hHdd, pParam->ssId.ssId, pIes->SSID.ssid, pParam->ssId.length);
9910 }
9911 pParam->cbMode = csrGetCBModeFromIes(pMac, pParam->operationChn, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07009912 }
9913 else
9914 {
9915 pParam->ssId.length = 0;
9916 pParam->operationalRateSet.numRates = 0;
9917 }
9918 }
9919}
9920
Jeff Johnson295189b2012-06-20 16:38:30 -07009921static void csrRoamDetermineMaxRateForAdHoc( tpAniSirGlobal pMac, tSirMacRateSet *pSirRateSet )
9922{
9923 tANI_U8 MaxRate = 0;
9924 tANI_U32 i;
9925 tANI_U8 *pRate;
9926
9927 pRate = pSirRateSet->rate;
9928 for ( i = 0; i < pSirRateSet->numRates; i++ )
9929 {
9930 MaxRate = CSR_MAX( MaxRate, ( pRate[ i ] & (~CSR_DOT11_BASIC_RATE_MASK) ) );
9931 }
9932
9933 // Save the max rate in the connected state information...
9934
9935 // modify LastRates variable as well
9936
9937 return;
9938}
9939
Jeff Johnson295189b2012-06-20 16:38:30 -07009940//this function finds a valid secondary channel for channel bonding with "channel".
9941//Param: channel -- primary channel, caller must validate it
9942// cbChoice -- CB directory
9943//Return: if 0, no secondary channel is found. Otherwise a valid secondary channel.
9944static tANI_U8 csrRoamGetSecondaryChannel(tpAniSirGlobal pMac, tANI_U8 channel, eCsrCBChoice cbChoice)
9945{
9946 tANI_U8 chnUp = 0, chnDown = 0, chnRet = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07009947 switch (cbChoice)
9948 {
9949 case eCSR_CB_OFF:
9950 chnUp = 0;
9951 chnDown = 0;
9952 break;
9953 case eCSR_CB_DOWN:
9954 chnUp = 0;
9955 chnDown = channel - CSR_CB_CHANNEL_GAP;
9956 break;
9957 case eCSR_CB_UP:
9958 chnUp = channel + CSR_CB_CHANNEL_GAP;
9959 chnDown = 0;
9960 break;
9961 case eCSR_CB_AUTO:
9962 //consider every other value means auto
9963 default:
9964 chnUp = channel + CSR_CB_CHANNEL_GAP;
9965 chnDown = channel - CSR_CB_CHANNEL_GAP;
9966 break;
9967 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009968 //if CB_UP or auto, try channel up first
9969 if(chnUp && CSR_IS_SAME_BAND_CHANNELS(chnUp, channel) && csrRoamIsChannelValid(pMac, chnUp))
9970 {
9971 //found a valid up channel for channel bonding
9972 //check whether the center channel is valid
9973 if(csrRoamIsValid40MhzChannel(pMac, channel + CSR_CB_CENTER_CHANNEL_OFFSET))
9974 {
9975 chnRet = chnUp;
9976 }
9977 }
9978 if(chnRet == 0 && chnDown && CSR_IS_SAME_BAND_CHANNELS(chnDown, channel) && csrRoamIsChannelValid(pMac, chnDown))
9979 {
9980 //found a valid down channel for channel bonding
9981 if(csrRoamIsValid40MhzChannel(pMac, channel - CSR_CB_CENTER_CHANNEL_OFFSET))
9982 {
9983 chnRet = chnDown;
9984 }
9985 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009986 return chnRet;
9987}
9988
Jeff Johnson295189b2012-06-20 16:38:30 -07009989eHalStatus csrRoamIssueStartBss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamStartBssParams *pParam,
9990 tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc, tANI_U32 roamId )
9991{
9992 eHalStatus status = eHAL_STATUS_SUCCESS;
9993 eCsrBand eBand;
Jeff Johnson295189b2012-06-20 16:38:30 -07009994 // Set the roaming substate to 'Start BSS attempt'...
9995 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_START_BSS_REQ, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07009996#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
9997 //Need to figure out whether we need to log WDS???
9998 if( CSR_IS_IBSS( pProfile ) )
9999 {
10000 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -070010001 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
10002 if(pIbssLog)
10003 {
10004 if(pBssDesc)
10005 {
10006 pIbssLog->eventId = WLAN_IBSS_EVENT_JOIN_IBSS_REQ;
10007 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pBssDesc->bssId, 6);
10008 }
10009 else
10010 {
10011 pIbssLog->eventId = WLAN_IBSS_EVENT_START_IBSS_REQ;
10012 }
10013 palCopyMemory(pMac->hHdd, pIbssLog->ssid, pParam->ssId.ssId,
10014 pParam->ssId.length);
10015 if(pProfile->ChannelInfo.numOfChannels == 0)
10016 {
10017 pIbssLog->channelSetting = AUTO_PICK;
10018 }
10019 else
10020 {
10021 pIbssLog->channelSetting = SPECIFIED;
10022 }
10023 pIbssLog->operatingChannel = pParam->operationChn;
10024 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
10025 }
10026 }
10027#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
10028 //Put RSN information in for Starting BSS
10029 pParam->nRSNIELength = (tANI_U16)pProfile->nRSNReqIELength;
10030 pParam->pRSNIE = pProfile->pRSNReqIE;
10031
Jeff Johnson295189b2012-06-20 16:38:30 -070010032#ifdef WLAN_SOFTAP_FEATURE
10033 pParam->privacy = pProfile->privacy;
10034 pParam->fwdWPSPBCProbeReq = pProfile->fwdWPSPBCProbeReq;
10035 pParam->authType = pProfile->csr80211AuthType;
10036 pParam->beaconInterval = pProfile->beaconInterval;
10037 pParam->dtimPeriod = pProfile->dtimPeriod;
10038 pParam->ApUapsdEnable = pProfile->ApUapsdEnable;
10039 pParam->ssidHidden = pProfile->SSIDs.SSIDList[0].ssidHidden;
10040 if (CSR_IS_INFRA_AP(pProfile)&& (pParam->operationChn != 0))
10041 {
10042 if (csrIsValidChannel(pMac, pParam->operationChn) != eHAL_STATUS_SUCCESS)
10043 {
10044 pParam->operationChn = INFRA_AP_DEFAULT_CHANNEL;
10045 }
10046 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010047 pParam->protEnabled = pProfile->protEnabled;
10048 pParam->obssProtEnabled = pProfile->obssProtEnabled;
10049 pParam->ht_protection = pProfile->cfg_protection;
10050 pParam->wps_state = pProfile->wps_state;
10051#endif
10052
Jeff Johnson295189b2012-06-20 16:38:30 -070010053#ifdef WLAN_SOFTAP_FEATURE
10054 pParam->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, pParam->operationChn /* pProfile->operationChannel*/,
10055 &eBand);
10056#else
10057 pParam->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, (eCsrPhyMode)pProfile->phyMode, pProfile->operationChannel,
10058 &eBand);
10059#endif
10060 pParam->bssPersona = pProfile->csrPersona;
10061 // When starting an IBSS, start on the channel from the Profile.
10062 status = csrSendMBStartBssReqMsg( pMac, sessionId, pProfile->BSSType, pParam, pBssDesc );
Jeff Johnson295189b2012-06-20 16:38:30 -070010063 return (status);
10064}
10065
Jeff Johnson295189b2012-06-20 16:38:30 -070010066static void csrRoamPrepareBssParams(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
Jeff Johnsone7245742012-09-05 17:12:55 -070010067 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig, tDot11fBeaconIEs *pIes)
Jeff Johnson295189b2012-06-20 16:38:30 -070010068{
10069 tANI_U8 Channel, SecondChn;
Jeff Johnsone7245742012-09-05 17:12:55 -070010070 ePhyChanBondState cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010071 eCsrCBChoice cbChoice;
10072 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010073
10074 if(!pSession)
10075 {
10076 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10077 return;
10078 }
10079
Jeff Johnson295189b2012-06-20 16:38:30 -070010080 if( pBssDesc )
10081 {
10082 csrRoamGetBssStartParmsFromBssDesc( pMac, pBssDesc, pIes, &pSession->bssParams );
10083 //Since csrRoamGetBssStartParmsFromBssDesc fills in the bssid for pSession->bssParams
10084 //The following code has to be do after that.
10085 //For WDS station, use selfMac as the self BSSID
10086 if( CSR_IS_WDS_STA( pProfile ) )
10087 {
10088 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, &pSession->selfMacAddr, sizeof(tCsrBssid));
10089 }
10090 }
10091 else
10092 {
10093 csrRoamGetBssStartParms(pMac, pProfile, &pSession->bssParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010094 //Use the first SSID
10095 if(pProfile->SSIDs.numOfSSIDs)
10096 {
10097 palCopyMemory(pMac->hHdd, &pSession->bssParams.ssId, pProfile->SSIDs.SSIDList, sizeof(tSirMacSSid));
10098 }
10099 //For WDS station, use selfMac as the self BSSID
10100 if( CSR_IS_WDS_STA( pProfile ) )
10101 {
10102 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, &pSession->selfMacAddr, sizeof(tCsrBssid));
10103 }
10104 //Use the first BSSID
10105 else if( pProfile->BSSIDs.numOfBSSIDs )
10106 {
10107 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, pProfile->BSSIDs.bssid, sizeof(tCsrBssid));
10108 }
10109 else
10110 {
10111 palZeroMemory( pMac->hHdd, &pSession->bssParams.bssid, sizeof(tCsrBssid) );
10112 }
10113 }
10114 Channel = pSession->bssParams.operationChn;
Jeff Johnson295189b2012-06-20 16:38:30 -070010115 //Set operating channel in pProfile which will be used
10116 //in csrRoamSetBssConfigCfg() to determine channel bonding
10117 //mode and will be configured in CFG later
10118 pProfile->operationChannel = Channel;
10119
10120 if(Channel == 0)
10121 {
10122 smsLog(pMac, LOGW, " CSR cannot find a channel to start IBSS\n");
10123 }
10124 else
10125 {
10126
10127 csrRoamDetermineMaxRateForAdHoc( pMac, &pSession->bssParams.operationalRateSet );
Jeff Johnsone7245742012-09-05 17:12:55 -070010128 if (CSR_IS_INFRA_AP(pProfile))
10129 {
10130 if(CSR_IS_CHANNEL_24GHZ(Channel))
10131 {
10132 cbMode = pMac->roam.configParam.channelBondingMode24GHz;
10133 }
10134 else
10135 {
10136 cbMode = pMac->roam.configParam.channelBondingMode5GHz;
10137 }
10138 smsLog(pMac, LOG1, "##softap cbMode %d\n", cbMode);
10139 pBssConfig->cbMode = cbMode;
10140 pSession->bssParams.cbMode = cbMode;
10141 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010142
10143 if( CSR_IS_START_IBSS( pProfile ) )
10144 {
10145 //TBH: channel bonding is not supported for Libra
10146 if( pProfile->ChannelInfo.ChannelList && eCSR_OPERATING_CHANNEL_AUTO != pProfile->ChannelInfo.ChannelList[0] )
10147 {
10148 Channel = pProfile->ChannelInfo.ChannelList[0];
10149 cbChoice = pProfile->CBMode;
10150 }
10151 else {
10152 cbChoice = pMac->roam.configParam.cbChoice;
10153 }
10154 pSession->bssParams.operationChn = Channel;
10155 //make sure channel is valid
10156 if(!csrRoamIsChannelValid(pMac, Channel))
10157 {
10158 //set Channel to 0 to let lim know this is invalid
10159 //We still send this request down to lim even though we know the channel is wrong because
10160 //lim will response with error and hdd's eWNI_SME_START_BSS_RSP handler will roam other profile (if any)
10161 Channel = 0;
10162 pSession->bssParams.operationChn = 0;
10163 }
10164 else {
10165 tANI_U32 ChannelBondingMode;
Jeff Johnson295189b2012-06-20 16:38:30 -070010166 if(CSR_IS_CHANNEL_24GHZ(Channel))
10167 {
10168 ChannelBondingMode = pMac->roam.configParam.channelBondingMode24GHz;
10169 }
10170 else
10171 {
10172 ChannelBondingMode = pMac->roam.configParam.channelBondingMode5GHz;
10173 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010174 //now we have a valid channel
10175 if(WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != ChannelBondingMode)
10176 {
10177 //let's pick a secondard channel
10178 SecondChn = csrRoamGetSecondaryChannel(pMac, Channel, cbChoice);
Jeff Johnson295189b2012-06-20 16:38:30 -070010179 if(SecondChn > Channel)
10180 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010181 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
Jeff Johnson295189b2012-06-20 16:38:30 -070010182 }
10183 else if(SecondChn && SecondChn < Channel)
10184 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010185 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
Jeff Johnson295189b2012-06-20 16:38:30 -070010186 }
10187 else
10188 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010189 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010190 }
10191 pSession->bssParams.cbMode = cbMode;
10192 }
10193 else
10194 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010195 pSession->bssParams.cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010196 }
10197 }
10198 }
10199 }
10200}
10201
Jeff Johnson295189b2012-06-20 16:38:30 -070010202static eHalStatus csrRoamStartIbss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
10203 tANI_BOOLEAN *pfSameIbss )
10204{
10205 eHalStatus status = eHAL_STATUS_SUCCESS;
10206 tANI_BOOLEAN fSameIbss = FALSE;
10207
10208 if ( csrIsConnStateIbss( pMac, sessionId ) )
10209 {
10210 // Check if any profile parameter has changed ? If any profile parameter
10211 // has changed then stop old BSS and start a new one with new parameters
10212 if ( csrIsSameProfile( pMac, &pMac->roam.roamSession[sessionId].connectedProfile, pProfile ) )
10213 {
10214 fSameIbss = TRUE;
10215 }
10216 else
10217 {
10218 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
10219 }
10220 }
10221 else if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
10222 {
10223 // Disassociate from the connected Infrastructure network...
10224 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
10225 }
10226 else
10227 {
10228 tBssConfigParam *pBssConfig;
10229
10230 status = palAllocateMemory(pMac->hHdd, (void **)&pBssConfig, sizeof(tBssConfigParam));
10231 if(HAL_STATUS_SUCCESS(status))
10232 {
10233 palZeroMemory(pMac->hHdd, pBssConfig, sizeof(tBssConfigParam));
10234 // there is no Bss description before we start an IBSS so we need to adopt
10235 // all Bss configuration parameters from the Profile.
10236 status = csrRoamPrepareBssConfigFromProfile(pMac, pProfile, pBssConfig, NULL);
10237 if(HAL_STATUS_SUCCESS(status))
10238 {
10239 //save dotMode
10240 pMac->roam.roamSession[sessionId].bssParams.uCfgDot11Mode = pBssConfig->uCfgDot11Mode;
10241 //Prepare some more parameters for this IBSS
Jeff Johnsone7245742012-09-05 17:12:55 -070010242 csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, pBssConfig, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070010243 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, NULL, pBssConfig, NULL);
10244 }
10245
10246 palFreeMemory(pMac->hHdd, pBssConfig);
10247 }//Allocate memory
10248 }
10249
10250 if(pfSameIbss)
10251 {
10252 *pfSameIbss = fSameIbss;
10253 }
10254 return( status );
10255}
10256
Jeff Johnson295189b2012-06-20 16:38:30 -070010257static void csrRoamUpdateConnectedProfileFromNewBss( tpAniSirGlobal pMac, tANI_U32 sessionId,
10258 tSirSmeNewBssInfo *pNewBss )
10259{
10260 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010261
10262 if(!pSession)
10263 {
10264 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10265 return;
10266 }
10267
Jeff Johnson295189b2012-06-20 16:38:30 -070010268 if( pNewBss )
10269 {
10270 // Set the operating channel.
10271 pSession->connectedProfile.operationChannel = pNewBss->channelNumber;
10272 // move the BSSId from the BSS description into the connected state information.
10273 palCopyMemory( pMac->hHdd, &pSession->connectedProfile.bssid,
10274 &(pNewBss->bssId), sizeof( tCsrBssid ) );
10275 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010276 return;
10277}
10278
Jeff Johnson295189b2012-06-20 16:38:30 -070010279#ifdef FEATURE_WLAN_WAPI
10280eHalStatus csrRoamSetBKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId, tBkidCacheInfo *pBKIDCache,
10281 tANI_U32 numItems )
10282{
10283 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10284 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070010285 if(!CSR_IS_SESSION_VALID( pMac, sessionId ))
10286 {
10287 smsLog(pMac, LOGE, FL(" Invalid session ID\n"));
10288 return status;
10289 }
10290 smsLog(pMac, LOGW, "csrRoamSetBKIDCache called, numItems = %d\n", numItems);
10291 pSession = CSR_GET_SESSION( pMac, sessionId );
10292 if(numItems <= CSR_MAX_BKID_ALLOWED)
10293 {
10294 status = eHAL_STATUS_SUCCESS;
10295 //numItems may be 0 to clear the cache
10296 pSession->NumBkidCache = (tANI_U16)numItems;
10297 if(numItems && pBKIDCache)
10298 {
10299 status = palCopyMemory( pMac->hHdd, pSession->BkidCacheInfo, pBKIDCache,
10300 sizeof(tBkidCacheInfo) * numItems );
10301 }
10302 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010303 return (status);
10304}
Jeff Johnson295189b2012-06-20 16:38:30 -070010305eHalStatus csrRoamGetBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pNum,
10306 tBkidCacheInfo *pBkidCache)
10307{
10308 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10309 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070010310 if(!CSR_IS_SESSION_VALID( pMac, sessionId ))
10311 {
10312 smsLog(pMac, LOGE, FL(" Invalid session ID\n"));
10313 return status;
10314 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010315 pSession = CSR_GET_SESSION( pMac, sessionId );
10316 if(pNum && pBkidCache)
10317 {
10318 if(pSession->NumBkidCache == 0)
10319 {
10320 *pNum = 0;
10321 status = eHAL_STATUS_SUCCESS;
10322 }
10323 else if(*pNum >= pSession->NumBkidCache)
10324 {
10325 if(pSession->NumBkidCache > CSR_MAX_PMKID_ALLOWED)
10326 {
10327 smsLog(pMac, LOGE, FL("NumPmkidCache :%d is more than CSR_MAX_PMKID_ALLOWED, resetting to CSR_MAX_PMKID_ALLOWED\n"),
10328 pSession->NumBkidCache);
10329 pSession->NumBkidCache = CSR_MAX_PMKID_ALLOWED;
10330 }
10331 palCopyMemory( pMac->hHdd, pBkidCache, pSession->BkidCacheInfo,
10332 sizeof(tBkidCacheInfo) * pSession->NumBkidCache );
10333 *pNum = pSession->NumBkidCache;
10334 status = eHAL_STATUS_SUCCESS;
10335 }
10336 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010337 return (status);
Jeff Johnson295189b2012-06-20 16:38:30 -070010338}
Jeff Johnson295189b2012-06-20 16:38:30 -070010339tANI_U32 csrRoamGetNumBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId)
10340{
10341 return (pMac->roam.roamSession[sessionId].NumBkidCache);
Jeff Johnson295189b2012-06-20 16:38:30 -070010342}
10343#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070010344eHalStatus csrRoamSetPMKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId,
10345 tPmkidCacheInfo *pPMKIDCache, tANI_U32 numItems )
10346{
10347 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10348 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010349
10350 if(!pSession)
10351 {
10352 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10353 return eHAL_STATUS_FAILURE;
10354 }
10355
Jeff Johnson295189b2012-06-20 16:38:30 -070010356 smsLog(pMac, LOGW, "csrRoamSetPMKIDCache called, numItems = %d\n", numItems);
10357 if(numItems <= CSR_MAX_PMKID_ALLOWED)
10358 {
10359#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
10360 {
10361 WLAN_VOS_DIAG_EVENT_DEF(secEvent, vos_event_wlan_security_payload_type);
10362 palZeroMemory(pMac->hHdd, &secEvent, sizeof(vos_event_wlan_security_payload_type));
10363 secEvent.eventId = WLAN_SECURITY_EVENT_PMKID_UPDATE;
10364 secEvent.encryptionModeMulticast =
10365 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
10366 secEvent.encryptionModeUnicast =
10367 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
10368 palCopyMemory( pMac->hHdd, secEvent.bssid, pSession->connectedProfile.bssid, 6 );
10369 secEvent.authMode =
10370 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
10371 WLAN_VOS_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
10372 }
10373#endif//FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -070010374 status = eHAL_STATUS_SUCCESS;
10375 //numItems may be 0 to clear the cache
10376 pSession->NumPmkidCache = (tANI_U16)numItems;
10377 if(numItems && pPMKIDCache)
10378 {
10379 status = palCopyMemory( pMac->hHdd, pSession->PmkidCacheInfo, pPMKIDCache,
10380 sizeof(tPmkidCacheInfo) * numItems );
10381 }
10382 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010383 return (status);
10384}
10385
Jeff Johnson295189b2012-06-20 16:38:30 -070010386tANI_U32 csrRoamGetNumPMKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId)
10387{
10388 return (pMac->roam.roamSession[sessionId].NumPmkidCache);
10389}
10390
Jeff Johnson295189b2012-06-20 16:38:30 -070010391eHalStatus csrRoamGetPMKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pNum, tPmkidCacheInfo *pPmkidCache)
10392{
10393 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10394 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010395
10396 if(!pSession)
10397 {
10398 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10399 return eHAL_STATUS_FAILURE;
10400 }
10401
Jeff Johnson295189b2012-06-20 16:38:30 -070010402 if(pNum && pPmkidCache)
10403 {
10404 if(pSession->NumPmkidCache == 0)
10405 {
10406 *pNum = 0;
10407 status = eHAL_STATUS_SUCCESS;
10408 }
10409 else if(*pNum >= pSession->NumPmkidCache)
10410 {
10411 if(pSession->NumPmkidCache > CSR_MAX_PMKID_ALLOWED)
10412 {
10413 smsLog(pMac, LOGE, FL("NumPmkidCache :%d is more than CSR_MAX_PMKID_ALLOWED, resetting to CSR_MAX_PMKID_ALLOWED\n"),
10414 pSession->NumPmkidCache);
10415 pSession->NumPmkidCache = CSR_MAX_PMKID_ALLOWED;
10416 }
10417 palCopyMemory( pMac->hHdd, pPmkidCache, pSession->PmkidCacheInfo,
10418 sizeof(tPmkidCacheInfo) * pSession->NumPmkidCache );
10419 *pNum = pSession->NumPmkidCache;
10420 status = eHAL_STATUS_SUCCESS;
10421 }
10422 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010423 return (status);
10424}
10425
Jeff Johnson295189b2012-06-20 16:38:30 -070010426eHalStatus csrRoamGetWpaRsnReqIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10427{
10428 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10429 tANI_U32 len;
10430 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010431
10432 if(!pSession)
10433 {
10434 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10435 return eHAL_STATUS_FAILURE;
10436 }
10437
Jeff Johnson295189b2012-06-20 16:38:30 -070010438 if(pLen)
10439 {
10440 len = *pLen;
10441 *pLen = pSession->nWpaRsnReqIeLength;
10442 if(pBuf)
10443 {
10444 if(len >= pSession->nWpaRsnReqIeLength)
10445 {
10446 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWpaRsnReqIE, pSession->nWpaRsnReqIeLength);
10447 }
10448 }
10449 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010450 return (status);
10451}
10452
Jeff Johnson295189b2012-06-20 16:38:30 -070010453eHalStatus csrRoamGetWpaRsnRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10454{
10455 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10456 tANI_U32 len;
10457 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010458
10459 if(!pSession)
10460 {
10461 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10462 return eHAL_STATUS_FAILURE;
10463 }
10464
Jeff Johnson295189b2012-06-20 16:38:30 -070010465 if(pLen)
10466 {
10467 len = *pLen;
10468 *pLen = pSession->nWpaRsnRspIeLength;
10469 if(pBuf)
10470 {
10471 if(len >= pSession->nWpaRsnRspIeLength)
10472 {
10473 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWpaRsnRspIE, pSession->nWpaRsnRspIeLength);
10474 }
10475 }
10476 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010477 return (status);
10478}
Jeff Johnson295189b2012-06-20 16:38:30 -070010479#ifdef FEATURE_WLAN_WAPI
10480eHalStatus csrRoamGetWapiReqIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10481{
10482 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10483 tANI_U32 len;
10484 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010485
10486 if(!pSession)
10487 {
10488 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10489 return eHAL_STATUS_FAILURE;
10490 }
10491
Jeff Johnson295189b2012-06-20 16:38:30 -070010492 if(pLen)
10493 {
10494 len = *pLen;
10495 *pLen = pSession->nWapiReqIeLength;
10496 if(pBuf)
10497 {
10498 if(len >= pSession->nWapiReqIeLength)
10499 {
10500 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWapiReqIE, pSession->nWapiReqIeLength);
10501 }
10502 }
10503 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010504 return (status);
10505}
Jeff Johnson295189b2012-06-20 16:38:30 -070010506eHalStatus csrRoamGetWapiRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10507{
10508 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10509 tANI_U32 len;
10510 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010511
10512 if(!pSession)
10513 {
10514 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10515 return eHAL_STATUS_FAILURE;
10516 }
10517
Jeff Johnson295189b2012-06-20 16:38:30 -070010518 if(pLen)
10519 {
10520 len = *pLen;
10521 *pLen = pSession->nWapiRspIeLength;
10522 if(pBuf)
10523 {
10524 if(len >= pSession->nWapiRspIeLength)
10525 {
10526 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWapiRspIE, pSession->nWapiRspIeLength);
10527 }
10528 }
10529 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010530 return (status);
10531}
10532#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070010533eRoamCmdStatus csrGetRoamCompleteStatus(tpAniSirGlobal pMac, tANI_U32 sessionId)
10534{
10535 eRoamCmdStatus retStatus = eCSR_ROAM_CONNECT_COMPLETION;
10536 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010537
10538 if(!pSession)
10539 {
10540 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10541 return (retStatus);
10542 }
10543
Jeff Johnson295189b2012-06-20 16:38:30 -070010544 if(CSR_IS_ROAMING(pSession))
10545 {
10546 retStatus = eCSR_ROAM_ROAMING_COMPLETION;
10547 pSession->fRoaming = eANI_BOOLEAN_FALSE;
10548 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010549 return (retStatus);
10550}
10551
Jeff Johnson295189b2012-06-20 16:38:30 -070010552//This function remove the connected BSS from te cached scan result
10553eHalStatus csrRoamRemoveConnectedBssFromScanCache(tpAniSirGlobal pMac,
10554 tCsrRoamConnectedProfile *pConnProfile)
10555{
10556 eHalStatus status = eHAL_STATUS_FAILURE;
10557 tCsrScanResultFilter *pScanFilter = NULL;
10558 tListElem *pEntry;
10559 tCsrScanResult *pResult;
10560 tDot11fBeaconIEs *pIes;
10561 tANI_BOOLEAN fMatch;
Jeff Johnson295189b2012-06-20 16:38:30 -070010562 if(!(csrIsMacAddressZero(pMac, &pConnProfile->bssid) ||
10563 csrIsMacAddressBroadcast(pMac, &pConnProfile->bssid)))
10564 {
10565 do
10566 {
10567 //Prepare the filter. Only fill in the necessary fields. Not all fields are needed
10568 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
10569 if(!HAL_STATUS_SUCCESS(status)) break;
10570 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
10571 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->BSSIDs.bssid, sizeof(tCsrBssid));
10572 if(!HAL_STATUS_SUCCESS(status)) break;
10573 palCopyMemory(pMac->hHdd, pScanFilter->BSSIDs.bssid, &pConnProfile->bssid, sizeof(tCsrBssid));
10574 pScanFilter->BSSIDs.numOfBSSIDs = 1;
10575 if(!csrIsNULLSSID(pConnProfile->SSID.ssId, pConnProfile->SSID.length))
10576 {
10577 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->SSIDs.SSIDList, sizeof(tCsrSSIDInfo));
10578 if(!HAL_STATUS_SUCCESS(status)) break;
10579 palCopyMemory(pMac->hHdd, &pScanFilter->SSIDs.SSIDList[0].SSID, &pConnProfile->SSID, sizeof(tSirMacSSid));
10580 }
10581 pScanFilter->authType.numEntries = 1;
10582 pScanFilter->authType.authType[0] = pConnProfile->AuthType;
10583 pScanFilter->BSSType = pConnProfile->BSSType;
10584 pScanFilter->EncryptionType.numEntries = 1;
10585 pScanFilter->EncryptionType.encryptionType[0] = pConnProfile->EncryptionType;
10586 pScanFilter->mcEncryptionType.numEntries = 1;
10587 pScanFilter->mcEncryptionType.encryptionType[0] = pConnProfile->mcEncryptionType;
10588 //We ignore the channel for now, BSSID should be enough
10589 pScanFilter->ChannelInfo.numOfChannels = 0;
10590 //Also ignore the following fields
10591 pScanFilter->uapsd_mask = 0;
10592 pScanFilter->bWPSAssociation = eANI_BOOLEAN_FALSE;
10593 pScanFilter->countryCode[0] = 0;
10594 pScanFilter->phyMode = eCSR_DOT11_MODE_TAURUS;
Jeff Johnson295189b2012-06-20 16:38:30 -070010595 csrLLLock(&pMac->scan.scanResultList);
10596 pEntry = csrLLPeekHead( &pMac->scan.scanResultList, LL_ACCESS_NOLOCK );
10597 while( pEntry )
10598 {
10599 pResult = GET_BASE_ADDR( pEntry, tCsrScanResult, Link );
10600 pIes = (tDot11fBeaconIEs *)( pResult->Result.pvIes );
10601 fMatch = csrMatchBSS(pMac, &pResult->Result.BssDescriptor,
10602 pScanFilter, NULL, NULL, NULL, &pIes);
10603 //Release the IEs allocated by csrMatchBSS is needed
10604 if( !pResult->Result.pvIes )
10605 {
10606 //need to free the IEs since it is allocated by csrMatchBSS
10607 palFreeMemory(pMac->hHdd, pIes);
10608 }
10609 if(fMatch)
10610 {
10611 //We found the one
10612 if( csrLLRemoveEntry(&pMac->scan.scanResultList, pEntry, LL_ACCESS_NOLOCK) )
10613 {
10614 //Free the memory
10615 csrFreeScanResultEntry( pMac, pResult );
10616 }
10617 break;
10618 }
10619 pEntry = csrLLNext(&pMac->scan.scanResultList, pEntry, LL_ACCESS_NOLOCK);
10620 }//while
10621 csrLLUnlock(&pMac->scan.scanResultList);
10622 }while(0);
10623 if(pScanFilter)
10624 {
10625 csrFreeScanFilter(pMac, pScanFilter);
10626 palFreeMemory(pMac->hHdd, pScanFilter);
10627 }
10628 }
10629 return (status);
10630}
10631
Jeff Johnson295189b2012-06-20 16:38:30 -070010632//BT-AMP
Jeff Johnson295189b2012-06-20 16:38:30 -070010633eHalStatus csrIsBTAMPAllowed( tpAniSirGlobal pMac, tANI_U32 chnId )
10634{
10635 eHalStatus status = eHAL_STATUS_SUCCESS;
10636 tANI_U32 sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070010637 for( sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
10638 {
10639 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
10640 {
10641 if( csrIsConnStateIbss( pMac, sessionId ) || csrIsBTAMP( pMac, sessionId ) )
10642 {
10643 //co-exist with IBSS or BT-AMP is not supported
10644 smsLog( pMac, LOGW, " BTAMP is not allowed due to IBSS/BT-AMP exist in session %d\n", sessionId );
10645 status = eHAL_STATUS_CSR_WRONG_STATE;
10646 break;
10647 }
10648 if( csrIsConnStateInfra( pMac, sessionId ) )
10649 {
10650 if( chnId &&
10651 ( (tANI_U8)chnId != pMac->roam.roamSession[sessionId].connectedProfile.operationChannel ) )
10652 {
10653 smsLog( pMac, LOGW, " BTAMP is not allowed due to channel (%d) diff than infr channel (%d)\n",
10654 chnId, pMac->roam.roamSession[sessionId].connectedProfile.operationChannel );
10655 status = eHAL_STATUS_CSR_WRONG_STATE;
10656 break;
10657 }
10658 }
10659 }
10660 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010661 return ( status );
10662}
10663
Jeff Johnson295189b2012-06-20 16:38:30 -070010664static eHalStatus csrRoamStartWds( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc )
10665{
10666 eHalStatus status = eHAL_STATUS_SUCCESS;
10667 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
10668 tBssConfigParam bssConfig;
Jeff Johnson32d95a32012-09-10 13:15:23 -070010669
10670 if(!pSession)
10671 {
10672 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10673 return eHAL_STATUS_FAILURE;
10674 }
10675
Jeff Johnson295189b2012-06-20 16:38:30 -070010676 if ( csrIsConnStateIbss( pMac, sessionId ) )
10677 {
10678 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
10679 }
10680 else if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
10681 {
10682 // Disassociate from the connected Infrastructure network...
10683 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
10684 }
10685 else
10686 {
10687#if defined(VOSS_ENABLED)
10688 //We don't expect Bt-AMP HDD not to disconnect the last connection first at this time.
10689 //Otherwise we need to add code to handle the
10690 //situation just like IBSS. Though for WDS station, we need to send disassoc to PE first then
10691 //send stop_bss to PE, before we can continue.
10692 VOS_ASSERT( !csrIsConnStateWds( pMac, sessionId ) );
10693#endif
10694 palZeroMemory(pMac->hHdd, &bssConfig, sizeof(tBssConfigParam));
10695 /* Assume HDD provide bssid in profile */
10696 palCopyMemory( pMac->hHdd, &pSession->bssParams.bssid, pProfile->BSSIDs.bssid[0], sizeof(tCsrBssid) );
10697 // there is no Bss description before we start an WDS so we need
10698 // to adopt all Bss configuration parameters from the Profile.
10699 status = csrRoamPrepareBssConfigFromProfile(pMac, pProfile, &bssConfig, pBssDesc);
10700 if(HAL_STATUS_SUCCESS(status))
10701 {
10702 //Save profile for late use
10703 csrFreeRoamProfile( pMac, sessionId );
10704 if (HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd,
10705 (void **)&pSession->pCurRoamProfile,
10706 sizeof(tCsrRoamProfile))))
10707 {
10708 palZeroMemory(pMac->hHdd, pSession->pCurRoamProfile, sizeof(tCsrRoamProfile));
10709 csrRoamCopyProfile(pMac, pSession->pCurRoamProfile, pProfile);
10710 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010711 //Prepare some more parameters for this WDS
Jeff Johnsone7245742012-09-05 17:12:55 -070010712 csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, &bssConfig, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070010713 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, NULL, &bssConfig, NULL);
10714 }
10715 }
10716
10717 return( status );
10718}
10719
Jeff Johnson295189b2012-06-20 16:38:30 -070010720////////////////////Mail box
10721
Jeff Johnson295189b2012-06-20 16:38:30 -070010722//pBuf is caller allocated memory point to &(tSirSmeJoinReq->rsnIE.rsnIEdata[ 0 ]) + pMsg->rsnIE.length;
10723//or &(tSirSmeReassocReq->rsnIE.rsnIEdata[ 0 ]) + pMsg->rsnIE.length;
10724static void csrPrepareJoinReassocReqBuffer( tpAniSirGlobal pMac,
10725 tSirBssDescription *pBssDescription,
10726 tANI_U8 *pBuf, tANI_U8 uapsdMask)
10727{
10728 tCsrChannelSet channelGroup;
10729 tSirMacCapabilityInfo *pAP_capabilityInfo;
10730 tAniBool fTmp;
10731 tANI_BOOLEAN found = FALSE;
10732 tANI_U32 size = 0;
10733 tANI_U16 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010734 // plug in neighborhood occupancy info (i.e. BSSes on primary or secondary channels)
10735 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundPri
10736 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundSecDown
10737 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundSecUp
Jeff Johnson295189b2012-06-20 16:38:30 -070010738 // 802.11h
10739 //We can do this because it is in HOST CPU order for now.
10740 pAP_capabilityInfo = (tSirMacCapabilityInfo *)&pBssDescription->capabilityInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -070010741 //tell the target AP my 11H capability only if both AP and STA support 11H and the channel being used is 11a
10742 if ( csrIs11hSupported( pMac ) && pAP_capabilityInfo->spectrumMgt && eSIR_11A_NW_TYPE == pBssDescription->nwType )
10743 {
10744 fTmp = (tAniBool)pal_cpu_to_be32(1);
10745 }
10746 else
10747 fTmp = (tAniBool)0;
10748
10749 // corresponds to --- pMsg->spectrumMgtIndicator = ON;
10750 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&fTmp, sizeof(tAniBool) );
10751 pBuf += sizeof(tAniBool);
10752 *pBuf++ = MIN_STA_PWR_CAP_DBM; // it is for pMsg->powerCap.minTxPower = 0;
10753 found = csrSearchChannelListForTxPower(pMac, pBssDescription, &channelGroup);
Jeff Johnson295189b2012-06-20 16:38:30 -070010754 // This is required for 11k test VoWiFi Ent: Test 2.
10755 // We need the power capabilities for Assoc Req.
10756 // This macro is provided by the halPhyCfg.h. We pick our
10757 // max and min capability by the halPhy provided macros
10758 *pBuf++ = MAX_STA_PWR_CAP_DBM;
Jeff Johnson295189b2012-06-20 16:38:30 -070010759 size = sizeof(pMac->roam.validChannelList);
10760 if(HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &size)))
10761 {
10762 *pBuf++ = (tANI_U8)size; //tSirSupChnl->numChnl
10763 for ( i = 0; i < size; i++)
10764 {
10765 *pBuf++ = pMac->roam.validChannelList[ i ]; //tSirSupChnl->channelList[ i ]
10766
10767 }
10768 }
10769 else
10770 {
10771 smsLog(pMac, LOGE, FL("can not find any valid channel\n"));
10772 *pBuf++ = 0; //tSirSupChnl->numChnl
10773 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010774 //Check whether it is ok to enter UAPSD
10775#ifndef WLAN_MDM_CODE_REDUCTION_OPT
10776 if( btcIsReadyForUapsd(pMac) )
10777#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
10778 {
10779 *pBuf++ = uapsdMask;
10780 }
10781#ifndef WLAN_MDM_CODE_REDUCTION_OPT
10782 else
10783 {
10784 smsLog(pMac, LOGE, FL(" BTC doesn't allow UAPSD for uapsd_mask(0x%X)\n"), uapsdMask);
10785 *pBuf++ = 0;
10786 }
10787#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
10788
Jeff Johnson295189b2012-06-20 16:38:30 -070010789 // move the entire BssDescription into the join request.
10790 palCopyMemory( pMac->hHdd, pBuf, pBssDescription,
10791 pBssDescription->length + sizeof( pBssDescription->length ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070010792 pBuf += pBssDescription->length + sizeof( pBssDescription->length ); // update to new location
10793}
10794
Jeff Johnson295189b2012-06-20 16:38:30 -070010795/*
10796 * The communication between HDD and LIM is thru mailbox (MB).
10797 * Both sides will access the data structure "tSirSmeJoinReq".
10798 * The rule is, while the components of "tSirSmeJoinReq" can be accessed in the regular way like tSirSmeJoinReq.assocType, this guideline
10799 * stops at component tSirRSNie; any acces to the components after tSirRSNie is forbidden because the space from tSirRSNie is quueezed
10800 * with the component "tSirBssDescription". And since the size of actual 'tSirBssDescription' varies, the receiving side (which is the routine
10801 * limJoinReqSerDes() of limSerDesUtils.cc) should keep in mind not to access the components DIRECTLY after tSirRSNie.
10802 */
10803eHalStatus csrSendJoinReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDescription,
10804 tCsrRoamProfile *pProfile, tDot11fBeaconIEs *pIes )
10805{
10806 eHalStatus status = eHAL_STATUS_SUCCESS;
10807 tSirSmeJoinReq *pMsg;
10808 tANI_U8 *pBuf;
10809 tANI_U16 msgLen, wTmp, ieLen;
10810 tSirMacRateSet OpRateSet;
10811 tSirMacRateSet ExRateSet;
10812 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
10813 tANI_U32 dwTmp;
10814 tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN]; //RSN MAX is bigger than WPA MAX
Jeff Johnson32d95a32012-09-10 13:15:23 -070010815
10816 if(!pSession)
10817 {
10818 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10819 return eHAL_STATUS_FAILURE;
10820 }
10821
Jeff Johnson295189b2012-06-20 16:38:30 -070010822 do {
10823 pSession->joinFailStatusCode.statusCode = eSIR_SME_SUCCESS;
10824 pSession->joinFailStatusCode.reasonCode = 0;
10825 // There are a number of variable length fields to consider. First, the tSirSmeJoinReq
10826 // includes a single bssDescription. bssDescription includes a single tANI_U32 for the
10827 // IE fields, but the length field in the bssDescription needs to be interpreted to
10828 // determine length of the IE fields.
10829 //
10830 // So, take the size of the JoinReq, subtract the size of the bssDescription and
10831 // add in the length from the bssDescription (then add the size of the 'length' field
10832 // itself because that is NOT included in the length field).
10833 msgLen = sizeof( tSirSmeJoinReq ) - sizeof( *pBssDescription ) +
10834 pBssDescription->length + sizeof( pBssDescription->length ) +
10835 sizeof( tCsrWpaIe ) + sizeof( tCsrWpaAuthIe ) + sizeof( tANI_U16 ); // add in the size of the WPA IE that we may build.
Jeff Johnson295189b2012-06-20 16:38:30 -070010836 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
10837 if ( !HAL_STATUS_SUCCESS(status) ) break;
10838 palZeroMemory(pMac->hHdd, pMsg, msgLen);
10839 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_JOIN_REQ);
10840 pMsg->length = pal_cpu_to_be16(msgLen);
10841 pBuf = &pMsg->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070010842 // sessionId
10843 *pBuf = (tANI_U8)sessionId;
10844 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070010845 // transactionId
10846 *pBuf = 0;
10847 *( pBuf + 1 ) = 0;
10848 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070010849 // ssId
10850 if( pIes->SSID.present && pIes->SSID.num_ssid )
10851 {
10852 // ssId len
10853 *pBuf = pIes->SSID.num_ssid;
10854 pBuf++;
10855 palCopyMemory( pMac->hHdd, pBuf, pIes->SSID.ssid, pIes->SSID.num_ssid );
10856 pBuf += pIes->SSID.num_ssid;
10857 }
10858 else
10859 {
10860 *pBuf = 0;
10861 pBuf++;
10862 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010863 // selfMacAddr
10864 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
10865 pBuf += sizeof(tSirMacAddr);
10866 // bsstype
10867 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( pProfile->BSSType ) );
10868 if (dwTmp == eSIR_BTAMP_STA_MODE) dwTmp = eSIR_BTAMP_AP_MODE; // Override BssType for BTAMP
10869 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
10870 pBuf += sizeof(tSirBssType);
10871 // dot11mode
10872 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pSession->bssParams.uCfgDot11Mode );
10873 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070010874 //Persona
10875 *pBuf = (tANI_U8)pProfile->csrPersona;
10876 pBuf++;
Jeff Johnsone7245742012-09-05 17:12:55 -070010877 //CBMode
10878 *pBuf = (tANI_U8)pSession->bssParams.cbMode;
10879 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070010880
10881 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
Jeff Johnsone7245742012-09-05 17:12:55 -070010882 FL("CSR PERSONA=%d CSR CbMode %d"), pProfile->csrPersona, pSession->bssParams.cbMode);
10883
Jeff Johnson295189b2012-06-20 16:38:30 -070010884 // uapsdPerAcBitmask
10885 *pBuf = pProfile->uapsd_mask;
10886 pBuf++;
10887
Jeff Johnsone7245742012-09-05 17:12:55 -070010888
Jeff Johnson295189b2012-06-20 16:38:30 -070010889
10890#if (WNI_POLARIS_FW_PACKAGE == ADVANCED)
10891#endif /*(WNI_POLARIS_FW_PACKAGE == ADVANCED)*/
Jeff Johnson295189b2012-06-20 16:38:30 -070010892 status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode, pBssDescription, pIes, &OpRateSet, &ExRateSet);
10893 if (HAL_STATUS_SUCCESS(status) )
10894 {
10895 // OperationalRateSet
10896 if (OpRateSet.numRates) {
10897 *pBuf++ = OpRateSet.numRates;
10898 palCopyMemory(pMac->hHdd, pBuf, OpRateSet.rate, OpRateSet.numRates);
10899 pBuf += OpRateSet.numRates;
10900 } else *pBuf++ = 0;
10901 // ExtendedRateSet
10902 if (ExRateSet.numRates) {
10903 *pBuf++ = ExRateSet.numRates;
10904 palCopyMemory(pMac->hHdd, pBuf, ExRateSet.rate, ExRateSet.numRates);
10905 pBuf += ExRateSet.numRates;
10906 } else *pBuf++ = 0;
10907 }
10908 else
10909 {
10910 *pBuf++ = 0;
10911 *pBuf++ = 0;
10912 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010913 // rsnIE
10914 if ( csrIsProfileWpa( pProfile ) )
10915 {
10916 // Insert the Wpa IE into the join request
10917 ieLen = csrRetrieveWpaIe( pMac, pProfile, pBssDescription, pIes,
10918 (tCsrWpaIe *)( wpaRsnIE ) );
10919 }
10920 else if( csrIsProfileRSN( pProfile ) )
10921 {
10922 // Insert the RSN IE into the join request
10923 ieLen = csrRetrieveRsnIe( pMac, sessionId, pProfile, pBssDescription, pIes,
10924 (tCsrRSNIe *)( wpaRsnIE ) );
10925 }
10926#ifdef FEATURE_WLAN_WAPI
10927 else if( csrIsProfileWapi( pProfile ) )
10928 {
10929 // Insert the WAPI IE into the join request
10930 ieLen = csrRetrieveWapiIe( pMac, sessionId, pProfile, pBssDescription, pIes,
10931 (tCsrWapiIe *)( wpaRsnIE ) );
10932 }
10933#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070010934 else
10935 {
10936 ieLen = 0;
10937 }
10938 //remember the IE for future use
10939 if( ieLen )
10940 {
10941 if(ieLen > DOT11F_IE_RSN_MAX_LEN)
10942 {
10943 smsLog(pMac, LOGE, FL(" WPA RSN IE length :%d is more than DOT11F_IE_RSN_MAX_LEN, resetting to %d\n"), ieLen, DOT11F_IE_RSN_MAX_LEN);
10944 ieLen = DOT11F_IE_RSN_MAX_LEN;
10945 }
10946#ifdef FEATURE_WLAN_WAPI
10947 if( csrIsProfileWapi( pProfile ) )
10948 {
10949 //Check whether we need to allocate more memory
10950 if(ieLen > pSession->nWapiReqIeLength)
10951 {
10952 if(pSession->pWapiReqIE && pSession->nWapiReqIeLength)
10953 {
10954 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
10955 }
10956 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWapiReqIE, ieLen);
10957 if(!HAL_STATUS_SUCCESS(status)) break;
10958 }
10959 pSession->nWapiReqIeLength = ieLen;
10960 palCopyMemory(pMac->hHdd, pSession->pWapiReqIE, wpaRsnIE, ieLen);
10961 wTmp = pal_cpu_to_be16( ieLen );
10962 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
10963 pBuf += sizeof(tANI_U16);
10964 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
10965 pBuf += ieLen;
10966 }
10967 else//should be WPA/WPA2 otherwise
10968#endif /* FEATURE_WLAN_WAPI */
10969 {
10970 //Check whether we need to allocate more memory
10971 if(ieLen > pSession->nWpaRsnReqIeLength)
10972 {
10973 if(pSession->pWpaRsnReqIE && pSession->nWpaRsnReqIeLength)
10974 {
10975 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
10976 }
10977 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnReqIE, ieLen);
10978 if(!HAL_STATUS_SUCCESS(status)) break;
10979 }
10980 pSession->nWpaRsnReqIeLength = ieLen;
10981 palCopyMemory(pMac->hHdd, pSession->pWpaRsnReqIE, wpaRsnIE, ieLen);
10982 wTmp = pal_cpu_to_be16( ieLen );
10983 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
10984 pBuf += sizeof(tANI_U16);
10985 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
10986 pBuf += ieLen;
10987 }
10988 }
10989 else
10990 {
10991 //free whatever old info
10992 pSession->nWpaRsnReqIeLength = 0;
10993 if(pSession->pWpaRsnReqIE)
10994 {
10995 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
10996 pSession->pWpaRsnReqIE = NULL;
10997 }
10998#ifdef FEATURE_WLAN_WAPI
10999 pSession->nWapiReqIeLength = 0;
11000 if(pSession->pWapiReqIE)
11001 {
11002 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
11003 pSession->pWapiReqIE = NULL;
11004 }
11005#endif /* FEATURE_WLAN_WAPI */
11006 //length is two bytes
11007 *pBuf = 0;
11008 *(pBuf + 1) = 0;
11009 pBuf += 2;
11010 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011011#ifdef FEATURE_WLAN_CCX
11012 // Never include the cckmIE in an Join Request
11013 //length is two bytes
11014 *pBuf = 0;
11015 *(pBuf + 1) = 0;
11016 pBuf += 2;
11017#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011018 // addIEScan
11019 if(pProfile->nAddIEScanLength && pProfile->pAddIEScan)
11020 {
11021 ieLen = pProfile->nAddIEScanLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011022 if(ieLen > pSession->nAddIEScanLength)
11023 {
11024 if(pSession->pAddIEScan && pSession->nAddIEScanLength)
11025 {
11026 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11027 }
11028 status = palAllocateMemory(pMac->hHdd,
11029 (void **)&pSession->pAddIEScan, ieLen);
11030 if(!HAL_STATUS_SUCCESS(status)) break;
11031 }
11032 pSession->nAddIEScanLength = ieLen;
11033 palCopyMemory(pMac->hHdd, pSession->pAddIEScan,
11034 pProfile->pAddIEScan, ieLen);
11035 wTmp = pal_cpu_to_be16( ieLen );
11036 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11037 pBuf += sizeof(tANI_U16);
11038 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEScan, ieLen );
11039 pBuf += ieLen;
11040 }
11041 else
11042 {
11043 pSession->nAddIEScanLength = 0;
11044 if(pSession->pAddIEScan)
11045 {
11046 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11047 pSession->pAddIEScan = NULL;
11048 }
11049 *pBuf = 0;
11050 *(pBuf + 1) = 0;
11051 pBuf += 2;
11052 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011053 // addIEAssoc
11054 if(pProfile->nAddIEAssocLength && pProfile->pAddIEAssoc)
11055 {
11056 ieLen = pProfile->nAddIEAssocLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011057 if(ieLen > pSession->nAddIEAssocLength)
11058 {
11059 if(pSession->pAddIEAssoc && pSession->nAddIEAssocLength)
11060 {
11061 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11062 }
11063 status = palAllocateMemory(pMac->hHdd,
11064 (void **)&pSession->pAddIEAssoc, ieLen);
11065 if(!HAL_STATUS_SUCCESS(status)) break;
11066 }
11067 pSession->nAddIEAssocLength = ieLen;
11068 palCopyMemory(pMac->hHdd, pSession->pAddIEAssoc,
11069 pProfile->pAddIEAssoc, ieLen);
11070 wTmp = pal_cpu_to_be16( ieLen );
11071 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11072 pBuf += sizeof(tANI_U16);
11073 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEAssoc, ieLen );
11074 pBuf += ieLen;
11075 }
11076 else
11077 {
11078 pSession->nAddIEAssocLength = 0;
11079 if(pSession->pAddIEAssoc)
11080 {
11081 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11082 pSession->pAddIEAssoc = NULL;
11083 }
11084 *pBuf = 0;
11085 *(pBuf + 1) = 0;
11086 pBuf += 2;
11087 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011088 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedUCEncryptionType) );
11089 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11090 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011091 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
11092 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11093 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011094#ifdef WLAN_FEATURE_VOWIFI_11R
11095 if (csrIsProfile11r( pProfile ) )
11096 {
11097 // is11Rconnection;
11098 dwTmp = pal_cpu_to_be32(TRUE);
11099 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11100 pBuf += sizeof(tAniBool);
11101 }
11102 else
11103 {
11104 // is11Rconnection;
11105 dwTmp = pal_cpu_to_be32(FALSE);
11106 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11107 pBuf += sizeof(tAniBool);
11108 }
11109#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011110#ifdef FEATURE_WLAN_CCX
11111 /* A profile can not be both CCX and 11R. But an 802.11R AP
11112 * may be advertising support for CCX as well. So if we are
11113 * associating Open or explicitly CCX then we will get CCX.
11114 * If we are associating explictly 11R only then we will get
11115 * 11R.
11116 */
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011117 if ((csrIsProfileCCX(pProfile) ||
11118 ((pIes->CCXVersion.present)
11119 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11120 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11121 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11122 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11123 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11124 && (!(csrIsProfile11r( pProfile )))
11125 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -070011126 {
11127 // isCCXconnection;
11128 dwTmp = pal_cpu_to_be32(TRUE);
11129 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11130 pBuf += sizeof(tAniBool);
11131 }
11132 else
11133 {
11134 //isCCXconnection;
11135 dwTmp = pal_cpu_to_be32(FALSE);
11136 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11137 pBuf += sizeof(tAniBool);
11138 }
11139 {
11140 tCCXTspecInfo ccxTspec;
11141 // CCX-Tspec IEs in the ASSOC request is presently not supported
11142 // so nullify the TSPEC parameters
11143 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11144 palCopyMemory( pMac->hHdd, pBuf, &ccxTspec, sizeof(tCCXTspecInfo));
11145 pBuf += sizeof(tCCXTspecInfo);
11146 }
11147#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011148#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -070011149 // Fill in isFastTransitionEnabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011150 if (pMac->roam.configParam.isFastTransitionEnabled
11151#ifdef FEATURE_WLAN_LFR
11152 || csrRoamIsFastRoamEnabled(pMac)
11153#endif
11154 )
Jeff Johnson295189b2012-06-20 16:38:30 -070011155 {
11156 dwTmp = pal_cpu_to_be32(TRUE);
11157 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11158 pBuf += sizeof(tAniBool);
11159 }
11160 else
11161 {
11162 dwTmp = pal_cpu_to_be32(FALSE);
11163 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11164 pBuf += sizeof(tAniBool);
11165 }
11166#endif
Jeff Johnson43971f52012-07-17 12:26:56 -070011167#ifdef FEATURE_WLAN_LFR
11168 if(csrRoamIsFastRoamEnabled(pMac))
11169 {
11170 //legacy fast roaming enabled
11171 dwTmp = pal_cpu_to_be32(TRUE);
11172 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11173 pBuf += sizeof(tAniBool);
11174 }
11175 else
11176 {
11177 dwTmp = pal_cpu_to_be32(FALSE);
11178 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11179 pBuf += sizeof(tAniBool);
11180 }
11181#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011182 //BssDesc
11183 csrPrepareJoinReassocReqBuffer( pMac, pBssDescription, pBuf,
11184 (tANI_U8)pProfile->uapsd_mask);
Jeff Johnson295189b2012-06-20 16:38:30 -070011185 status = palSendMBMessage(pMac->hHdd, pMsg );
11186 if(!HAL_STATUS_SUCCESS(status))
11187 {
11188 break;
11189 }
11190 //Tush-QoS: notify QoS module that join happening
11191 else
11192 {
11193#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11194 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_JOIN_REQ, NULL);
11195#endif
11196 }
11197 } while( 0 );
11198 return( status );
11199}
11200
Jeff Johnson295189b2012-06-20 16:38:30 -070011201eHalStatus csrSendSmeReassocReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDescription,
11202 tDot11fBeaconIEs *pIes, tCsrRoamProfile *pProfile )
11203{
11204 eHalStatus status;
11205 tSirSmeReassocReq *pMsg;
11206 tANI_U8 *pBuf;
11207 v_U8_t acm_mask = 0, uapsd_mask;
11208 tANI_U16 msgLen, ieLen, wTmp;
11209 tANI_U32 dwTmp;
11210 tSirMacRateSet OpRateSet;
11211 tSirMacRateSet ExRateSet;
11212 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11213 tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN]; //RSN MAX is bigger than WPA MAX
Jeff Johnson32d95a32012-09-10 13:15:23 -070011214
11215 if(!pSession)
11216 {
11217 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
11218 return eHAL_STATUS_FAILURE;
11219 }
11220
Jeff Johnson295189b2012-06-20 16:38:30 -070011221 /* To satisfy klockworks */
11222 if (pBssDescription == NULL)
11223 {
11224 smsLog(pMac, LOGE, FL(" pBssDescription is NULL\n"));
11225 return eHAL_STATUS_FAILURE;
11226 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011227 do {
11228 // There are a number of variable length fields to consider. First, the tSirSmeJoinReq
11229 // includes a single bssDescription. bssDescription includes a single tANI_U32 for the
11230 // IE fields, but the length field in the bssDescription needs to be interpreted to
11231 // determine length of the IE fields.
11232 //
11233 // So, take the size of the JoinReq, subtract the size of the bssDescription and
11234 // add in the length from the bssDescription (then add the size of the 'length' field
11235 // itself because that is NOT included in the length field).
11236 msgLen = sizeof( tSirSmeReassocReq ) - sizeof( *pBssDescription ) +
11237 pBssDescription->length + sizeof( pBssDescription->length ) +
11238 sizeof( tCsrWpaIe ) + sizeof( tCsrWpaAuthIe ) + sizeof( tANI_U16 ); // add in the size of the WPA IE that we may build.
11239 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
11240 if ( !HAL_STATUS_SUCCESS(status) ) break;
11241 palZeroMemory(pMac->hHdd, pMsg, msgLen);
11242 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_REASSOC_REQ);
11243 pMsg->length = pal_cpu_to_be16(msgLen);
11244 pBuf = &pMsg->sessionId;
11245 // sessionId
11246 *pBuf++ = (tANI_U8)sessionId;
11247 // transactionId
11248 *pBuf = 0;
11249 *(pBuf + 1) = 0;
11250 pBuf += sizeof (tANI_U16);
11251 // ssId
11252 if( pIes->SSID.present && pIes->SSID.num_ssid )
11253 {
11254 // ssId len
11255 *pBuf++ = pIes->SSID.num_ssid;
11256 palCopyMemory( pMac->hHdd, pBuf, pIes->SSID.ssid, pIes->SSID.num_ssid );
11257 pBuf += pIes->SSID.num_ssid;
11258 }
11259 else
11260 {
11261 *pBuf++ = 0;
11262 }
11263 // selfMacAddr
11264 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
11265 pBuf += sizeof(tSirMacAddr);
11266 // bsstype
11267 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( pProfile->BSSType ) );
11268 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
11269 pBuf += sizeof(tSirBssType);
11270 // dot11mode
11271 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pSession->bssParams.uCfgDot11Mode );
11272 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011273 //Persona
11274 *pBuf = (tANI_U8)pProfile->csrPersona;
11275 pBuf++;
Jeff Johnsone7245742012-09-05 17:12:55 -070011276 //CBMode
11277 *pBuf = (tANI_U8)pSession->bssParams.cbMode;
11278 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011279
Jeff Johnsone7245742012-09-05 17:12:55 -070011280 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
11281 FL("CSR PERSONA=%d CSR CBMode=%u\n"), pProfile->csrPersona, pSession->bssParams.cbMode);
11282
Jeff Johnson295189b2012-06-20 16:38:30 -070011283 // uapsdPerAcBitmask
11284 *pBuf = pProfile->uapsd_mask;
11285 pBuf++;
11286
Jeff Johnson295189b2012-06-20 16:38:30 -070011287 status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode,
11288 pBssDescription, pIes, &OpRateSet, &ExRateSet);
11289 if (HAL_STATUS_SUCCESS(status) )
11290 {
11291 // OperationalRateSet
11292 if (OpRateSet.numRates)
11293 {
11294 *pBuf++ = OpRateSet.numRates;
11295 palCopyMemory(pMac->hHdd, pBuf, OpRateSet.rate, OpRateSet.numRates);
11296 pBuf += OpRateSet.numRates;
11297 }
11298 else *pBuf++ = 0;
11299 // ExtendedRateSet
11300 if (ExRateSet.numRates)
11301 {
11302 *pBuf++ = ExRateSet.numRates;
11303 palCopyMemory(pMac->hHdd, pBuf, ExRateSet.rate, ExRateSet.numRates);
11304 pBuf += ExRateSet.numRates;
11305 }
11306 else *pBuf++ = 0;
11307 }
11308 else
11309 {
11310 *pBuf++ = 0;
11311 *pBuf++ = 0;
11312 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011313 // rsnIE
11314 if ( csrIsProfileWpa( pProfile ) )
11315 {
11316 // Insert the Wpa IE into the join request
11317 ieLen = csrRetrieveWpaIe( pMac, pProfile, pBssDescription, pIes,
11318 (tCsrWpaIe *)( wpaRsnIE ) );
11319 }
11320 else if( csrIsProfileRSN( pProfile ) )
11321 {
11322 // Insert the RSN IE into the join request
11323 ieLen = csrRetrieveRsnIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11324 (tCsrRSNIe *)( wpaRsnIE ) );
11325 }
11326#ifdef FEATURE_WLAN_WAPI
11327 else if( csrIsProfileWapi( pProfile ) )
11328 {
11329 // Insert the WAPI IE into the join request
11330 ieLen = csrRetrieveWapiIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11331 (tCsrWapiIe *)( wpaRsnIE) );
11332 }
11333#endif /* FEATURE_WLAN_WAPI */
11334 else
11335 {
11336 ieLen = 0;
11337 }
11338 //remember the IE for future use
11339 if( ieLen )
11340 {
11341 if(ieLen > DOT11F_IE_RSN_MAX_LEN)
11342 {
11343 smsLog(pMac, LOGE, FL(" WPA RSN IE length :%d is more than DOT11F_IE_RSN_MAX_LEN, resetting to %d\n"), ieLen, DOT11F_IE_RSN_MAX_LEN);
11344 ieLen = DOT11F_IE_RSN_MAX_LEN;
11345 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011346 //Check whether we need to allocate more memory
11347 if(ieLen > pSession->nWpaRsnReqIeLength)
11348 {
11349 if(pSession->pWpaRsnReqIE && pSession->nWpaRsnReqIeLength)
11350 {
11351 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11352 }
11353 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnReqIE, ieLen);
11354 if(!HAL_STATUS_SUCCESS(status)) break;
11355 }
11356 pSession->nWpaRsnReqIeLength = ieLen;
11357 palCopyMemory(pMac->hHdd, pSession->pWpaRsnReqIE, wpaRsnIE, ieLen);
11358 wTmp = pal_cpu_to_be16( ieLen );
11359 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11360 pBuf += sizeof(tANI_U16);
11361 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11362 pBuf += ieLen;
11363 }
11364 else
11365 {
11366 //free whatever old info
11367 pSession->nWpaRsnReqIeLength = 0;
11368 if(pSession->pWpaRsnReqIE)
11369 {
11370 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11371 pSession->pWpaRsnReqIE = NULL;
11372 }
11373 //length is two bytes
11374 *pBuf = 0;
11375 *(pBuf + 1) = 0;
11376 pBuf += 2;
11377 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011378#ifdef FEATURE_WLAN_CCX
11379 // cckmIE
11380 if( csrIsProfileCCX( pProfile ) )
11381 {
11382 // Insert the CCKM IE into the join request
11383 ieLen = csrConstructCcxCckmIe( pMac,
11384 pSession,
11385 pProfile,
11386 pBssDescription,
11387 pSession->pWpaRsnReqIE,
11388 pSession->nWpaRsnReqIeLength,
11389 (void *)( wpaRsnIE ) );
11390 }
11391 else
11392 {
11393 ieLen = 0;
11394 }
11395 //If present, copy the IE into the eWNI_SME_REASSOC_REQ message buffer
11396 if( ieLen )
11397 {
11398 //Copy the CCKM IE over from the temp buffer (wpaRsnIE)
11399 wTmp = pal_cpu_to_be16( ieLen );
11400 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11401 pBuf += sizeof(tANI_U16);
11402 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11403 pBuf += ieLen;
11404 }
11405 else
11406 {
11407 //Indicate you have no CCKM IE
11408 //length is two bytes
11409 *pBuf = 0;
11410 *(pBuf + 1) = 0;
11411 pBuf += 2;
11412 }
11413#endif /* FEATURE_WLAN_CCX */
Jeff Johnson295189b2012-06-20 16:38:30 -070011414 // addIEScan
11415 if(pProfile->nAddIEScanLength && pProfile->pAddIEScan)
11416 {
11417 ieLen = pProfile->nAddIEScanLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011418 if(ieLen > pSession->nAddIEScanLength)
11419 {
11420 if(pSession->pAddIEScan && pSession->nAddIEScanLength)
11421 {
11422 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11423 }
11424 status = palAllocateMemory(pMac->hHdd,
11425 (void **)&pSession->pAddIEScan, ieLen);
11426 if(!HAL_STATUS_SUCCESS(status)) break;
11427 }
11428 pSession->nAddIEScanLength = ieLen;
11429 palCopyMemory(pMac->hHdd, pSession->pAddIEScan,
11430 pProfile->pAddIEScan, ieLen);
11431 wTmp = pal_cpu_to_be16( ieLen );
11432 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11433 pBuf += sizeof(tANI_U16);
11434 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEScan, ieLen );
11435 pBuf += ieLen;
11436 }
11437 else
11438 {
11439 pSession->nAddIEScanLength = 0;
11440 if(pSession->pAddIEScan)
11441 {
11442 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11443 pSession->pAddIEScan = NULL;
11444 }
11445 *pBuf = 0;
11446 *(pBuf + 1) = 0;
11447 pBuf += 2;
11448 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011449 // addIEAssoc
11450 if(pProfile->nAddIEAssocLength && pProfile->pAddIEAssoc)
11451 {
11452 ieLen = pProfile->nAddIEAssocLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011453 if(ieLen > pSession->nAddIEAssocLength)
11454 {
11455 if(pSession->pAddIEAssoc && pSession->nAddIEAssocLength)
11456 {
11457 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11458 }
11459 status = palAllocateMemory(pMac->hHdd,
11460 (void **)&pSession->pAddIEAssoc, ieLen);
11461 if(!HAL_STATUS_SUCCESS(status)) break;
11462 }
11463 pSession->nAddIEAssocLength = ieLen;
11464 palCopyMemory(pMac->hHdd, pSession->pAddIEAssoc,
11465 pProfile->pAddIEAssoc, ieLen);
11466 wTmp = pal_cpu_to_be16( ieLen );
11467 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11468 pBuf += sizeof(tANI_U16);
11469 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEAssoc, ieLen );
11470 pBuf += ieLen;
11471 }
11472 else
11473 {
11474 pSession->nAddIEAssocLength = 0;
11475 if(pSession->pAddIEAssoc)
11476 {
11477 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11478 pSession->pAddIEAssoc = NULL;
11479 }
11480 *pBuf = 0;
11481 *(pBuf + 1) = 0;
11482 pBuf += 2;
11483 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011484 //Unmask any AC in reassoc that is ACM-set
11485 uapsd_mask = (v_U8_t)pProfile->uapsd_mask;
11486 if( uapsd_mask && ( NULL != pBssDescription ) )
11487 {
11488 if( CSR_IS_QOS_BSS(pIes) && CSR_IS_UAPSD_BSS(pIes) )
11489 {
11490#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11491 acm_mask = sme_QosGetACMMask(pMac, pBssDescription, pIes);
11492#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
11493 uapsd_mask &= ~(acm_mask);
11494 }
11495 else
11496 {
11497 uapsd_mask = 0;
11498 }
11499 }
11500
11501 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedUCEncryptionType) );
11502 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11503 pBuf += sizeof(tANI_U32);
11504
11505 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
11506 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11507 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011508#ifdef WLAN_FEATURE_VOWIFI_11R
11509 // is11Rconnection;
11510 dwTmp = csrIsProfile11r( pProfile )? pal_cpu_to_be32(TRUE) : 0;
11511 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11512 pBuf += sizeof(tAniBool);
Jeff Johnson295189b2012-06-20 16:38:30 -070011513#ifdef FEATURE_WLAN_CCX
11514 //isCCXconnection;
11515 //CCKM profile, ccxversion ie present, not 11r and ini file has CCX enabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011516 dwTmp = ( ((csrIsProfileCCX(pProfile) ||
11517 ((pIes->CCXVersion.present)
11518 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11519 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11520 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11521 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11522 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11523 && (!(csrIsProfile11r( pProfile )))
11524 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
11525 ? pal_cpu_to_be32(TRUE) : 0);
Jeff Johnson295189b2012-06-20 16:38:30 -070011526 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11527 pBuf += sizeof(tAniBool);
11528#endif // FEATURE_WLAN_CCX
11529#endif // WLAN_FEATURE_VOWIFI_11R
Jeff Johnson295189b2012-06-20 16:38:30 -070011530#ifdef FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011531 if ((csrIsProfileCCX(pProfile) ||
11532 ((pIes->CCXVersion.present)
11533 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11534 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11535 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11536 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11537 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11538 && (!(csrIsProfile11r( pProfile )))
11539 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -070011540 {
11541 tCCXTspecInfo ccxTspec;
Jeff Johnson295189b2012-06-20 16:38:30 -070011542 // CCX Tspec information
11543 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11544 ccxTspec.numTspecs = sme_QosCCxRetrieveTspecInfo(pMac, sessionId, (tTspecInfo *) &ccxTspec.tspec[0]);
11545 *pBuf = ccxTspec.numTspecs;
11546 pBuf += sizeof(tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070011547 // Copy the TSPEC information only if present
11548 if (ccxTspec.numTspecs) {
11549 palCopyMemory(pMac->hHdd, pBuf, (void*)&ccxTspec.tspec[0], (ccxTspec.numTspecs*sizeof(tTspecInfo)));
11550 }
11551 pBuf += sizeof(ccxTspec.tspec);
11552 }
11553 else
11554 {
11555 {
11556 tCCXTspecInfo ccxTspec;
11557 // CCX-Tspec IEs in the ASSOC request is presently not supported
11558 // so nullify the TSPEC parameters
11559 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11560 palCopyMemory( pMac->hHdd, pBuf, &ccxTspec, sizeof(tCCXTspecInfo));
11561 pBuf += sizeof(tCCXTspecInfo);
11562 }
11563 }
11564#endif // FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011565#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -070011566 // Fill in isFastTransitionEnabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011567 if (pMac->roam.configParam.isFastTransitionEnabled
11568#ifdef FEATURE_WLAN_LFR
11569 || csrRoamIsFastRoamEnabled(pMac)
11570#endif
11571 )
Jeff Johnson295189b2012-06-20 16:38:30 -070011572 {
11573 dwTmp = pal_cpu_to_be32(TRUE);
11574 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11575 pBuf += sizeof(tAniBool);
11576 }
11577 else
11578 {
11579 dwTmp = pal_cpu_to_be32(FALSE);
11580 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11581 pBuf += sizeof(tAniBool);
11582 }
11583#endif
Jeff Johnson43971f52012-07-17 12:26:56 -070011584#ifdef FEATURE_WLAN_LFR
11585 if(csrRoamIsFastRoamEnabled(pMac))
11586 {
11587 //legacy fast roaming enabled
11588 dwTmp = pal_cpu_to_be32(TRUE);
11589 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11590 pBuf += sizeof(tAniBool);
11591 }
11592 else
11593 {
11594 dwTmp = pal_cpu_to_be32(FALSE);
11595 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11596 pBuf += sizeof(tAniBool);
11597 }
11598#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011599 csrPrepareJoinReassocReqBuffer( pMac, pBssDescription, pBuf, uapsd_mask);
11600
11601#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11602 //Tush-QoS: notify QoS module that reassoc happening
11603 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_REASSOC_REQ, NULL);
11604#endif
11605 status = palSendMBMessage( pMac->hHdd, pMsg );
11606 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011607 return( status );
Jeff Johnson295189b2012-06-20 16:38:30 -070011608}
11609
Jeff Johnson295189b2012-06-20 16:38:30 -070011610//
11611eHalStatus csrSendMBDisassocReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr bssId, tANI_U16 reasonCode )
11612{
11613 eHalStatus status = eHAL_STATUS_SUCCESS;
11614 tSirSmeDisassocReq *pMsg;
11615 tANI_U8 *pBuf;
11616 tANI_U16 wTmp;
11617#ifdef WLAN_SOFTAP_FEATURE
11618 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11619 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
11620 return eHAL_STATUS_FAILURE;
11621#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011622 do {
11623 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDisassocReq ));
11624 if ( !HAL_STATUS_SUCCESS(status) ) break;
11625 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDisassocReq ));
11626 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DISASSOC_REQ);
11627 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDisassocReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -070011628 pBuf = &pMsg->sessionId;
11629 // sessionId
11630 *pBuf++ = (tANI_U8)sessionId;
11631 // transactionId
11632 *pBuf = 0;
11633 *( pBuf + 1 ) = 0;
11634 pBuf += sizeof(tANI_U16);
11635
11636#ifdef WLAN_SOFTAP_FEATURE
11637 if ( (pSession->pCurRoamProfile != NULL ) &&
11638 ( reasonCode == eSIR_MAC_UNSPEC_FAILURE_REASON ) &&
11639 ((CSR_IS_INFRA_AP(pSession->pCurRoamProfile)) || (CSR_IS_WDS_AP(pSession->pCurRoamProfile))))
11640 {
11641 // Set the bssid address before sending the message to LIM
11642 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pSession->selfMacAddr, sizeof( tSirMacAddr ) );
11643 pBuf = pBuf + sizeof ( tSirMacAddr );
Jeff Johnson295189b2012-06-20 16:38:30 -070011644 // Set the peer MAC address before sending the message to LIM
11645 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( tSirMacAddr ) ); //perMacAddr is passed as bssId for softAP
11646 pBuf = pBuf + sizeof ( tSirMacAddr );
11647 }
11648 else
11649 {
11650#endif
11651 // Set the peer MAC address before sending the message to LIM
11652 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( tSirMacAddr ) );
11653 pBuf = pBuf + sizeof ( tSirMacAddr );
Jeff Johnson295189b2012-06-20 16:38:30 -070011654 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( pMsg->bssId ) );
11655 pBuf = pBuf + sizeof ( tSirMacAddr );
11656#ifdef WLAN_SOFTAP_FEATURE
11657 }
11658#endif
11659 if(!HAL_STATUS_SUCCESS(status))
11660 {
11661 palFreeMemory(pMac->hHdd, pMsg);
11662 break;
11663 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011664 // reasonCode
11665 wTmp = pal_cpu_to_be16(reasonCode);
11666 status = palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11667 if(!HAL_STATUS_SUCCESS(status))
11668 {
11669 palFreeMemory(pMac->hHdd, pMsg);
11670 break;
11671 }
11672 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011673 /* The state will be DISASSOC_HANDOFF only when we are doing handoff.
11674 Here we should not send the disassoc over the air to the AP */
11675 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO(pMac, sessionId)
11676#ifdef WLAN_FEATURE_VOWIFI_11R
11677 && csrRoamIs11rAssoc(pMac)
11678#endif
11679 )
11680 {
11681 *pBuf = CSR_DONT_SEND_DISASSOC_OVER_THE_AIR; /* Set DoNotSendOverTheAir flag to 1 only for handoff case */
11682 }
11683 pBuf += sizeof(tANI_U8);
11684 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011685 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011686 return( status );
11687}
Jeff Johnson295189b2012-06-20 16:38:30 -070011688#ifdef WLAN_SOFTAP_FEATURE
11689eHalStatus csrSendMBTkipCounterMeasuresReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_BOOLEAN bEnable, tSirMacAddr bssId )
11690{
11691 eHalStatus status = eHAL_STATUS_SUCCESS;
11692 tSirSmeTkipCntrMeasReq *pMsg;
11693 tANI_U8 *pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011694 do
11695 {
11696 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeTkipCntrMeasReq ));
11697 if ( !HAL_STATUS_SUCCESS(status) ) break;
11698 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeTkipCntrMeasReq ));
11699 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_TKIP_CNTR_MEAS_REQ);
11700 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeTkipCntrMeasReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -070011701 pBuf = &pMsg->sessionId;
11702 // sessionId
11703 *pBuf++ = (tANI_U8)sessionId;
11704 // transactionId
11705 *pBuf = 0;
11706 *( pBuf + 1 ) = 0;
11707 pBuf += sizeof(tANI_U16);
11708 // bssid
11709 status = palCopyMemory( pMac->hHdd, pMsg->bssId, bssId, sizeof( tSirMacAddr ) );
11710 pBuf = pBuf + sizeof ( tSirMacAddr );
11711 // bEnable
11712 *pBuf = (tANI_BOOLEAN)bEnable;
11713 if(!HAL_STATUS_SUCCESS(status))
11714 {
11715 palFreeMemory(pMac->hHdd, pMsg);
11716 break;
11717 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011718 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011719 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011720 return( status );
11721}
Jeff Johnson295189b2012-06-20 16:38:30 -070011722eHalStatus
11723csrSendMBGetAssociatedStasReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId,
11724 VOS_MODULE_ID modId, tSirMacAddr bssId,
11725 void *pUsrContext, void *pfnSapEventCallback,
11726 tANI_U8 *pAssocStasBuf )
11727{
11728 eHalStatus status = eHAL_STATUS_SUCCESS;
11729 tSirSmeGetAssocSTAsReq *pMsg;
11730 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
11731 tANI_U32 dwTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011732 do
11733 {
11734 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeGetAssocSTAsReq ) );
11735 if (!HAL_STATUS_SUCCESS(status)) break;
11736 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirSmeGetAssocSTAsReq ) );
11737 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_ASSOC_STAS_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070011738 pBuf = (tANI_U8 *)&pMsg->bssId;
11739 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011740 // bssId
11741 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof(tSirMacAddr) );
11742 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070011743 // modId
11744 dwTmp = pal_cpu_to_be16((tANI_U16)modId);
11745 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U16));
11746 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011747 // pUsrContext
11748 dwTmp = pal_cpu_to_be32((tANI_U32)pUsrContext);
11749 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11750 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011751 // pfnSapEventCallback
11752 dwTmp = pal_cpu_to_be32((tANI_U32)pfnSapEventCallback);
11753 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11754 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011755 // pAssocStasBuf
11756 dwTmp = pal_cpu_to_be32((tANI_U32)pAssocStasBuf);
11757 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11758 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011759 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)));//msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070011760 status = palSendMBMessage( pMac->hHdd, pMsg );
11761 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011762 return( status );
11763 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011764eHalStatus
11765csrSendMBGetWPSPBCSessions( tpAniSirGlobal pMac, tANI_U32 sessionId,
11766 tSirMacAddr bssId, void *pUsrContext, void *pfnSapEventCallback,v_MACADDR_t pRemoveMac)
11767 {
11768 eHalStatus status = eHAL_STATUS_SUCCESS;
11769 tSirSmeGetWPSPBCSessionsReq *pMsg;
11770 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
11771 tANI_U32 dwTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011772 do
11773 {
11774 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirSmeGetWPSPBCSessionsReq) );
11775 if (!HAL_STATUS_SUCCESS(status)) break;
11776 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirSmeGetWPSPBCSessionsReq ) );
11777 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_WPSPBC_SESSION_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070011778 pBuf = (tANI_U8 *)&pMsg->pUsrContext;
11779 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011780 // pUsrContext
11781 dwTmp = pal_cpu_to_be32((tANI_U32)pUsrContext);
11782 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11783 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011784 // pSapEventCallback
11785 dwTmp = pal_cpu_to_be32((tANI_U32)pfnSapEventCallback);
11786 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11787 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011788 // bssId
11789 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof(tSirMacAddr) );
11790 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070011791 // MAC Address of STA in WPS session
11792 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pRemoveMac.bytes, sizeof(v_MACADDR_t));
11793 pBuf += sizeof(v_MACADDR_t);
Jeff Johnson295189b2012-06-20 16:38:30 -070011794 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)));//msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070011795 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011796 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011797 return( status );
11798}
11799#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011800eHalStatus csrSendMBDeauthReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr bssId, tANI_U16 reasonCode )
11801{
11802 eHalStatus status = eHAL_STATUS_SUCCESS;
11803 tSirSmeDeauthReq *pMsg;
11804 tANI_U8 *pBuf;
11805 tANI_U16 wTmp;
11806 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11807 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
11808 return eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070011809 do {
11810 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDeauthReq ));
11811 if ( !HAL_STATUS_SUCCESS(status) ) break;
11812 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDeauthReq ));
11813 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEAUTH_REQ);
11814 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDeauthReq ));
11815 //sessionId
11816 pBuf = &pMsg->sessionId;
11817 *pBuf++ = (tANI_U8)sessionId;
11818
11819 //tansactionId
11820 *pBuf = 0;
11821 *(pBuf + 1 ) = 0;
11822 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011823 if ((pSession->pCurRoamProfile != NULL) && (
11824#ifdef WLAN_SOFTAP_FEATURE
11825 (CSR_IS_INFRA_AP(pSession->pCurRoamProfile)) ||
11826#endif
11827 (CSR_IS_WDS_AP(pSession->pCurRoamProfile)))){
11828 // Set the BSSID before sending the message to LIM
11829 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pSession->selfMacAddr, sizeof( pMsg->peerMacAddr ) );
11830 pBuf = pBuf + sizeof(tSirMacAddr);
11831 }
11832 else
11833 {
11834 // Set the BSSID before sending the message to LIM
11835 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( pMsg->peerMacAddr ) );
11836 pBuf = pBuf + sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070011837 }
11838 if(!HAL_STATUS_SUCCESS(status))
11839 {
11840 palFreeMemory(pMac->hHdd, pMsg);
11841 break;
11842 }
11843 // Set the peer MAC address before sending the message to LIM
11844 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *) pBuf, bssId, sizeof( pMsg->peerMacAddr ) );
11845 pBuf = pBuf + sizeof(tSirMacAddr);
11846 if(!HAL_STATUS_SUCCESS(status))
11847 {
11848 palFreeMemory(pMac->hHdd, pMsg);
11849 break;
11850 }
11851 wTmp = pal_cpu_to_be16(reasonCode);
11852 status = palCopyMemory( pMac->hHdd, pBuf, &wTmp,sizeof( tANI_U16 ) );
11853 if(!HAL_STATUS_SUCCESS(status))
11854 {
11855 palFreeMemory(pMac->hHdd, pMsg);
11856 break;
11857 }
11858 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011859 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011860 return( status );
11861}
11862
Jeff Johnson295189b2012-06-20 16:38:30 -070011863eHalStatus csrSendMBDisassocCnfMsg( tpAniSirGlobal pMac, tpSirSmeDisassocInd pDisassocInd )
11864{
11865 eHalStatus status = eHAL_STATUS_SUCCESS;
11866 tSirSmeDisassocCnf *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -070011867 do {
11868 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDisassocCnf ));
11869 if ( !HAL_STATUS_SUCCESS(status) ) break;
11870 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDisassocCnf ));
11871 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DISASSOC_CNF);
11872 pMsg->statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
11873 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDisassocCnf ));
11874 status = palCopyMemory(pMac->hHdd, pMsg->peerMacAddr, pDisassocInd->peerMacAddr, sizeof(pMsg->peerMacAddr));
11875 if(!HAL_STATUS_SUCCESS(status))
11876 {
11877 palFreeMemory(pMac->hHdd, pMsg);
11878 break;
11879 }
11880//To test reconn
11881 status = palCopyMemory(pMac->hHdd, pMsg->bssId, pDisassocInd->bssId, sizeof(pMsg->peerMacAddr));
11882 if(!HAL_STATUS_SUCCESS(status))
11883 {
11884 palFreeMemory(pMac->hHdd, pMsg);
11885 break;
11886 }
11887//To test reconn ends
Jeff Johnson295189b2012-06-20 16:38:30 -070011888 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011889 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011890 return( status );
11891}
11892
Jeff Johnson295189b2012-06-20 16:38:30 -070011893eHalStatus csrSendMBDeauthCnfMsg( tpAniSirGlobal pMac, tpSirSmeDeauthInd pDeauthInd )
11894{
11895 eHalStatus status = eHAL_STATUS_SUCCESS;
11896 tSirSmeDeauthCnf *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -070011897 do {
11898 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDeauthCnf ));
11899 if ( !HAL_STATUS_SUCCESS(status) ) break;
11900 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDeauthCnf ));
11901 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEAUTH_CNF);
11902 pMsg->statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
11903 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDeauthCnf ));
11904 status = palCopyMemory(pMac->hHdd, pMsg->bssId, pDeauthInd->bssId, sizeof(pMsg->bssId));
11905 if(!HAL_STATUS_SUCCESS(status))
11906 {
11907 palFreeMemory(pMac->hHdd, pMsg);
11908 break;
11909 }
11910 status = palCopyMemory(pMac->hHdd, pMsg->peerMacAddr, pDeauthInd->peerMacAddr, sizeof(pMsg->peerMacAddr));
11911 if(!HAL_STATUS_SUCCESS(status))
11912 {
11913 palFreeMemory(pMac->hHdd, pMsg);
11914 break;
11915 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011916 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011917 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011918 return( status );
11919}
Jeff Johnson295189b2012-06-20 16:38:30 -070011920eHalStatus csrSendAssocCnfMsg( tpAniSirGlobal pMac, tpSirSmeAssocInd pAssocInd, eHalStatus Halstatus )
11921{
11922 eHalStatus status = eHAL_STATUS_SUCCESS;
11923 tSirSmeAssocCnf *pMsg;
11924 tANI_U8 *pBuf;
11925 tSirResultCodes statusCode;
11926 tANI_U16 wTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011927 do {
11928 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeAssocCnf ));
11929 if ( !HAL_STATUS_SUCCESS(status) ) break;
11930 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeAssocCnf ));
11931 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_ASSOC_CNF);
11932 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeAssocCnf ));
Jeff Johnson295189b2012-06-20 16:38:30 -070011933 pBuf = (tANI_U8 *)&pMsg->statusCode;
11934 if(HAL_STATUS_SUCCESS(Halstatus))
11935 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
11936 else
11937 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_ASSOC_REFUSED);
11938 palCopyMemory( pMac->hHdd, pBuf, &statusCode, sizeof(tSirResultCodes) );
11939 pBuf += sizeof(tSirResultCodes);
11940 // bssId
11941 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
11942 pBuf += sizeof (tSirMacAddr);
11943 // peerMacAddr
11944 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
11945 pBuf += sizeof (tSirMacAddr);
11946 // aid
11947 wTmp = pal_cpu_to_be16(pAssocInd->aid);
11948 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11949 pBuf += sizeof (tANI_U16);
11950 // alternateBssId
11951 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
11952 pBuf += sizeof (tSirMacAddr);
11953 // alternateChannelId
11954 *pBuf = 11;
Jeff Johnson295189b2012-06-20 16:38:30 -070011955 status = palSendMBMessage( pMac->hHdd, pMsg );
11956 if(!HAL_STATUS_SUCCESS(status))
11957 {
11958 //pMsg is freed by palSendMBMessage
11959 break;
11960 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011961 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011962 return( status );
11963}
Jeff Johnson295189b2012-06-20 16:38:30 -070011964#ifdef WLAN_SOFTAP_FEATURE
11965eHalStatus csrSendAssocIndToUpperLayerCnfMsg( tpAniSirGlobal pMac,
11966 tpSirSmeAssocInd pAssocInd,
11967 eHalStatus Halstatus,
11968 tANI_U8 sessionId)
11969{
11970 tSirMsgQ msgQ;
11971 eHalStatus status = eHAL_STATUS_SUCCESS;
11972 tSirSmeAssocIndToUpperLayerCnf *pMsg;
11973 tANI_U8 *pBuf;
11974 tSirResultCodes statusCode;
11975 tANI_U16 wTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011976 do {
11977 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeAssocIndToUpperLayerCnf ));
11978 if ( !HAL_STATUS_SUCCESS(status) ) break;
11979 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeAssocIndToUpperLayerCnf ));
Jeff Johnsone7245742012-09-05 17:12:55 -070011980
Jeff Johnson295189b2012-06-20 16:38:30 -070011981 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_UPPER_LAYER_ASSOC_CNF);
11982 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeAssocIndToUpperLayerCnf ));
11983
11984 pMsg->sessionId = sessionId;
11985
11986 pBuf = (tANI_U8 *)&pMsg->statusCode;
11987 if(HAL_STATUS_SUCCESS(Halstatus))
11988 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
11989 else
11990 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_ASSOC_REFUSED);
11991 palCopyMemory( pMac->hHdd, pBuf, &statusCode, sizeof(tSirResultCodes) );
11992 pBuf += sizeof(tSirResultCodes);
11993 // bssId
11994 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
11995 pBuf += sizeof (tSirMacAddr);
11996 // peerMacAddr
11997 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
11998 pBuf += sizeof (tSirMacAddr);
11999 // StaId
12000 wTmp = pal_cpu_to_be16(pAssocInd->staId);
12001 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12002 pBuf += sizeof (tANI_U16);
12003 // alternateBssId
12004 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12005 pBuf += sizeof (tSirMacAddr);
12006 // alternateChannelId
12007 *pBuf = 11;
12008 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012009 // Instead of copying roam Info, we just copy only WmmEnabled , RsnIE information
12010 //Wmm
12011 *pBuf = pAssocInd->wmmEnabledSta;
12012 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012013 //RSN IE
12014 status = palCopyMemory(pMac->hHdd, (tSirRSNie *)pBuf, &pAssocInd->rsnIE, sizeof(tSirRSNie));
12015 pBuf += sizeof (tSirRSNie);
Jeff Johnson295189b2012-06-20 16:38:30 -070012016 //Additional IE
12017 status = palCopyMemory(pMac->hHdd, (void *)pBuf, &pAssocInd->addIE, sizeof(tSirAddie));
12018 pBuf += sizeof (tSirAddie);
Jeff Johnson295189b2012-06-20 16:38:30 -070012019 //reassocReq
12020 *pBuf = pAssocInd->reassocReq;
12021 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012022 msgQ.type = eWNI_SME_UPPER_LAYER_ASSOC_CNF;
12023 msgQ.bodyptr = pMsg;
12024 msgQ.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070012025 SysProcessMmhMsg(pMac, &msgQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012026 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012027 return( status );
12028}
12029#endif
12030
Jeff Johnson295189b2012-06-20 16:38:30 -070012031eHalStatus csrSendMBSetContextReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId ,
12032 tSirMacAddr peerMacAddr, tANI_U8 numKeys, tAniEdType edType,
12033 tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
12034 tANI_U8 keyId, tANI_U8 keyLength, tANI_U8 *pKey, tANI_U8 paeRole,
12035 tANI_U8 *pKeyRsc )
12036{
12037 tSirSmeSetContextReq *pMsg;
12038 tANI_U16 msgLen;
12039 eHalStatus status = eHAL_STATUS_FAILURE;
12040 tAniEdType tmpEdType;
12041 tAniKeyDirection tmpDirection;
12042 tANI_U8 *pBuf;
12043 tANI_U8 *p;
12044 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012045 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012046 if( ( 1 != numKeys ) && ( 0 != numKeys ) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012047 // all of these fields appear in every SET_CONTEXT message. Below we'll add in the size for each
12048 // key set. Since we only support upto one key, we always allocate memory for 1 key
12049 msgLen = sizeof( tANI_U16) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) +
12050 sizeof( tSirMacAddr ) + 1 + sizeof(tANI_U16) +
12051 sizeof( pMsg->keyMaterial.length ) + sizeof( pMsg->keyMaterial.edType ) + sizeof( pMsg->keyMaterial.numKeys ) +
12052 ( sizeof( pMsg->keyMaterial.key ) );
12053
12054 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12055 if ( !HAL_STATUS_SUCCESS(status) ) break;
12056 palZeroMemory(pMac->hHdd, pMsg, msgLen);
12057 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SETCONTEXT_REQ);
12058 pMsg->length = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012059 //sessionId
12060 pBuf = &pMsg->sessionId;
12061 *pBuf = (tANI_U8)sessionId;
12062 pBuf++;
12063 // transactionId
12064 *pBuf = 0;
12065 *(pBuf + 1) = 0;
12066 pBuf += sizeof(tANI_U16);
12067 // peerMacAddr
12068 palCopyMemory( pMac->hHdd, pBuf,
12069 (tANI_U8 *)peerMacAddr, sizeof(tSirMacAddr) );
12070
12071 pBuf += sizeof(tSirMacAddr);
12072
12073 // bssId
12074 palCopyMemory( pMac->hHdd, pBuf,
12075 (tANI_U8 *)&pSession->connectedProfile.bssid, sizeof(tSirMacAddr) );
12076
12077 pBuf += sizeof(tSirMacAddr);
12078
12079 p = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012080 // Set the pMsg->keyMaterial.length field (this length is defined as all data that follows the edType field
12081 // in the tSirKeyMaterial keyMaterial; field).
12082 //
12083 // !!NOTE: This keyMaterial.length contains the length of a MAX size key, though the keyLength can be
12084 // shorter than this max size. Is LIM interpreting this ok ?
12085 p = pal_set_U16( p, pal_cpu_to_be16((tANI_U16)( sizeof( pMsg->keyMaterial.numKeys ) + ( numKeys * sizeof( pMsg->keyMaterial.key ) ) )) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012086 // set pMsg->keyMaterial.edType
12087 tmpEdType = (tAniEdType)pal_cpu_to_be32(edType);
12088 palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpEdType, sizeof(tAniEdType) );
12089 p += sizeof( pMsg->keyMaterial.edType );
Jeff Johnson295189b2012-06-20 16:38:30 -070012090 // set the pMsg->keyMaterial.numKeys field
12091 *p = numKeys;
12092 p += sizeof( pMsg->keyMaterial.numKeys );
Jeff Johnson295189b2012-06-20 16:38:30 -070012093 // set pSirKey->keyId = keyId;
12094 *p = keyId;
12095 p += sizeof( pMsg->keyMaterial.key[ 0 ].keyId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012096 // set pSirKey->unicast = (tANI_U8)fUnicast;
12097 *p = (tANI_U8)fUnicast;
12098 p += sizeof( pMsg->keyMaterial.key[ 0 ].unicast );
Jeff Johnson295189b2012-06-20 16:38:30 -070012099 // set pSirKey->keyDirection = aniKeyDirection;
12100 tmpDirection = (tAniKeyDirection)pal_cpu_to_be32(aniKeyDirection);
12101 palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpDirection, sizeof(tAniKeyDirection) );
12102 p += sizeof(tAniKeyDirection);
12103 // pSirKey->keyRsc = ;;
12104 palCopyMemory( pMac->hHdd, p, pKeyRsc, CSR_MAX_RSC_LEN );
12105 p += sizeof( pMsg->keyMaterial.key[ 0 ].keyRsc );
Jeff Johnson295189b2012-06-20 16:38:30 -070012106 // set pSirKey->paeRole
12107 *p = paeRole; // 0 is Supplicant
12108 p++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012109 // set pSirKey->keyLength = keyLength;
12110 p = pal_set_U16( p, pal_cpu_to_be16(keyLength) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012111 if ( keyLength && pKey )
12112 {
12113 palCopyMemory( pMac->hHdd, p, pKey, keyLength );
12114 if(keyLength == 16)
12115 {
Madan Mohan Koyyalamudi8bdd3112012-09-24 13:55:14 -070012116 smsLog(pMac, LOG1, " SME Set keyIdx (%d) encType(%d) key = %02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X\n",
Jeff Johnson295189b2012-06-20 16:38:30 -070012117 keyId, edType, pKey[0], pKey[1], pKey[2], pKey[3], pKey[4],
12118 pKey[5], pKey[6], pKey[7], pKey[8],
12119 pKey[9], pKey[10], pKey[11], pKey[12], pKey[13], pKey[14], pKey[15]);
12120 }
12121 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012122 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012123 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012124 return( status );
12125}
12126
Jeff Johnson295189b2012-06-20 16:38:30 -070012127eHalStatus csrSendMBStartBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamBssType bssType,
12128 tCsrRoamStartBssParams *pParam, tSirBssDescription *pBssDesc )
12129{
12130 eHalStatus status;
12131 tSirSmeStartBssReq *pMsg;
12132 tANI_U8 *pBuf = NULL;
12133 tANI_U8 *wTmpBuf = NULL;
12134 tANI_U16 msgLen, wTmp;
12135 tANI_U32 dwTmp;
12136 tSirNwType nwType;
Jeff Johnsone7245742012-09-05 17:12:55 -070012137 ePhyChanBondState cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -070012138#ifdef WLAN_SOFTAP_FEATURE
12139 tANI_U32 authType;
12140#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070012141 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070012142
12143 if(!pSession)
12144 {
12145 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12146 return eHAL_STATUS_FAILURE;
12147 }
12148
Jeff Johnson295189b2012-06-20 16:38:30 -070012149 do {
12150 pSession->joinFailStatusCode.statusCode = eSIR_SME_SUCCESS;
12151 pSession->joinFailStatusCode.reasonCode = 0;
12152 msgLen = sizeof(tSirSmeStartBssReq);
12153 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12154 if ( !HAL_STATUS_SUCCESS(status) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012155 palZeroMemory(pMac->hHdd, pMsg, msgLen);
12156 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_START_BSS_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012157 pBuf = &pMsg->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070012158 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012159 //sessionId
12160 *pBuf = (tANI_U8)sessionId;
12161 pBuf++;
12162 // transactionId
12163 *pBuf = 0;
12164 *(pBuf + 1) = 0;
12165 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012166 // bssid
12167 palCopyMemory( pMac->hHdd, pBuf, pParam->bssid, sizeof(tSirMacAddr) );
12168 pBuf += sizeof(tSirMacAddr);
12169 // selfMacAddr
12170 palCopyMemory( pMac->hHdd, pBuf, pSession->selfMacAddr, sizeof(tSirMacAddr) );
12171 pBuf += sizeof(tSirMacAddr);
12172 // beaconInterval
12173 if( pBssDesc && pBssDesc->beaconInterval )
12174 {
12175 wTmp = pal_cpu_to_be16( pBssDesc->beaconInterval );
12176 }
12177#ifdef WLAN_SOFTAP_FEATURE
12178 else if(pParam->beaconInterval)
12179 {
12180 wTmp = pal_cpu_to_be16( pParam->beaconInterval );
12181 }
12182#endif
12183 else
12184 {
12185 wTmp = pal_cpu_to_be16( WNI_CFG_BEACON_INTERVAL_STADEF );
12186 }
Jeff Johnsone7245742012-09-05 17:12:55 -070012187 if(csrIsconcurrentsessionValid (pMac, sessionId,
12188 pParam->bssPersona)
12189 == eHAL_STATUS_SUCCESS )
12190 {
12191 csrValidateBeaconInterval(pMac, pParam->operationChn, &wTmp, sessionId,
12192 pParam->bssPersona);
12193 //Update the beacon Interval
12194 pParam->beaconInterval = wTmp;
12195 }
12196 else
12197 {
12198 smsLog( pMac,LOGE, FL("****Start BSS failed persona already exists***\n"));
12199 status = eHAL_STATUS_FAILURE;
12200 return status;
12201 }
12202
Jeff Johnson295189b2012-06-20 16:38:30 -070012203 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof( tANI_U16 ) );
12204 pBuf += sizeof(tANI_U16);
12205 // dot11mode
12206 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pParam->uCfgDot11Mode );
12207 pBuf += 1;
12208 // bssType
12209 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( bssType ) );
12210 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
12211 pBuf += sizeof(tSirBssType);
12212 // ssId
12213 if( pParam->ssId.length )
12214 {
12215 // ssId len
12216 *pBuf = pParam->ssId.length;
12217 pBuf++;
12218 palCopyMemory( pMac->hHdd, pBuf, pParam->ssId.ssId, pParam->ssId.length );
12219 pBuf += pParam->ssId.length;
12220 }
12221 else
12222 {
12223 *pBuf = 0;
12224 pBuf++;
12225 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012226 // set the channel Id
12227 *pBuf = pParam->operationChn;
12228 pBuf++;
12229 //What should we really do for the cbmode.
Jeff Johnsone7245742012-09-05 17:12:55 -070012230 cbMode = (ePhyChanBondState)pal_cpu_to_be32(pParam->cbMode);
12231 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&cbMode, sizeof(ePhyChanBondState) );
12232 pBuf += sizeof(ePhyChanBondState);
Jeff Johnson295189b2012-06-20 16:38:30 -070012233
12234#ifdef WLAN_SOFTAP_FEATURE
12235 // Set privacy
12236 *pBuf = pParam->privacy;
12237 pBuf++;
12238
12239 //Set Uapsd
12240 *pBuf = pParam->ApUapsdEnable;
12241 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012242 //Set SSID hidden
12243 *pBuf = pParam->ssidHidden;
12244 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012245 *pBuf = (tANI_U8)pParam->fwdWPSPBCProbeReq;
12246 pBuf++;
12247
12248 //Ht protection Enable/Disable
12249 *pBuf = (tANI_U8)pParam->protEnabled;
12250 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012251 //Enable Beacons to Receive for OBSS protection Enable/Disable
12252 *pBuf = (tANI_U8)pParam->obssProtEnabled;
12253 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012254 //set cfg related to protection
12255 wTmp = pal_cpu_to_be16( pParam->ht_protection );
12256 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof( tANI_U16 ) );
12257 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012258 // Set Auth type
12259 authType = pal_cpu_to_be32(pParam->authType);
12260 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&authType, sizeof(tANI_U32));
12261 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012262 // Set DTIM
12263 dwTmp = pal_cpu_to_be32(pParam->dtimPeriod);
12264 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
12265 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012266 // Set wps_state
12267 *pBuf = pParam->wps_state;
12268 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012269#endif
12270 //Persona
12271 *pBuf = (tANI_U8)pParam->bssPersona;
12272 pBuf++;
12273
Jeff Johnsone7245742012-09-05 17:12:55 -070012274
Jeff Johnson295189b2012-06-20 16:38:30 -070012275
12276 // set RSN IE
12277 if( pParam->nRSNIELength > sizeof(pMsg->rsnIE.rsnIEdata) )
12278 {
12279 status = eHAL_STATUS_INVALID_PARAMETER;
12280 palFreeMemory( pMac->hHdd, pMsg );
12281 break;
12282 }
12283 wTmp = pal_cpu_to_be16( pParam->nRSNIELength );
12284 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12285 pBuf += sizeof(tANI_U16);
12286 if( wTmp )
12287 {
12288 wTmp = pParam->nRSNIELength;
12289 palCopyMemory( pMac->hHdd, pBuf, pParam->pRSNIE, wTmp );
12290 pBuf += wTmp;
12291 }
12292 nwType = (tSirNwType)pal_cpu_to_be32(pParam->sirNwType);
12293 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&nwType, sizeof(tSirNwType) );
12294 pBuf += sizeof(tSirNwType);
Jeff Johnson295189b2012-06-20 16:38:30 -070012295 *pBuf = pParam->operationalRateSet.numRates; //tSirMacRateSet->numRates
12296 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012297 palCopyMemory( pMac->hHdd, pBuf, pParam->operationalRateSet.rate, pParam->operationalRateSet.numRates );
12298 pBuf += pParam->operationalRateSet.numRates ;
12299 *pBuf++ = pParam->extendedRateSet.numRates;
12300 if(0 != pParam->extendedRateSet.numRates)
12301 {
12302 palCopyMemory( pMac->hHdd, pBuf, pParam->extendedRateSet.rate, pParam->extendedRateSet.numRates );
12303 pBuf += pParam->extendedRateSet.numRates;
12304 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012305 msgLen = (tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)); //msg_header + msg
12306 pMsg->length = pal_cpu_to_be16(msgLen);
12307
12308 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012309 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012310 return( status );
12311}
12312
Jeff Johnson295189b2012-06-20 16:38:30 -070012313eHalStatus csrSendMBStopBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId )
12314{
12315 eHalStatus status = eHAL_STATUS_FAILURE;
12316 tSirSmeStopBssReq *pMsg;
12317 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
12318 tANI_U8 *pBuf;
12319 tANI_U16 msgLen;
Jeff Johnson32d95a32012-09-10 13:15:23 -070012320
12321 if(!pSession)
12322 {
12323 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12324 return eHAL_STATUS_FAILURE;
12325 }
12326
Jeff Johnson295189b2012-06-20 16:38:30 -070012327 do {
12328 status = palAllocateMemory(pMac, (void **)&pMsg, sizeof(tSirSmeStopBssReq));
12329 if ( !HAL_STATUS_SUCCESS(status) ) break;
12330 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeStopBssReq ));
12331 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_STOP_BSS_REQ);
12332 pBuf = &pMsg->sessionId;
12333 //sessionId
12334 *pBuf = (tANI_U8)sessionId;
12335 pBuf++;
12336 // transactionId
12337 *pBuf = 0;
12338 pBuf += sizeof(tANI_U16);
12339 //reason code
12340 *pBuf = 0;
12341 pBuf += sizeof(tSirResultCodes);
12342 // bssid
12343 // if BSSType is WDS sta, use selfmacAddr as bssid, else use bssid in connectedProfile
12344 if( CSR_IS_CONN_WDS_STA(&pSession->connectedProfile) )
12345 {
12346 palCopyMemory( pMac->hHdd, pBuf,(tANI_U8 *)&pSession->selfMacAddr, sizeof(tSirMacAddr) );
12347 }
12348 else
12349 {
12350 palCopyMemory( pMac->hHdd, pBuf,(tANI_U8 *)&pSession->connectedProfile.bssid, sizeof(tSirMacAddr) );
12351 }
12352 pBuf += sizeof(tSirMacAddr);
12353 msgLen = sizeof(tANI_U16) + sizeof(tANI_U16) + 1 + sizeof(tANI_U16) + sizeof(tSirResultCodes) + sizeof(tSirMacAddr);
12354 pMsg->length = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012355 status = palSendMBMessage( pMac->hHdd, pMsg );
12356#if 0
12357 status = palAllocateMemory(pMac, (void **)&pMsg, sizeof(tSirSmeStopBssReq));
12358 if ( !HAL_STATUS_SUCCESS(status) ) break;
12359 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeStopBssReq ));
12360 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_STOP_BSS_REQ);
12361 pMsg->reasonCode = 0;
12362 // bssid
12363 // if BSSType is WDS sta, use selfmacAddr as bssid, else use bssid in connectedProfile
12364 if( CSR_IS_CONN_WDS_STA(&pSession->connectedProfile) )
12365 {
12366 pbBssid = (tANI_U8 *)&pSession->selfMacAddr;
12367 }
12368 else
12369 {
12370 pbBssid = (tANI_U8 *)&pSession->connectedProfile.bssid;
12371 }
12372 palCopyMemory( pMac->hHdd, &pMsg->bssId, pbBssid, sizeof(tSirMacAddr) );
12373 pMsg->transactionId = 0;
12374 pMsg->sessionId = (tANI_U8)sessionId;
12375 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeStopBssReq ));
12376 status = palSendMBMessage( pMac->hHdd, pMsg );
12377#endif
12378 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012379 return( status );
12380}
12381
Jeff Johnson295189b2012-06-20 16:38:30 -070012382eHalStatus csrReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId,
12383 tCsrRoamModifyProfileFields *pModProfileFields,
12384 tANI_U32 *pRoamId, v_BOOL_t fForce)
12385{
Jeff Johnson295189b2012-06-20 16:38:30 -070012386 eHalStatus status = eHAL_STATUS_FAILURE;
12387 tANI_U32 roamId = 0;
12388 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012389 if((csrIsConnStateConnected(pMac, sessionId)) &&
12390 (fForce || (!palEqualMemory(pMac->hHdd, &pModProfileFields,
12391 &pSession->connectedProfile.modifyProfileFields,
12392 sizeof(tCsrRoamModifyProfileFields)))) )
12393 {
12394 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
12395 if(pRoamId)
12396 {
12397 *pRoamId = roamId;
12398 }
12399
Jeff Johnson295189b2012-06-20 16:38:30 -070012400 status = csrRoamIssueReassoc(pMac, sessionId, NULL, pModProfileFields,
12401 eCsrSmeIssuedReassocToSameAP, roamId,
12402 eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -070012403 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012404 return status;
12405}
Jeff Johnson295189b2012-06-20 16:38:30 -070012406static eHalStatus csrRoamSessionOpened(tpAniSirGlobal pMac, tANI_U32 sessionId)
12407{
12408 eHalStatus status = eHAL_STATUS_SUCCESS;
12409 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -070012410 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
12411 status = csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
12412 eCSR_ROAM_SESSION_OPENED, eCSR_ROAM_RESULT_NONE);
12413 return (status);
12414}
Jeff Johnson295189b2012-06-20 16:38:30 -070012415eHalStatus csrProcessAddStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg)
12416{
12417 eHalStatus status = eHAL_STATUS_SUCCESS;
12418 tListElem *pEntry = NULL;
12419 tSmeCmd *pCommand = NULL;
12420 tSirSmeAddStaSelfRsp *pRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012421 do
12422 {
12423 if(pMsg == NULL)
12424 {
12425 smsLog(pMac, LOGE, "in %s msg ptr is NULL\n", __FUNCTION__);
12426 status = eHAL_STATUS_FAILURE;
12427 break;
12428 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012429 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
12430 if(pEntry)
12431 {
12432 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12433 if(eSmeCommandAddStaSession == pCommand->command)
12434 {
12435 pRsp = (tSirSmeAddStaSelfRsp*)pMsg;
12436 smsLog( pMac, LOG1, "Add Sta rsp status = %d\n", pRsp->status );
12437 //Nothing to be done. May be indicate the self sta addition success by calling session callback (TODO).
Jeff Johnson295189b2012-06-20 16:38:30 -070012438 csrRoamSessionOpened(pMac, pCommand->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -070012439 //Remove this command out of the active list
12440 if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK))
12441 {
12442 //Now put this command back on the avilable command list
12443 csrReleaseCommand(pMac, pCommand);
12444 }
12445 smeProcessPendingQueue( pMac );
12446 }
12447 else
12448 {
12449 smsLog(pMac, LOGE, "in %s eWNI_SME_ADD_STA_SELF_RSP Received but NO Add sta session command are ACTIVE ...\n",
12450 __FUNCTION__);
12451 status = eHAL_STATUS_FAILURE;
12452 break;
12453 }
12454 }
12455 else
12456 {
12457 smsLog(pMac, LOGE, "in %s eWNI_SME_ADD_STA_SELF_RSP Received but NO commands are ACTIVE ...\n",
12458 __FUNCTION__);
12459 status = eHAL_STATUS_FAILURE;
12460 break;
12461 }
12462 } while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -070012463 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -070012464}
Jeff Johnson295189b2012-06-20 16:38:30 -070012465eHalStatus csrSendMBAddSelfStaReqMsg( tpAniSirGlobal pMac, tSirMacAddr macAddr )
12466{
12467 tSirSmeAddStaSelfReq *pMsg;
12468 tANI_U16 msgLen;
12469 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012470 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012471 msgLen = sizeof( tANI_U16 ) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) /*+
12472 sizeof( tSirBssType )*/;
Jeff Johnson295189b2012-06-20 16:38:30 -070012473 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12474 if ( !HAL_STATUS_SUCCESS(status) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012475 palZeroMemory(pMac->hHdd, pMsg, msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012476 pMsg->mesgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_ADD_STA_SELF_REQ);
12477 pMsg->mesgLen = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012478 // self station address
12479 palCopyMemory( pMac->hHdd, (tANI_U8 *)pMsg->selfMacAddr, (tANI_U8 *)macAddr, sizeof(tSirMacAddr) );
Madan Mohan Koyyalamudi8bdd3112012-09-24 13:55:14 -070012480 smsLog( pMac, LOG1, FL("selfMac=%02x, %02x, %02x, %02x, %02x, %02x"),
Jeff Johnson295189b2012-06-20 16:38:30 -070012481 pMsg->selfMacAddr[0],
12482 pMsg->selfMacAddr[1],
12483 pMsg->selfMacAddr[2],
12484 pMsg->selfMacAddr[3],
12485 pMsg->selfMacAddr[4],
12486 pMsg->selfMacAddr[5]);
12487 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012488 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012489 return( status );
12490}
Jeff Johnson295189b2012-06-20 16:38:30 -070012491eHalStatus csrIssueAddStaForSessionReq(tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr sessionMacAddr)
12492{
12493 eHalStatus status = eHAL_STATUS_SUCCESS;
12494 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -070012495 pCommand = csrGetCommandBuffer(pMac);
12496 if(NULL == pCommand)
12497 {
12498 status = eHAL_STATUS_RESOURCES;
12499 }
12500 else
12501 {
12502 pCommand->command = eSmeCommandAddStaSession;
12503 pCommand->sessionId = (tANI_U8)sessionId;
12504 palCopyMemory( pMac->hHdd, pCommand->u.addStaSessionCmd.selfMacAddr, sessionMacAddr, sizeof( tSirMacAddr ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012505 status = csrQueueSmeCommand(pMac, pCommand, TRUE);
12506 if( !HAL_STATUS_SUCCESS( status ) )
12507 {
12508 //Should be panic??
12509 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
12510 }
12511 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012512 return (status);
12513}
Jeff Johnson295189b2012-06-20 16:38:30 -070012514eHalStatus csrProcessAddStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
12515{
12516 return csrSendMBAddSelfStaReqMsg( pMac,
12517 pCommand->u.addStaSessionCmd.selfMacAddr );
12518}
Jeff Johnson295189b2012-06-20 16:38:30 -070012519eHalStatus csrRoamOpenSession( tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext,
12520 tANI_U8 *pSelfMacAddr, tANI_U8 *pbSessionId )
12521{
12522 eHalStatus status = eHAL_STATUS_SUCCESS;
12523 tANI_U32 i;
12524 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070012525 *pbSessionId = CSR_SESSION_ID_INVALID;
12526 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
12527 {
12528 if( !CSR_IS_SESSION_VALID( pMac, i ) )
12529 {
12530 pSession = CSR_GET_SESSION( pMac, i );
12531 status = eHAL_STATUS_SUCCESS;
12532 pSession->sessionActive = eANI_BOOLEAN_TRUE;
12533 pSession->sessionId = (tANI_U8)i;
12534 pSession->callback = callback;
12535 pSession->pContext = pContext;
12536 palCopyMemory( pMac->hHdd, &pSession->selfMacAddr, pSelfMacAddr, sizeof(tCsrBssid) );
12537 *pbSessionId = (tANI_U8)i;
Jeff Johnson295189b2012-06-20 16:38:30 -070012538 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerRoaming, csrRoamRoamingTimerHandler,
12539 &pSession->roamingTimerInfo);
12540 if(!HAL_STATUS_SUCCESS(status))
12541 {
12542 smsLog(pMac, LOGE, FL("cannot allocate memory for Roaming timer\n"));
12543 break;
12544 }
12545#ifdef FEATURE_WLAN_BTAMP_UT_RF
12546 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerJoinRetry, csrRoamJoinRetryTimerHandler,
12547 &pSession->joinRetryTimerInfo);
12548 if(!HAL_STATUS_SUCCESS(status))
12549 {
12550 smsLog(pMac, LOGE, FL("cannot allocate memory for joinretry timer\n"));
12551 break;
12552 }
12553#endif
12554 pSession->ibssJoinTimerInfo.pMac = pMac;
12555 pSession->ibssJoinTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
Jeff Johnson295189b2012-06-20 16:38:30 -070012556 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerIbssJoining, csrRoamIbssJoinTimerHandler,
12557 &pSession->ibssJoinTimerInfo);
12558 if(!HAL_STATUS_SUCCESS(status))
12559 {
12560 smsLog(pMac, LOGE, FL("cannot allocate memory for IbssJoining timer\n"));
12561 break;
12562 }
12563 status = csrIssueAddStaForSessionReq ( pMac, i, pSelfMacAddr );
12564 break;
12565 }
12566 }
12567 if( CSR_ROAM_SESSION_MAX == i )
12568 {
12569 //No session is available
12570 status = eHAL_STATUS_RESOURCES;
12571 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012572 return ( status );
12573}
Jeff Johnson295189b2012-06-20 16:38:30 -070012574eHalStatus csrProcessDelStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg)
12575{
12576 eHalStatus status = eHAL_STATUS_SUCCESS;
12577 tListElem *pEntry = NULL;
12578 tSmeCmd *pCommand = NULL;
12579 tSirSmeDelStaSelfRsp *pRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012580 do
12581 {
12582 if(pMsg == NULL)
12583 {
12584 smsLog(pMac, LOGE, "in %s msg ptr is NULL\n", __FUNCTION__);
12585 status = eHAL_STATUS_FAILURE;
12586 break;
12587 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012588 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
12589 if(pEntry)
12590 {
12591 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12592 if(eSmeCommandDelStaSession == pCommand->command)
12593 {
12594 tANI_U8 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070012595 pRsp = (tSirSmeDelStaSelfRsp*)pMsg;
12596 smsLog( pMac, LOG1, "Del Sta rsp status = %d\n", pRsp->status );
Jeff Johnson295189b2012-06-20 16:38:30 -070012597 //This session is done.
12598 csrCleanupSession(pMac, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -070012599 if(pCommand->u.delStaSessionCmd.callback)
12600 {
12601
12602 status = sme_ReleaseGlobalLock( &pMac->sme );
12603 if ( HAL_STATUS_SUCCESS( status ) )
12604 {
12605 pCommand->u.delStaSessionCmd.callback(
12606 pCommand->u.delStaSessionCmd.pContext);
12607 status = sme_AcquireGlobalLock( &pMac->sme );
12608 if (! HAL_STATUS_SUCCESS( status ) )
12609 {
12610 smsLog(pMac, LOGP, "%s: Failed to Acquire Lock\n", __FUNCTION__);
12611 return status;
12612 }
12613 }
12614 else {
12615 smsLog(pMac, LOGE, "%s: Failed to Release Lock\n", __FUNCTION__);
12616 }
12617 }
12618
12619 //Remove this command out of the active list
12620 if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK))
12621 {
12622 //Now put this command back on the avilable command list
12623 csrReleaseCommand(pMac, pCommand);
12624 }
12625 smeProcessPendingQueue( pMac );
12626 }
12627 else
12628 {
12629 smsLog(pMac, LOGE, "in %s eWNI_SME_DEL_STA_SELF_RSP Received but NO Del sta session command are ACTIVE ...\n",
12630 __FUNCTION__);
12631 status = eHAL_STATUS_FAILURE;
12632 break;
12633 }
12634 }
12635 else
12636 {
12637 smsLog(pMac, LOGE, "in %s eWNI_SME_DEL_STA_SELF_RSP Received but NO commands are ACTIVE ...\n",
12638 __FUNCTION__);
12639 status = eHAL_STATUS_FAILURE;
12640 break;
12641 }
12642 } while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -070012643 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -070012644}
Jeff Johnson295189b2012-06-20 16:38:30 -070012645eHalStatus csrSendMBDelSelfStaReqMsg( tpAniSirGlobal pMac, tSirMacAddr macAddr )
12646{
12647 tSirSmeDelStaSelfReq *pMsg;
12648 tANI_U16 msgLen;
12649 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012650 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012651 msgLen = sizeof( tANI_U16 ) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) /*+
12652 sizeof( tSirBssType )*/;
Jeff Johnson295189b2012-06-20 16:38:30 -070012653 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12654 if ( !HAL_STATUS_SUCCESS(status) ) break;
12655
12656 palZeroMemory(pMac->hHdd, pMsg, msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012657 pMsg->mesgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEL_STA_SELF_REQ);
12658 pMsg->mesgLen = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012659 // self station address
12660 palCopyMemory( pMac->hHdd, (tANI_U8 *)pMsg->selfMacAddr, (tANI_U8 *)macAddr, sizeof(tSirMacAddr) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012661 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012662 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012663 return( status );
12664}
Jeff Johnson295189b2012-06-20 16:38:30 -070012665eHalStatus csrIssueDelStaForSessionReq(tpAniSirGlobal pMac, tANI_U32 sessionId,
12666 tSirMacAddr sessionMacAddr,
12667 csrRoamSessionCloseCallback callback,
12668 void *pContext)
12669{
12670 eHalStatus status = eHAL_STATUS_SUCCESS;
12671 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -070012672 pCommand = csrGetCommandBuffer(pMac);
12673 if(NULL == pCommand)
12674 {
12675 status = eHAL_STATUS_RESOURCES;
12676 }
12677 else
12678 {
12679 pCommand->command = eSmeCommandDelStaSession;
12680 pCommand->sessionId = (tANI_U8)sessionId;
12681 pCommand->u.delStaSessionCmd.callback = callback;
12682 pCommand->u.delStaSessionCmd.pContext = pContext;
12683 palCopyMemory( pMac->hHdd, pCommand->u.delStaSessionCmd.selfMacAddr, sessionMacAddr, sizeof( tSirMacAddr ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012684 status = csrQueueSmeCommand(pMac, pCommand, TRUE);
12685 if( !HAL_STATUS_SUCCESS( status ) )
12686 {
12687 //Should be panic??
12688 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
12689 }
12690 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012691 return (status);
12692}
Jeff Johnson295189b2012-06-20 16:38:30 -070012693eHalStatus csrProcessDelStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
12694{
12695 return csrSendMBDelSelfStaReqMsg( pMac,
12696 pCommand->u.delStaSessionCmd.selfMacAddr );
12697}
Jeff Johnson295189b2012-06-20 16:38:30 -070012698static void purgeCsrSessionCmdList(tpAniSirGlobal pMac, tANI_U32 sessionId)
12699{
12700 tDblLinkList *pList = &pMac->roam.roamCmdPendingList;
12701 tListElem *pEntry, *pNext;
12702 tSmeCmd *pCommand;
12703 tDblLinkList localList;
12704
12705 vos_mem_zero(&localList, sizeof(tDblLinkList));
12706 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &localList)))
12707 {
12708 smsLog(pMac, LOGE, FL(" failed to open list"));
12709 return;
12710 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012711 csrLLLock(pList);
12712 pEntry = csrLLPeekHead(pList, LL_ACCESS_NOLOCK);
12713 while(pEntry != NULL)
12714 {
12715 pNext = csrLLNext(pList, pEntry, LL_ACCESS_NOLOCK);
12716 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12717 if(pCommand->sessionId == sessionId)
12718 {
12719 if(csrLLRemoveEntry(pList, pEntry, LL_ACCESS_NOLOCK))
12720 {
12721 csrLLInsertTail(&localList, pEntry, LL_ACCESS_NOLOCK);
12722 }
12723 }
12724 pEntry = pNext;
12725 }
12726 csrLLUnlock(pList);
12727
12728 while( (pEntry = csrLLRemoveHead(&localList, LL_ACCESS_NOLOCK)) )
12729 {
12730 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12731 csrAbortCommand(pMac, pCommand, eANI_BOOLEAN_TRUE);
12732 }
12733 csrLLClose(&localList);
12734}
12735
Jeff Johnson295189b2012-06-20 16:38:30 -070012736void csrCleanupSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
12737{
12738 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
12739 {
12740 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012741 csrRoamStop(pMac, sessionId);
12742 csrFreeConnectBssDesc(pMac, sessionId);
12743 csrRoamFreeConnectProfile( pMac, &pSession->connectedProfile );
12744 csrRoamFreeConnectedInfo ( pMac, &pSession->connectedInfo);
12745 palTimerFree(pMac->hHdd, pSession->hTimerRoaming);
12746#ifdef FEATURE_WLAN_BTAMP_UT_RF
12747 palTimerFree(pMac->hHdd, pSession->hTimerJoinRetry);
12748#endif
12749 palTimerFree(pMac->hHdd, pSession->hTimerIbssJoining);
12750 purgeSmeSessionCmdList(pMac, sessionId);
12751 purgeCsrSessionCmdList(pMac, sessionId);
12752 csrInitSession(pMac, sessionId);
12753 }
12754}
12755
Jeff Johnson295189b2012-06-20 16:38:30 -070012756eHalStatus csrRoamCloseSession( tpAniSirGlobal pMac, tANI_U32 sessionId,
12757 tANI_BOOLEAN fSync,
12758 csrRoamSessionCloseCallback callback,
12759 void *pContext )
12760{
12761 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -070012762 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
12763 {
12764 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
12765 if(fSync)
12766 {
12767 csrCleanupSession(pMac, sessionId);
12768 }
12769 else
12770 {
12771 purgeSmeSessionCmdList(pMac, sessionId);
12772 purgeCsrSessionCmdList(pMac, sessionId);
12773 status = csrIssueDelStaForSessionReq( pMac, sessionId,
12774 pSession->selfMacAddr, callback, pContext);
12775 }
12776 }
12777 else
12778 {
12779 status = eHAL_STATUS_INVALID_PARAMETER;
12780 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012781 return ( status );
12782}
12783
Jeff Johnson295189b2012-06-20 16:38:30 -070012784static void csrInitSession( tpAniSirGlobal pMac, tANI_U32 sessionId )
12785{
12786 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070012787
12788 if(!pSession)
12789 {
12790 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12791 return;
12792 }
12793
Jeff Johnson295189b2012-06-20 16:38:30 -070012794 pSession->sessionActive = eANI_BOOLEAN_FALSE;
12795 pSession->sessionId = CSR_SESSION_ID_INVALID;
12796 pSession->callback = NULL;
12797 pSession->pContext = NULL;
12798 pSession->ibss_join_pending = FALSE;
12799 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
12800 // TODO : Confirm pMac->roam.fReadyForPowerSave = eANI_BOOLEAN_FALSE;
12801 csrFreeRoamProfile( pMac, sessionId );
12802 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
12803 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
12804 csrFreeConnectBssDesc(pMac, sessionId);
12805 csrScanEnable(pMac);
12806 palZeroMemory( pMac->hHdd, &pSession->selfMacAddr, sizeof(tCsrBssid) );
12807 if(pSession->pWpaRsnReqIE)
12808 {
12809 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
12810 pSession->pWpaRsnReqIE = NULL;
12811 }
12812 pSession->nWpaRsnReqIeLength = 0;
12813 if(pSession->pWpaRsnRspIE)
12814 {
12815 palFreeMemory(pMac->hHdd, pSession->pWpaRsnRspIE);
12816 pSession->pWpaRsnRspIE = NULL;
12817 }
12818 pSession->nWpaRsnRspIeLength = 0;
12819#ifdef FEATURE_WLAN_WAPI
12820 if(pSession->pWapiReqIE)
12821 {
12822 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
12823 pSession->pWapiReqIE = NULL;
12824 }
12825 pSession->nWapiReqIeLength = 0;
12826 if(pSession->pWapiRspIE)
12827 {
12828 palFreeMemory(pMac->hHdd, pSession->pWapiRspIE);
12829 pSession->pWapiRspIE = NULL;
12830 }
12831 pSession->nWapiRspIeLength = 0;
12832#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070012833 if(pSession->pAddIEScan)
12834 {
12835 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
12836 pSession->pAddIEScan = NULL;
12837 }
12838 pSession->nAddIEScanLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070012839 if(pSession->pAddIEAssoc)
12840 {
12841 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
12842 pSession->pAddIEAssoc = NULL;
12843}
12844 pSession->nAddIEAssocLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070012845}
12846
Jeff Johnson295189b2012-06-20 16:38:30 -070012847eHalStatus csrRoamGetSessionIdFromBSSID( tpAniSirGlobal pMac, tCsrBssid *bssid, tANI_U32 *pSessionId )
12848{
12849 eHalStatus status = eHAL_STATUS_FAILURE;
12850 tANI_U32 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070012851 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
12852 {
12853 if( CSR_IS_SESSION_VALID( pMac, i ) )
12854 {
12855 if( csrIsMacAddressEqual( pMac, bssid, &pMac->roam.roamSession[i].connectedProfile.bssid ) )
12856 {
12857 //Found it
12858 status = eHAL_STATUS_SUCCESS;
12859 *pSessionId = i;
12860 break;
12861 }
12862 }
12863 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012864 return( status );
12865}
12866
Jeff Johnson295189b2012-06-20 16:38:30 -070012867//This function assumes that we only support one IBSS session. We cannot use BSSID to identify
12868//session because for IBSS, the bssid changes.
12869static tANI_U32 csrFindIbssSession( tpAniSirGlobal pMac )
12870{
12871 tANI_U32 i, nRet = CSR_SESSION_ID_INVALID;
12872 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070012873 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
12874 {
12875 if( CSR_IS_SESSION_VALID( pMac, i ) )
12876 {
12877 pSession = CSR_GET_SESSION( pMac, i );
12878 if( pSession->pCurRoamProfile && ( csrIsBssTypeIBSS( pSession->connectedProfile.BSSType ) ) )
12879 {
12880 //Found it
12881 nRet = i;
12882 break;
12883 }
12884 }
12885 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012886 return (nRet);
12887}
Jeff Johnson295189b2012-06-20 16:38:30 -070012888static void csrRoamLinkUp(tpAniSirGlobal pMac, tCsrBssid bssid)
12889{
12890 /* Update the current BSS info in ho control block based on connected
12891 profile info from pmac global structure */
12892
Jeff Johnson295189b2012-06-20 16:38:30 -070012893 smsLog(pMac, LOGW, " csrRoamLinkUp: WLAN link UP with AP= %02x-%02x-%02x-%02x-%02x-%02x\n",
12894 bssid[ 0 ], bssid[ 1 ], bssid[ 2 ],
12895 bssid[ 3 ], bssid[ 4 ], bssid[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -070012896 /* Check for user misconfig of RSSI trigger threshold */
12897 pMac->roam.configParam.vccRssiThreshold =
12898 ( 0 == pMac->roam.configParam.vccRssiThreshold ) ?
12899 CSR_VCC_RSSI_THRESHOLD : pMac->roam.configParam.vccRssiThreshold;
12900 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
Jeff Johnson295189b2012-06-20 16:38:30 -070012901 /* Check for user misconfig of UL MAC Loss trigger threshold */
12902 pMac->roam.configParam.vccUlMacLossThreshold =
12903 ( 0 == pMac->roam.configParam.vccUlMacLossThreshold ) ?
12904 CSR_VCC_UL_MAC_LOSS_THRESHOLD : pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070012905#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
12906 {
12907 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070012908 /* Indicate the neighbor roal algorithm about the connect indication */
12909 csrRoamGetSessionIdFromBSSID(pMac, (tCsrBssid *)bssid, &sessionId);
12910 csrNeighborRoamIndicateConnect(pMac, sessionId, VOS_STATUS_SUCCESS);
12911 }
12912#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070012913}
12914
Jeff Johnson295189b2012-06-20 16:38:30 -070012915static void csrRoamLinkDown(tpAniSirGlobal pMac, tANI_U32 sessionId)
12916{
12917 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070012918
12919 if(!pSession)
12920 {
12921 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12922 return;
12923 }
12924
Jeff Johnson295189b2012-06-20 16:38:30 -070012925 //Only to handle the case for Handover on infra link
12926 if( eCSR_BSS_TYPE_INFRASTRUCTURE != pSession->connectedProfile.BSSType )
12927 {
12928 return;
12929 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012930 /* deregister the clients requesting stats from PE/TL & also stop the corresponding timers*/
12931 csrRoamDeregStatisticsReq(pMac);
12932 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
12933#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
12934 /* Indicate the neighbor roal algorithm about the disconnect indication */
12935 csrNeighborRoamIndicateDisconnect(pMac, sessionId);
12936#endif
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070012937
12938 //Remove this code once SLM_Sessionization is supported
12939 //BMPS_WORKAROUND_NOT_NEEDED
12940 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) &&
Mohit Khanna349bc392012-09-11 17:24:52 -070012941 csrIsInfraApStarted( pMac ) &&
12942 pMac->roam.configParam.doBMPSWorkaround)
Jeff Johnsone7245742012-09-05 17:12:55 -070012943 {
12944 pMac->roam.configParam.doBMPSWorkaround = 0;
12945 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012946}
12947
Jeff Johnson295189b2012-06-20 16:38:30 -070012948void csrRoamTlStatsTimerHandler(void *pv)
12949{
12950 tpAniSirGlobal pMac = PMAC_STRUCT( pv );
12951 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070012952 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
12953
Jeff Johnsone7245742012-09-05 17:12:55 -070012954 smsLog(pMac, LOG1, FL(" TL stat timer is no-op. It needs to support multiple stations"));
12955
Jeff Johnson295189b2012-06-20 16:38:30 -070012956#if 0
12957 // TODO Persession .???
12958 //req TL for stats
12959 if(WLANTL_GetStatistics(pMac->roam.gVosContext, &tlStats, pMac->roam.connectedInfo.staId))
12960 {
12961 smsLog(pMac, LOGE, FL("csrRoamTlStatsTimerHandler:couldn't get the stats from TL\n"));
12962 }
12963 else
12964 {
12965 //save in SME
12966 csrRoamSaveStatsFromTl(pMac, tlStats);
12967 }
12968#endif
12969 if(!pMac->roam.tlStatsReqInfo.timerRunning)
12970 {
12971 if(pMac->roam.tlStatsReqInfo.periodicity)
12972 {
12973 //start timer
12974 status = palTimerStart(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer,
12975 pMac->roam.tlStatsReqInfo.periodicity * PAL_TIMER_TO_MS_UNIT, eANI_BOOLEAN_FALSE);
12976 if(!HAL_STATUS_SUCCESS(status))
12977 {
12978 smsLog(pMac, LOGE, FL("csrRoamTlStatsTimerHandler:cannot start TlStatsTimer timer\n"));
12979 return;
12980 }
12981 pMac->roam.tlStatsReqInfo.timerRunning = TRUE;
12982 }
12983 }
12984}
Jeff Johnson295189b2012-06-20 16:38:30 -070012985void csrRoamPeStatsTimerHandler(void *pv)
12986{
12987 tCsrPeStatsReqInfo *pPeStatsReqListEntry = (tCsrPeStatsReqInfo *)pv;
12988 eHalStatus status;
12989 tpAniSirGlobal pMac = pPeStatsReqListEntry->pMac;
12990 VOS_STATUS vosStatus;
12991 tPmcPowerState powerState;
Jeff Johnson295189b2012-06-20 16:38:30 -070012992 pPeStatsReqListEntry->timerRunning = FALSE;
12993 if( pPeStatsReqListEntry->timerStopFailed == TRUE )
12994 {
12995 // If we entered here, meaning the timer could not be successfully
12996 // stopped in csrRoamRemoveEntryFromPeStatsReqList(). So do it here.
12997
12998 /* Destroy the timer */
12999 vosStatus = vos_timer_destroy( &pPeStatsReqListEntry->hPeStatsTimer );
13000 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13001 {
13002 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:failed to destroy hPeStatsTimer timer\n"));
13003 }
13004
13005 // Free the entry
13006 palFreeMemory(pMac->hHdd, pPeStatsReqListEntry);
13007 pPeStatsReqListEntry = NULL;
13008 }
13009 else
13010 {
13011 if(!pPeStatsReqListEntry->rspPending)
13012 {
13013 status = csrSendMBStatsReqMsg(pMac, pPeStatsReqListEntry->statsMask & ~(1 << eCsrGlobalClassDStats),
13014 pPeStatsReqListEntry->staId);
13015 if(!HAL_STATUS_SUCCESS(status))
13016 {
13017 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:failed to send down stats req to PE\n"));
13018 }
13019 else
13020 {
13021 pPeStatsReqListEntry->rspPending = TRUE;
13022 }
13023 }
13024
13025 //send down a req
13026 if(pPeStatsReqListEntry->periodicity &&
13027 (VOS_TIMER_STATE_STOPPED == vos_timer_getCurrentState(&pPeStatsReqListEntry->hPeStatsTimer)))
13028 {
13029 pmcQueryPowerState(pMac, &powerState, NULL, NULL);
13030 if(ePMC_FULL_POWER == powerState)
13031 {
13032 if(pPeStatsReqListEntry->periodicity < pMac->roam.configParam.statsReqPeriodicity)
13033 {
13034 pPeStatsReqListEntry->periodicity = pMac->roam.configParam.statsReqPeriodicity;
13035 }
13036 }
13037 else
13038 {
13039 if(pPeStatsReqListEntry->periodicity < pMac->roam.configParam.statsReqPeriodicityInPS)
13040 {
13041 pPeStatsReqListEntry->periodicity = pMac->roam.configParam.statsReqPeriodicityInPS;
13042 }
13043 }
13044 //start timer
13045 vosStatus = vos_timer_start( &pPeStatsReqListEntry->hPeStatsTimer, pPeStatsReqListEntry->periodicity );
13046 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13047 {
13048 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:cannot start hPeStatsTimer timer\n"));
13049 return;
13050 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013051 pPeStatsReqListEntry->timerRunning = TRUE;
13052
13053 }
13054
13055 }
13056}
Jeff Johnson295189b2012-06-20 16:38:30 -070013057void csrRoamStatsClientTimerHandler(void *pv)
13058{
13059 tCsrStatsClientReqInfo *pStaEntry = (tCsrStatsClientReqInfo *)pv;
Jeff Johnson295189b2012-06-20 16:38:30 -070013060 if(VOS_TIMER_STATE_STOPPED == vos_timer_getCurrentState(&pStaEntry->timer))
13061 {
13062#if 0
13063 // TODO Stats fix for multisession
13064 //start the timer
13065 vosStatus = vos_timer_start( &pStaEntry->timer, pStaEntry->periodicity );
13066
13067 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13068 {
13069 smsLog(pStaEntry->pMac, LOGE, FL("csrGetStatistics:cannot start StatsClient timer\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013070 }
13071#endif
13072 }
13073#if 0
13074 //send up the stats report
13075 csrRoamReportStatistics(pStaEntry->pMac, pStaEntry->statsMask, pStaEntry->callback,
13076 pStaEntry->staId, pStaEntry->pContext);
13077#endif
13078}
13079
13080
13081
Jeff Johnson295189b2012-06-20 16:38:30 -070013082eHalStatus csrSendMBStatsReqMsg( tpAniSirGlobal pMac, tANI_U32 statsMask, tANI_U8 staId)
13083{
13084 tAniGetPEStatsReq *pMsg;
13085 eHalStatus status = eHAL_STATUS_SUCCESS;
13086 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof(tAniGetPEStatsReq));
13087 if ( !HAL_STATUS_SUCCESS(status) )
13088 {
13089 smsLog(pMac, LOG1, " csrSendMBStatsReqMsg: failed to allocate mem for stats req \n");
13090 return status;
13091 }
13092 // need to initiate a stats request to PE
13093 pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_STATISTICS_REQ);
13094 pMsg->msgLen = (tANI_U16)sizeof(tAniGetPEStatsReq);
13095 pMsg->staId = staId;
13096 pMsg->statsMask = statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -070013097 status = palSendMBMessage(pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070013098 if(!HAL_STATUS_SUCCESS(status))
13099 {
13100 smsLog(pMac, LOG1, " csrSendMBStatsReqMsg: failed to send down the stats req \n");
13101 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013102 return status;
13103}
Jeff Johnson295189b2012-06-20 16:38:30 -070013104void csrRoamStatsRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg)
13105{
13106 tAniGetPEStatsRsp *pSmeStatsRsp;
13107 eHalStatus status = eHAL_STATUS_FAILURE;
13108 tListElem *pEntry = NULL;
13109 tCsrStatsClientReqInfo *pTempStaEntry = NULL;
13110 tCsrPeStatsReqInfo *pPeStaEntry = NULL;
13111 tANI_U32 tempMask = 0;
13112 tANI_U8 counter = 0;
13113 tANI_U8 *pStats = NULL;
13114 tANI_U32 length = 0;
13115 v_PVOID_t pvosGCtx;
13116 v_S7_t rssi = 0;
13117 tANI_U32 *pRssi = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013118 pSmeStatsRsp = (tAniGetPEStatsRsp *)pSirMsg;
13119 if(pSmeStatsRsp->rc)
13120 {
13121 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:stats rsp from PE shows failure\n"));
13122 goto post_update;
13123 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013124 tempMask = pSmeStatsRsp->statsMask;
13125 pStats = ((tANI_U8 *)&pSmeStatsRsp->statsMask) + sizeof(pSmeStatsRsp->statsMask);
Jeff Johnson295189b2012-06-20 16:38:30 -070013126 /* subtract all statistics from this length, and after processing the entire
13127 * 'stat' part of the message, if the length is not zero, then rssi is piggy packed
13128 * in this 'stats' message.
13129 */
13130 length = pSmeStatsRsp->msgLen - sizeof(tAniGetPEStatsRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -070013131 //new stats info from PE, fill up the stats strucutres in PMAC
13132 while(tempMask)
13133 {
13134 if(tempMask & 1)
13135 {
13136 switch(counter)
13137 {
13138 case eCsrSummaryStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013139 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:summary stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013140 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.summaryStatsInfo,
13141 pStats, sizeof(tCsrSummaryStatsInfo));
13142 if(!HAL_STATUS_SUCCESS(status))
13143 {
13144 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy summary stats\n"));
13145 }
13146 pStats += sizeof(tCsrSummaryStatsInfo);
13147 length -= sizeof(tCsrSummaryStatsInfo);
13148 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013149 case eCsrGlobalClassAStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013150 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassA stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013151 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classAStatsInfo,
13152 pStats, sizeof(tCsrGlobalClassAStatsInfo));
13153 if(!HAL_STATUS_SUCCESS(status))
13154 {
13155 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassA stats\n"));
13156 }
13157 pStats += sizeof(tCsrGlobalClassAStatsInfo);
13158 length -= sizeof(tCsrGlobalClassAStatsInfo);
13159 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013160 case eCsrGlobalClassBStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013161 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassB stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013162 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classBStatsInfo,
13163 pStats, sizeof(tCsrGlobalClassBStatsInfo));
13164 if(!HAL_STATUS_SUCCESS(status))
13165 {
13166 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassB stats\n"));
13167 }
13168 pStats += sizeof(tCsrGlobalClassBStatsInfo);
13169 length -= sizeof(tCsrGlobalClassBStatsInfo);
13170 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013171 case eCsrGlobalClassCStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013172 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassC stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013173 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classCStatsInfo,
13174 pStats, sizeof(tCsrGlobalClassCStatsInfo));
13175 if(!HAL_STATUS_SUCCESS(status))
13176 {
13177 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassC stats\n"));
13178 }
13179 pStats += sizeof(tCsrGlobalClassCStatsInfo);
13180 length -= sizeof(tCsrGlobalClassCStatsInfo);
13181 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013182 case eCsrPerStaStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013183 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:PerSta stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013184 if( CSR_MAX_STA > pSmeStatsRsp->staId )
13185 {
13186 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.perStaStatsInfo[pSmeStatsRsp->staId],
13187 pStats, sizeof(tCsrPerStaStatsInfo));
13188 }
13189 else
13190 {
13191 status = eHAL_STATUS_FAILURE;
13192 smsLog( pMac, LOGE, FL("csrRoamStatsRspProcessor:out bound staId:%d\n"), pSmeStatsRsp->staId);
13193 VOS_ASSERT( 0 );
13194 }
13195 if(!HAL_STATUS_SUCCESS(status))
13196 {
13197 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy PerSta stats\n"));
13198 }
13199 pStats += sizeof(tCsrPerStaStatsInfo);
13200 length -= sizeof(tCsrPerStaStatsInfo);
13201 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013202 default:
13203 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:unknown stats type\n"));
13204 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013205 }
13206 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013207 tempMask >>=1;
13208 counter++;
13209 }
13210 pvosGCtx = vos_get_global_context(VOS_MODULE_ID_SME, pMac);
13211 if (length != 0)
13212 {
13213 pRssi = (tANI_U32*)pStats;
13214 rssi = (v_S7_t)*pRssi;
13215 }
13216 else
13217 {
13218 /* If riva is not sending rssi, continue to use the hack */
13219 rssi = RSSI_HACK_BMPS;
13220 }
13221 WDA_UpdateRssiBmps(pvosGCtx, pSmeStatsRsp->staId, rssi);
Jeff Johnson295189b2012-06-20 16:38:30 -070013222post_update:
13223 //make sure to update the pe stats req list
13224 pEntry = csrRoamFindInPeStatsReqList(pMac, pSmeStatsRsp->statsMask);
13225 if(pEntry)
13226 {
13227 pPeStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
13228 pPeStaEntry->rspPending = FALSE;
13229
13230 }
13231 //check the one timer cases
13232 pEntry = csrRoamCheckClientReqList(pMac, pSmeStatsRsp->statsMask);
13233 if(pEntry)
13234 {
Jeff Johnson295189b2012-06-20 16:38:30 -070013235 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013236 if(pTempStaEntry->timerExpired)
13237 {
13238 //send up the stats report
13239 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
13240 pTempStaEntry->staId, pTempStaEntry->pContext);
13241 //also remove from the client list
13242 csrRoamRemoveStatListEntry(pMac, pEntry);
13243 pTempStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013244 }
13245 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013246}
Jeff Johnson295189b2012-06-20 16:38:30 -070013247tListElem * csrRoamFindInPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask)
13248{
13249 tListElem *pEntry = NULL;
13250 tCsrPeStatsReqInfo *pTempStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013251 pEntry = csrLLPeekHead( &pMac->roam.peStatsReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013252 if(!pEntry)
13253 {
13254 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013255 smsLog(pMac, LOG2, "csrRoamFindInPeStatsReqList: List empty, no request to PE\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013256 return NULL;
13257 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013258 while( pEntry )
13259 {
13260 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013261 if(pTempStaEntry->statsMask == statsMask)
13262 {
Mohit Khanna23863762012-09-11 17:40:09 -070013263 smsLog(pMac, LOG3, "csrRoamFindInPeStatsReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013264 break;
13265 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013266 pEntry = csrLLNext( &pMac->roam.peStatsReqList, pEntry, LL_ACCESS_NOLOCK );
13267 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013268 return pEntry;
13269}
13270
Jeff Johnson295189b2012-06-20 16:38:30 -070013271tListElem * csrRoamChecknUpdateClientReqList(tpAniSirGlobal pMac, tCsrStatsClientReqInfo *pStaEntry,
13272 tANI_BOOLEAN update)
13273{
13274 tListElem *pEntry;
13275 tCsrStatsClientReqInfo *pTempStaEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070013276 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013277 if(!pEntry)
13278 {
13279 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013280 smsLog(pMac, LOG2, "csrRoamChecknUpdateClientReqList: List empty, no request from "
Jeff Johnson295189b2012-06-20 16:38:30 -070013281 "upper layer client(s)\n");
13282 return NULL;
13283 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013284 while( pEntry )
13285 {
13286 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013287 if((pTempStaEntry->requesterId == pStaEntry->requesterId) &&
13288 (pTempStaEntry->statsMask == pStaEntry->statsMask))
13289 {
Mohit Khanna23863762012-09-11 17:40:09 -070013290 smsLog(pMac, LOG3, "csrRoamChecknUpdateClientReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013291 if(update)
13292 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013293 pTempStaEntry->periodicity = pStaEntry->periodicity;
13294 pTempStaEntry->callback = pStaEntry->callback;
13295 pTempStaEntry->pContext = pStaEntry->pContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070013296 }
13297 break;
13298 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013299 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
13300 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013301 return pEntry;
13302}
Jeff Johnson295189b2012-06-20 16:38:30 -070013303tListElem * csrRoamCheckClientReqList(tpAniSirGlobal pMac, tANI_U32 statsMask)
13304{
13305 tListElem *pEntry;
13306 tCsrStatsClientReqInfo *pTempStaEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070013307 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013308 if(!pEntry)
13309 {
13310 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013311 smsLog(pMac, LOG2, "csrRoamCheckClientReqList: List empty, no request from "
Jeff Johnson295189b2012-06-20 16:38:30 -070013312 "upper layer client(s)\n");
13313 return NULL;
13314 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013315 while( pEntry )
13316 {
13317 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013318 if((pTempStaEntry->statsMask & ~(1 << eCsrGlobalClassDStats)) == statsMask)
13319 {
Mohit Khanna23863762012-09-11 17:40:09 -070013320 smsLog(pMac, LOG3, "csrRoamCheckClientReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013321 break;
13322 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013323 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
13324 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013325 return pEntry;
13326}
Jeff Johnson295189b2012-06-20 16:38:30 -070013327eHalStatus csrRoamRegisterLinkQualityIndCallback(tpAniSirGlobal pMac,
13328 csrRoamLinkQualityIndCallback callback,
13329 void *pContext)
13330{
13331 pMac->roam.linkQualityIndInfo.callback = callback;
13332 pMac->roam.linkQualityIndInfo.context = pContext;
13333 if( NULL == callback )
13334 {
13335 smsLog(pMac, LOGW, "csrRoamRegisterLinkQualityIndCallback: indication callback being deregistered");
13336 }
13337 else
13338 {
13339 smsLog(pMac, LOGW, "csrRoamRegisterLinkQualityIndCallback: indication callback being registered");
Jeff Johnson295189b2012-06-20 16:38:30 -070013340 /* do we need to invoke the callback to notify client of initial value ?? */
13341 }
13342 return eHAL_STATUS_SUCCESS;
13343}
Jeff Johnson295189b2012-06-20 16:38:30 -070013344void csrRoamVccTrigger(tpAniSirGlobal pMac)
13345{
13346 eCsrRoamLinkQualityInd newVccLinkQuality;
13347 tANI_U32 ul_mac_loss = 0;
13348 tANI_U32 ul_mac_loss_trigger_threshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013349 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
13350 /*-------------------------------------------------------------------------
13351 Link quality is currently binary based on OBIWAN recommended triggers
Jeff Johnson295189b2012-06-20 16:38:30 -070013352 Check for a change in link quality and notify client if necessary
13353 -------------------------------------------------------------------------*/
13354 ul_mac_loss_trigger_threshold =
13355 pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013356 VOS_ASSERT( ul_mac_loss_trigger_threshold != 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070013357 smsLog(pMac, LOGW, "csrRoamVccTrigger: UL_MAC_LOSS_THRESHOLD is %d\n",
13358 ul_mac_loss_trigger_threshold );
Jeff Johnson295189b2012-06-20 16:38:30 -070013359 if(ul_mac_loss_trigger_threshold < ul_mac_loss)
13360 {
13361 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality is POOR \n");
13362 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13363 }
13364 else
13365 {
13366 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality is GOOD\n");
13367 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_GOOD_IND;
13368 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013369 smsLog(pMac, LOGW, "csrRoamVccTrigger: link qual : *** UL_MAC_LOSS %d *** ",
13370 ul_mac_loss);
Jeff Johnson295189b2012-06-20 16:38:30 -070013371 if(newVccLinkQuality != pMac->roam.vccLinkQuality)
13372 {
13373 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality changed: trigger necessary\n");
13374 if(NULL != pMac->roam.linkQualityIndInfo.callback)
13375 {
13376 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality indication %d\n",
13377 newVccLinkQuality );
13378
13379 /* we now invoke the callback once to notify client of initial value */
13380 pMac->roam.linkQualityIndInfo.callback( newVccLinkQuality,
13381 pMac->roam.linkQualityIndInfo.context );
13382 //event: EVENT_WLAN_VCC
13383 }
13384 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013385 pMac->roam.vccLinkQuality = newVccLinkQuality;
13386
Jeff Johnson295189b2012-06-20 16:38:30 -070013387}
Jeff Johnson295189b2012-06-20 16:38:30 -070013388VOS_STATUS csrRoamVccTriggerRssiIndCallback(tHalHandle hHal,
13389 v_U8_t rssiNotification,
13390 void * context)
13391{
13392 tpAniSirGlobal pMac = PMAC_STRUCT( context );
13393 eCsrRoamLinkQualityInd newVccLinkQuality;
13394 // TODO : Session info unavailable
13395 tANI_U32 sessionId = 0;
13396 VOS_STATUS status = VOS_STATUS_SUCCESS;
13397 /*-------------------------------------------------------------------------
13398 Link quality is currently binary based on OBIWAN recommended triggers
Jeff Johnson295189b2012-06-20 16:38:30 -070013399 Check for a change in link quality and notify client if necessary
13400 -------------------------------------------------------------------------*/
13401 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: RSSI trigger threshold is %d\n",
13402 pMac->roam.configParam.vccRssiThreshold);
13403 if(!csrIsConnStateConnectedInfra(pMac, sessionId))
13404 {
13405 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: ignoring the indication as we are not connected\n");
13406 return VOS_STATUS_SUCCESS;
13407 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013408 if(WLANTL_HO_THRESHOLD_DOWN == rssiNotification)
13409 {
13410 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality is POOR\n");
13411 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13412 }
13413 else if(WLANTL_HO_THRESHOLD_UP == rssiNotification)
13414 {
13415 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality is GOOD \n");
13416 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_GOOD_IND;
13417 }
13418 else
13419 {
13420 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: unknown rssi notification %d\n", rssiNotification);
13421 //Set to this so the code below won't do anything
13422 newVccLinkQuality = pMac->roam.vccLinkQuality;
Jeff Johnson295189b2012-06-20 16:38:30 -070013423 VOS_ASSERT(0);
13424 }
13425
Jeff Johnson295189b2012-06-20 16:38:30 -070013426 if(newVccLinkQuality != pMac->roam.vccLinkQuality)
13427 {
13428 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality changed: trigger necessary\n");
13429 if(NULL != pMac->roam.linkQualityIndInfo.callback)
13430 {
13431 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality indication %d\n",
13432 newVccLinkQuality);
Jeff Johnson295189b2012-06-20 16:38:30 -070013433 /* we now invoke the callback once to notify client of initial value */
13434 pMac->roam.linkQualityIndInfo.callback( newVccLinkQuality,
13435 pMac->roam.linkQualityIndInfo.context );
13436 //event: EVENT_WLAN_VCC
13437 }
13438 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013439 pMac->roam.vccLinkQuality = newVccLinkQuality;
Jeff Johnson295189b2012-06-20 16:38:30 -070013440 return status;
13441}
Jeff Johnson295189b2012-06-20 16:38:30 -070013442tCsrStatsClientReqInfo * csrRoamInsertEntryIntoList( tpAniSirGlobal pMac,
13443 tDblLinkList *pStaList,
13444 tCsrStatsClientReqInfo *pStaEntry)
13445{
13446 tCsrStatsClientReqInfo *pNewStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013447 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013448 //if same entity requested for same set of stats with different periodicity &
13449 // callback update it
13450 if(NULL == csrRoamChecknUpdateClientReqList(pMac, pStaEntry, TRUE))
13451 {
13452
13453 status = palAllocateMemory(pMac->hHdd, (void **)&pNewStaEntry, sizeof(tCsrStatsClientReqInfo));
13454 if (!HAL_STATUS_SUCCESS(status))
13455 {
13456 smsLog(pMac, LOGW, "csrRoamInsertEntryIntoList: couldn't allocate memory for the "
13457 "entry\n");
13458 return NULL;
13459 }
13460
Jeff Johnson295189b2012-06-20 16:38:30 -070013461 pNewStaEntry->callback = pStaEntry->callback;
13462 pNewStaEntry->pContext = pStaEntry->pContext;
13463 pNewStaEntry->periodicity = pStaEntry->periodicity;
13464 pNewStaEntry->requesterId = pStaEntry->requesterId;
13465 pNewStaEntry->statsMask = pStaEntry->statsMask;
13466 pNewStaEntry->pPeStaEntry = pStaEntry->pPeStaEntry;
13467 pNewStaEntry->pMac = pStaEntry->pMac;
13468 pNewStaEntry->staId = pStaEntry->staId;
13469 pNewStaEntry->timerExpired = pStaEntry->timerExpired;
13470
13471 csrLLInsertTail( pStaList, &pNewStaEntry->link, LL_ACCESS_LOCK );
13472 }
13473 return pNewStaEntry;
13474}
13475
Jeff Johnson295189b2012-06-20 16:38:30 -070013476tCsrPeStatsReqInfo * csrRoamInsertEntryIntoPeStatsReqList( tpAniSirGlobal pMac,
13477 tDblLinkList *pStaList,
13478 tCsrPeStatsReqInfo *pStaEntry)
13479{
13480 tCsrPeStatsReqInfo *pNewStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013481 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013482 status = palAllocateMemory(pMac->hHdd, (void **)&pNewStaEntry, sizeof(tCsrPeStatsReqInfo));
13483 if (!HAL_STATUS_SUCCESS(status))
13484 {
13485 smsLog(pMac, LOGW, "csrRoamInsertEntryIntoPeStatsReqList: couldn't allocate memory for the "
13486 "entry\n");
13487 return NULL;
13488 }
13489
Jeff Johnson295189b2012-06-20 16:38:30 -070013490 pNewStaEntry->hPeStatsTimer = pStaEntry->hPeStatsTimer;
13491 pNewStaEntry->numClient = pStaEntry->numClient;
13492 pNewStaEntry->periodicity = pStaEntry->periodicity;
13493 pNewStaEntry->statsMask = pStaEntry->statsMask;
13494 pNewStaEntry->pMac = pStaEntry->pMac;
13495 pNewStaEntry->staId = pStaEntry->staId;
13496 pNewStaEntry->timerRunning = pStaEntry->timerRunning;
13497 pNewStaEntry->rspPending = pStaEntry->rspPending;
13498
13499 csrLLInsertTail( pStaList, &pNewStaEntry->link, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013500 return pNewStaEntry;
13501}
Jeff Johnson295189b2012-06-20 16:38:30 -070013502eHalStatus csrGetRssi(tpAniSirGlobal pMac,
13503 tCsrRssiCallback callback,
13504 tANI_U8 staId, tCsrBssid bssId, void *pContext, void* pVosContext)
13505{
13506 eHalStatus status = eHAL_STATUS_SUCCESS;
13507 vos_msg_t msg;
13508 tANI_U32 sessionId;
13509
13510 tAniGetRssiReq *pMsg;
13511 smsLog(pMac, LOG2, FL("called"));
13512 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof(tAniGetRssiReq));
13513 if ( !HAL_STATUS_SUCCESS(status) )
13514 {
13515 smsLog(pMac, LOGE, " csrGetRssi: failed to allocate mem for req \n");
13516 return status;
13517 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013518 csrRoamGetSessionIdFromBSSID(pMac, (tCsrBssid *)bssId, &sessionId);
13519
13520 pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_RSSI_REQ);
13521 pMsg->msgLen = (tANI_U16)sizeof(tAniGetRssiReq);
13522 pMsg->sessionId = sessionId;
13523 pMsg->staId = staId;
13524 pMsg->rssiCallback = callback;
13525 pMsg->pDevContext = pContext;
13526 pMsg->pVosContext = pVosContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070013527 msg.type = eWNI_SME_GET_RSSI_REQ;
13528 msg.bodyptr = pMsg;
13529 msg.reserved = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013530 if(VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, &msg))
13531 {
13532 smsLog(pMac, LOGE, " csrGetRssi failed to post msg to self \n");
13533 palFreeMemory(pMac->hHdd, (void *)pMsg);
13534 status = eHAL_STATUS_FAILURE;
13535 }
13536 smsLog(pMac, LOG2, FL("returned"));
13537 return status;
13538}
Jeff Johnson295189b2012-06-20 16:38:30 -070013539eHalStatus csrGetStatistics(tpAniSirGlobal pMac, eCsrStatsRequesterType requesterId,
13540 tANI_U32 statsMask,
13541 tCsrStatsCallback callback,
13542 tANI_U32 periodicity, tANI_BOOLEAN cache,
13543 tANI_U8 staId, void *pContext)
13544{
13545 tCsrStatsClientReqInfo staEntry;
13546 tCsrStatsClientReqInfo *pStaEntry = NULL;
13547 tCsrPeStatsReqInfo *pPeStaEntry = NULL;
13548 tListElem *pEntry = NULL;
13549 tANI_BOOLEAN found = FALSE;
13550 eHalStatus status = eHAL_STATUS_SUCCESS;
13551 tANI_BOOLEAN insertInClientList = FALSE;
13552 VOS_STATUS vosStatus;
Jeff Johnsone7245742012-09-05 17:12:55 -070013553 WLANTL_TRANSFER_STA_TYPE *pTlStats;
Jeff Johnson295189b2012-06-20 16:38:30 -070013554
13555 if( csrIsAllSessionDisconnected(pMac) )
13556 {
13557 //smsLog(pMac, LOGW, "csrGetStatistics: wrong state curState(%d) not connected\n", pMac->roam.curState);
13558 return eHAL_STATUS_FAILURE;
13559 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013560 if((!statsMask) && (!callback))
13561 {
13562 //msg
13563 smsLog(pMac, LOGW, "csrGetStatistics: statsMask & callback empty in the request\n");
13564 return eHAL_STATUS_FAILURE;
13565 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013566 //for the search list method for deregister
13567 staEntry.requesterId = requesterId;
13568 staEntry.statsMask = statsMask;
13569 //requester wants to deregister or just an error
13570 if((statsMask) && (!callback))
13571 {
13572 pEntry = csrRoamChecknUpdateClientReqList(pMac, &staEntry, FALSE);
13573 if(!pEntry)
13574 {
13575 //msg
13576 smsLog(pMac, LOGW, "csrGetStatistics: callback is empty in the request & couldn't "
13577 "find any existing request in statsClientReqList\n");
13578 return eHAL_STATUS_FAILURE;
13579 }
13580 else
13581 {
13582 //clean up & return
13583 pStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnsond13512a2012-07-17 11:42:19 -070013584 if(NULL != pStaEntry->pPeStaEntry)
Jeff Johnson295189b2012-06-20 16:38:30 -070013585 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013586 pStaEntry->pPeStaEntry->numClient--;
13587 //check if we need to delete the entry from peStatsReqList too
13588 if(!pStaEntry->pPeStaEntry->numClient)
13589 {
13590 csrRoamRemoveEntryFromPeStatsReqList(pMac, pStaEntry->pPeStaEntry);
13591 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013592 }
Jeff Johnsond13512a2012-07-17 11:42:19 -070013593
Jeff Johnson295189b2012-06-20 16:38:30 -070013594 //check if we need to stop the tl stats timer too
13595 pMac->roam.tlStatsReqInfo.numClient--;
13596 if(!pMac->roam.tlStatsReqInfo.numClient)
13597 {
13598 if(pMac->roam.tlStatsReqInfo.timerRunning)
13599 {
13600 status = palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
13601 if(!HAL_STATUS_SUCCESS(status))
13602 {
13603 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot stop TlStatsTimer timer\n"));
13604 return eHAL_STATUS_FAILURE;
13605 }
13606 }
13607 pMac->roam.tlStatsReqInfo.periodicity = 0;
13608 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
13609 }
13610 vos_timer_stop( &pStaEntry->timer );
Jeff Johnson295189b2012-06-20 16:38:30 -070013611 // Destroy the vos timer...
13612 vosStatus = vos_timer_destroy( &pStaEntry->timer );
13613 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13614 {
13615 smsLog(pMac, LOGE, FL("csrGetStatistics:failed to destroy Client req timer\n"));
13616 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013617 csrRoamRemoveStatListEntry(pMac, pEntry);
13618 pStaEntry = NULL;
13619 return eHAL_STATUS_SUCCESS;
13620 }
13621 }
13622
13623 if(cache && !periodicity)
13624 {
13625 //return the cached stats
13626 csrRoamReportStatistics(pMac, statsMask, callback, staId, pContext);
13627 }
13628 else
13629 {
13630 //add the request in the client req list
13631 staEntry.callback = callback;
13632 staEntry.pContext = pContext;
13633 staEntry.periodicity = periodicity;
13634 staEntry.pPeStaEntry = NULL;
13635 staEntry.staId = staId;
13636 staEntry.pMac = pMac;
13637 staEntry.timerExpired = FALSE;
13638
13639
Jeff Johnson295189b2012-06-20 16:38:30 -070013640 //if periodic report requested with non cached result from PE/TL
13641 if(periodicity)
13642 {
13643
13644 //if looking for stats from PE
13645 if(statsMask & ~(1 << eCsrGlobalClassDStats))
13646 {
13647
13648 //check if same request made already & waiting for rsp
13649 pPeStaEntry = csrRoamCheckPeStatsReqList(pMac, statsMask & ~(1 << eCsrGlobalClassDStats),
13650 periodicity, &found, staId);
13651 if(!pPeStaEntry)
13652 {
13653 //bail out, maxed out on number of req for PE
13654 return eHAL_STATUS_FAILURE;
13655 }
13656 else
13657 {
13658 staEntry.pPeStaEntry = pPeStaEntry;
13659 }
13660
13661 }
13662 //request stats from TL rightaway if requested by client, update tlStatsReqInfo if needed
13663 if(statsMask & (1 << eCsrGlobalClassDStats))
13664 {
13665 if(cache && pMac->roam.tlStatsReqInfo.numClient)
13666 {
13667 smsLog(pMac, LOGE, FL("csrGetStatistics:Looking for cached stats from TL\n"));
13668 }
13669 else
13670 {
13671
13672 //update periodicity
13673 if(pMac->roam.tlStatsReqInfo.periodicity)
13674 {
13675 pMac->roam.tlStatsReqInfo.periodicity =
13676 CSR_ROAM_MIN(periodicity, pMac->roam.tlStatsReqInfo.periodicity);
13677 }
13678 else
13679 {
13680 pMac->roam.tlStatsReqInfo.periodicity = periodicity;
13681 }
13682 if(pMac->roam.tlStatsReqInfo.periodicity < CSR_MIN_TL_STAT_QUERY_PERIOD)
13683 {
13684 pMac->roam.tlStatsReqInfo.periodicity = CSR_MIN_TL_STAT_QUERY_PERIOD;
13685 }
13686
13687 if(!pMac->roam.tlStatsReqInfo.timerRunning)
13688 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013689 pTlStats = (WLANTL_TRANSFER_STA_TYPE *)vos_mem_malloc(sizeof(WLANTL_TRANSFER_STA_TYPE));
13690 if(NULL != pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070013691 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013692 //req TL for class D stats
13693 if(WLANTL_GetStatistics(pMac->roam.gVosContext, pTlStats, staId))
13694 {
13695 smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
13696 }
13697 else
13698 {
13699 //save in SME
13700 csrRoamSaveStatsFromTl(pMac, pTlStats);
13701 }
13702 vos_mem_free(pTlStats);
13703 pTlStats = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013704 }
13705 else
13706 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013707 smsLog(pMac, LOGE, FL("cannot allocate memory for TL stat"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013708 }
Jeff Johnsone7245742012-09-05 17:12:55 -070013709
Jeff Johnson295189b2012-06-20 16:38:30 -070013710 if(pMac->roam.tlStatsReqInfo.periodicity)
13711 {
13712 //start timer
13713 status = palTimerStart(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer,
13714 pMac->roam.tlStatsReqInfo.periodicity * PAL_TIMER_TO_MS_UNIT, eANI_BOOLEAN_FALSE);
13715 if(!HAL_STATUS_SUCCESS(status))
13716 {
13717 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot start TlStatsTimer timer\n"));
13718 return eHAL_STATUS_FAILURE;
13719 }
13720 pMac->roam.tlStatsReqInfo.timerRunning = TRUE;
13721 }
13722 }
13723 }
13724 pMac->roam.tlStatsReqInfo.numClient++;
13725 }
13726
13727 insertInClientList = TRUE;
13728 }
13729 //if one time report requested with non cached result from PE/TL
13730 else if(!cache && !periodicity)
13731 {
13732 if(statsMask & ~(1 << eCsrGlobalClassDStats))
13733 {
13734 //send down a req
13735 status = csrSendMBStatsReqMsg(pMac, statsMask & ~(1 << eCsrGlobalClassDStats), staId);
13736 if(!HAL_STATUS_SUCCESS(status))
13737 {
13738 smsLog(pMac, LOGE, FL("csrGetStatistics:failed to send down stats req to PE\n"));
13739 }
13740 //so that when the stats rsp comes back from PE we respond to upper layer
13741 //right away
13742 staEntry.timerExpired = TRUE;
13743 insertInClientList = TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -070013744 }
13745 if(statsMask & (1 << eCsrGlobalClassDStats))
13746 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013747 pTlStats = (WLANTL_TRANSFER_STA_TYPE *)vos_mem_malloc(sizeof(WLANTL_TRANSFER_STA_TYPE));
13748 if(NULL != pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070013749 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013750 //req TL for class D stats
13751 if(!VOS_IS_STATUS_SUCCESS(WLANTL_GetStatistics(pMac->roam.gVosContext, pTlStats, staId)))
13752 {
13753 smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
13754 }
13755 else
13756 {
13757 //save in SME
13758 csrRoamSaveStatsFromTl(pMac, pTlStats);
13759 }
13760 vos_mem_free(pTlStats);
13761 pTlStats = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013762 }
13763 else
13764 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013765 smsLog(pMac, LOGE, FL("cannot allocate memory for TL stat"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013766 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013767
13768 }
13769 //if looking for stats from TL only
13770 if(!insertInClientList)
13771 {
13772 //return the stats
13773 csrRoamReportStatistics(pMac, statsMask, callback, staId, pContext);
13774 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013775 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013776 if(insertInClientList)
13777 {
13778 pStaEntry = csrRoamInsertEntryIntoList(pMac, &pMac->roam.statsClientReqList, &staEntry);
13779 if(!pStaEntry)
13780 {
13781 //msg
13782 smsLog(pMac, LOGW, "csrGetStatistics: Failed to insert req in statsClientReqList\n");
13783 return eHAL_STATUS_FAILURE;
13784 }
Jeff Johnsone7245742012-09-05 17:12:55 -070013785 pStaEntry->periodicity = periodicity;
Jeff Johnson295189b2012-06-20 16:38:30 -070013786 //Init & start timer if needed
13787 if(periodicity)
13788 {
13789 vosStatus = vos_timer_init( &pStaEntry->timer, VOS_TIMER_TYPE_SW,
13790 csrRoamStatsClientTimerHandler, pStaEntry );
13791 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13792 {
13793 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot init StatsClient timer\n"));
13794 return eHAL_STATUS_FAILURE;
13795 }
13796 vosStatus = vos_timer_start( &pStaEntry->timer, periodicity );
13797 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13798 {
13799 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot start StatsClient timer\n"));
13800 return eHAL_STATUS_FAILURE;
13801 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013802 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013803 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013804 }
13805 return eHAL_STATUS_SUCCESS;
13806}
13807
Jeff Johnson295189b2012-06-20 16:38:30 -070013808tCsrPeStatsReqInfo * csrRoamCheckPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask,
13809 tANI_U32 periodicity, tANI_BOOLEAN *pFound, tANI_U8 staId)
13810{
13811 tANI_BOOLEAN found = FALSE;
13812 eHalStatus status = eHAL_STATUS_SUCCESS;
13813 tCsrPeStatsReqInfo staEntry;
13814 tCsrPeStatsReqInfo *pTempStaEntry = NULL;
13815 tListElem *pStaEntry = NULL;
13816 VOS_STATUS vosStatus;
13817 tPmcPowerState powerState;
13818 *pFound = FALSE;
13819
13820 pStaEntry = csrRoamFindInPeStatsReqList(pMac, statsMask);
13821 if(pStaEntry)
13822 {
13823 pTempStaEntry = GET_BASE_ADDR( pStaEntry, tCsrPeStatsReqInfo, link );
13824 if(pTempStaEntry->periodicity)
13825 {
13826 pTempStaEntry->periodicity =
13827 CSR_ROAM_MIN(periodicity, pTempStaEntry->periodicity);
13828 }
13829 else
13830 {
13831 pTempStaEntry->periodicity = periodicity;
13832 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013833 pTempStaEntry->numClient++;
13834 found = TRUE;
13835 }
13836 else
13837 {
13838 palZeroMemory(pMac->hHdd, &staEntry, sizeof(tCsrPeStatsReqInfo));
13839 staEntry.numClient = 1;
13840 staEntry.periodicity = periodicity;
13841 staEntry.pMac = pMac;
13842 staEntry.rspPending = FALSE;
13843 staEntry.staId = staId;
13844 staEntry.statsMask = statsMask;
13845 staEntry.timerRunning = FALSE;
13846 pTempStaEntry = csrRoamInsertEntryIntoPeStatsReqList(pMac, &pMac->roam.peStatsReqList, &staEntry);
13847 if(!pTempStaEntry)
13848 {
13849 //msg
13850 smsLog(pMac, LOGW, "csrRoamCheckPeStatsReqList: Failed to insert req in peStatsReqList\n");
13851 return NULL;
13852 }
13853 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013854 pmcQueryPowerState(pMac, &powerState, NULL, NULL);
13855 if(ePMC_FULL_POWER == powerState)
13856 {
13857 if(pTempStaEntry->periodicity < pMac->roam.configParam.statsReqPeriodicity)
13858 {
13859 pTempStaEntry->periodicity = pMac->roam.configParam.statsReqPeriodicity;
13860 }
13861 }
13862 else
13863 {
13864 if(pTempStaEntry->periodicity < pMac->roam.configParam.statsReqPeriodicityInPS)
13865 {
13866 pTempStaEntry->periodicity = pMac->roam.configParam.statsReqPeriodicityInPS;
13867 }
13868 }
13869 if(!pTempStaEntry->timerRunning)
13870 {
13871 //send down a req in case of one time req, for periodic ones wait for timer to expire
13872 if(!pTempStaEntry->rspPending &&
13873 !pTempStaEntry->periodicity)
13874 {
13875 status = csrSendMBStatsReqMsg(pMac, statsMask & ~(1 << eCsrGlobalClassDStats), staId);
13876 if(!HAL_STATUS_SUCCESS(status))
13877 {
13878 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:failed to send down stats req to PE\n"));
13879 }
13880 else
13881 {
13882 pTempStaEntry->rspPending = TRUE;
13883 }
13884 }
13885 if(pTempStaEntry->periodicity)
13886 {
13887 if(!found)
13888 {
13889
13890 vosStatus = vos_timer_init( &pTempStaEntry->hPeStatsTimer, VOS_TIMER_TYPE_SW,
13891 csrRoamPeStatsTimerHandler, pTempStaEntry );
13892 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13893 {
13894 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:cannot init hPeStatsTimer timer\n"));
13895 return NULL;
13896 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013897 }
13898 //start timer
13899 smsLog(pMac, LOG1, "csrRoamCheckPeStatsReqList:peStatsTimer period %d\n", pTempStaEntry->periodicity);
Jeff Johnson295189b2012-06-20 16:38:30 -070013900 vosStatus = vos_timer_start( &pTempStaEntry->hPeStatsTimer, pTempStaEntry->periodicity );
13901 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13902 {
13903 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:cannot start hPeStatsTimer timer\n"));
13904 return NULL;
13905 }
13906 pTempStaEntry->timerRunning = TRUE;
13907 }
13908 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013909 *pFound = found;
13910 return pTempStaEntry;
13911}
13912
Jeff Johnson295189b2012-06-20 16:38:30 -070013913/*
13914 pStaEntry is no longer invalid upon the return of this function.
13915*/
13916static void csrRoamRemoveStatListEntry(tpAniSirGlobal pMac, tListElem *pEntry)
13917{
13918 if(pEntry)
13919 {
13920 if(csrLLRemoveEntry(&pMac->roam.statsClientReqList, pEntry, LL_ACCESS_LOCK))
13921 {
13922 palFreeMemory(pMac->hHdd, GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link ));
Jeff Johnsone7245742012-09-05 17:12:55 -070013923 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013924 }
13925 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013926
13927void csrRoamRemoveEntryFromPeStatsReqList(tpAniSirGlobal pMac, tCsrPeStatsReqInfo *pPeStaEntry)
13928{
13929 tListElem *pEntry;
13930 tCsrPeStatsReqInfo *pTempStaEntry;
13931 VOS_STATUS vosStatus;
13932 pEntry = csrLLPeekHead( &pMac->roam.peStatsReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013933 if(!pEntry)
13934 {
13935 //list empty
13936 smsLog(pMac, LOGW, "csrRoamRemoveEntryFromPeStatsReqList: List empty, no stats req for PE\n");
13937 return;
13938 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013939 while( pEntry )
13940 {
13941 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013942 if( pTempStaEntry && pTempStaEntry->statsMask == pPeStaEntry->statsMask)
13943 {
13944 smsLog(pMac, LOGW, "csrRoamRemoveEntryFromPeStatsReqList: match found\n");
13945 if(pTempStaEntry->timerRunning)
13946 {
13947 vosStatus = vos_timer_stop( &pTempStaEntry->hPeStatsTimer );
13948 /* If we are not able to stop the timer here, just remove
13949 * the entry from the linked list. Destroy the timer object
13950 * and free the memory in the timer CB
13951 */
13952 if( vosStatus == VOS_STATUS_SUCCESS )
13953 {
13954 /* the timer is successfully stopped */
13955 pTempStaEntry->timerRunning = FALSE;
13956
13957 /* Destroy the timer */
13958 vosStatus = vos_timer_destroy( &pTempStaEntry->hPeStatsTimer );
13959 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13960 {
13961 smsLog(pMac, LOGE, FL("csrRoamRemoveEntryFromPeStatsReqList:failed to destroy hPeStatsTimer timer\n"));
13962 }
13963 }
13964 else
13965 {
13966 // the timer could not be stopped. Hence destroy and free the
13967 // memory for the PE stat entry in the timer CB.
13968 pTempStaEntry->timerStopFailed = TRUE;
13969 }
Jeff Johnsone7245742012-09-05 17:12:55 -070013970 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013971
13972 if(csrLLRemoveEntry(&pMac->roam.peStatsReqList, pEntry, LL_ACCESS_LOCK))
13973 {
13974 // Only free the memory if we could stop the timer successfully
13975 if(!pTempStaEntry->timerStopFailed)
13976 {
13977 palFreeMemory(pMac->hHdd, pTempStaEntry);
13978 pTempStaEntry = NULL;
13979 }
13980 break;
13981 }
13982
13983 pEntry = csrLLNext( &pMac->roam.peStatsReqList, pEntry, LL_ACCESS_NOLOCK );
13984 }
13985 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013986 return;
13987}
13988
13989
Jeff Johnsone7245742012-09-05 17:12:55 -070013990void csrRoamSaveStatsFromTl(tpAniSirGlobal pMac, WLANTL_TRANSFER_STA_TYPE *pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070013991{
13992
Jeff Johnsone7245742012-09-05 17:12:55 -070013993 pMac->roam.classDStatsInfo.num_rx_bytes_crc_ok = pTlStats->rxBcntCRCok;
13994 pMac->roam.classDStatsInfo.rx_bc_byte_cnt = pTlStats->rxBCBcnt;
13995 pMac->roam.classDStatsInfo.rx_bc_frm_cnt = pTlStats->rxBCFcnt;
13996 pMac->roam.classDStatsInfo.rx_byte_cnt = pTlStats->rxBcnt;
13997 pMac->roam.classDStatsInfo.rx_mc_byte_cnt = pTlStats->rxMCBcnt;
13998 pMac->roam.classDStatsInfo.rx_mc_frm_cnt = pTlStats->rxMCFcnt;
13999 pMac->roam.classDStatsInfo.rx_rate = pTlStats->rxRate;
Jeff Johnson295189b2012-06-20 16:38:30 -070014000 //?? need per AC
Jeff Johnsone7245742012-09-05 17:12:55 -070014001 pMac->roam.classDStatsInfo.rx_uc_byte_cnt[0] = pTlStats->rxUCBcnt;
14002 pMac->roam.classDStatsInfo.rx_uc_frm_cnt = pTlStats->rxUCFcnt;
14003 pMac->roam.classDStatsInfo.tx_bc_byte_cnt = pTlStats->txBCBcnt;
14004 pMac->roam.classDStatsInfo.tx_bc_frm_cnt = pTlStats->txBCFcnt;
14005 pMac->roam.classDStatsInfo.tx_mc_byte_cnt = pTlStats->txMCBcnt;
14006 pMac->roam.classDStatsInfo.tx_mc_frm_cnt = pTlStats->txMCFcnt;
Jeff Johnson295189b2012-06-20 16:38:30 -070014007 //?? need per AC
Jeff Johnsone7245742012-09-05 17:12:55 -070014008 pMac->roam.classDStatsInfo.tx_uc_byte_cnt[0] = pTlStats->txUCBcnt;
14009 pMac->roam.classDStatsInfo.tx_uc_frm_cnt = pTlStats->txUCFcnt;
Jeff Johnson295189b2012-06-20 16:38:30 -070014010
14011}
14012
Jeff Johnson295189b2012-06-20 16:38:30 -070014013void csrRoamReportStatistics(tpAniSirGlobal pMac, tANI_U32 statsMask,
14014 tCsrStatsCallback callback, tANI_U8 staId, void *pContext)
14015{
14016 tANI_U8 stats[500];
14017 tANI_U8 *pStats = NULL;
14018 tANI_U32 tempMask = 0;
14019 tANI_U8 counter = 0;
14020 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070014021 if(!callback)
14022 {
14023 smsLog(pMac, LOGE, FL("csrRoamReportStatistics:cannot report callback NULL\n"));
14024 return;
14025 }
14026 if(!statsMask)
14027 {
14028 smsLog(pMac, LOGE, FL("csrRoamReportStatistics:cannot report statsMask is 0\n"));
14029 return;
14030 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014031 pStats = stats;
Jeff Johnson295189b2012-06-20 16:38:30 -070014032 tempMask = statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -070014033 while(tempMask)
14034 {
14035 if(tempMask & 1)
14036 {
14037 //new stats info from PE, fill up the stats strucutres in PMAC
14038 switch(counter)
14039 {
14040 case eCsrSummaryStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014041 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:summary stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014042 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.summaryStatsInfo,
14043 sizeof(tCsrSummaryStatsInfo));
14044 if(!HAL_STATUS_SUCCESS(status))
14045 {
14046 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy summary stats\n"));
14047 }
14048 pStats += sizeof(tCsrSummaryStatsInfo);
14049 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014050 case eCsrGlobalClassAStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014051 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassA stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014052 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classAStatsInfo,
14053 sizeof(tCsrGlobalClassAStatsInfo));
14054 if(!HAL_STATUS_SUCCESS(status))
14055 {
14056 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassA stats\n"));
14057 }
14058 pStats += sizeof(tCsrGlobalClassAStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014059 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014060 case eCsrGlobalClassBStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014061 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassB stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014062 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classBStatsInfo,
14063 sizeof(tCsrGlobalClassBStatsInfo));
14064 if(!HAL_STATUS_SUCCESS(status))
14065 {
14066 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassB stats\n"));
14067 }
14068 pStats += sizeof(tCsrGlobalClassBStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014069 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014070 case eCsrGlobalClassCStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014071 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassC stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014072 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classCStatsInfo,
14073 sizeof(tCsrGlobalClassCStatsInfo));
14074 if(!HAL_STATUS_SUCCESS(status))
14075 {
14076 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassC stats\n"));
14077 }
14078 pStats += sizeof(tCsrGlobalClassCStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014079 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014080 case eCsrGlobalClassDStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014081 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassD stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014082 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classDStatsInfo,
14083 sizeof(tCsrGlobalClassDStatsInfo));
14084 if(!HAL_STATUS_SUCCESS(status))
14085 {
14086 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassD stats\n"));
14087 }
14088 pStats += sizeof(tCsrGlobalClassDStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014089 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014090 case eCsrPerStaStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014091 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:PerSta stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014092 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.perStaStatsInfo[staId],
14093 sizeof(tCsrPerStaStatsInfo));
14094 if(!HAL_STATUS_SUCCESS(status))
14095 {
14096 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy PerSta stats\n"));
14097 }
14098 pStats += sizeof(tCsrPerStaStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014099 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014100 default:
14101 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:unknown stats type\n"));
14102 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014103 }
14104 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014105 tempMask >>=1;
14106 counter++;
14107 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014108 callback(stats, pContext );
Jeff Johnson295189b2012-06-20 16:38:30 -070014109}
14110
Jeff Johnson295189b2012-06-20 16:38:30 -070014111eHalStatus csrRoamDeregStatisticsReq(tpAniSirGlobal pMac)
14112{
14113 tListElem *pEntry = NULL;
14114 tListElem *pPrevEntry = NULL;
14115 tCsrStatsClientReqInfo *pTempStaEntry = NULL;
14116 eHalStatus status = eHAL_STATUS_SUCCESS;
14117 VOS_STATUS vosStatus;
14118 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070014119 if(!pEntry)
14120 {
14121 //list empty
14122 smsLog(pMac, LOGW, "csrRoamDeregStatisticsReq: List empty, no request from "
14123 "upper layer client(s)\n");
14124 return status;
14125 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014126 while( pEntry )
14127 {
14128 if(pPrevEntry)
14129 {
14130 pTempStaEntry = GET_BASE_ADDR( pPrevEntry, tCsrStatsClientReqInfo, link );
14131 //send up the stats report
14132 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
14133 pTempStaEntry->staId, pTempStaEntry->pContext);
14134 csrRoamRemoveStatListEntry(pMac, pPrevEntry);
14135 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014136 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070014137 if (pTempStaEntry->pPeStaEntry) //pPeStaEntry can be NULL
14138 {
Jeff Johnsone7245742012-09-05 17:12:55 -070014139 pTempStaEntry->pPeStaEntry->numClient--;
14140 //check if we need to delete the entry from peStatsReqList too
14141 if(!pTempStaEntry->pPeStaEntry->numClient)
14142 {
14143 csrRoamRemoveEntryFromPeStatsReqList(pMac, pTempStaEntry->pPeStaEntry);
14144 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014145 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014146 //check if we need to stop the tl stats timer too
14147 pMac->roam.tlStatsReqInfo.numClient--;
14148 if(!pMac->roam.tlStatsReqInfo.numClient)
14149 {
14150 if(pMac->roam.tlStatsReqInfo.timerRunning)
14151 {
14152 status = palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
14153 if(!HAL_STATUS_SUCCESS(status))
14154 {
14155 smsLog(pMac, LOGE, FL("csrRoamDeregStatisticsReq:cannot stop TlStatsTimer timer\n"));
14156 //we will continue
14157 }
14158 }
14159 pMac->roam.tlStatsReqInfo.periodicity = 0;
14160 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
14161 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014162 if (pTempStaEntry->periodicity)
14163 {
14164 //While creating StaEntry in csrGetStatistics,
14165 //Initializing and starting timer only when periodicity is set.
14166 //So Stop and Destroy timer only when periodicity is set.
14167
Jeff Johnsone7245742012-09-05 17:12:55 -070014168 vos_timer_stop( &pTempStaEntry->timer );
14169 // Destroy the vos timer...
14170 vosStatus = vos_timer_destroy( &pTempStaEntry->timer );
14171 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14172 {
14173 smsLog(pMac, LOGE, FL("csrRoamDeregStatisticsReq:failed to destroy Client req timer\n"));
14174 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014175 }
Jeff Johnsone7245742012-09-05 17:12:55 -070014176
Jeff Johnson295189b2012-06-20 16:38:30 -070014177
14178 pPrevEntry = pEntry;
14179 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
14180 }
14181 //the last one
14182 if(pPrevEntry)
14183 {
14184 pTempStaEntry = GET_BASE_ADDR( pPrevEntry, tCsrStatsClientReqInfo, link );
14185 //send up the stats report
14186 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
14187 pTempStaEntry->staId, pTempStaEntry->pContext);
14188 csrRoamRemoveStatListEntry(pMac, pPrevEntry);
14189 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014190 return status;
14191
14192}
14193
Jeff Johnson295189b2012-06-20 16:38:30 -070014194eHalStatus csrIsFullPowerNeeded( tpAniSirGlobal pMac, tSmeCmd *pCommand,
14195 tRequestFullPowerReason *pReason,
14196 tANI_BOOLEAN *pfNeedPower )
14197{
14198 tANI_BOOLEAN fNeedFullPower = eANI_BOOLEAN_FALSE;
14199 tRequestFullPowerReason reason = eSME_REASON_OTHER;
14200 tPmcState pmcState;
14201 eHalStatus status = eHAL_STATUS_SUCCESS;
14202 // TODO : Session info unavailable
14203 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070014204 if( pfNeedPower )
14205 {
14206 *pfNeedPower = eANI_BOOLEAN_FALSE;
14207 }
14208 //We only handle CSR commands
14209 if( !(eSmeCsrCommandMask & pCommand->command) )
14210 {
14211 return eHAL_STATUS_SUCCESS;
14212 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014213 //Check PMC state first
14214 pmcState = pmcGetPmcState( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -070014215 switch( pmcState )
14216 {
14217 case REQUEST_IMPS:
14218 case IMPS:
14219 if( eSmeCommandScan == pCommand->command )
14220 {
14221 switch( pCommand->u.scanCmd.reason )
14222 {
14223 case eCsrScanGetResult:
14224 case eCsrScanBGScanAbort:
14225 case eCsrScanBGScanEnable:
14226 case eCsrScanGetScanChnInfo:
14227 //Internal process, no need for full power
14228 fNeedFullPower = eANI_BOOLEAN_FALSE;
14229 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014230 default:
14231 //Other scans are real scan, ask for power
14232 fNeedFullPower = eANI_BOOLEAN_TRUE;
14233 break;
14234 } //switch
14235 }
14236 else
14237 {
14238 //ask for power for roam and status change
14239 fNeedFullPower = eANI_BOOLEAN_TRUE;
14240 }
14241 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014242 case REQUEST_BMPS:
14243 case BMPS:
14244 case REQUEST_START_UAPSD:
14245 case UAPSD:
14246 //We treat WOWL same as BMPS
14247 case REQUEST_ENTER_WOWL:
14248 case WOWL:
14249 if( eSmeCommandRoam == pCommand->command )
14250 {
14251 tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
14252 tCsrScanResult *pScanResult;
14253 tListElem *pEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070014254 switch ( pCommand->u.roamCmd.roamReason )
14255 {
14256 case eCsrForcedDisassoc:
14257 case eCsrForcedDisassocMICFailure:
14258 reason = eSME_LINK_DISCONNECTED_BY_HDD;
14259 fNeedFullPower = eANI_BOOLEAN_TRUE;
14260 break;
14261 case eCsrSmeIssuedDisassocForHandoff:
14262 case eCsrForcedDeauth:
14263 case eCsrHddIssuedReassocToSameAP:
14264 case eCsrSmeIssuedReassocToSameAP:
14265 fNeedFullPower = eANI_BOOLEAN_TRUE;
14266 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014267 case eCsrCapsChange:
14268 fNeedFullPower = eANI_BOOLEAN_TRUE;
14269 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014270 default:
14271 //Check whether the profile is already connected. If so, no need for full power
14272 //Note: IBSS is ignored for now because we don't support powersave in IBSS
14273 if ( csrIsConnStateConnectedInfra(pMac, sessionId) && pBSSList )
14274 {
14275 //Only need to check the first one
14276 pEntry = csrLLPeekHead(&pBSSList->List, LL_ACCESS_LOCK);
14277 if( pEntry )
14278 {
14279 pScanResult = GET_BASE_ADDR(pEntry, tCsrScanResult, Link);
14280#if 0
14281 // TODO : Session Specific info pConnectBssDesc
14282 if( csrIsBssIdEqual( pMac, &pScanResult->Result.BssDescriptor, pMac->roam.pConnectBssDesc ) &&
14283 csrIsSsidEqual( pMac, pMac->roam.pConnectBssDesc,
14284 &pScanResult->Result.BssDescriptor, (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ) ) )
14285 {
14286 // Check to see if the Auth type has changed in the Profile. If so, we don't want to Reassociate
14287 // with Authenticating first. To force this, stop the current association (Disassociate) and
14288 // then re 'Join' the AP, wihch will force an Authentication (with the new Auth type) followed by
14289 // a new Association.
14290 if(csrIsSameProfile(pMac, &pMac->roam.connectedProfile, pProfile))
14291 {
14292 if(csrRoamIsSameProfileKeys(pMac, &pMac->roam.connectedProfile, pProfile))
14293 {
14294 //Done, eventually, the command reaches eCsrReassocToSelfNoCapChange;
14295 //No need for full power
14296 //Set the flag so the code later can avoid to do the above
14297 //check again.
14298 pCommand->u.roamCmd.fReassocToSelfNoCapChange = eANI_BOOLEAN_TRUE;
14299 break;
14300 }
14301 }
14302 }
14303#endif
14304 }
14305 }
14306 //If we are here, full power is needed
14307 fNeedFullPower = eANI_BOOLEAN_TRUE;
14308 break;
14309 }
14310 }
14311 else if( eSmeCommandWmStatusChange == pCommand->command )
14312 {
14313 //need full power for all
14314 fNeedFullPower = eANI_BOOLEAN_TRUE;
14315 reason = eSME_LINK_DISCONNECTED_BY_OTHER;
14316 }
14317 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014318 case REQUEST_STOP_UAPSD:
14319 case REQUEST_EXIT_WOWL:
14320 if( eSmeCommandRoam == pCommand->command )
14321 {
14322 fNeedFullPower = eANI_BOOLEAN_TRUE;
14323 switch ( pCommand->u.roamCmd.roamReason )
14324 {
14325 case eCsrForcedDisassoc:
14326 case eCsrForcedDisassocMICFailure:
14327 reason = eSME_LINK_DISCONNECTED_BY_HDD;
14328 break;
14329 default:
14330 break;
14331 }
14332 }
14333 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014334 case STOPPED:
14335 case REQUEST_STANDBY:
14336 case STANDBY:
14337 case LOW_POWER:
14338 //We are not supposed to do anything
14339 smsLog( pMac, LOGE, FL( " cannot process because PMC is in stopped/standby state %d\n" ), pmcState );
14340 status = eHAL_STATUS_FAILURE;
14341 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014342 case FULL_POWER:
14343 case REQUEST_FULL_POWER:
14344 default:
14345 //No need to ask for full power. This has to be FULL_POWER state
14346 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014347 } //switch
Jeff Johnson295189b2012-06-20 16:38:30 -070014348 if( pReason )
14349 {
14350 *pReason = reason;
14351 }
14352 if( pfNeedPower )
14353 {
14354 *pfNeedPower = fNeedFullPower;
14355 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014356 return ( status );
14357}
14358
Jeff Johnson295189b2012-06-20 16:38:30 -070014359static eHalStatus csrRequestFullPower( tpAniSirGlobal pMac, tSmeCmd *pCommand )
14360{
14361 eHalStatus status = eHAL_STATUS_SUCCESS;
14362 tANI_BOOLEAN fNeedFullPower = eANI_BOOLEAN_FALSE;
14363 tRequestFullPowerReason reason = eSME_REASON_OTHER;
Jeff Johnson295189b2012-06-20 16:38:30 -070014364 status = csrIsFullPowerNeeded( pMac, pCommand, &reason, &fNeedFullPower );
Jeff Johnson295189b2012-06-20 16:38:30 -070014365 if( fNeedFullPower && HAL_STATUS_SUCCESS( status ) )
14366 {
14367 status = pmcRequestFullPower(pMac, csrFullPowerCallback, pMac, reason);
14368 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014369 return ( status );
14370}
14371
Jeff Johnson295189b2012-06-20 16:38:30 -070014372tSmeCmd *csrGetCommandBuffer( tpAniSirGlobal pMac )
14373{
14374 tSmeCmd *pCmd = smeGetCommandBuffer( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -070014375 if( pCmd )
14376 {
14377 pMac->roam.sPendingCommands++;
14378 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014379 return ( pCmd );
14380}
14381
Jeff Johnson295189b2012-06-20 16:38:30 -070014382void csrReleaseCommand(tpAniSirGlobal pMac, tSmeCmd *pCommand)
14383{
14384 if (pMac->roam.sPendingCommands > 0)
14385 {
14386 //All command allocated through csrGetCommandBuffer need to
14387 //decrement the pending count when releasing.
14388 pMac->roam.sPendingCommands--;
14389 smeReleaseCommand( pMac, pCommand );
14390 }
14391 else
14392 {
14393 smsLog(pMac, LOGE, FL( "no pending commands"));
14394 VOS_ASSERT(0);
14395 }
14396}
14397
Jeff Johnson295189b2012-06-20 16:38:30 -070014398//Return SUCCESS is the command is queued, failed
14399eHalStatus csrQueueSmeCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fHighPriority )
14400{
14401 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070014402 if( (eSmeCommandScan == pCommand->command) && pMac->scan.fDropScanCmd )
14403 {
14404 smsLog(pMac, LOGW, FL(" drop scan (scan reason %d) command"),
14405 pCommand->u.scanCmd.reason);
14406 return eHAL_STATUS_CSR_WRONG_STATE;
14407 }
14408
14409 //We can call request full power first before putting the command into pending Q
14410 //because we are holding SME lock at this point.
14411 status = csrRequestFullPower( pMac, pCommand );
14412 if( HAL_STATUS_SUCCESS( status ) )
14413 {
14414 tANI_BOOLEAN fNoCmdPending;
Jeff Johnson295189b2012-06-20 16:38:30 -070014415 //make sure roamCmdPendingList is not empty first
14416 fNoCmdPending = csrLLIsListEmpty( &pMac->roam.roamCmdPendingList, eANI_BOOLEAN_FALSE );
14417 if( fNoCmdPending )
14418 {
14419 smePushCommand( pMac, pCommand, fHighPriority );
14420 }
14421 else
14422 {
14423 //Other commands are waiting for PMC callback, queue the new command to the pending Q
14424 //no list lock is needed since SME lock is held
14425 if( !fHighPriority )
14426 {
14427 csrLLInsertTail( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14428 }
14429 else {
14430 csrLLInsertHead( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14431 }
14432 }
14433 }
14434 else if( eHAL_STATUS_PMC_PENDING == status )
14435 {
14436 //no list lock is needed since SME lock is held
14437 if( !fHighPriority )
14438 {
14439 csrLLInsertTail( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14440 }
14441 else {
14442 csrLLInsertHead( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14443 }
14444 //Let caller know the command is queue
14445 status = eHAL_STATUS_SUCCESS;
14446 }
14447 else
14448 {
14449 //Not to decrease pMac->roam.sPendingCommands here. Caller will decrease it when it
14450 //release the command.
14451 smsLog( pMac, LOGE, FL( " cannot queue command %d\n" ), pCommand->command );
14452 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014453 return ( status );
Jeff Johnson295189b2012-06-20 16:38:30 -070014454}
Jeff Johnson295189b2012-06-20 16:38:30 -070014455#ifdef WLAN_SOFTAP_FEATURE
14456eHalStatus csrRoamUpdateAPWPSIE( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirAPWPSIEs* pAPWPSIES )
14457{
14458 eHalStatus status = eHAL_STATUS_SUCCESS;
14459 tSirUpdateAPWPSIEsReq *pMsg;
14460 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
14461
14462 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14463 if (NULL == pSession)
14464 {
14465 smsLog( pMac, LOGE, FL( " Session does not exist for session id %d" ), sessionId);
14466 return eHAL_STATUS_FAILURE;
14467 }
14468
Jeff Johnson295189b2012-06-20 16:38:30 -070014469 do
14470 {
14471 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirUpdateAPWPSIEsReq) );
14472 if (!HAL_STATUS_SUCCESS(status)) break;
14473 palZeroMemory( pMac->hHdd, pMsg, sizeof(tSirUpdateAPWPSIEsReq) );
14474 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_UPDATE_APWPSIE_REQ);
14475
14476 pBuf = (tANI_U8 *)&pMsg->transactionId;
14477 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070014478 // transactionId
14479 *pBuf = 0;
14480 *( pBuf + 1 ) = 0;
14481 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070014482 // bssId
14483 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
14484 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070014485 //sessionId
14486 *pBuf++ = (tANI_U8)sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070014487 // APWPSIEs
14488 palCopyMemory( pMac->hHdd, (tSirAPWPSIEs *)pBuf, pAPWPSIES, sizeof(tSirAPWPSIEs));
14489 pBuf += sizeof(tSirAPWPSIEs);
Jeff Johnson295189b2012-06-20 16:38:30 -070014490 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32) + (pBuf - wTmpBuf))); //msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070014491 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070014492 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070014493 return ( status );
14494}
Jeff Johnson295189b2012-06-20 16:38:30 -070014495eHalStatus csrRoamUpdateWPARSNIEs( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirRSNie * pAPSirRSNie)
14496{
14497 eHalStatus status = eHAL_STATUS_SUCCESS;
14498 tSirUpdateAPWPARSNIEsReq *pMsg;
14499 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070014500 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14501 if (NULL == pSession)
14502 {
14503 smsLog( pMac, LOGE, FL( " Session does not exist for session id %d" ), sessionId);
14504 return eHAL_STATUS_FAILURE;
14505 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014506 do
14507 {
14508 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirUpdateAPWPARSNIEsReq) );
14509 if (!HAL_STATUS_SUCCESS(status)) break;
14510 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirUpdateAPWPARSNIEsReq ) );
14511 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SET_APWPARSNIEs_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070014512 pBuf = (tANI_U8 *)&pMsg->transactionId;
14513 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070014514 // transactionId
14515 *pBuf = 0;
14516 *( pBuf + 1 ) = 0;
14517 pBuf += sizeof(tANI_U16);
14518
14519 // bssId
14520 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
14521 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070014522 // sessionId
14523 *pBuf++ = (tANI_U8)sessionId;
14524
14525 // APWPARSNIEs
14526 palCopyMemory( pMac->hHdd, (tSirRSNie *)pBuf, pAPSirRSNie, sizeof(tSirRSNie));
14527 pBuf += sizeof(tSirRSNie);
Jeff Johnson295189b2012-06-20 16:38:30 -070014528 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf))); //msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070014529 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070014530 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070014531 return ( status );
14532}
Jeff Johnson295189b2012-06-20 16:38:30 -070014533#endif //#ifdef WLAN_SOFTAP_FEATURE
14534
14535#ifdef WLAN_FEATURE_VOWIFI_11R
14536//eHalStatus csrRoamIssueFTPreauthReq(tHalHandle hHal, tANI_U32 sessionId, tCsrBssid preAuthBssid, tANI_U8 channelId)
14537eHalStatus csrRoamIssueFTPreauthReq(tHalHandle hHal, tANI_U32 sessionId, tpSirBssDescription pBssDescription)
14538{
14539 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
14540 tpSirFTPreAuthReq pftPreAuthReq;
14541 tANI_U16 auth_req_len = 0;
14542 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070014543 auth_req_len = sizeof(tSirFTPreAuthReq);
14544 pftPreAuthReq = (tpSirFTPreAuthReq)vos_mem_malloc(auth_req_len);
14545 if (pftPreAuthReq == NULL)
14546 {
14547 smsLog(pMac, LOGE, FL("Memory allocation for FT Preauth request failed"));
14548 return eHAL_STATUS_RESOURCES;
14549 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014550 // Save the SME Session ID here. We need it while processing the preauth response
14551 pMac->ft.ftSmeContext.smeSessionId = sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070014552 vos_mem_zero(pftPreAuthReq, auth_req_len);
14553
14554 pftPreAuthReq->pbssDescription = (tpSirBssDescription)vos_mem_malloc(
14555 sizeof(pBssDescription->length) + pBssDescription->length);
14556
14557 pftPreAuthReq->messageType = pal_cpu_to_be16(eWNI_SME_FT_PRE_AUTH_REQ);
14558
14559 pftPreAuthReq->preAuthchannelNum = pBssDescription->channelId;
14560
Jeff Johnson295189b2012-06-20 16:38:30 -070014561 palCopyMemory(pMac->hHdd, (void *)&pftPreAuthReq->currbssId, (void *)pSession->connectedProfile.bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070014562 palCopyMemory(pMac->hHdd, (void *)&pftPreAuthReq->preAuthbssId, (void *)pBssDescription->bssId, sizeof(tSirMacAddr));
14563
Jeff Johnson295189b2012-06-20 16:38:30 -070014564#ifdef WLAN_FEATURE_VOWIFI_11R
14565 if (csrRoamIs11rAssoc(pMac))
14566 {
14567 pftPreAuthReq->ft_ies_length = (tANI_U16)pMac->ft.ftSmeContext.auth_ft_ies_length;
14568 palCopyMemory(pMac->hHdd, pftPreAuthReq->ft_ies, pMac->ft.ftSmeContext.auth_ft_ies,
14569 pMac->ft.ftSmeContext.auth_ft_ies_length);
14570 }
14571 else
14572#endif
14573 {
14574 pftPreAuthReq->ft_ies_length = 0;
14575 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014576 vos_mem_copy(pftPreAuthReq->pbssDescription, pBssDescription, pBssDescription->length);
Jeff Johnson295189b2012-06-20 16:38:30 -070014577 pftPreAuthReq->length = pal_cpu_to_be16(sizeof(tSirFTPreAuthReq) + sizeof(pBssDescription->length) +
14578 pBssDescription->length);
Jeff Johnson295189b2012-06-20 16:38:30 -070014579 return palSendMBMessage(pMac->hHdd, pftPreAuthReq);
14580}
Jeff Johnson295189b2012-06-20 16:38:30 -070014581/*--------------------------------------------------------------------------
14582 * This will receive and process the FT Pre Auth Rsp from the current
14583 * associated ap.
14584 *
14585 * This will invoke the hdd call back. This is so that hdd can now
14586 * send the FTIEs from the Auth Rsp (Auth Seq 2) to the supplicant.
14587 ------------------------------------------------------------------------*/
14588void csrRoamFTPreAuthRspProcessor( tHalHandle hHal, tpSirFTPreAuthRsp pFTPreAuthRsp )
14589{
14590 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
14591 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson04dd8a82012-06-29 20:41:40 -070014592#ifdef FEATURE_WLAN_LFR
14593 tCsrRoamInfo roamInfo;
14594#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014595
14596#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
14597 smsLog( pMac, LOGE, FL("Preauth response status code %d"), pFTPreAuthRsp->status);
14598#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014599#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
14600 csrNeighborRoamPreauthRspHandler(pMac, (VOS_STATUS)pFTPreAuthRsp->status);
14601#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014602 /* The below function calls/timers should be invoked only if the pre-auth is successful */
14603 if (VOS_STATUS_SUCCESS != (VOS_STATUS)pFTPreAuthRsp->status)
14604 return;
Jeff Johnson295189b2012-06-20 16:38:30 -070014605 // Implies a success
14606 pMac->ft.ftSmeContext.FTState = eFT_AUTH_COMPLETE;
Jeff Johnson295189b2012-06-20 16:38:30 -070014607 // Indicate SME QoS module the completion of Preauth success. This will trigger the creation of RIC IEs
14608 pMac->ft.ftSmeContext.psavedFTPreAuthRsp = pFTPreAuthRsp;
14609 sme_QosCsrEventInd(pMac, pMac->ft.ftSmeContext.smeSessionId, SME_QOS_CSR_PREAUTH_SUCCESS_IND, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070014610 /* Start the pre-auth reassoc interval timer with a period of 400ms. When this expires,
14611 * actual transition from the current to handoff AP is triggered */
14612 status = palTimerStart(pMac->hHdd, pMac->ft.ftSmeContext.preAuthReassocIntvlTimer,
14613 60 * PAL_TIMER_TO_MS_UNIT,
14614 eANI_BOOLEAN_FALSE);
14615 if (eHAL_STATUS_SUCCESS != status)
14616 {
14617 smsLog(pMac, LOGE, FL("Preauth reassoc interval timer start failed to start with status %d\n"), status);
14618 return;
14619 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014620 // Save the received response
14621 palCopyMemory(pMac->hHdd, (void *)&pMac->ft.ftSmeContext.preAuthbssId, (void *)pFTPreAuthRsp->preAuthbssId, sizeof(tCsrBssid));
14622 if (csrRoamIs11rAssoc(pMac))
14623 csrRoamCallCallback(pMac, pFTPreAuthRsp->smeSessionId, NULL, 0,
14624 eCSR_ROAM_FT_RESPONSE, eCSR_ROAM_RESULT_NONE);
14625
14626 // Currently we dont do anything special for CCX connection.
Jeff Johnson04dd8a82012-06-29 20:41:40 -070014627#ifdef FEATURE_WLAN_LFR
14628 // If Legacy Fast Roaming is enabled, signal the supplicant
14629 // So he can send us a PMK-ID for this candidate AP.
14630 if (csrRoamIsFastRoamEnabled(pMac))
14631 {
14632 // Save the bssid from the received response
14633 palCopyMemory(pMac->hHdd, (void *)&roamInfo.bssid, (void *)pFTPreAuthRsp->preAuthbssId, sizeof(tCsrBssid));
14634 csrRoamCallCallback(pMac, pFTPreAuthRsp->smeSessionId, &roamInfo, 0, eCSR_ROAM_PMK_NOTIFY, 0);
14635 }
14636
14637#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014638
14639 // Done with it, init it.
14640 pMac->ft.ftSmeContext.psavedFTPreAuthRsp = NULL;
14641}
14642#endif
14643#ifdef FEATURE_WLAN_BTAMP_UT_RF
14644void csrRoamJoinRetryTimerHandler(void *pv)
14645{
14646 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
14647 tpAniSirGlobal pMac = pInfo->pMac;
14648 tANI_U32 sessionId = pInfo->sessionId;
14649 tCsrRoamSession *pSession;
14650
14651 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
14652 {
14653 smsLog( pMac, LOGE, FL( " retrying the last roam profile on session %d\n" ), sessionId );
14654 pSession = CSR_GET_SESSION( pMac, sessionId );
14655 if(pSession->pCurRoamProfile && csrIsConnStateDisconnected(pMac, sessionId))
14656 {
14657 if( !HAL_STATUS_SUCCESS(csrRoamJoinLastProfile(pMac, sessionId)) )
14658 {
14659 smsLog( pMac, LOGE, FL( " fail to retry the last roam profile\n" ) );
14660 }
14661 }
14662 }
14663}
Jeff Johnson295189b2012-06-20 16:38:30 -070014664eHalStatus csrRoamStartJoinRetryTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
14665{
14666 eHalStatus status = eHAL_STATUS_FAILURE;
14667 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14668
14669 if(pSession->pCurRoamProfile && pSession->maxRetryCount)
14670 {
14671 smsLog(pMac, LOGE, FL(" call sessionId %d retry count %d left\n "), sessionId, pSession->maxRetryCount);
14672 pSession->maxRetryCount--;
14673 pSession->joinRetryTimerInfo.pMac = pMac;
14674 pSession->joinRetryTimerInfo.sessionId = (tANI_U8)sessionId;
14675 status = palTimerStart(pMac->hHdd, pSession->hTimerJoinRetry, interval, eANI_BOOLEAN_FALSE);
14676 if(!HAL_STATUS_SUCCESS(status))
14677 {
14678 smsLog(pMac, LOGE, FL(" fail to start timer status %s \n "), status);
14679 }
14680 }
14681 else
14682 {
14683 smsLog(pMac, LOGE, FL(" not to start timer due to no profile or reach mac ret (%d)\n "),
14684 pSession->maxRetryCount);
14685 }
14686
14687 return (status);
14688}
Jeff Johnson295189b2012-06-20 16:38:30 -070014689eHalStatus csrRoamStopJoinRetryTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
14690{
14691 smsLog(pMac, LOGE, " csrRoamStopJoinRetryTimer \n ");
14692 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
14693 {
14694 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerJoinRetry));
14695 }
14696
14697 return eHAL_STATUS_SUCCESS;
14698}
14699#endif
14700
14701
14702/*
14703 pBuf points to the beginning of the message
14704 LIM packs disassoc rsp as below,
14705 messageType - 2 bytes
14706 messageLength - 2 bytes
14707 sessionId - 1 byte
14708 transactionId - 2 bytes (tANI_U16)
14709 reasonCode - 4 bytes (sizeof(tSirResultCodes))
14710 peerMacAddr - 6 bytes
14711 The rest is conditionally defined of (WNI_POLARIS_FW_PRODUCT == AP) and not used
14712*/
14713static void csrSerDesUnpackDiassocRsp(tANI_U8 *pBuf, tSirSmeDisassocRsp *pRsp)
14714{
14715 if(pBuf && pRsp)
14716 {
14717 pBuf += 4; //skip type and length
14718 pRsp->sessionId = *pBuf++;
14719 pal_get_U16( pBuf, (tANI_U16 *)&pRsp->transactionId );
14720 pBuf += 2;
14721 pal_get_U32( pBuf, (tANI_U32 *)&pRsp->statusCode );
14722 pBuf += 4;
14723 vos_mem_copy(pRsp->peerMacAddr, pBuf, 6);
14724 }
14725}
14726
Jeff Johnsond13512a2012-07-17 11:42:19 -070014727eHalStatus csrGetDefaultCountryCodeFrmNv(tpAniSirGlobal pMac, tANI_U8 *pCountry)
14728{
14729 static uNvTables nvTables;
14730 eHalStatus status = eHAL_STATUS_SUCCESS;
14731 VOS_STATUS vosStatus = vos_nv_readDefaultCountryTable( &nvTables );
14732
14733 /* read the country code from NV and use it */
14734 if ( VOS_IS_STATUS_SUCCESS(vosStatus) )
14735 {
14736 palCopyMemory( pMac->hHdd, pCountry,
14737 nvTables.defaultCountryTable.countryCode,
14738 WNI_CFG_COUNTRY_CODE_LEN );
14739 return status;
14740 }
14741 else
14742 {
14743 palCopyMemory( pMac->hHdd, pCountry,
14744 "XXX",
14745 WNI_CFG_COUNTRY_CODE_LEN );
14746 status = eHAL_STATUS_FAILURE;
14747 return status;
14748 }
14749}
14750
14751eHalStatus csrGetCurrentCountryCode(tpAniSirGlobal pMac, tANI_U8 *pCountry)
14752{
14753 palCopyMemory( pMac->hHdd, pCountry,
14754 pMac->scan.countryCode11d,
14755 WNI_CFG_COUNTRY_CODE_LEN );
14756 return eHAL_STATUS_SUCCESS;
14757}