blob: 915729cb3952964c0c954ce176785c43db0a68e1 [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);
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -0700264void csrReinitPreauthCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand);
Jeff Johnson295189b2012-06-20 16:38:30 -0700265
266//Initialize global variables
267static void csrRoamInitGlobals(tpAniSirGlobal pMac)
268{
269 if(pMac)
270 {
271 pMac->roam.powerTableFromEeprom = csrRoamPowerTableFromEeprom;
272 pMac->roam.powerTableFromEeprom40MHz = csrRoamPowerTableFromEeprom40MHz;
273 pMac->roam.roamSession = csrRoamRoamSession;
274 }
275 return;
276}
277
Jeff Johnson295189b2012-06-20 16:38:30 -0700278static void csrRoamDeInitGlobals(tpAniSirGlobal pMac)
279{
280 if(pMac)
281 {
282 pMac->roam.powerTableFromEeprom = NULL;
283 pMac->roam.powerTableFromEeprom40MHz = NULL;
284 pMac->roam.roamSession = NULL;
285 }
286 return;
287}
Jeff Johnson295189b2012-06-20 16:38:30 -0700288eHalStatus csrOpen(tpAniSirGlobal pMac)
289{
290 eHalStatus status = eHAL_STATUS_SUCCESS;
291 static uNvTables nvTables;
292 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700293 v_REGDOMAIN_t regId;
294 tANI_U32 i;
295
296 do
297 {
298 /* Initialize CSR Roam Globals */
299 csrRoamInitGlobals(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -0700300 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
301 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_STOP, i);
302
303 initConfigParam(pMac);
304 if(!HAL_STATUS_SUCCESS((status = csrScanOpen(pMac))))
305 break;
306 if(!HAL_STATUS_SUCCESS((status = csrRoamOpen(pMac))))
307 break;
308 pMac->roam.nextRoamId = 1; //Must not be 0
309 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &pMac->roam.statsClientReqList)))
310 break;
311 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &pMac->roam.peStatsReqList)))
312 break;
313 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &pMac->roam.roamCmdPendingList)))
314 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700315 vosStatus = vos_nv_readDefaultCountryTable( &nvTables );
316 if ( VOS_IS_STATUS_SUCCESS(vosStatus) )
317 {
318 palCopyMemory( pMac->hHdd, pMac->scan.countryCodeDefault,
319 nvTables.defaultCountryTable.countryCode, WNI_CFG_COUNTRY_CODE_LEN );
320 status = eHAL_STATUS_SUCCESS;
321 }
322 else
323 {
324 smsLog( pMac, LOGE, FL(" fail to get NV_FIELD_IMAGE\n") );
325 //hardcoded for now
326 pMac->scan.countryCodeDefault[0] = 'U';
327 pMac->scan.countryCodeDefault[1] = 'S';
328 pMac->scan.countryCodeDefault[2] = 'I';
329 //status = eHAL_STATUS_SUCCESS;
330 }
Madan Mohan Koyyalamudi8b7f1e62012-10-05 14:56:51 -0700331 smsLog( pMac, LOG1, FL(" country Code from nvRam %s"), pMac->scan.countryCodeDefault );
Jeff Johnson295189b2012-06-20 16:38:30 -0700332 csrGetRegulatoryDomainForCountry(pMac, pMac->scan.countryCodeDefault, &regId);
Jeff Johnson295189b2012-06-20 16:38:30 -0700333 WDA_SetRegDomain(pMac, regId);
334 pMac->scan.domainIdDefault = regId;
335 pMac->scan.domainIdCurrent = pMac->scan.domainIdDefault;
Jeff Johnson295189b2012-06-20 16:38:30 -0700336 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeCurrent,
337 pMac->scan.countryCodeDefault, WNI_CFG_COUNTRY_CODE_LEN);
338 status = csrInitGetChannels( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -0700339 }while(0);
340
341 return (status);
342}
343
Jeff Johnson295189b2012-06-20 16:38:30 -0700344#ifdef WLAN_SOFTAP_FEATURE
345eHalStatus csrSetRegInfo(tHalHandle hHal, tANI_U8 *apCntryCode)
346{
347 eHalStatus status = eHAL_STATUS_SUCCESS;
348 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
349 v_REGDOMAIN_t regId;
350 v_U8_t cntryCodeLength;
Jeff Johnson295189b2012-06-20 16:38:30 -0700351 if(NULL == apCntryCode)
352 {
353 smsLog( pMac, LOGW, FL(" Invalid country Code Pointer\n") );
354 return eHAL_STATUS_FAILURE;
355 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700356 smsLog( pMac, LOGW, FL(" country Code %s\n"), apCntryCode );
Jeff Johnson295189b2012-06-20 16:38:30 -0700357 /* To get correct Regulatory domain from NV table
358 * 2 character Country code should be used
359 * 3rd charater is optional for indoor/outdoor setting */
360 cntryCodeLength = strlen(apCntryCode);
Madan Mohan Koyyalamudib666eb12012-09-18 17:29:47 -0700361
362 if (cntryCodeLength > WNI_CFG_COUNTRY_CODE_LEN)
363 {
364 smsLog( pMac, LOGW, FL(" Invalid Country Code Length\n") );
365 return eHAL_STATUS_FAILURE;
366 }
367
Jeff Johnson295189b2012-06-20 16:38:30 -0700368 status = csrGetRegulatoryDomainForCountry(pMac, apCntryCode, &regId);
369 if (status != eHAL_STATUS_SUCCESS)
370 {
371 smsLog( pMac, LOGE, FL(" fail to get regId for country Code %s\n"), apCntryCode );
372 return status;
373 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700374 status = WDA_SetRegDomain(hHal, regId);
375 if (status != eHAL_STATUS_SUCCESS)
376 {
377 smsLog( pMac, LOGE, FL(" fail to get regId for country Code %s\n"), apCntryCode );
378 return status;
379 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700380 pMac->scan.domainIdDefault = regId;
381 pMac->scan.domainIdCurrent = pMac->scan.domainIdDefault;
Jeff Johnson295189b2012-06-20 16:38:30 -0700382 /* Clear CC field */
383 palFillMemory( pMac->hHdd,
384 pMac->scan.countryCodeDefault,
385 WNI_CFG_COUNTRY_CODE_LEN,
386 0 );
387 /* Copy 2 or 3 bytes country code */
388 palCopyMemory( pMac->hHdd, pMac->scan.countryCodeDefault,
389 apCntryCode, cntryCodeLength );
Jeff Johnson295189b2012-06-20 16:38:30 -0700390 /* If 2 bytes country code, 3rd byte must be filled with space */
391 if((WNI_CFG_COUNTRY_CODE_LEN - 1) == cntryCodeLength)
392 {
393 palFillMemory( pMac->hHdd,
394 pMac->scan.countryCodeDefault + 2,
395 1,
396 0x20 );
397 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700398 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeCurrent,
399 pMac->scan.countryCodeDefault, WNI_CFG_COUNTRY_CODE_LEN);
400 status = csrInitGetChannels( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -0700401 return status;
402}
Jeff Johnson295189b2012-06-20 16:38:30 -0700403eHalStatus csrSetChannels(tHalHandle hHal, tCsrConfigParam *pParam )
404{
405 eHalStatus status = eHAL_STATUS_SUCCESS;
406 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
407 tANI_U8 index = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700408 palCopyMemory( pMac->hHdd, pParam->Csr11dinfo.countryCode,
409 pMac->scan.countryCodeCurrent, WNI_CFG_COUNTRY_CODE_LEN );
Jeff Johnson295189b2012-06-20 16:38:30 -0700410 for ( index = 0; index < pMac->scan.base20MHzChannels.numChannels ; index++)
411 {
412 pParam->Csr11dinfo.Channels.channelList[index] = pMac->scan.base20MHzChannels.channelList[ index ];
413 pParam->Csr11dinfo.ChnPower[index].firstChannel = pMac->scan.base20MHzChannels.channelList[ index ];
414 pParam->Csr11dinfo.ChnPower[index].numChannels = 1;
415 pParam->Csr11dinfo.ChnPower[index].maxtxPower = pMac->scan.defaultPowerTable[index].pwr;
416 }
417 pParam->Csr11dinfo.Channels.numChannels = pMac->scan.base20MHzChannels.numChannels;
418
419 return status;
420}
421#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700422eHalStatus csrClose(tpAniSirGlobal pMac)
423{
424 eHalStatus status = eHAL_STATUS_SUCCESS;
425
426 csrStop(pMac);
427 csrRoamClose(pMac);
428 csrScanClose(pMac);
429 csrLLClose(&pMac->roam.statsClientReqList);
430 csrLLClose(&pMac->roam.peStatsReqList);
431 csrLLClose(&pMac->roam.roamCmdPendingList);
Jeff Johnson295189b2012-06-20 16:38:30 -0700432 /* DeInit Globals */
433 csrRoamDeInitGlobals(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -0700434 return (status);
435}
Jeff Johnson295189b2012-06-20 16:38:30 -0700436eHalStatus csrStart(tpAniSirGlobal pMac)
437{
438 eHalStatus status = eHAL_STATUS_SUCCESS;
439 tANI_U32 i;
440
441 do
442 {
443 //save the global vos context
444 pMac->roam.gVosContext = vos_get_global_context(VOS_MODULE_ID_SME, pMac);
445 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
446 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, i );
447
448 status = csrRoamStart(pMac);
449 if(!HAL_STATUS_SUCCESS(status)) break;
450 pMac->scan.f11dInfoApplied = eANI_BOOLEAN_FALSE;
451 status = pmcRegisterPowerSaveCheck(pMac, csrCheckPSReady, pMac);
452 if(!HAL_STATUS_SUCCESS(status)) break;
453 pMac->roam.sPendingCommands = 0;
454 csrScanEnable(pMac);
455#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
456 status = csrNeighborRoamInit(pMac);
457#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
458 pMac->roam.tlStatsReqInfo.numClient = 0;
459 pMac->roam.tlStatsReqInfo.periodicity = 0;
460 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
461 //init the link quality indication also
462 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_MIN_IND;
463 if(!HAL_STATUS_SUCCESS(status))
464 {
465 smsLog(pMac, LOGW, " csrStart: Couldn't Init HO control blk \n");
466 break;
467 }
468 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700469#if defined(ANI_LOGDUMP)
470 csrDumpInit(pMac);
471#endif //#if defined(ANI_LOGDUMP)
Jeff Johnson295189b2012-06-20 16:38:30 -0700472 return (status);
473}
474
Jeff Johnson295189b2012-06-20 16:38:30 -0700475eHalStatus csrStop(tpAniSirGlobal pMac)
476{
477 tANI_U32 sessionId;
478 tANI_U32 i;
479
480 for(sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
481 {
482 csrRoamCloseSession(pMac, sessionId, TRUE, NULL, NULL);
483 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700484 csrScanDisable(pMac);
485 pMac->scan.fCancelIdleScan = eANI_BOOLEAN_FALSE;
486 pMac->scan.fRestartIdleScan = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700487 csrLLPurge( &pMac->roam.roamCmdPendingList, eANI_BOOLEAN_TRUE );
488
489#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
490 csrNeighborRoamClose(pMac);
491#endif
492 csrScanFlushResult(pMac); //Do we want to do this?
Jeff Johnson295189b2012-06-20 16:38:30 -0700493 // deregister from PMC since we register during csrStart()
494 // (ignore status since there is nothing we can do if it fails)
495 (void) pmcDeregisterPowerSaveCheck(pMac, csrCheckPSReady);
Jeff Johnson295189b2012-06-20 16:38:30 -0700496 //Reset the domain back to the deault
497 pMac->scan.domainIdCurrent = pMac->scan.domainIdDefault;
498 csrResetCountryInformation(pMac, eANI_BOOLEAN_TRUE);
499
500 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
501 {
502 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_STOP ,i );
503 pMac->roam.curSubState[i] = eCSR_ROAM_SUBSTATE_NONE;
504 }
505
506 return (eHAL_STATUS_SUCCESS);
507}
508
Jeff Johnson295189b2012-06-20 16:38:30 -0700509eHalStatus csrReady(tpAniSirGlobal pMac)
510{
511 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700512 csrScanGetSupportedChannels( pMac );
513 //WNI_CFG_VALID_CHANNEL_LIST should be set by this time
514 //use it to init the background scan list
515 csrInitBGScanChannelList(pMac);
516 /* HDD issues the init scan */
517 csrScanStartResultAgingTimer(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -0700518 //Store the AC weights in TL for later use
519 WLANTL_GetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
Jeff Johnson295189b2012-06-20 16:38:30 -0700520 status = csrInitChannelList( pMac );
521 if ( ! HAL_STATUS_SUCCESS( status ) )
522 {
523 smsLog( pMac, LOGE, "csrInitChannelList failed during csrReady with status=%d\n",
524 status );
525 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700526 return (status);
527}
Jeff Johnson295189b2012-06-20 16:38:30 -0700528void csrSetDefaultDot11Mode( tpAniSirGlobal pMac )
529{
530 v_U32_t wniDot11mode = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700531 wniDot11mode = csrTranslateToWNICfgDot11Mode(pMac,pMac->roam.configParam.uCfgDot11Mode);
532 ccmCfgSetInt(pMac, WNI_CFG_DOT11_MODE, wniDot11mode, NULL, eANI_BOOLEAN_FALSE);
533}
Jeff Johnson295189b2012-06-20 16:38:30 -0700534void csrSetGlobalCfgs( tpAniSirGlobal pMac )
535{
Jeff Johnsone7245742012-09-05 17:12:55 -0700536
Jeff Johnson295189b2012-06-20 16:38:30 -0700537 ccmCfgSetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD, csrGetFragThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
538 ccmCfgSetInt(pMac, WNI_CFG_RTS_THRESHOLD, csrGetRTSThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
539 ccmCfgSetInt(pMac, WNI_CFG_11D_ENABLED,
540 ((pMac->roam.configParam.Is11hSupportEnabled) ? pMac->roam.configParam.Is11dSupportEnabled : pMac->roam.configParam.Is11dSupportEnabled),
541 NULL, eANI_BOOLEAN_FALSE);
542 ccmCfgSetInt(pMac, WNI_CFG_11H_ENABLED, pMac->roam.configParam.Is11hSupportEnabled, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnsone7245742012-09-05 17:12:55 -0700543 /* 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
544 * Once session is established we will use the session related params stored in PE session for CB mode
545 */
546 ccmCfgSetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, !!(pMac->roam.configParam.channelBondingMode5GHz), NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -0700547 ccmCfgSetInt(pMac, WNI_CFG_HEART_BEAT_THRESHOLD, pMac->roam.configParam.HeartbeatThresh24, NULL, eANI_BOOLEAN_FALSE);
548
549 //Update the operating mode to configured value during initialization,
550 //So that client can advertise full capabilities in Probe request frame.
551 csrSetDefaultDot11Mode( pMac );
552}
553
Jeff Johnson295189b2012-06-20 16:38:30 -0700554eHalStatus csrRoamOpen(tpAniSirGlobal pMac)
555{
556 eHalStatus status = eHAL_STATUS_SUCCESS;
557 tANI_U32 i;
558 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -0700559 do
560 {
561 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
562 {
563 pSession = CSR_GET_SESSION( pMac, i );
564 pSession->roamingTimerInfo.pMac = pMac;
565 pSession->roamingTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
566 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700567 pMac->roam.WaitForKeyTimerInfo.pMac = pMac;
568 pMac->roam.WaitForKeyTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
569 status = palTimerAlloc(pMac->hHdd, &pMac->roam.hTimerWaitForKey, csrRoamWaitForKeyTimeOutHandler,
570 &pMac->roam.WaitForKeyTimerInfo);
571 if(!HAL_STATUS_SUCCESS(status))
572 {
573 smsLog(pMac, LOGE, FL("cannot allocate memory for WaitForKey time out timer\n"));
574 break;
575 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700576 status = palTimerAlloc(pMac->hHdd, &pMac->roam.tlStatsReqInfo.hTlStatsTimer, csrRoamTlStatsTimerHandler, pMac);
577 if(!HAL_STATUS_SUCCESS(status))
578 {
579 smsLog(pMac, LOGE, FL("cannot allocate memory for summary Statistics timer\n"));
580 return eHAL_STATUS_FAILURE;
581 }
582 }while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700583 return (status);
584}
585
Jeff Johnson295189b2012-06-20 16:38:30 -0700586eHalStatus csrRoamClose(tpAniSirGlobal pMac)
587{
588 tANI_U32 sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -0700589 for(sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++)
590 {
591 csrRoamCloseSession(pMac, sessionId, TRUE, NULL, NULL);
592 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700593 palTimerStop(pMac->hHdd, pMac->roam.hTimerWaitForKey);
594 palTimerFree(pMac->hHdd, pMac->roam.hTimerWaitForKey);
Jeff Johnson295189b2012-06-20 16:38:30 -0700595 palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
596 palTimerFree(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
Jeff Johnson295189b2012-06-20 16:38:30 -0700597 return (eHAL_STATUS_SUCCESS);
598}
599
Jeff Johnson295189b2012-06-20 16:38:30 -0700600eHalStatus csrRoamStart(tpAniSirGlobal pMac)
601{
602 (void)pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -0700603 return (eHAL_STATUS_SUCCESS);
604}
605
Jeff Johnson295189b2012-06-20 16:38:30 -0700606void csrRoamStop(tpAniSirGlobal pMac, tANI_U32 sessionId)
607{
608 csrRoamStopRoamingTimer(pMac, sessionId);
609 /* deregister the clients requesting stats from PE/TL & also stop the corresponding timers*/
610 csrRoamDeregStatisticsReq(pMac);
611}
Jeff Johnson295189b2012-06-20 16:38:30 -0700612eHalStatus csrRoamGetConnectState(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrConnectState *pState)
613{
614 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
Jeff Johnson295189b2012-06-20 16:38:30 -0700615 if( pState )
616 {
617 status = eHAL_STATUS_SUCCESS;
618 *pState = pMac->roam.roamSession[sessionId].connectState;
619 }
620 return (status);
621}
622
Jeff Johnson295189b2012-06-20 16:38:30 -0700623eHalStatus csrRoamCopyConnectProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamConnectedProfile *pProfile)
624{
625 eHalStatus status = eHAL_STATUS_FAILURE;
626 tANI_U32 size = 0;
627 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -0700628
629 if(!pSession)
630 {
631 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
632 return eHAL_STATUS_FAILURE;
633 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700634
635 if(pProfile)
636 {
637 if(pSession->pConnectBssDesc)
638 {
639 do
640 {
641 size = pSession->pConnectBssDesc->length + sizeof(pSession->pConnectBssDesc->length);
642 if(size)
643 {
644 status = palAllocateMemory(pMac->hHdd, (void **)&pProfile->pBssDesc, size);
645 if(HAL_STATUS_SUCCESS(status))
646 {
647 palCopyMemory(pMac->hHdd, pProfile->pBssDesc, pSession->pConnectBssDesc, size);
648 }
649 else
650 break;
651 }
652 else
653 {
654 pProfile->pBssDesc = NULL;
655 }
656 pProfile->AuthType = pSession->connectedProfile.AuthType;
657 pProfile->EncryptionType = pSession->connectedProfile.EncryptionType;
658 pProfile->mcEncryptionType = pSession->connectedProfile.mcEncryptionType;
659 pProfile->BSSType = pSession->connectedProfile.BSSType;
660 pProfile->operationChannel = pSession->connectedProfile.operationChannel;
661 pProfile->CBMode = pSession->connectedProfile.CBMode;
662 palCopyMemory(pMac->hHdd, &pProfile->bssid, &pSession->connectedProfile.bssid, sizeof(tCsrBssid));
663 palCopyMemory(pMac->hHdd, &pProfile->SSID, &pSession->connectedProfile.SSID, sizeof(tSirMacSSid));
664#ifdef WLAN_FEATURE_VOWIFI_11R
665 if (pSession->connectedProfile.MDID.mdiePresent)
666 {
667 pProfile->MDID.mdiePresent = 1;
668 pProfile->MDID.mobilityDomain = pSession->connectedProfile.MDID.mobilityDomain;
669 }
670 else
671 {
672 pProfile->MDID.mdiePresent = 0;
673 pProfile->MDID.mobilityDomain = 0;
674 }
675#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700676#ifdef FEATURE_WLAN_CCX
677 pProfile->isCCXAssoc = pSession->connectedProfile.isCCXAssoc;
Jeff Johnson295189b2012-06-20 16:38:30 -0700678 if (csrIsAuthTypeCCX(pSession->connectedProfile.AuthType))
679 {
680 palCopyMemory( pMac->hHdd, pProfile->ccxCckmInfo.krk,
681 pSession->connectedProfile.ccxCckmInfo.krk, CSR_KRK_KEY_LEN );
682 pProfile->ccxCckmInfo.reassoc_req_num=
683 pSession->connectedProfile.ccxCckmInfo.reassoc_req_num;
684 pProfile->ccxCckmInfo.krk_plumbed =
685 pSession->connectedProfile.ccxCckmInfo.krk_plumbed;
686 }
687#endif
688 }while(0);
689 }
690 }
691
692 return (status);
693}
694
Jeff Johnson295189b2012-06-20 16:38:30 -0700695eHalStatus csrRoamGetConnectProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamConnectedProfile *pProfile)
696{
697 eHalStatus status = eHAL_STATUS_FAILURE;
698
699 if(csrIsConnStateConnected(pMac, sessionId))
700 {
701 if(pProfile)
702 {
703 status = csrRoamCopyConnectProfile(pMac, sessionId, pProfile);
704 }
705 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700706 return (status);
707}
Jeff Johnson295189b2012-06-20 16:38:30 -0700708eHalStatus csrRoamFreeConnectProfile(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pProfile)
709{
710 eHalStatus status = eHAL_STATUS_SUCCESS;
711
712 if(pProfile->pBssDesc)
713 {
714 palFreeMemory(pMac->hHdd, pProfile->pBssDesc);
715 }
Madan Mohan Koyyalamudiea22cdc2012-10-18 21:02:23 -0700716 if(pProfile->pAddIEAssoc)
717 {
718 palFreeMemory(pMac->hHdd, pProfile->pAddIEAssoc);
719 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700720 palZeroMemory(pMac->hHdd, pProfile, sizeof(tCsrRoamConnectedProfile));
721 pProfile->AuthType = eCSR_AUTH_TYPE_UNKNOWN;
722 return (status);
723}
724
Jeff Johnson295189b2012-06-20 16:38:30 -0700725static eHalStatus csrRoamFreeConnectedInfo( tpAniSirGlobal pMac, tCsrRoamConnectedInfo *pConnectedInfo )
726{
727 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700728 if( pConnectedInfo->pbFrames )
729 {
730 palFreeMemory( pMac->hHdd, pConnectedInfo->pbFrames );
731 pConnectedInfo->pbFrames = NULL;
732 }
733 pConnectedInfo->nBeaconLength = 0;
734 pConnectedInfo->nAssocReqLength = 0;
735 pConnectedInfo->nAssocRspLength = 0;
736 pConnectedInfo->staId = 0;
737#ifdef WLAN_FEATURE_VOWIFI_11R
738 pConnectedInfo->nRICRspLength = 0;
739#endif
740#ifdef FEATURE_WLAN_CCX
741 pConnectedInfo->nTspecIeLength = 0;
742#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700743 return ( status );
744}
745
Jeff Johnson295189b2012-06-20 16:38:30 -0700746
747
Jeff Johnsone7245742012-09-05 17:12:55 -0700748
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -0700749void csrReleaseCommandPreauth(tpAniSirGlobal pMac, tSmeCmd *pCommand)
750{
751 csrReinitPreauthCmd(pMac, pCommand);
752 csrReleaseCommand( pMac, pCommand );
753}
754
Jeff Johnson295189b2012-06-20 16:38:30 -0700755void csrReleaseCommandRoam(tpAniSirGlobal pMac, tSmeCmd *pCommand)
756{
757 csrReinitRoamCmd(pMac, pCommand);
758 csrReleaseCommand( pMac, pCommand );
759}
760
Jeff Johnson295189b2012-06-20 16:38:30 -0700761void csrReleaseCommandScan(tpAniSirGlobal pMac, tSmeCmd *pCommand)
762{
763 csrReinitScanCmd(pMac, pCommand);
764 csrReleaseCommand( pMac, pCommand );
765}
766
Jeff Johnson295189b2012-06-20 16:38:30 -0700767void csrReleaseCommandWmStatusChange(tpAniSirGlobal pMac, tSmeCmd *pCommand)
768{
769 csrReinitWmStatusChangeCmd(pMac, pCommand);
770 csrReleaseCommand( pMac, pCommand );
771}
772
Jeff Johnson295189b2012-06-20 16:38:30 -0700773void csrReinitSetKeyCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
774{
775 palZeroMemory(pMac->hHdd, &pCommand->u.setKeyCmd, sizeof(tSetKeyCmd));
776}
777
Jeff Johnson295189b2012-06-20 16:38:30 -0700778void csrReinitRemoveKeyCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
779{
780 palZeroMemory(pMac->hHdd, &pCommand->u.removeKeyCmd, sizeof(tRemoveKeyCmd));
781}
782
Jeff Johnson295189b2012-06-20 16:38:30 -0700783void csrReleaseCommandSetKey(tpAniSirGlobal pMac, tSmeCmd *pCommand)
784{
785 csrReinitSetKeyCmd(pMac, pCommand);
786 csrReleaseCommand( pMac, pCommand );
787}
Jeff Johnson295189b2012-06-20 16:38:30 -0700788void csrReleaseCommandRemoveKey(tpAniSirGlobal pMac, tSmeCmd *pCommand)
789{
790 csrReinitRemoveKeyCmd(pMac, pCommand);
791 csrReleaseCommand( pMac, pCommand );
792}
Jeff Johnson295189b2012-06-20 16:38:30 -0700793void csrAbortCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fStopping )
794{
795
796 if( eSmeCsrCommandMask & pCommand->command )
797 {
798 switch (pCommand->command)
799 {
800 case eSmeCommandScan:
801 // We need to inform the requester before droping the scan command
802 smsLog( pMac, LOGW, "%s: Drop scan reason %d callback 0x%X\n",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700803 __func__, pCommand->u.scanCmd.reason, (unsigned int)pCommand->u.scanCmd.callback);
Jeff Johnson295189b2012-06-20 16:38:30 -0700804 if (NULL != pCommand->u.scanCmd.callback)
805 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700806 smsLog( pMac, LOGW, "%s callback scan requester\n", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700807 csrScanCallCallback(pMac, pCommand, eCSR_SCAN_ABORT);
808 }
809 csrReleaseCommandScan( pMac, pCommand );
810 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700811 case eSmeCommandRoam:
812 csrReleaseCommandRoam( pMac, pCommand );
813 break;
814
815 case eSmeCommandWmStatusChange:
816 csrReleaseCommandWmStatusChange( pMac, pCommand );
817 break;
818
819 case eSmeCommandSetKey:
820 csrReleaseCommandSetKey( pMac, pCommand );
821 break;
822
823 case eSmeCommandRemoveKey:
824 csrReleaseCommandRemoveKey( pMac, pCommand );
825 break;
826
827 default:
828 smsLog( pMac, LOGW, " CSR abort standard command %d\n", pCommand->command );
829 csrReleaseCommand( pMac, pCommand );
830 break;
831 }
832 }
833}
834
Jeff Johnson295189b2012-06-20 16:38:30 -0700835void csrRoamSubstateChange( tpAniSirGlobal pMac, eCsrRoamSubState NewSubstate, tANI_U32 sessionId)
836{
837 smsLog( pMac, LOG1, " CSR RoamSubstate: [ %d <== %d ]\n", NewSubstate, pMac->roam.curSubState[sessionId]);
838
Jeff Johnson295189b2012-06-20 16:38:30 -0700839 if(pMac->roam.curSubState[sessionId] == NewSubstate)
840 {
841 return;
Jeff Johnsone7245742012-09-05 17:12:55 -0700842 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700843 pMac->roam.curSubState[sessionId] = NewSubstate;
844}
845
Jeff Johnson295189b2012-06-20 16:38:30 -0700846eCsrRoamState csrRoamStateChange( tpAniSirGlobal pMac, eCsrRoamState NewRoamState, tANI_U8 sessionId)
847{
848 eCsrRoamState PreviousState;
849
850 smsLog( pMac, LOG1, "CSR RoamState: [ %d <== %d ]\n", NewRoamState, pMac->roam.curState[sessionId]);
851
852 PreviousState = pMac->roam.curState[sessionId];
853
854 if ( NewRoamState != pMac->roam.curState[sessionId] )
855 {
856 // Whenever we transition OUT of the Roaming state, clear the Roaming substate...
857 if ( CSR_IS_ROAM_JOINING(pMac, sessionId) )
858 {
859 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
860 }
861
862 pMac->roam.curState[sessionId] = NewRoamState;
863 }
864 return( PreviousState );
865}
866
Jeff Johnson295189b2012-06-20 16:38:30 -0700867void csrAssignRssiForCategory(tpAniSirGlobal pMac, tANI_U8 catOffset)
868{
869 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -0700870 if(catOffset)
871 {
872 pMac->roam.configParam.bCatRssiOffset = catOffset;
873 for(i = 0; i < CSR_NUM_RSSI_CAT; i++)
874 {
875 pMac->roam.configParam.RSSICat[CSR_NUM_RSSI_CAT - i - 1] = (int)CSR_BEST_RSSI_VALUE - (int)(i * catOffset);
876 }
877 }
878}
879
Jeff Johnson295189b2012-06-20 16:38:30 -0700880static void initConfigParam(tpAniSirGlobal pMac)
881{
882 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -0700883 pMac->roam.configParam.agingCount = CSR_AGING_COUNT;
884 pMac->roam.configParam.channelBondingMode24GHz = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
885 pMac->roam.configParam.channelBondingMode5GHz = WNI_CFG_CHANNEL_BONDING_MODE_ENABLE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700886
Jeff Johnson295189b2012-06-20 16:38:30 -0700887 pMac->roam.configParam.phyMode = eCSR_DOT11_MODE_TAURUS;
888 pMac->roam.configParam.eBand = eCSR_BAND_ALL;
889 pMac->roam.configParam.uCfgDot11Mode = eCSR_CFG_DOT11_MODE_TAURUS;
890 pMac->roam.configParam.FragmentationThreshold = eCSR_DOT11_FRAG_THRESH_DEFAULT;
891 pMac->roam.configParam.HeartbeatThresh24 = 40;
892 pMac->roam.configParam.HeartbeatThresh50 = 40;
893 pMac->roam.configParam.Is11dSupportEnabled = eANI_BOOLEAN_FALSE;
894 pMac->roam.configParam.Is11dSupportEnabledOriginal = eANI_BOOLEAN_FALSE;
895 pMac->roam.configParam.Is11eSupportEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnsone7245742012-09-05 17:12:55 -0700896 pMac->roam.configParam.Is11hSupportEnabled = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700897 pMac->roam.configParam.RTSThreshold = 2346;
898 pMac->roam.configParam.shortSlotTime = eANI_BOOLEAN_TRUE;
899 pMac->roam.configParam.WMMSupportMode = eCsrRoamWmmAuto;
900 pMac->roam.configParam.ProprietaryRatesEnabled = eANI_BOOLEAN_TRUE;
901 pMac->roam.configParam.TxRate = eCSR_TX_RATE_AUTO;
902 pMac->roam.configParam.impsSleepTime = CSR_IDLE_SCAN_NO_PS_INTERVAL;
903 pMac->roam.configParam.scanAgeTimeNCNPS = CSR_SCAN_AGING_TIME_NOT_CONNECT_NO_PS;
904 pMac->roam.configParam.scanAgeTimeNCPS = CSR_SCAN_AGING_TIME_NOT_CONNECT_W_PS;
905 pMac->roam.configParam.scanAgeTimeCNPS = CSR_SCAN_AGING_TIME_CONNECT_NO_PS;
906 pMac->roam.configParam.scanAgeTimeCPS = CSR_SCAN_AGING_TIME_CONNECT_W_PS;
907 for(i = 0; i < CSR_NUM_RSSI_CAT; i++)
908 {
909 pMac->roam.configParam.BssPreferValue[i] = i;
910 }
911 csrAssignRssiForCategory(pMac, CSR_DEFAULT_RSSI_DB_GAP);
912 pMac->roam.configParam.nRoamingTime = CSR_DEFAULT_ROAMING_TIME;
913 pMac->roam.configParam.fEnforce11dChannels = eANI_BOOLEAN_FALSE;
914 pMac->roam.configParam.fSupplicantCountryCodeHasPriority = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -0700915 pMac->roam.configParam.fEnforceCountryCodeMatch = eANI_BOOLEAN_FALSE;
916 pMac->roam.configParam.fEnforceDefaultDomain = eANI_BOOLEAN_FALSE;
917 pMac->roam.configParam.nActiveMaxChnTime = CSR_ACTIVE_MAX_CHANNEL_TIME;
918 pMac->roam.configParam.nActiveMinChnTime = CSR_ACTIVE_MIN_CHANNEL_TIME;
919 pMac->roam.configParam.nPassiveMaxChnTime = CSR_PASSIVE_MAX_CHANNEL_TIME;
920 pMac->roam.configParam.nPassiveMinChnTime = CSR_PASSIVE_MIN_CHANNEL_TIME;
Madan Mohan Koyyalamudi4ff9cd62012-10-30 17:48:57 -0700921#ifdef WLAN_AP_STA_CONCURRENCY
922 pMac->roam.configParam.nActiveMaxChnTimeConc = CSR_ACTIVE_MAX_CHANNEL_TIME_CONC;
923 pMac->roam.configParam.nActiveMinChnTimeConc = CSR_ACTIVE_MIN_CHANNEL_TIME_CONC;
924 pMac->roam.configParam.nPassiveMaxChnTimeConc = CSR_PASSIVE_MAX_CHANNEL_TIME_CONC;
925 pMac->roam.configParam.nPassiveMinChnTimeConc = CSR_PASSIVE_MIN_CHANNEL_TIME_CONC;
926 pMac->roam.configParam.nRestTimeConc = CSR_REST_TIME_CONC;
927#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700928 pMac->roam.configParam.IsIdleScanEnabled = TRUE; //enable the idle scan by default
929 pMac->roam.configParam.nTxPowerCap = CSR_MAX_TX_POWER;
930 pMac->roam.configParam.statsReqPeriodicity = CSR_MIN_GLOBAL_STAT_QUERY_PERIOD;
931 pMac->roam.configParam.statsReqPeriodicityInPS = CSR_MIN_GLOBAL_STAT_QUERY_PERIOD_IN_BMPS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700932#ifdef WLAN_FEATURE_VOWIFI_11R
933 pMac->roam.configParam.csr11rConfig.IsFTResourceReqSupported = 0;
934#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700935#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
936 pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries = 3;
937 pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold = 120;
938 pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold = 125;
939 pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime = 20;
940 pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime = 40;
941 pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod = 200;
942 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels = 3;
943 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[0] = 1;
944 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[1] = 6;
945 pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[2] = 11;
946 pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod = 20000; //20 seconds
947#endif
Jeff Johnsone7245742012-09-05 17:12:55 -0700948#ifdef WLAN_FEATURE_11AC
949 pMac->roam.configParam.nVhtChannelWidth = WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ + 1;
950#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700951
952 pMac->roam.configParam.addTSWhenACMIsOff = 0;
953 pMac->roam.configParam.fScanTwice = eANI_BOOLEAN_FALSE;
Mohit Khanna349bc392012-09-11 17:24:52 -0700954
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -0700955 //Remove this code once SLM_Sessionization is supported
956 //BMPS_WORKAROUND_NOT_NEEDED
Jeff Johnsone7245742012-09-05 17:12:55 -0700957 pMac->roam.configParam.doBMPSWorkaround = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700958
Jeff Johnsone7245742012-09-05 17:12:55 -0700959}
Jeff Johnson295189b2012-06-20 16:38:30 -0700960eCsrBand csrGetCurrentBand(tHalHandle hHal)
961{
962 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
963 return pMac->roam.configParam.bandCapability;
964}
Jeff Johnson295189b2012-06-20 16:38:30 -0700965eHalStatus csrSetBand(tHalHandle hHal, eCsrBand eBand)
966{
967 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
968 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -0700969 if (CSR_IS_PHY_MODE_A_ONLY(pMac) &&
970 (eBand == eCSR_BAND_24))
971 {
972 /* DOT11 mode configured to 11a only and received
973 request to change the band to 2.4 GHz */
974 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
975 "failed to set band cfg80211 = %u, band = %u\n",
976 pMac->roam.configParam.uCfgDot11Mode, eBand);
977 return eHAL_STATUS_INVALID_PARAMETER;
978 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700979 if ((CSR_IS_PHY_MODE_B_ONLY(pMac) ||
980 CSR_IS_PHY_MODE_G_ONLY(pMac)) &&
981 (eBand == eCSR_BAND_5G))
982 {
983 /* DOT11 mode configured to 11b/11g only and received
984 request to change the band to 5 GHz */
985 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
986 "failed to set band dot11mode = %u, band = %u\n",
987 pMac->roam.configParam.uCfgDot11Mode, eBand);
988 return eHAL_STATUS_INVALID_PARAMETER;
989 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700990 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
991 "Band changed to %u (0 - ALL, 1 - 2.4 GHZ, 2 - 5GHZ)\n", eBand);
992 pMac->roam.configParam.eBand = eBand;
993 pMac->roam.configParam.bandCapability = eBand;
994 csrScanGetSupportedChannels( pMac );
995 status = csrInitGetChannels( pMac );
996 if (eHAL_STATUS_SUCCESS == status)
997 csrInitChannelList( hHal );
998 return status;
999}
Jeff Johnsone7245742012-09-05 17:12:55 -07001000/* The funcns csrConvertCBIniValueToPhyCBState and csrConvertPhyCBStateToIniValue have been
1001 * introduced to convert the ini value to the ENUM used in csr and MAC for CB state
1002 * Ideally we should have kept the ini value and enum value same and representing the same
1003 * cb values as in 11n standard i.e.
1004 * Set to 1 (SCA) if the secondary channel is above the primary channel
1005 * Set to 3 (SCB) if the secondary channel is below the primary channel
1006 * Set to 0 (SCN) if no secondary channel is present
1007 * However, since our driver is already distributed we will keep the ini definition as it is which is:
1008 * 0 - secondary none
1009 * 1 - secondary LOW
1010 * 2 - secondary HIGH
1011 * and convert to enum value used within the driver in csrChangeDefaultConfigParam using this funcn
1012 * The enum values are as follows:
1013 * PHY_SINGLE_CHANNEL_CENTERED = 0
1014 * PHY_DOUBLE_CHANNEL_LOW_PRIMARY = 1
1015 * PHY_DOUBLE_CHANNEL_HIGH_PRIMARY = 3
1016 */
1017ePhyChanBondState csrConvertCBIniValueToPhyCBState(v_U32_t cbIniValue)
1018{
1019
1020 ePhyChanBondState phyCbState;
1021 switch (cbIniValue) {
1022 // secondary none
1023 case 0:
1024 phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
1025 break;
1026 // secondary LOW
1027 case 1:
1028 phyCbState = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
1029 break;
1030 // secondary HIGH
1031 case 2:
1032 phyCbState = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
1033 break;
1034#ifdef WLAN_FEATURE_11AC
1035 case 3:
1036 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
1037 break;
1038 case 4:
1039 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
1040 break;
1041 case 5:
1042 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
1043 break;
1044 case 6:
1045 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
1046 break;
1047 case 7:
1048 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
1049 break;
1050 case 8:
1051 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
1052 break;
1053 case 9:
1054 phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
1055 break;
1056#endif
1057 default:
1058 // If an invalid value is passed, disable CHANNEL BONDING
1059 phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
1060 break;
1061 }
1062 return phyCbState;
1063}
1064
1065v_U32_t csrConvertPhyCBStateToIniValue(ePhyChanBondState phyCbState)
1066{
1067
1068 v_U32_t cbIniValue;
1069 switch (phyCbState) {
1070 // secondary none
1071 case PHY_SINGLE_CHANNEL_CENTERED:
1072 cbIniValue = 0;
1073 break;
1074 // secondary LOW
1075 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
1076 cbIniValue = 1;
1077 break;
1078 // secondary HIGH
1079 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
1080 cbIniValue = 2;
1081 break;
1082#ifdef WLAN_FEATURE_11AC
1083 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
1084 cbIniValue = 3;
1085 break;
1086 case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
1087 cbIniValue = 4;
1088 break;
1089 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
1090 cbIniValue = 5;
1091 break;
1092 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
1093 cbIniValue = 6;
1094 break;
1095 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
1096 cbIniValue = 7;
1097 break;
1098 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
1099 cbIniValue = 8;
1100 break;
1101 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
1102 cbIniValue = 9;
1103 break;
1104#endif
1105 default:
1106 // return some invalid value
1107 cbIniValue = 10;
1108 break;
1109 }
1110 return cbIniValue;
1111}
Jeff Johnson295189b2012-06-20 16:38:30 -07001112
1113eHalStatus csrChangeDefaultConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
1114{
1115 eHalStatus status = eHAL_STATUS_SUCCESS;
1116
1117 if(pParam)
1118 {
1119 pMac->roam.configParam.WMMSupportMode = pParam->WMMSupportMode;
1120 pMac->roam.configParam.Is11eSupportEnabled = pParam->Is11eSupportEnabled;
1121 pMac->roam.configParam.FragmentationThreshold = pParam->FragmentationThreshold;
1122 pMac->roam.configParam.Is11dSupportEnabled = pParam->Is11dSupportEnabled;
1123 pMac->roam.configParam.Is11dSupportEnabledOriginal = pParam->Is11dSupportEnabled;
1124 pMac->roam.configParam.Is11hSupportEnabled = pParam->Is11hSupportEnabled;
1125
1126 pMac->roam.configParam.fenableMCCMode = pParam->fEnableMCCMode;
Mohit Khanna7ed53f02012-09-11 17:52:10 -07001127 pMac->roam.configParam.fAllowMCCGODiffBI = pParam->fAllowMCCGODiffBI;
1128
Jeff Johnsone7245742012-09-05 17:12:55 -07001129 /* channelBondingMode5GHz plays a dual role right now
1130 * 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
1131 * This is how channelBondingMode5GHz works now and this is kept intact to avoid any cfg.ini change
1132 */
1133 if (pParam->channelBondingMode24GHz > MAX_CB_VALUE_IN_INI)
1134 {
1135 smsLog( pMac, LOGW, "Invalid CB value from ini in 2.4GHz band %d, CB DISABLED\n", pParam->channelBondingMode24GHz);
1136 }
1137 pMac->roam.configParam.channelBondingMode24GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingMode24GHz);
1138 if (pParam->channelBondingMode5GHz > MAX_CB_VALUE_IN_INI)
1139 {
1140 smsLog( pMac, LOGW, "Invalid CB value from ini in 5GHz band %d, CB DISABLED\n", pParam->channelBondingMode5GHz);
1141 }
1142 pMac->roam.configParam.channelBondingMode5GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingMode5GHz);
Jeff Johnson295189b2012-06-20 16:38:30 -07001143 pMac->roam.configParam.RTSThreshold = pParam->RTSThreshold;
1144 pMac->roam.configParam.phyMode = pParam->phyMode;
1145 pMac->roam.configParam.shortSlotTime = pParam->shortSlotTime;
1146 pMac->roam.configParam.HeartbeatThresh24 = pParam->HeartbeatThresh24;
1147 pMac->roam.configParam.HeartbeatThresh50 = pParam->HeartbeatThresh50;
1148 pMac->roam.configParam.ProprietaryRatesEnabled = pParam->ProprietaryRatesEnabled;
1149 pMac->roam.configParam.TxRate = pParam->TxRate;
1150 pMac->roam.configParam.AdHocChannel24 = pParam->AdHocChannel24;
1151 pMac->roam.configParam.AdHocChannel5G = pParam->AdHocChannel5G;
1152 pMac->roam.configParam.bandCapability = pParam->bandCapability;
1153 pMac->roam.configParam.cbChoice = pParam->cbChoice;
1154 pMac->roam.configParam.bgScanInterval = pParam->bgScanInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07001155 //if HDD passed down non zero values then only update,
1156 //otherwise keep using the defaults
1157 if(pParam->nActiveMaxChnTime)
1158 {
1159 pMac->roam.configParam.nActiveMaxChnTime = pParam->nActiveMaxChnTime;
1160 }
1161 if(pParam->nActiveMinChnTime)
1162 {
1163 pMac->roam.configParam.nActiveMinChnTime = pParam->nActiveMinChnTime;
1164 }
1165 if(pParam->nPassiveMaxChnTime)
1166 {
1167 pMac->roam.configParam.nPassiveMaxChnTime = pParam->nPassiveMaxChnTime;
1168 }
1169 if(pParam->nPassiveMinChnTime)
1170 {
1171 pMac->roam.configParam.nPassiveMinChnTime = pParam->nPassiveMinChnTime;
1172 }
Madan Mohan Koyyalamudi4ff9cd62012-10-30 17:48:57 -07001173#ifdef WLAN_AP_STA_CONCURRENCY
1174 if(pParam->nActiveMaxChnTimeConc)
1175 {
1176 pMac->roam.configParam.nActiveMaxChnTimeConc = pParam->nActiveMaxChnTimeConc;
1177 }
1178 if(pParam->nActiveMinChnTimeConc)
1179 {
1180 pMac->roam.configParam.nActiveMinChnTimeConc = pParam->nActiveMinChnTimeConc;
1181 }
1182 if(pParam->nPassiveMaxChnTimeConc)
1183 {
1184 pMac->roam.configParam.nPassiveMaxChnTimeConc = pParam->nPassiveMaxChnTimeConc;
1185 }
1186 if(pParam->nPassiveMinChnTimeConc)
1187 {
1188 pMac->roam.configParam.nPassiveMinChnTimeConc = pParam->nPassiveMinChnTimeConc;
1189 }
1190 if(pParam->nRestTimeConc)
1191 {
1192 pMac->roam.configParam.nRestTimeConc = pParam->nRestTimeConc;
1193 }
1194#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001195 //if upper layer wants to disable idle scan altogether set it to 0
1196 if(pParam->impsSleepTime)
1197 {
1198 //Change the unit from second to microsecond
1199 tANI_U32 impsSleepTime = pParam->impsSleepTime * PAL_TIMER_TO_SEC_UNIT;
Jeff Johnson295189b2012-06-20 16:38:30 -07001200 if(CSR_IDLE_SCAN_NO_PS_INTERVAL_MIN <= impsSleepTime)
1201 {
1202 pMac->roam.configParam.impsSleepTime = impsSleepTime;
1203 }
1204 else
1205 {
1206 pMac->roam.configParam.impsSleepTime = CSR_IDLE_SCAN_NO_PS_INTERVAL;
1207 }
1208 }
1209 else
1210 {
1211 pMac->roam.configParam.impsSleepTime = 0;
1212 }
1213 pMac->roam.configParam.eBand = pParam->eBand;
1214#ifdef WLAN_SOFTAP_FEATURE
1215 pMac->roam.configParam.uCfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(NULL, pMac->roam.configParam.phyMode,
1216 pMac->roam.configParam.ProprietaryRatesEnabled);
1217#else
1218 pMac->roam.configParam.uCfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(pMac->roam.configParam.phyMode,
1219 pMac->roam.configParam.ProprietaryRatesEnabled);
1220#endif
1221 //if HDD passed down non zero values for age params, then only update,
1222 //otherwise keep using the defaults
1223 if(pParam->nScanResultAgeCount)
1224 {
1225 pMac->roam.configParam.agingCount = pParam->nScanResultAgeCount;
1226 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001227 if(pParam->scanAgeTimeNCNPS)
1228 {
1229 pMac->roam.configParam.scanAgeTimeNCNPS = pParam->scanAgeTimeNCNPS;
1230 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001231 if(pParam->scanAgeTimeNCPS)
1232 {
1233 pMac->roam.configParam.scanAgeTimeNCPS = pParam->scanAgeTimeNCPS;
1234 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001235 if(pParam->scanAgeTimeCNPS)
1236 {
1237 pMac->roam.configParam.scanAgeTimeCNPS = pParam->scanAgeTimeCNPS;
1238 }
1239 if(pParam->scanAgeTimeCPS)
1240 {
1241 pMac->roam.configParam.scanAgeTimeCPS = pParam->scanAgeTimeCPS;
1242 }
1243
1244 csrAssignRssiForCategory(pMac, pParam->bCatRssiOffset);
1245 pMac->roam.configParam.nRoamingTime = pParam->nRoamingTime;
1246 pMac->roam.configParam.fEnforce11dChannels = pParam->fEnforce11dChannels;
1247 pMac->roam.configParam.fSupplicantCountryCodeHasPriority = pParam->fSupplicantCountryCodeHasPriority;
1248 pMac->roam.configParam.fEnforceCountryCodeMatch = pParam->fEnforceCountryCodeMatch;
1249 pMac->roam.configParam.fEnforceDefaultDomain = pParam->fEnforceDefaultDomain;
Jeff Johnson295189b2012-06-20 16:38:30 -07001250 pMac->roam.configParam.vccRssiThreshold = pParam->vccRssiThreshold;
1251 pMac->roam.configParam.vccUlMacLossThreshold = pParam->vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07001252 pMac->roam.configParam.IsIdleScanEnabled = pParam->IsIdleScanEnabled;
1253 pMac->roam.configParam.statsReqPeriodicity = pParam->statsReqPeriodicity;
1254 pMac->roam.configParam.statsReqPeriodicityInPS = pParam->statsReqPeriodicityInPS;
1255 //Assign this before calling CsrInit11dInfo
1256 pMac->roam.configParam.nTxPowerCap = pParam->nTxPowerCap;
Jeff Johnson295189b2012-06-20 16:38:30 -07001257 if( csrIs11dSupported( pMac ) )
1258 {
1259 status = CsrInit11dInfo(pMac, &pParam->Csr11dinfo);
1260 }
1261 else
1262 {
1263 pMac->scan.curScanType = eSIR_ACTIVE_SCAN;
1264 }
Jeff Johnsone7245742012-09-05 17:12:55 -07001265
1266 /* Initialize the power + channel information if 11h is enabled.
1267 If 11d is enabled this information has already been initialized */
1268 if( csrIs11hSupported( pMac ) && !csrIs11dSupported( pMac ) )
1269 {
1270 csrInitChannelPowerList(pMac, &pParam->Csr11dinfo);
1271 }
1272
1273
Jeff Johnson295189b2012-06-20 16:38:30 -07001274#ifdef WLAN_FEATURE_VOWIFI_11R
1275 palCopyMemory( pMac->hHdd, &pMac->roam.configParam.csr11rConfig, &pParam->csr11rConfig, sizeof(tCsr11rConfigParams) );
1276 smsLog( pMac, LOG1, "IsFTResourceReqSupp = %d\n", pMac->roam.configParam.csr11rConfig.IsFTResourceReqSupported);
1277#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07001278#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -07001279 pMac->roam.configParam.isFastTransitionEnabled = pParam->isFastTransitionEnabled;
Jeff Johnson43971f52012-07-17 12:26:56 -07001280 pMac->roam.configParam.RoamRssiDiff = pParam->RoamRssiDiff;
Jeff Johnson295189b2012-06-20 16:38:30 -07001281#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07001282#ifdef FEATURE_WLAN_LFR
1283 pMac->roam.configParam.isFastRoamIniFeatureEnabled = pParam->isFastRoamIniFeatureEnabled;
1284#endif
1285
Jeff Johnson295189b2012-06-20 16:38:30 -07001286#ifdef FEATURE_WLAN_CCX
1287 pMac->roam.configParam.isCcxIniFeatureEnabled = pParam->isCcxIniFeatureEnabled;
1288#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001289#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1290 palCopyMemory( pMac->hHdd, &pMac->roam.configParam.neighborRoamConfig, &pParam->neighborRoamConfig, sizeof(tCsrNeighborRoamConfigParams) );
Jeff Johnson295189b2012-06-20 16:38:30 -07001291 smsLog( pMac, LOG1, "nNeighborScanTimerPerioid = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod);
1292 smsLog( pMac, LOG1, "nNeighborReassocRssiThreshold = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold);
1293 smsLog( pMac, LOG1, "nNeighborLookupRssiThreshold = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold);
1294 smsLog( pMac, LOG1, "nNeighborScanMinChanTime = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime);
1295 smsLog( pMac, LOG1, "nNeighborScanMaxChanTime = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime);
1296 smsLog( pMac, LOG1, "nMaxNeighborRetries = %d\n", pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries);
1297 smsLog( pMac, LOG1, "nNeighborResultsRefreshPeriod = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod);
Jeff Johnson295189b2012-06-20 16:38:30 -07001298 {
1299 int i;
1300 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 -07001301 for( i=0; i< pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels; i++)
1302 {
1303 smsLog( pMac, LOG1, "%d ", pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[i] );
1304 }
1305 smsLog( pMac, LOG1, "\n");
1306 }
1307#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001308 pMac->roam.configParam.addTSWhenACMIsOff = pParam->addTSWhenACMIsOff;
1309 pMac->scan.fValidateList = pParam->fValidateList;
1310 pMac->scan.fEnableBypass11d = pParam->fEnableBypass11d;
1311 pMac->scan.fEnableDFSChnlScan = pParam->fEnableDFSChnlScan;
1312 pMac->roam.configParam.fScanTwice = pParam->fScanTwice;
Jeff Johnsone7245742012-09-05 17:12:55 -07001313 pMac->scan.fFirstScanOnly2GChnl = pParam->fFirstScanOnly2GChnl;
1314 /* This parameter is not available in cfg and not passed from upper layers. Instead it is initialized here
1315 * This paramtere is used in concurrency to determine if there are concurrent active sessions.
1316 * Is used as a temporary fix to disconnect all active sessions when BMPS enabled so the active session if Infra STA
1317 * will automatically connect back and resume BMPS since resume BMPS is not working when moving from concurrent to
1318 * single session
1319 */
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07001320 //Remove this code once SLM_Sessionization is supported
1321 //BMPS_WORKAROUND_NOT_NEEDED
Mohit Khanna349bc392012-09-11 17:24:52 -07001322 pMac->roam.configParam.doBMPSWorkaround = 0;
1323
Jeff Johnsone7245742012-09-05 17:12:55 -07001324#ifdef WLAN_FEATURE_11AC
1325 pMac->roam.configParam.nVhtChannelWidth = pParam->nVhtChannelWidth;
1326#endif
Madan Mohan Koyyalamudi3f65e312012-11-06 15:31:12 -08001327 pMac->scan.fIgnore_chan165 = pParam->fIgnore_chan165;
Jeff Johnson295189b2012-06-20 16:38:30 -07001328 }
1329
1330 return status;
1331}
1332
Jeff Johnson295189b2012-06-20 16:38:30 -07001333eHalStatus csrGetConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
1334{
1335 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
Jeff Johnson295189b2012-06-20 16:38:30 -07001336 if(pParam)
1337 {
1338 pParam->WMMSupportMode = pMac->roam.configParam.WMMSupportMode;
1339 pParam->Is11eSupportEnabled = pMac->roam.configParam.Is11eSupportEnabled;
1340 pParam->FragmentationThreshold = pMac->roam.configParam.FragmentationThreshold;
1341 pParam->Is11dSupportEnabled = pMac->roam.configParam.Is11dSupportEnabled;
1342 pParam->Is11dSupportEnabledOriginal = pMac->roam.configParam.Is11dSupportEnabledOriginal;
1343 pParam->Is11hSupportEnabled = pMac->roam.configParam.Is11hSupportEnabled;
Jeff Johnsone7245742012-09-05 17:12:55 -07001344 pParam->channelBondingMode24GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode24GHz);
1345 pParam->channelBondingMode5GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode5GHz);
Jeff Johnson295189b2012-06-20 16:38:30 -07001346 pParam->RTSThreshold = pMac->roam.configParam.RTSThreshold;
1347 pParam->phyMode = pMac->roam.configParam.phyMode;
1348 pParam->shortSlotTime = pMac->roam.configParam.shortSlotTime;
1349 pParam->HeartbeatThresh24 = pMac->roam.configParam.HeartbeatThresh24;
1350 pParam->HeartbeatThresh50 = pMac->roam.configParam.HeartbeatThresh50;
1351 pParam->ProprietaryRatesEnabled = pMac->roam.configParam.ProprietaryRatesEnabled;
1352 pParam->TxRate = pMac->roam.configParam.TxRate;
1353 pParam->AdHocChannel24 = pMac->roam.configParam.AdHocChannel24;
1354 pParam->AdHocChannel5G = pMac->roam.configParam.AdHocChannel5G;
1355 pParam->bandCapability = pMac->roam.configParam.bandCapability;
1356 pParam->cbChoice = pMac->roam.configParam.cbChoice;
1357 pParam->bgScanInterval = pMac->roam.configParam.bgScanInterval;
Jeff Johnson295189b2012-06-20 16:38:30 -07001358 pParam->nActiveMaxChnTime = pMac->roam.configParam.nActiveMaxChnTime;
1359 pParam->nActiveMinChnTime = pMac->roam.configParam.nActiveMinChnTime;
1360 pParam->nPassiveMaxChnTime = pMac->roam.configParam.nPassiveMaxChnTime;
1361 pParam->nPassiveMinChnTime = pMac->roam.configParam.nPassiveMinChnTime;
Madan Mohan Koyyalamudi4ff9cd62012-10-30 17:48:57 -07001362#ifdef WLAN_AP_STA_CONCURRENCY
1363 pParam->nActiveMaxChnTimeConc = pMac->roam.configParam.nActiveMaxChnTimeConc;
1364 pParam->nActiveMinChnTimeConc = pMac->roam.configParam.nActiveMinChnTimeConc;
1365 pParam->nPassiveMaxChnTimeConc = pMac->roam.configParam.nPassiveMaxChnTimeConc;
1366 pParam->nPassiveMinChnTimeConc = pMac->roam.configParam.nPassiveMinChnTimeConc;
1367 pParam->nRestTimeConc = pMac->roam.configParam.nRestTimeConc;
1368#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001369 //Change the unit from microsecond to second
1370 pParam->impsSleepTime = pMac->roam.configParam.impsSleepTime / PAL_TIMER_TO_SEC_UNIT;
1371 pParam->eBand = pMac->roam.configParam.eBand;
1372 pParam->nScanResultAgeCount = pMac->roam.configParam.agingCount;
1373 pParam->scanAgeTimeNCNPS = pMac->roam.configParam.scanAgeTimeNCNPS;
1374 pParam->scanAgeTimeNCPS = pMac->roam.configParam.scanAgeTimeNCPS;
1375 pParam->scanAgeTimeCNPS = pMac->roam.configParam.scanAgeTimeCNPS;
1376 pParam->scanAgeTimeCPS = pMac->roam.configParam.scanAgeTimeCPS;
1377 pParam->bCatRssiOffset = pMac->roam.configParam.bCatRssiOffset;
1378 pParam->nRoamingTime = pMac->roam.configParam.nRoamingTime;
1379 pParam->fEnforce11dChannels = pMac->roam.configParam.fEnforce11dChannels;
1380 pParam->fSupplicantCountryCodeHasPriority = pMac->roam.configParam.fSupplicantCountryCodeHasPriority;
1381 pParam->fEnforceCountryCodeMatch = pMac->roam.configParam.fEnforceCountryCodeMatch;
1382 pParam->fEnforceDefaultDomain = pMac->roam.configParam.fEnforceDefaultDomain;
1383 pParam->vccRssiThreshold = pMac->roam.configParam.vccRssiThreshold;
1384 pParam->vccUlMacLossThreshold = pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -07001385 pParam->IsIdleScanEnabled = pMac->roam.configParam.IsIdleScanEnabled;
1386 pParam->nTxPowerCap = pMac->roam.configParam.nTxPowerCap;
1387 pParam->statsReqPeriodicity = pMac->roam.configParam.statsReqPeriodicity;
1388 pParam->statsReqPeriodicityInPS = pMac->roam.configParam.statsReqPeriodicityInPS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001389 pParam->addTSWhenACMIsOff = pMac->roam.configParam.addTSWhenACMIsOff;
1390 pParam->fValidateList = pMac->roam.configParam.fValidateList;
1391 pParam->fEnableBypass11d = pMac->scan.fEnableBypass11d;
1392 pParam->fEnableDFSChnlScan = pMac->scan.fEnableDFSChnlScan;
Madan Mohan Koyyalamudi3f65e312012-11-06 15:31:12 -08001393 pParam->fIgnore_chan165= pMac->scan.fIgnore_chan165;
Jeff Johnson295189b2012-06-20 16:38:30 -07001394 pParam->fScanTwice = pMac->roam.configParam.fScanTwice;
Jeff Johnsone7245742012-09-05 17:12:55 -07001395 pParam->fFirstScanOnly2GChnl = pMac->scan.fFirstScanOnly2GChnl;
Jeff Johnson295189b2012-06-20 16:38:30 -07001396
1397#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1398 palCopyMemory( pMac->hHdd, &pParam->neighborRoamConfig, &pMac->roam.configParam.neighborRoamConfig, sizeof(tCsrNeighborRoamConfigParams) );
1399#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07001400#ifdef WLAN_FEATURE_11AC
1401 pParam->nVhtChannelWidth = pMac->roam.configParam.nVhtChannelWidth;
1402#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001403
1404 csrSetChannels(pMac, pParam);
1405
1406 status = eHAL_STATUS_SUCCESS;
1407 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001408 return (status);
1409}
1410
Jeff Johnson295189b2012-06-20 16:38:30 -07001411eHalStatus csrSetPhyMode(tHalHandle hHal, tANI_U32 phyMode, eCsrBand eBand, tANI_BOOLEAN *pfRestartNeeded)
1412{
1413 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
1414 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
1415 tANI_BOOLEAN fRestartNeeded = eANI_BOOLEAN_FALSE;
1416 eCsrPhyMode newPhyMode = eCSR_DOT11_MODE_AUTO;
Jeff Johnson295189b2012-06-20 16:38:30 -07001417 do
1418 {
1419 if(eCSR_BAND_24 == eBand)
1420 {
1421 if(CSR_IS_RADIO_A_ONLY(pMac)) break;
1422 if((eCSR_DOT11_MODE_11a & phyMode) || (eCSR_DOT11_MODE_11a_ONLY & phyMode)) break;
1423 }
1424 if(eCSR_BAND_5G == eBand)
1425 {
1426 if(CSR_IS_RADIO_BG_ONLY(pMac)) break;
1427 if((eCSR_DOT11_MODE_11b & phyMode) || (eCSR_DOT11_MODE_11b_ONLY & phyMode) ||
1428 (eCSR_DOT11_MODE_11g & phyMode) || (eCSR_DOT11_MODE_11g_ONLY & phyMode)
1429 )
1430 {
1431 break;
1432 }
1433 }
1434 if((0 == phyMode) || (eCSR_DOT11_MODE_TAURUS & phyMode))
1435 {
1436 newPhyMode = eCSR_DOT11_MODE_TAURUS;
1437 }
1438 else if(eCSR_DOT11_MODE_AUTO & phyMode)
1439 {
1440 newPhyMode = eCSR_DOT11_MODE_AUTO;
1441 }
1442 else
1443 {
1444 //Check for dual band and higher capability first
1445 if(eCSR_DOT11_MODE_11n_ONLY & phyMode)
1446 {
1447 if(eCSR_DOT11_MODE_11n_ONLY != phyMode) break;
1448 newPhyMode = eCSR_DOT11_MODE_11n_ONLY;
1449 }
1450 else if(eCSR_DOT11_MODE_11a_ONLY & phyMode)
1451 {
1452 if(eCSR_DOT11_MODE_11a_ONLY != phyMode) break;
1453 if(eCSR_BAND_24 == eBand) break;
1454 newPhyMode = eCSR_DOT11_MODE_11a_ONLY;
1455 eBand = eCSR_BAND_5G;
1456 }
1457 else if(eCSR_DOT11_MODE_11g_ONLY & phyMode)
1458 {
1459 if(eCSR_DOT11_MODE_11g_ONLY != phyMode) break;
1460 if(eCSR_BAND_5G == eBand) break;
1461 newPhyMode = eCSR_DOT11_MODE_11g_ONLY;
1462 eBand = eCSR_BAND_24;
1463 }
1464 else if(eCSR_DOT11_MODE_11b_ONLY & phyMode)
1465 {
1466 if(eCSR_DOT11_MODE_11b_ONLY != phyMode) break;
1467 if(eCSR_BAND_5G == eBand) break;
1468 newPhyMode = eCSR_DOT11_MODE_11b_ONLY;
1469 eBand = eCSR_BAND_24;
1470 }
1471 else if(eCSR_DOT11_MODE_11n & phyMode)
1472 {
1473 newPhyMode = eCSR_DOT11_MODE_11n;
1474 }
1475 else if(eCSR_DOT11_MODE_abg & phyMode)
1476 {
1477 newPhyMode = eCSR_DOT11_MODE_abg;
1478 }
1479 else if(eCSR_DOT11_MODE_11a & phyMode)
1480 {
1481 if((eCSR_DOT11_MODE_11g & phyMode) || (eCSR_DOT11_MODE_11b & phyMode))
1482 {
1483 if(eCSR_BAND_ALL == eBand)
1484 {
1485 newPhyMode = eCSR_DOT11_MODE_abg;
1486 }
1487 else
1488 {
1489 //bad setting
1490 break;
1491 }
1492 }
1493 else
1494 {
1495 newPhyMode = eCSR_DOT11_MODE_11a;
1496 eBand = eCSR_BAND_5G;
1497 }
1498 }
1499 else if(eCSR_DOT11_MODE_11g & phyMode)
1500 {
1501 newPhyMode = eCSR_DOT11_MODE_11g;
1502 eBand = eCSR_BAND_24;
1503 }
1504 else if(eCSR_DOT11_MODE_11b & phyMode)
1505 {
1506 newPhyMode = eCSR_DOT11_MODE_11b;
1507 eBand = eCSR_BAND_24;
1508 }
1509 else
1510 {
1511 //We will never be here
1512 smsLog( pMac, LOGE, FL(" cannot recognize the phy mode 0x%08X\n"), phyMode );
1513 newPhyMode = eCSR_DOT11_MODE_AUTO;
1514 }
1515 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001516 //Done validating
1517 status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001518 //Now we need to check whether a restart is needed.
1519 if(eBand != pMac->roam.configParam.eBand)
1520 {
1521 fRestartNeeded = eANI_BOOLEAN_TRUE;
1522 break;
1523 }
1524 if(newPhyMode != pMac->roam.configParam.phyMode)
1525 {
1526 fRestartNeeded = eANI_BOOLEAN_TRUE;
1527 break;
1528 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001529 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07001530 if(HAL_STATUS_SUCCESS(status))
1531 {
1532 pMac->roam.configParam.eBand = eBand;
1533 pMac->roam.configParam.phyMode = newPhyMode;
1534 if(pfRestartNeeded)
1535 {
1536 *pfRestartNeeded = fRestartNeeded;
1537 }
1538 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001539 return (status);
1540}
1541
Jeff Johnson295189b2012-06-20 16:38:30 -07001542void csrPruneChannelListForMode( tpAniSirGlobal pMac, tCsrChannel *pChannelList )
1543{
1544 tANI_U8 Index;
1545 tANI_U8 cChannels;
Jeff Johnson295189b2012-06-20 16:38:30 -07001546 // for dual band NICs, don't need to trim the channel list....
1547 if ( !CSR_IS_OPEARTING_DUAL_BAND( pMac ) )
1548 {
1549 // 2.4 GHz band operation requires the channel list to be trimmed to
1550 // the 2.4 GHz channels only...
1551 if ( CSR_IS_24_BAND_ONLY( pMac ) )
1552 {
1553 for( Index = 0, cChannels = 0; Index < pChannelList->numChannels;
1554 Index++ )
1555 {
1556 if ( CSR_IS_CHANNEL_24GHZ(pChannelList->channelList[ Index ]) )
1557 {
1558 pChannelList->channelList[ cChannels ] = pChannelList->channelList[ Index ];
1559 cChannels++;
1560 }
1561 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001562 // Cleanup the rest of channels. Note we only need to clean up the channels if we had
1563 // to trim the list. Calling palZeroMemory() with a 0 size is going to throw asserts on
1564 // the debug builds so let's be a bit smarter about that. Zero out the reset of the channels
1565 // only if we need to.
1566 //
1567 // The amount of memory to clear is the number of channesl that we trimmed
1568 // (pChannelList->numChannels - cChannels) times the size of a channel in the structure.
1569
1570 if ( pChannelList->numChannels > cChannels )
1571 {
1572 palZeroMemory( pMac->hHdd, &pChannelList->channelList[ cChannels ],
1573 sizeof( pChannelList->channelList[ 0 ] ) * ( pChannelList->numChannels - cChannels ) );
1574
1575 }
1576
1577 pChannelList->numChannels = cChannels;
1578 }
1579 else if ( CSR_IS_5G_BAND_ONLY( pMac ) )
1580 {
1581 for ( Index = 0, cChannels = 0; Index < pChannelList->numChannels; Index++ )
1582 {
1583 if ( CSR_IS_CHANNEL_5GHZ(pChannelList->channelList[ Index ]) )
1584 {
1585 pChannelList->channelList[ cChannels ] = pChannelList->channelList[ Index ];
1586 cChannels++;
1587 }
1588 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001589 // Cleanup the rest of channels. Note we only need to clean up the channels if we had
1590 // to trim the list. Calling palZeroMemory() with a 0 size is going to throw asserts on
1591 // the debug builds so let's be a bit smarter about that. Zero out the reset of the channels
1592 // only if we need to.
1593 //
1594 // The amount of memory to clear is the number of channesl that we trimmed
1595 // (pChannelList->numChannels - cChannels) times the size of a channel in the structure.
1596 if ( pChannelList->numChannels > cChannels )
1597 {
1598 palZeroMemory( pMac->hHdd, &pChannelList->channelList[ cChannels ],
1599 sizeof( pChannelList->channelList[ 0 ] ) * ( pChannelList->numChannels - cChannels ) );
1600 }
1601
1602 pChannelList->numChannels = cChannels;
1603 }
1604 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001605}
Jeff Johnson295189b2012-06-20 16:38:30 -07001606#ifdef WLAN_SOFTAP_FEATURE
1607#define INFRA_AP_DEFAULT_CHANNEL 6
1608eHalStatus csrIsValidChannel(tpAniSirGlobal pMac, tANI_U8 chnNum)
1609{
1610 tANI_U8 index= 0;
1611 eHalStatus status = eHAL_STATUS_FAILURE;
1612 for (index=0; index < pMac->scan.base20MHzChannels.numChannels ;index++)
1613 {
1614 if(pMac->scan.base20MHzChannels.channelList[ index ] == chnNum){
1615 status = eHAL_STATUS_SUCCESS;
1616 break;
1617 }
1618 }
1619 return status;
1620}
1621#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001622eHalStatus csrInitGetChannels(tpAniSirGlobal pMac)
1623{
1624 eHalStatus status = eHAL_STATUS_SUCCESS;
1625 tANI_U8 num20MHzChannelsFound = 0;
1626 VOS_STATUS vosStatus;
1627 tANI_U8 Index = 0;
1628 tANI_U8 num40MHzChannelsFound = 0;
Jeff Johnsone7245742012-09-05 17:12:55 -07001629
Jeff Johnson295189b2012-06-20 16:38:30 -07001630
1631 //TODO: this interface changed to include the 40MHz channel list
1632 // this needs to be tied into the adapter structure somehow and referenced appropriately for CB operation
1633 // Read the scan channel list (including the power limit) from EEPROM
1634 vosStatus = vos_nv_getChannelListWithPower( pMac->scan.defaultPowerTable, &num20MHzChannelsFound,
1635 pMac->scan.defaultPowerTable40MHz, &num40MHzChannelsFound);
1636 if ( (VOS_STATUS_SUCCESS != vosStatus) || (num20MHzChannelsFound == 0) )
1637 {
1638 smsLog( pMac, LOGE, FL("failed to get channels \n"));
1639 status = eHAL_STATUS_FAILURE;
1640 }
1641 else
1642 {
1643 if ( num20MHzChannelsFound > WNI_CFG_VALID_CHANNEL_LIST_LEN )
1644 {
1645 num20MHzChannelsFound = WNI_CFG_VALID_CHANNEL_LIST_LEN;
1646 }
1647 pMac->scan.numChannelsDefault = num20MHzChannelsFound;
1648 // Move the channel list to the global data
1649 // structure -- this will be used as the scan list
1650 for ( Index = 0; Index < num20MHzChannelsFound; Index++)
1651 {
1652#ifdef FEATURE_WLAN_INTEGRATED_SOC /* Need to fix this while dealing with NV item */
1653 pMac->scan.base20MHzChannels.channelList[ Index ] = pMac->scan.defaultPowerTable[ Index ].chanId;
1654#else
1655 pMac->scan.base20MHzChannels.channelList[ Index ] = Index + 1;
1656 pMac->scan.defaultPowerTable[Index].chanId = Index + 1;
1657 pMac->scan.defaultPowerTable[Index].pwr = 25;
1658#endif
1659 }
1660 pMac->scan.base20MHzChannels.numChannels = num20MHzChannelsFound;
1661 if(num40MHzChannelsFound > WNI_CFG_VALID_CHANNEL_LIST_LEN)
1662 {
1663 num40MHzChannelsFound = WNI_CFG_VALID_CHANNEL_LIST_LEN;
1664 }
1665 for ( Index = 0; Index < num40MHzChannelsFound; Index++)
1666 {
1667 pMac->scan.base40MHzChannels.channelList[ Index ] = pMac->scan.defaultPowerTable40MHz[ Index ].chanId;
1668 }
1669 pMac->scan.base40MHzChannels.numChannels = num40MHzChannelsFound;
1670 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001671 return (status);
1672}
1673
Jeff Johnson295189b2012-06-20 16:38:30 -07001674eHalStatus csrInitChannelList( tHalHandle hHal )
1675{
1676 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
1677 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001678 csrPruneChannelListForMode(pMac, &pMac->scan.baseChannels);
1679 csrPruneChannelListForMode(pMac, &pMac->scan.base20MHzChannels);
1680 // Apply the base channel list, power info, and set the Country code...
1681 csrApplyChannelPowerCountryInfo( pMac, &pMac->scan.base20MHzChannels, pMac->scan.countryCodeCurrent );
1682
1683 return (status);
1684}
Jeff Johnson295189b2012-06-20 16:38:30 -07001685eHalStatus csrChangeConfigParams(tpAniSirGlobal pMac,
1686 tCsrUpdateConfigParam *pUpdateConfigParam)
1687{
1688 eHalStatus status = eHAL_STATUS_FAILURE;
1689 tCsr11dinfo *ps11dinfo = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07001690 ps11dinfo = &pUpdateConfigParam->Csr11dinfo;
1691 status = CsrInit11dInfo(pMac, ps11dinfo);
1692 return status;
1693}
1694
Jeff Johnson295189b2012-06-20 16:38:30 -07001695static eHalStatus CsrInit11dInfo(tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo)
1696{
1697 eHalStatus status = eHAL_STATUS_FAILURE;
1698 tANI_U8 index;
1699 tANI_U32 count=0;
1700 tSirMacChanInfo *pChanInfo;
1701 tSirMacChanInfo *pChanInfoStart;
1702 tANI_BOOLEAN applyConfig = TRUE;
1703
1704 if(!ps11dinfo)
1705 {
1706 return (status);
1707 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001708 if ( ps11dinfo->Channels.numChannels && ( WNI_CFG_VALID_CHANNEL_LIST_LEN >= ps11dinfo->Channels.numChannels ) )
1709 {
1710 pMac->scan.base20MHzChannels.numChannels = ps11dinfo->Channels.numChannels;
1711 status = palCopyMemory(pMac->hHdd, pMac->scan.base20MHzChannels.channelList,
1712 ps11dinfo->Channels.channelList, ps11dinfo->Channels.numChannels);
1713 if(!HAL_STATUS_SUCCESS(status)) return (status);
1714 }
1715 else
1716 {
1717 //No change
1718 return (eHAL_STATUS_SUCCESS);
1719 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001720 //legacy maintenance
1721 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeDefault,
1722 ps11dinfo->countryCode, WNI_CFG_COUNTRY_CODE_LEN);
1723 if(!HAL_STATUS_SUCCESS(status)) return (status);
Jeff Johnson295189b2012-06-20 16:38:30 -07001724 //Tush: at csropen get this initialized with default, during csr reset if this
1725 // already set with some value no need initilaize with default again
1726 if(0 == pMac->scan.countryCodeCurrent[0])
1727 {
1728 status = palCopyMemory(pMac->hHdd, pMac->scan.countryCodeCurrent,
1729 ps11dinfo->countryCode, WNI_CFG_COUNTRY_CODE_LEN);
1730 if(!HAL_STATUS_SUCCESS(status)) return (status);
1731 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001732 // need to add the max power channel list
1733 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN)))
1734 {
1735 palZeroMemory(pMac->hHdd, pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN);
1736 pChanInfoStart = pChanInfo;
Jeff Johnsone7245742012-09-05 17:12:55 -07001737 for(index = 0; index < ps11dinfo->Channels.numChannels; index++)
1738 {
1739 pChanInfo->firstChanNum = ps11dinfo->ChnPower[index].firstChannel;
1740 pChanInfo->numChannels = ps11dinfo->ChnPower[index].numChannels;
1741 pChanInfo->maxTxPower = CSR_ROAM_MIN( ps11dinfo->ChnPower[index].maxtxPower, pMac->roam.configParam.nTxPowerCap );
1742 pChanInfo++;
1743 count++;
1744 }
1745 if(count)
1746 {
1747 csrSaveToChannelPower2G_5G( pMac, count * sizeof(tSirMacChanInfo), pChanInfoStart );
1748 }
1749 palFreeMemory(pMac->hHdd, pChanInfoStart);
1750 }
1751 //Only apply them to CFG when not in STOP state. Otherwise they will be applied later
1752 if( HAL_STATUS_SUCCESS(status) )
1753 {
1754 for( index = 0; index < CSR_ROAM_SESSION_MAX; index++ )
1755 {
1756 if((CSR_IS_SESSION_VALID(pMac, index)) && CSR_IS_ROAM_STOP(pMac, index))
1757 {
1758 applyConfig = FALSE;
1759 }
1760 }
1761
1762 if(TRUE == applyConfig)
1763 {
1764 // Apply the base channel list, power info, and set the Country code...
1765 csrApplyChannelPowerCountryInfo( pMac, &pMac->scan.base20MHzChannels, pMac->scan.countryCodeCurrent );
1766 }
1767
1768 }
1769 return (status);
1770}
1771/* Initialize the Channel + Power List in the local cache and in the CFG */
1772eHalStatus csrInitChannelPowerList( tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo)
1773{
1774 tANI_U8 index;
1775 tANI_U32 count=0;
1776 tSirMacChanInfo *pChanInfo;
1777 tSirMacChanInfo *pChanInfoStart;
1778
1779 if(!ps11dinfo || !pMac)
1780 {
1781 return eHAL_STATUS_FAILURE;
1782 }
1783
1784 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN)))
1785 {
1786 palZeroMemory(pMac->hHdd, pChanInfo, sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN);
1787 pChanInfoStart = pChanInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07001788
1789 for(index = 0; index < ps11dinfo->Channels.numChannels; index++)
1790 {
1791 pChanInfo->firstChanNum = ps11dinfo->ChnPower[index].firstChannel;
1792 pChanInfo->numChannels = ps11dinfo->ChnPower[index].numChannels;
1793 pChanInfo->maxTxPower = CSR_ROAM_MIN( ps11dinfo->ChnPower[index].maxtxPower, pMac->roam.configParam.nTxPowerCap );
1794 pChanInfo++;
1795 count++;
1796 }
1797 if(count)
1798 {
1799 csrSaveToChannelPower2G_5G( pMac, count * sizeof(tSirMacChanInfo), pChanInfoStart );
1800 }
1801 palFreeMemory(pMac->hHdd, pChanInfoStart);
1802 }
1803
Jeff Johnsone7245742012-09-05 17:12:55 -07001804 return eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07001805}
1806
1807//pCommand may be NULL
1808//Pass in sessionId in case pCommand is NULL. sessionId is not used in case pCommand is not NULL.
1809void csrRoamRemoveDuplicateCommand(tpAniSirGlobal pMac, tANI_U32 sessionId, tSmeCmd *pCommand, eCsrRoamReason eRoamReason)
1810{
1811 tListElem *pEntry, *pNextEntry;
1812 tSmeCmd *pDupCommand;
1813 tDblLinkList localList;
1814
1815 vos_mem_zero(&localList, sizeof(tDblLinkList));
1816 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &localList)))
1817 {
1818 smsLog(pMac, LOGE, FL(" failed to open list"));
1819 return;
1820 }
1821 csrLLLock( &pMac->sme.smeCmdPendingList );
1822 pEntry = csrLLPeekHead( &pMac->sme.smeCmdPendingList, LL_ACCESS_NOLOCK );
1823 while( pEntry )
1824 {
1825 pNextEntry = csrLLNext( &pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK );
1826 pDupCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07001827 // Remove the previous command if..
1828 // - the new roam command is for the same RoamReason...
1829 // - the new roam command is a NewProfileList.
1830 // - the new roam command is a Forced Dissoc
1831 // - the new roam command is from an 802.11 OID (OID_SSID or OID_BSSID).
1832 if (
1833 (pCommand && ( pCommand->sessionId == pDupCommand->sessionId ) &&
1834 ((pCommand->command == pDupCommand->command) &&
1835 (pCommand->u.roamCmd.roamReason == pDupCommand->u.roamCmd.roamReason ||
1836 eCsrForcedDisassoc == pCommand->u.roamCmd.roamReason ||
1837 eCsrHddIssued == pCommand->u.roamCmd.roamReason)))
1838 ||
1839 //below the pCommand is NULL
Jeff Johnson43971f52012-07-17 12:26:56 -07001840 ( (sessionId == pDupCommand->sessionId) &&
1841 (eSmeCommandRoam == pDupCommand->command) &&
Jeff Johnson295189b2012-06-20 16:38:30 -07001842 ((eCsrForcedDisassoc == eRoamReason) ||
1843 (eCsrHddIssued == eRoamReason))
1844 )
1845 )
1846 {
1847 smsLog(pMac, LOGW, FL(" roamReason = %d\n"), pDupCommand->u.roamCmd.roamReason);
1848 // Remove the 'stale' roam command from the pending list...
1849 if(csrLLRemoveEntry( &pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK ))
1850 {
1851 csrLLInsertTail(&localList, pEntry, LL_ACCESS_NOLOCK);
1852 }
1853 }
1854 pEntry = pNextEntry;
1855 }
1856 csrLLUnlock( &pMac->sme.smeCmdPendingList );
1857
1858 while( (pEntry = csrLLRemoveHead(&localList, LL_ACCESS_NOLOCK)) )
1859 {
1860 pDupCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
1861 //Tell caller that the command is cancelled
1862 csrRoamCallCallback(pMac, pDupCommand->sessionId, NULL, pDupCommand->u.roamCmd.roamId,
1863 eCSR_ROAM_CANCELLED, eCSR_ROAM_RESULT_NONE);
1864 csrReleaseCommandRoam(pMac, pDupCommand);
1865 }
1866 csrLLClose(&localList);
1867}
Jeff Johnson295189b2012-06-20 16:38:30 -07001868eHalStatus csrRoamCallCallback(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamInfo *pRoamInfo,
1869 tANI_U32 roamId, eRoamCmdStatus u1, eCsrRoamResult u2)
1870{
1871 eHalStatus status = eHAL_STATUS_SUCCESS;
1872#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
1873 WLAN_VOS_DIAG_EVENT_DEF(connectionStatus, vos_event_wlan_status_payload_type);
1874#endif
1875 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07001876 if( CSR_IS_SESSION_VALID( pMac, sessionId) )
1877 {
1878 pSession = CSR_GET_SESSION( pMac, sessionId );
1879 }
1880 else
1881 {
1882 smsLog(pMac, LOGE, "Session ID:%d is not valid\n", sessionId);
1883 VOS_ASSERT(0);
1884 return eHAL_STATUS_FAILURE;
1885 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001886 if(eCSR_ROAM_ASSOCIATION_COMPLETION == u1 && pRoamInfo)
1887 {
1888 smsLog(pMac, LOGW, " Assoc complete result = %d statusCode = %d reasonCode = %d\n", u2, pRoamInfo->statusCode, pRoamInfo->reasonCode);
1889 }
Madan Mohan Koyyalamudi85d140a2012-10-18 20:23:01 -07001890 if ((u1 == eCSR_ROAM_FT_REASSOC_FAILED) && (pSession->bRefAssocStartCnt)) {
1891 /*
1892 * Decrement bRefAssocStartCnt for FT reassoc failure.
1893 * Reason: For FT reassoc failures, we first call
1894 * csrRoamCallCallback before notifying a failed roam
1895 * completion through csrRoamComplete. The latter in
1896 * turn calls csrRoamProcessResults which tries to
1897 * once again call csrRoamCallCallback if bRefAssocStartCnt
1898 * is non-zero. Since this is redundant for FT reassoc
1899 * failure, decrement bRefAssocStartCnt.
1900 */
1901 pSession->bRefAssocStartCnt--;
1902 }
1903
Jeff Johnson295189b2012-06-20 16:38:30 -07001904 if ( (pSession == NULL) ||
1905 (eANI_BOOLEAN_FALSE == pSession->sessionActive) )
1906 {
1907 smsLog(pMac, LOG1, "Session ID is not valid\n");
1908 return eHAL_STATUS_FAILURE;
1909 }
1910
1911 if(NULL != pSession->callback)
1912 {
1913 if( pRoamInfo )
1914 {
1915 pRoamInfo->sessionId = (tANI_U8)sessionId;
1916 }
1917
1918 /* avoid holding the global lock when making the roaming callback , original change came
1919 from a raised CR (CR304874). Since this callback is in HDD a potential deadlock
1920 is possible on other OS ports where the callback may need to take locks to protect
1921 HDD state
1922 UPDATE : revert this change but keep the comments here. Need to revisit as there are callbacks
1923 that may actually depend on the lock being held */
1924 // TODO: revisit: sme_ReleaseGlobalLock( &pMac->sme );
1925 status = pSession->callback(pSession->pContext, pRoamInfo, roamId, u1, u2);
1926 // TODO: revisit: sme_AcquireGlobalLock( &pMac->sme );
1927 }
1928 //EVENT_WLAN_STATUS: eCSR_ROAM_ASSOCIATION_COMPLETION,
1929 // eCSR_ROAM_LOSTLINK, eCSR_ROAM_DISASSOCIATED,
1930#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
1931 palZeroMemory(pMac->hHdd, &connectionStatus, sizeof(vos_event_wlan_status_payload_type));
1932 if((eCSR_ROAM_ASSOCIATION_COMPLETION == u1) && (eCSR_ROAM_RESULT_ASSOCIATED == u2))
1933 {
1934 connectionStatus.eventId = eCSR_WLAN_STATUS_CONNECT;
1935 connectionStatus.bssType = pRoamInfo->u.pConnectedProfile->BSSType;
1936 if(NULL != pRoamInfo->pBssDesc)
1937 {
1938 connectionStatus.rssi = pRoamInfo->pBssDesc->rssi * (-1);
1939 connectionStatus.channel = pRoamInfo->pBssDesc->channelId;
1940 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001941 connectionStatus.qosCapability = pRoamInfo->u.pConnectedProfile->qosConnection;
1942 connectionStatus.authType = (v_U8_t)diagAuthTypeFromCSRType(pRoamInfo->u.pConnectedProfile->AuthType);
1943 connectionStatus.encryptionType = (v_U8_t)diagEncTypeFromCSRType(pRoamInfo->u.pConnectedProfile->EncryptionType);
1944 palCopyMemory(pMac->hHdd, connectionStatus.ssid, pRoamInfo->u.pConnectedProfile->SSID.ssId, 6);
1945 connectionStatus.reason = eCSR_REASON_UNSPECIFIED;
1946 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1947 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001948 if((eCSR_ROAM_MIC_ERROR_IND == u1) || (eCSR_ROAM_RESULT_MIC_FAILURE == u2))
1949 {
1950 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1951 connectionStatus.reason = eCSR_REASON_MIC_ERROR;
1952 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1953 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001954 if(eCSR_ROAM_RESULT_FORCED == u2)
1955 {
1956 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1957 connectionStatus.reason = eCSR_REASON_USER_REQUESTED;
1958 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1959 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001960 if(eCSR_ROAM_RESULT_DISASSOC_IND == u2)
1961 {
1962 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1963 connectionStatus.reason = eCSR_REASON_DISASSOC;
1964 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1965 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001966 if(eCSR_ROAM_RESULT_DEAUTH_IND == u2)
1967 {
1968 connectionStatus.eventId = eCSR_WLAN_STATUS_DISCONNECT;
1969 connectionStatus.reason = eCSR_REASON_DEAUTH;
1970 WLAN_VOS_DIAG_EVENT_REPORT(&connectionStatus, EVENT_WLAN_STATUS);
1971 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001972#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
1973
1974 return (status);
1975}
Jeff Johnson295189b2012-06-20 16:38:30 -07001976// Returns whether handoff is currently in progress or not
1977tANI_BOOLEAN csrRoamIsHandoffInProgress(tpAniSirGlobal pMac)
1978{
1979#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
1980 return csrNeighborRoamIsHandoffInProgress(pMac);
1981#else
1982 return eANI_BOOLEAN_FALSE;
1983#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07001984}
Jeff Johnson295189b2012-06-20 16:38:30 -07001985eHalStatus csrRoamIssueDisassociate( tpAniSirGlobal pMac, tANI_U32 sessionId,
1986 eCsrRoamSubState NewSubstate, tANI_BOOLEAN fMICFailure )
1987{
1988 eHalStatus status = eHAL_STATUS_SUCCESS;
1989 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1990 tANI_U16 reasonCode;
1991 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07001992
1993 if(!pSession)
1994 {
1995 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
1996 return eHAL_STATUS_FAILURE;
1997 }
Jeff Johnson295189b2012-06-20 16:38:30 -07001998
1999 //Restore AC weight in case we change it
2000 if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
2001 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07002002 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 -07002003 pMac->roam.ucACWeights[2], pMac->roam.ucACWeights[3]);
2004 WLANTL_SetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
2005 }
2006
2007 if ( fMICFailure )
2008 {
2009 reasonCode = eSIR_MAC_MIC_FAILURE_REASON;
2010 }
2011 else if (NewSubstate == eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF)
2012 {
2013 reasonCode = eSIR_MAC_DISASSOC_DUE_TO_FTHANDOFF_REASON;
2014 } else
2015 {
2016 reasonCode = eSIR_MAC_UNSPEC_FAILURE_REASON;
2017 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002018#ifdef WLAN_FEATURE_VOWIFI_11R
2019 if ( (csrRoamIsHandoffInProgress(pMac)) &&
2020 (NewSubstate != eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF))
2021 {
2022 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
2023 palCopyMemory(pMac->hHdd, &bssId, pNeighborRoamInfo->csrNeighborRoamProfile.BSSIDs.bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -07002024 } else
2025#endif
2026 if(pSession->pConnectBssDesc)
2027 {
2028 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
2029 }
Jeff Johnsone7245742012-09-05 17:12:55 -07002030
Jeff Johnson295189b2012-06-20 16:38:30 -07002031
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07002032 smsLog( pMac, LOG1, "CSR Attempting to Disassociate Bssid= %02x-%02x-%02x-%02x-%02x-%02x subState = %d",
Jeff Johnson295189b2012-06-20 16:38:30 -07002033 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2034 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ], NewSubstate );
Jeff Johnson295189b2012-06-20 16:38:30 -07002035 csrRoamSubstateChange( pMac, NewSubstate, sessionId);
2036
2037 status = csrSendMBDisassocReqMsg( pMac, sessionId, bssId, reasonCode );
2038
2039 if(HAL_STATUS_SUCCESS(status))
2040 {
2041 csrRoamLinkDown(pMac, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07002042#ifndef WLAN_MDM_CODE_REDUCTION_OPT
2043 //no need to tell QoS that we are disassociating, it will be taken care off in assoc req for HO
2044 if(eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF != NewSubstate)
2045 {
2046 //Tush-QoS: notify QoS module that disassoc happening
2047 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_REQ, NULL);
2048 }
2049#endif
2050 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002051 return (status);
2052}
Jeff Johnson295189b2012-06-20 16:38:30 -07002053#ifdef WLAN_SOFTAP_FEATURE
2054
Jeff Johnson295189b2012-06-20 16:38:30 -07002055/* ---------------------------------------------------------------------------
2056 \fn csrRoamIssueDisassociateStaCmd
2057 \brief csr function that HDD calls to disassociate a associated station
2058 \param sessionId - session Id for Soft AP
2059 \param pPeerMacAddr - MAC of associated station to delete
2060 \param reason - reason code, be one of the tSirMacReasonCodes
2061 \return eHalStatus
2062 ---------------------------------------------------------------------------*/
2063eHalStatus csrRoamIssueDisassociateStaCmd( tpAniSirGlobal pMac,
2064 tANI_U32 sessionId,
2065 tANI_U8 *pPeerMacAddr,
2066 tANI_U32 reason)
2067{
2068 eHalStatus status = eHAL_STATUS_SUCCESS;
2069 tSmeCmd *pCommand;
2070
2071 do
2072 {
2073 pCommand = csrGetCommandBuffer( pMac );
2074 if ( !pCommand )
2075 {
2076 smsLog( pMac, LOGE, FL(" fail to get command buffer") );
2077 status = eHAL_STATUS_RESOURCES;
2078 break;
2079 }
2080 pCommand->command = eSmeCommandRoam;
2081 pCommand->sessionId = (tANI_U8)sessionId;
2082 pCommand->u.roamCmd.roamReason = eCsrForcedDisassocSta;
2083 vos_mem_copy(pCommand->u.roamCmd.peerMac, pPeerMacAddr, 6);
2084 pCommand->u.roamCmd.reason = (tSirMacReasonCodes)reason;
2085 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_FALSE);
2086 if( !HAL_STATUS_SUCCESS( status ) )
2087 {
2088 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
2089 csrReleaseCommandRoam( pMac, pCommand );
2090 }
2091 }while(0);
2092
2093 return status;
2094}
2095
2096
Jeff Johnson295189b2012-06-20 16:38:30 -07002097/* ---------------------------------------------------------------------------
2098 \fn csrRoamIssueDeauthSta
2099 \brief csr function that HDD calls to delete a associated station
2100 \param sessionId - session Id for Soft AP
2101 \param pPeerMacAddr - MAC of associated station to delete
2102 \param reason - reason code, be one of the tSirMacReasonCodes
2103 \return eHalStatus
2104 ---------------------------------------------------------------------------*/
2105eHalStatus csrRoamIssueDeauthStaCmd( tpAniSirGlobal pMac,
2106 tANI_U32 sessionId,
2107 tANI_U8 *pPeerMacAddr,
2108 tANI_U32 reason)
2109{
2110 eHalStatus status = eHAL_STATUS_SUCCESS;
2111 tSmeCmd *pCommand;
2112
2113 do
2114 {
2115 pCommand = csrGetCommandBuffer( pMac );
2116 if ( !pCommand )
2117 {
2118 smsLog( pMac, LOGE, FL(" fail to get command buffer") );
2119 status = eHAL_STATUS_RESOURCES;
2120 break;
2121 }
2122 pCommand->command = eSmeCommandRoam;
2123 pCommand->sessionId = (tANI_U8)sessionId;
2124 pCommand->u.roamCmd.roamReason = eCsrForcedDeauthSta;
2125 vos_mem_copy(pCommand->u.roamCmd.peerMac, pPeerMacAddr, 6);
2126 pCommand->u.roamCmd.reason = (tSirMacReasonCodes)reason;
2127 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_FALSE);
2128 if( !HAL_STATUS_SUCCESS( status ) )
2129 {
2130 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
2131 csrReleaseCommandRoam( pMac, pCommand );
2132 }
2133 }while(0);
2134
2135 return status;
2136}
Jeff Johnson295189b2012-06-20 16:38:30 -07002137eHalStatus
2138csrRoamIssueTkipCounterMeasures( tpAniSirGlobal pMac, tANI_U32 sessionId,
2139 tANI_BOOLEAN bEnable )
2140{
2141 eHalStatus status = eHAL_STATUS_FAILURE;
2142 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2143 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07002144 if (!pSession)
2145 {
2146 smsLog( pMac, LOGE, "csrRoamIssueTkipCounterMeasures:CSR Session not found\n");
2147 return (status);
2148 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002149 if (pSession->pConnectBssDesc)
2150 {
2151 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
2152 }
2153 else
2154 {
2155 smsLog( pMac, LOGE, "csrRoamIssueTkipCounterMeasures:Connected BSS Description in CSR Session not found\n");
2156 return (status);
2157 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002158 smsLog( pMac, LOG2, "CSR issuing tkip counter measures for Bssid = %02x-%02x-%02x-%02x-%02x-%02x, Enable = %d\n",
2159 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2160 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] , bEnable);
Jeff Johnson295189b2012-06-20 16:38:30 -07002161 status = csrSendMBTkipCounterMeasuresReqMsg( pMac, sessionId, bEnable, bssId );
2162 return (status);
2163}
Jeff Johnson295189b2012-06-20 16:38:30 -07002164eHalStatus
2165csrRoamGetAssociatedStas( tpAniSirGlobal pMac, tANI_U32 sessionId,
2166 VOS_MODULE_ID modId, void *pUsrContext,
2167 void *pfnSapEventCallback, v_U8_t *pAssocStasBuf )
2168{
2169 eHalStatus status = eHAL_STATUS_SUCCESS;
2170 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2171 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07002172 if (!pSession)
2173 {
2174 smsLog( pMac, LOGE, "csrRoamGetAssociatedStas:CSR Session not found\n");
2175 return (status);
2176 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002177 if(pSession->pConnectBssDesc)
2178 {
2179 palCopyMemory( pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid) );
2180 }
2181 else
2182 {
2183 smsLog( pMac, LOGE, "csrRoamGetAssociatedStas:Connected BSS Description in CSR Session not found\n");
2184 return (status);
2185 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002186 smsLog( pMac, LOG2, "CSR getting associated stations for Bssid = %02x-%02x-%02x-%02x-%02x-%02x\n",
2187 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2188 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -07002189 status = csrSendMBGetAssociatedStasReqMsg( pMac, sessionId, modId, bssId, pUsrContext, pfnSapEventCallback, pAssocStasBuf );
2190 return (status);
2191}
Jeff Johnson295189b2012-06-20 16:38:30 -07002192eHalStatus
2193csrRoamGetWpsSessionOverlap( tpAniSirGlobal pMac, tANI_U32 sessionId,
2194 void *pUsrContext, void *pfnSapEventCallback, v_MACADDR_t pRemoveMac )
2195{
2196 eHalStatus status = eHAL_STATUS_SUCCESS;
2197 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2198 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
2199
2200 if (!pSession)
2201 {
2202 smsLog( pMac, LOGE, "csrRoamGetWpsSessionOverlap:CSR Session not found\n");
2203 return (status);
2204 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002205 if(pSession->pConnectBssDesc)
2206 {
2207 palCopyMemory( pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid) );
2208 }
2209 else
2210 {
2211 smsLog( pMac, LOGE, "csrRoamGetWpsSessionOverlap:Connected BSS Description in CSR Session not found\n");
2212 return (status);
2213 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002214 smsLog( pMac, LOG2, "CSR getting WPS Session Overlap for Bssid = %02x-%02x-%02x-%02x-%02x-%02x\n",
2215 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2216 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
2217
2218 status = csrSendMBGetWPSPBCSessions( pMac, sessionId, bssId, pUsrContext, pfnSapEventCallback, pRemoveMac);
2219
2220 return (status);
2221}
Jeff Johnson295189b2012-06-20 16:38:30 -07002222#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002223eHalStatus csrRoamIssueDeauth( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamSubState NewSubstate )
2224{
2225 eHalStatus status = eHAL_STATUS_SUCCESS;
2226 tCsrBssid bssId = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2227 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07002228
2229 if (!pSession)
2230 {
2231 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
2232 return eHAL_STATUS_FAILURE;
2233 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002234
2235 if(pSession->pConnectBssDesc)
2236 {
2237 palCopyMemory(pMac->hHdd, &bssId, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
2238 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002239 smsLog( pMac, LOG2, "CSR Attempting to Deauth Bssid= %02x-%02x-%02x-%02x-%02x-%02x\n",
2240 bssId[ 0 ], bssId[ 1 ], bssId[ 2 ],
2241 bssId[ 3 ], bssId[ 4 ], bssId[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -07002242 csrRoamSubstateChange( pMac, NewSubstate, sessionId);
2243
2244 status = csrSendMBDeauthReqMsg( pMac, sessionId, bssId, eSIR_MAC_DISASSOC_LEAVING_BSS_REASON );
2245
2246 return (status);
2247}
2248
Jeff Johnson295189b2012-06-20 16:38:30 -07002249eHalStatus csrRoamSaveConnectedBssDesc( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDesc )
2250{
2251 eHalStatus status = eHAL_STATUS_SUCCESS;
2252 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
2253 tANI_U32 size;
Jeff Johnson32d95a32012-09-10 13:15:23 -07002254
2255 if(!pSession)
2256 {
2257 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
2258 return eHAL_STATUS_FAILURE;
2259 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002260
2261 // If no BSS description was found in this connection (happens with start IBSS), then
2262 // nix the BSS description that we keep around for the connected BSS) and get out...
2263 if(NULL == pBssDesc)
2264 {
2265 csrFreeConnectBssDesc(pMac, sessionId);
2266 }
2267 else
2268 {
2269 size = pBssDesc->length + sizeof( pBssDesc->length );
2270 if(NULL != pSession->pConnectBssDesc)
2271 {
2272 if(((pSession->pConnectBssDesc->length) + sizeof(pSession->pConnectBssDesc->length)) < size)
2273 {
2274 //not enough room for the new BSS, pMac->roam.pConnectBssDesc is freed inside
2275 csrFreeConnectBssDesc(pMac, sessionId);
2276 }
2277 }
2278 if(NULL == pSession->pConnectBssDesc)
2279 {
2280 status = palAllocateMemory( pMac->hHdd, (void **)&pSession->pConnectBssDesc, size);
2281 }
2282 if ( HAL_STATUS_SUCCESS(status) && pSession->pConnectBssDesc )
2283 {
2284 palCopyMemory( pMac->hHdd, pSession->pConnectBssDesc, pBssDesc, size );
2285 }
2286 }
2287
2288 return (status);
2289}
2290
Jeff Johnson295189b2012-06-20 16:38:30 -07002291eHalStatus csrRoamPrepareBssConfig(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
2292 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig,
2293 tDot11fBeaconIEs *pIes)
2294{
2295 eHalStatus status = eHAL_STATUS_SUCCESS;
2296 eCsrCfgDot11Mode cfgDot11Mode;
Jeff Johnson295189b2012-06-20 16:38:30 -07002297#if defined(VOSS_ENABLED)
2298 VOS_ASSERT( pIes != NULL );
2299#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07002300
Jeff Johnson295189b2012-06-20 16:38:30 -07002301 do
2302 {
2303 palCopyMemory(pMac->hHdd, &pBssConfig->BssCap, &pBssDesc->capabilityInfo, sizeof(tSirMacCapabilityInfo));
2304 //get qos
2305 pBssConfig->qosType = csrGetQoSFromBssDesc(pMac, pBssDesc, pIes);
2306 //get SSID
2307 if(pIes->SSID.present)
2308 {
2309 palCopyMemory(pMac->hHdd, &pBssConfig->SSID.ssId, pIes->SSID.ssid, pIes->SSID.num_ssid);
2310 pBssConfig->SSID.length = pIes->SSID.num_ssid;
2311 }
2312 else
2313 pBssConfig->SSID.length = 0;
2314 if(csrIsNULLSSID(pBssConfig->SSID.ssId, pBssConfig->SSID.length))
2315 {
2316 smsLog(pMac, LOGW, " BSS desc SSID is a wildcard\n");
2317 //Return failed if profile doesn't have an SSID either.
2318 if(pProfile->SSIDs.numOfSSIDs == 0)
2319 {
2320 smsLog(pMac, LOGW, " Both BSS desc and profile doesn't have SSID\n");
2321 status = eHAL_STATUS_FAILURE;
2322 break;
2323 }
2324 }
2325 if(CSR_IS_CHANNEL_5GHZ(pBssDesc->channelId))
2326 {
2327 pBssConfig->eBand = eCSR_BAND_5G;
2328 }
2329 else
2330 {
2331 pBssConfig->eBand = eCSR_BAND_24;
2332 }
2333 //phymode
2334 if(csrIsPhyModeMatch( pMac, pProfile->phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes ))
2335 {
2336 pBssConfig->uCfgDot11Mode = cfgDot11Mode;
2337 }
2338 else
2339 {
2340 smsLog(pMac, LOGW, " Can not find match phy mode\n");
2341 //force it
2342 if(eCSR_BAND_24 == pBssConfig->eBand)
2343 {
2344 pBssConfig->uCfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
2345 }
2346 else
2347 {
2348 pBssConfig->uCfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
2349 }
2350 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002351 //Qos
2352 if ((pBssConfig->uCfgDot11Mode != eCSR_CFG_DOT11_MODE_11N) &&
2353 (pMac->roam.configParam.WMMSupportMode == eCsrRoamWmmNoQos))
2354 {
2355 //Joining BSS is not 11n capable and WMM is disabled on client.
2356 //Disable QoS and WMM
2357 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_DCF;
2358 }
Pratik Bhalgatb5b19b02012-11-22 16:28:19 +05302359
2360 if (((pBssConfig->uCfgDot11Mode == eCSR_CFG_DOT11_MODE_11N) ||
2361 (pBssConfig->uCfgDot11Mode == eCSR_CFG_DOT11_MODE_11AC)) &&
2362 ((pBssConfig->qosType != eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP) ||
2363 (pBssConfig->qosType != eCSR_MEDIUM_ACCESS_11e_HCF) ||
2364 (pBssConfig->qosType != eCSR_MEDIUM_ACCESS_11e_eDCF) ))
2365 {
2366 //Joining BSS is 11n capable and WMM is disabled on AP.
2367 //Assume all HT AP's are QOS AP's and enable WMM
2368 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP;
2369 }
2370
2371
Jeff Johnson295189b2012-06-20 16:38:30 -07002372 //auth type
2373 switch( pProfile->negotiatedAuthType )
2374 {
2375 default:
2376 case eCSR_AUTH_TYPE_WPA:
2377 case eCSR_AUTH_TYPE_WPA_PSK:
2378 case eCSR_AUTH_TYPE_WPA_NONE:
2379 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
2380 pBssConfig->authType = eSIR_OPEN_SYSTEM;
2381 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002382 case eCSR_AUTH_TYPE_SHARED_KEY:
2383 pBssConfig->authType = eSIR_SHARED_KEY;
2384 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002385 case eCSR_AUTH_TYPE_AUTOSWITCH:
2386 pBssConfig->authType = eSIR_AUTO_SWITCH;
2387 break;
2388 }
2389 //short slot time
2390 if( eCSR_CFG_DOT11_MODE_11B != cfgDot11Mode )
2391 {
2392 pBssConfig->uShortSlotTime = pMac->roam.configParam.shortSlotTime;
2393 }
2394 else
2395 {
2396 pBssConfig->uShortSlotTime = 0;
2397 }
2398 if(pBssConfig->BssCap.ibss)
2399 {
2400 //We don't support 11h on IBSS
2401 pBssConfig->f11hSupport = eANI_BOOLEAN_FALSE;
2402 }
2403 else
2404 {
2405 pBssConfig->f11hSupport = pMac->roam.configParam.Is11hSupportEnabled;
2406 }
2407 //power constraint
2408 pBssConfig->uPowerLimit = csrGet11hPowerConstraint(pMac, &pIes->PowerConstraints);
2409 //heartbeat
2410 if ( CSR_IS_11A_BSS( pBssDesc ) )
2411 {
2412 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh50;
2413 }
2414 else
2415 {
2416 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh24;
2417 }
2418 //Join timeout
2419 // if we find a BeaconInterval in the BssDescription, then set the Join Timeout to
Jeff Johnsone7245742012-09-05 17:12:55 -07002420 // be 10 x the BeaconInterval.
Jeff Johnson295189b2012-06-20 16:38:30 -07002421 if ( pBssDesc->beaconInterval )
2422 {
2423 //Make sure it is bigger than the minimal
Jeff Johnsone7245742012-09-05 17:12:55 -07002424 pBssConfig->uJoinTimeOut = CSR_ROAM_MAX(10 * pBssDesc->beaconInterval, CSR_JOIN_FAILURE_TIMEOUT_MIN);
Jeff Johnson295189b2012-06-20 16:38:30 -07002425 }
2426 else
2427 {
2428 pBssConfig->uJoinTimeOut = CSR_JOIN_FAILURE_TIMEOUT_DEFAULT;
2429 }
2430 //validate CB
2431 pBssConfig->cbMode = csrGetCBModeFromIes(pMac, pBssDesc->channelId, pIes);
2432 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002433 return (status);
2434}
2435
Jeff Johnson295189b2012-06-20 16:38:30 -07002436static eHalStatus csrRoamPrepareBssConfigFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
2437 tBssConfigParam *pBssConfig, tSirBssDescription *pBssDesc)
2438{
2439 eHalStatus status = eHAL_STATUS_SUCCESS;
2440 tANI_U8 operationChannel = 0;
2441 tANI_U8 qAPisEnabled = FALSE;
2442 //SSID
2443 pBssConfig->SSID.length = 0;
2444 if(pProfile->SSIDs.numOfSSIDs)
2445 {
2446 //only use the first one
2447 palCopyMemory(pMac->hHdd, &pBssConfig->SSID, &pProfile->SSIDs.SSIDList[0].SSID, sizeof(tSirMacSSid));
2448 }
2449 else
2450 {
2451 //SSID must present
2452 return eHAL_STATUS_FAILURE;
2453 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002454 //Settomg up the capabilities
2455 if( csrIsBssTypeIBSS(pProfile->BSSType) )
2456 {
2457 pBssConfig->BssCap.ibss = 1;
2458 }
2459 else
2460 {
2461 pBssConfig->BssCap.ess = 1;
2462 }
2463 if( eCSR_ENCRYPT_TYPE_NONE != pProfile->EncryptionType.encryptionType[0] )
2464 {
2465 pBssConfig->BssCap.privacy = 1;
2466 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002467 pBssConfig->eBand = pMac->roam.configParam.eBand;
2468 //phymode
2469 if(pProfile->ChannelInfo.ChannelList)
2470 {
2471 operationChannel = pProfile->ChannelInfo.ChannelList[0];
2472 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002473#ifdef WLAN_SOFTAP_FEATURE
2474 pBssConfig->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, operationChannel,
2475 &pBssConfig->eBand);
2476#else
Jeff Johnson295189b2012-06-20 16:38:30 -07002477 pBssConfig->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel,
2478 &pBssConfig->eBand);
2479#endif
2480 //QOS
2481 //Is this correct to always set to this //***
Jeff Johnson295189b2012-06-20 16:38:30 -07002482 if ( pBssConfig->BssCap.ess == 1 )
2483 {
2484#ifdef WLAN_SOFTAP_FEATURE
2485 /*For Softap case enable WMM*/
2486 if(CSR_IS_INFRA_AP(pProfile) && (eCsrRoamWmmNoQos != pMac->roam.configParam.WMMSupportMode )){
2487 qAPisEnabled = TRUE;
2488 }
2489 else
2490#endif
2491 if (csrRoamGetQosInfoFromBss(pMac, pBssDesc) == eHAL_STATUS_SUCCESS) {
2492 qAPisEnabled = TRUE;
2493 } else {
2494 qAPisEnabled = FALSE;
2495 }
2496 } else {
2497 qAPisEnabled = TRUE;
2498 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002499 if (( eCsrRoamWmmNoQos != pMac->roam.configParam.WMMSupportMode && qAPisEnabled) ||
2500 (( eCSR_CFG_DOT11_MODE_11N == pBssConfig->uCfgDot11Mode && qAPisEnabled) ||
2501 ( eCSR_CFG_DOT11_MODE_TAURUS == pBssConfig->uCfgDot11Mode ) ) //For 11n, need QoS
2502 )
2503 {
2504 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP;
2505 } else {
2506 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_DCF;
2507 }
2508
2509 //auth type
2510 switch( pProfile->AuthType.authType[0] ) //Take the prefered Auth type.
2511 {
2512 default:
2513 case eCSR_AUTH_TYPE_WPA:
2514 case eCSR_AUTH_TYPE_WPA_PSK:
2515 case eCSR_AUTH_TYPE_WPA_NONE:
2516 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
2517 pBssConfig->authType = eSIR_OPEN_SYSTEM;
2518 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002519 case eCSR_AUTH_TYPE_SHARED_KEY:
2520 pBssConfig->authType = eSIR_SHARED_KEY;
2521 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002522 case eCSR_AUTH_TYPE_AUTOSWITCH:
2523 pBssConfig->authType = eSIR_AUTO_SWITCH;
2524 break;
2525 }
2526 //short slot time
2527 if( WNI_CFG_PHY_MODE_11B != pBssConfig->uCfgDot11Mode )
2528 {
2529 pBssConfig->uShortSlotTime = pMac->roam.configParam.shortSlotTime;
2530 }
2531 else
2532 {
2533 pBssConfig->uShortSlotTime = 0;
2534 }
2535 //power constraint. We don't support 11h on IBSS
2536 pBssConfig->f11hSupport = eANI_BOOLEAN_FALSE;
2537 pBssConfig->uPowerLimit = 0;
2538 //heartbeat
2539 if ( eCSR_BAND_5G == pBssConfig->eBand )
2540 {
2541 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh50;
2542 }
2543 else
2544 {
2545 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh24;
2546 }
2547 //Join timeout
2548 pBssConfig->uJoinTimeOut = CSR_JOIN_FAILURE_TIMEOUT_DEFAULT;
Jeff Johnsone7245742012-09-05 17:12:55 -07002549
Jeff Johnson295189b2012-06-20 16:38:30 -07002550 return (status);
2551}
Jeff Johnson295189b2012-06-20 16:38:30 -07002552static eHalStatus csrRoamGetQosInfoFromBss(tpAniSirGlobal pMac, tSirBssDescription *pBssDesc)
2553{
2554 eHalStatus status = eHAL_STATUS_FAILURE;
2555 tDot11fBeaconIEs *pIes = NULL;
2556
2557 do
2558 {
2559 if(!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIes)))
2560 {
2561 //err msg
2562 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
2563 "csrRoamGetQosInfoFromBss() failed\n");
Jeff Johnson295189b2012-06-20 16:38:30 -07002564 break;
2565 }
2566 //check if the AP is QAP & it supports APSD
2567 if( CSR_IS_QOS_BSS(pIes) )
2568 {
2569 return eHAL_STATUS_SUCCESS;
2570 }
2571 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002572 return status;
2573}
2574
Jeff Johnson295189b2012-06-20 16:38:30 -07002575void csrSetCfgPrivacy( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, tANI_BOOLEAN fPrivacy )
2576{
Jeff Johnson295189b2012-06-20 16:38:30 -07002577 // !! Note: the only difference between this function and the csrSetCfgPrivacyFromProfile() is the
2578 // setting of the privacy CFG based on the advertised privacy setting from the AP for WPA associations.
2579 // See !!Note: below in this function...
2580 tANI_U32 PrivacyEnabled = 0;
2581 tANI_U32 RsnEnabled = 0;
2582 tANI_U32 WepDefaultKeyId = 0;
2583 tANI_U32 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_5; /* default 40 bits */
2584 tANI_U32 Key0Length = 0;
2585 tANI_U32 Key1Length = 0;
2586 tANI_U32 Key2Length = 0;
2587 tANI_U32 Key3Length = 0;
2588
2589 // Reserve for the biggest key
2590 tANI_U8 Key0[ WNI_CFG_WEP_DEFAULT_KEY_1_LEN ];
2591 tANI_U8 Key1[ WNI_CFG_WEP_DEFAULT_KEY_2_LEN ];
2592 tANI_U8 Key2[ WNI_CFG_WEP_DEFAULT_KEY_3_LEN ];
2593 tANI_U8 Key3[ WNI_CFG_WEP_DEFAULT_KEY_4_LEN ];
2594
2595 switch ( pProfile->negotiatedUCEncryptionType )
2596 {
2597 case eCSR_ENCRYPT_TYPE_NONE:
2598
2599 // for NO encryption, turn off Privacy and Rsn.
2600 PrivacyEnabled = 0;
2601 RsnEnabled = 0;
2602
2603 // WEP key length and Wep Default Key ID don't matter in this case....
2604
2605 // clear out the WEP keys that may be hanging around.
2606 Key0Length = 0;
2607 Key1Length = 0;
2608 Key2Length = 0;
2609 Key3Length = 0;
2610
2611 break;
2612
2613 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
2614
2615 // Privacy is ON. NO RSN for Wep40 static key.
2616 PrivacyEnabled = 1;
2617 RsnEnabled = 0;
2618
2619 // Set the Wep default key ID.
2620 WepDefaultKeyId = pProfile->Keys.defaultIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07002621 // Wep key size if 5 bytes (40 bits).
2622 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_5;
2623
2624 // set encryption keys in the CFG database or clear those that are not present in this profile.
2625 if ( pProfile->Keys.KeyLength[0] )
2626 {
2627 palCopyMemory( pMac->hHdd, Key0, pProfile->Keys.KeyMaterial[0], WNI_CFG_WEP_KEY_LENGTH_5 );
2628 Key0Length = WNI_CFG_WEP_KEY_LENGTH_5;
2629 }
2630 else
2631 {
2632 Key0Length = 0;
2633 }
2634
2635 if ( pProfile->Keys.KeyLength[1] )
2636 {
2637 palCopyMemory( pMac->hHdd, Key1, pProfile->Keys.KeyMaterial[1], WNI_CFG_WEP_KEY_LENGTH_5 );
2638 Key1Length = WNI_CFG_WEP_KEY_LENGTH_5;
2639 }
2640 else
2641 {
2642 Key1Length = 0;
2643 }
2644
2645 if ( pProfile->Keys.KeyLength[2] )
2646 {
2647 palCopyMemory( pMac->hHdd, Key2, pProfile->Keys.KeyMaterial[2], WNI_CFG_WEP_KEY_LENGTH_5 );
2648 Key2Length = WNI_CFG_WEP_KEY_LENGTH_5;
2649 }
2650 else
2651 {
2652 Key2Length = 0;
2653 }
2654
2655 if ( pProfile->Keys.KeyLength[3] )
2656 {
2657 palCopyMemory( pMac->hHdd, Key3, pProfile->Keys.KeyMaterial[3], WNI_CFG_WEP_KEY_LENGTH_5 );
2658 Key3Length = WNI_CFG_WEP_KEY_LENGTH_5;
2659 }
2660 else
2661 {
2662 Key3Length = 0;
2663 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002664 break;
2665
2666 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
2667
2668 // Privacy is ON. NO RSN for Wep40 static key.
2669 PrivacyEnabled = 1;
2670 RsnEnabled = 0;
2671
2672 // Set the Wep default key ID.
2673 WepDefaultKeyId = pProfile->Keys.defaultIndex;
2674
2675 // Wep key size if 13 bytes (104 bits).
2676 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_13;
2677
2678 // set encryption keys in the CFG database or clear those that are not present in this profile.
2679 if ( pProfile->Keys.KeyLength[0] )
2680 {
2681 palCopyMemory( pMac->hHdd, Key0, pProfile->Keys.KeyMaterial[ 0 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2682 Key0Length = WNI_CFG_WEP_KEY_LENGTH_13;
2683 }
2684 else
2685 {
2686 Key0Length = 0;
2687 }
2688
2689 if ( pProfile->Keys.KeyLength[1] )
2690 {
2691 palCopyMemory( pMac->hHdd, Key1, pProfile->Keys.KeyMaterial[ 1 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2692 Key1Length = WNI_CFG_WEP_KEY_LENGTH_13;
2693 }
2694 else
2695 {
2696 Key1Length = 0;
2697 }
2698
2699 if ( pProfile->Keys.KeyLength[2] )
2700 {
2701 palCopyMemory( pMac->hHdd, Key2, pProfile->Keys.KeyMaterial[ 2 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2702 Key2Length = WNI_CFG_WEP_KEY_LENGTH_13;
2703 }
2704 else
2705 {
2706 Key2Length = 0;
2707 }
2708
2709 if ( pProfile->Keys.KeyLength[3] )
2710 {
2711 palCopyMemory( pMac->hHdd, Key3, pProfile->Keys.KeyMaterial[ 3 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2712 Key3Length = WNI_CFG_WEP_KEY_LENGTH_13;
2713 }
2714 else
2715 {
2716 Key3Length = 0;
2717 }
2718
2719 break;
2720
2721 case eCSR_ENCRYPT_TYPE_WEP40:
2722 case eCSR_ENCRYPT_TYPE_WEP104:
2723 case eCSR_ENCRYPT_TYPE_TKIP:
2724 case eCSR_ENCRYPT_TYPE_AES:
2725#ifdef FEATURE_WLAN_WAPI
2726 case eCSR_ENCRYPT_TYPE_WPI:
2727#endif /* FEATURE_WLAN_WAPI */
2728 // !! Note: this is the only difference between this function and the csrSetCfgPrivacyFromProfile()
2729 // (setting of the privacy CFG based on the advertised privacy setting from the AP for WPA/WAPI associations ).
2730 PrivacyEnabled = (0 != fPrivacy);
2731
2732 // turn on RSN enabled for WPA associations
2733 RsnEnabled = 1;
2734
2735 // WEP key length and Wep Default Key ID don't matter in this case....
2736
2737 // clear out the static WEP keys that may be hanging around.
2738 Key0Length = 0;
2739 Key1Length = 0;
2740 Key2Length = 0;
2741 Key3Length = 0;
2742
2743 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002744 default:
2745 PrivacyEnabled = 0;
2746 RsnEnabled = 0;
2747 break;
2748 }
2749
2750 ccmCfgSetInt(pMac, WNI_CFG_PRIVACY_ENABLED, PrivacyEnabled, NULL, eANI_BOOLEAN_FALSE);
2751 ccmCfgSetInt(pMac, WNI_CFG_RSN_ENABLED, RsnEnabled, NULL, eANI_BOOLEAN_FALSE);
2752 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_1, Key0, Key0Length, NULL, eANI_BOOLEAN_FALSE);
2753 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_2, Key1, Key1Length, NULL, eANI_BOOLEAN_FALSE);
2754 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_3, Key2, Key2Length, NULL, eANI_BOOLEAN_FALSE);
2755 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_4, Key3, Key3Length, NULL, eANI_BOOLEAN_FALSE);
2756 ccmCfgSetInt(pMac, WNI_CFG_WEP_KEY_LENGTH, WepKeyLength, NULL, eANI_BOOLEAN_FALSE);
2757 ccmCfgSetInt(pMac, WNI_CFG_WEP_DEFAULT_KEYID, WepDefaultKeyId, NULL, eANI_BOOLEAN_FALSE);
2758}
2759
Jeff Johnson295189b2012-06-20 16:38:30 -07002760static void csrSetCfgSsid( tpAniSirGlobal pMac, tSirMacSSid *pSSID )
2761{
2762 tANI_U32 len = 0;
2763 if(pSSID->length <= WNI_CFG_SSID_LEN)
2764 {
2765 len = pSSID->length;
2766 }
2767 ccmCfgSetStr(pMac, WNI_CFG_SSID, (tANI_U8 *)pSSID->ssId, len, NULL, eANI_BOOLEAN_FALSE);
2768}
2769
Jeff Johnson295189b2012-06-20 16:38:30 -07002770eHalStatus csrSetQosToCfg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrMediaAccessType qosType )
2771{
2772 eHalStatus status = eHAL_STATUS_SUCCESS;
2773 tANI_U32 QoSEnabled;
2774 tANI_U32 WmeEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07002775 // set the CFG enable/disable variables based on the qosType being configured...
2776 switch( qosType )
2777 {
Jeff Johnson295189b2012-06-20 16:38:30 -07002778 case eCSR_MEDIUM_ACCESS_WMM_eDCF_802dot1p:
2779 QoSEnabled = FALSE;
2780 WmeEnabled = TRUE;
2781 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002782 case eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP:
2783 QoSEnabled = FALSE;
2784 WmeEnabled = TRUE;
2785 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002786 case eCSR_MEDIUM_ACCESS_WMM_eDCF_NoClassify:
2787 QoSEnabled = FALSE;
2788 WmeEnabled = TRUE;
2789 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002790 case eCSR_MEDIUM_ACCESS_11e_eDCF:
2791 QoSEnabled = TRUE;
2792 WmeEnabled = FALSE;
2793 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002794 case eCSR_MEDIUM_ACCESS_11e_HCF:
2795 QoSEnabled = TRUE;
2796 WmeEnabled = FALSE;
2797 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002798 default:
2799 case eCSR_MEDIUM_ACCESS_DCF:
2800 QoSEnabled = FALSE;
2801 WmeEnabled = FALSE;
2802 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002803 }
2804 //save the WMM setting for later use
2805 pMac->roam.roamSession[sessionId].fWMMConnection = (tANI_BOOLEAN)WmeEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07002806 status = ccmCfgSetInt(pMac, WNI_CFG_QOS_ENABLED, QoSEnabled, NULL, eANI_BOOLEAN_FALSE);
2807 status = ccmCfgSetInt(pMac, WNI_CFG_WME_ENABLED, WmeEnabled, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002808 return (status);
2809}
Jeff Johnson295189b2012-06-20 16:38:30 -07002810static eHalStatus csrGetRateSet( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, eCsrPhyMode phyMode, tSirBssDescription *pBssDesc,
2811 tDot11fBeaconIEs *pIes, tSirMacRateSet *pOpRateSet, tSirMacRateSet *pExRateSet)
2812{
2813 eHalStatus status = eHAL_STATUS_FAILURE;
2814 int i;
2815 eCsrCfgDot11Mode cfgDot11Mode;
2816 tANI_U8 *pDstRate;
Jeff Johnson295189b2012-06-20 16:38:30 -07002817 palZeroMemory(pMac->hHdd, pOpRateSet, sizeof(tSirMacRateSet));
2818 palZeroMemory(pMac->hHdd, pExRateSet, sizeof(tSirMacRateSet));
Jeff Johnson295189b2012-06-20 16:38:30 -07002819#if defined(VOSS_ENABLED)
2820 VOS_ASSERT( pIes != NULL );
2821#endif
2822
2823 if( NULL != pIes )
2824 {
2825 csrIsPhyModeMatch( pMac, phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07002826 // Originally, we thought that for 11a networks, the 11a rates are always
2827 // in the Operational Rate set & for 11b and 11g networks, the 11b rates
2828 // appear in the Operational Rate set. Consequently, in either case, we
2829 // would blindly put the rates we support into our Operational Rate set
2830 // (including the basic rates, which we have already verified are
2831 // supported earlier in the roaming decision).
Jeff Johnson295189b2012-06-20 16:38:30 -07002832 // However, it turns out that this is not always the case. Some AP's
2833 // (e.g. D-Link DI-784) ram 11g rates into the Operational Rate set,
2834 // too. Now, we're a little more careful:
2835 pDstRate = pOpRateSet->rate;
2836 if(pIes->SuppRates.present)
2837 {
2838 for ( i = 0; i < pIes->SuppRates.num_rates; i++ )
2839 {
2840 if ( csrRatesIsDot11RateSupported( pMac, pIes->SuppRates.rates[ i ] ) )
2841 {
2842 *pDstRate++ = pIes->SuppRates.rates[ i ];
Madan Mohan Koyyalamudi4e31b132012-11-02 13:13:52 -07002843 pOpRateSet->numRates++;
Jeff Johnson295189b2012-06-20 16:38:30 -07002844 }
2845 }
2846 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002847 if ( eCSR_CFG_DOT11_MODE_11G == cfgDot11Mode ||
2848 eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode ||
2849 eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode ||
2850 eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
2851 {
2852 // If there are Extended Rates in the beacon, we will reflect those
2853 // extended rates that we support in out Extended Operational Rate
2854 // set:
2855 pDstRate = pExRateSet->rate;
2856 if(pIes->ExtSuppRates.present)
2857 {
2858 for ( i = 0; i < pIes->ExtSuppRates.num_rates; i++ )
2859 {
2860 if ( csrRatesIsDot11RateSupported( pMac, pIes->ExtSuppRates.rates[ i ] ) )
2861 {
2862 *pDstRate++ = pIes->ExtSuppRates.rates[ i ];
2863 pExRateSet->numRates++;
2864 }
2865 }
2866 }
2867 }
2868 }//Parsing BSSDesc
2869 else
2870 {
2871 smsLog(pMac, LOGE, FL("failed to parse BssDesc\n"));
2872 }
2873 if (pOpRateSet->numRates > 0 || pExRateSet->numRates > 0) status = eHAL_STATUS_SUCCESS;
2874 return status;
2875}
2876
2877static void csrSetCfgRateSet( tpAniSirGlobal pMac, eCsrPhyMode phyMode, tCsrRoamProfile *pProfile,
2878 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
2879{
2880 int i;
2881 tANI_U8 *pDstRate;
2882 eCsrCfgDot11Mode cfgDot11Mode;
2883 tANI_U8 OperationalRates[ CSR_DOT11_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2884 tANI_U32 OperationalRatesLength = 0;
2885 tANI_U8 ExtendedOperationalRates[ CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2886 tANI_U32 ExtendedOperationalRatesLength = 0;
2887 tANI_U8 ProprietaryOperationalRates[ 4 ]; // leave enough room for the max number of proprietary rates
2888 tANI_U32 ProprietaryOperationalRatesLength = 0;
2889 tANI_U32 PropRatesEnable = 0;
2890 tANI_U8 MCSRateIdxSet[ SIZE_OF_SUPPORTED_MCS_SET ];
2891 tANI_U32 MCSRateLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002892#if defined(VOSS_ENABLED)
2893 VOS_ASSERT( pIes != NULL );
2894#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002895 if( NULL != pIes )
2896 {
2897 csrIsPhyModeMatch( pMac, phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07002898 // Originally, we thought that for 11a networks, the 11a rates are always
2899 // in the Operational Rate set & for 11b and 11g networks, the 11b rates
2900 // appear in the Operational Rate set. Consequently, in either case, we
2901 // would blindly put the rates we support into our Operational Rate set
2902 // (including the basic rates, which we have already verified are
2903 // supported earlier in the roaming decision).
Jeff Johnson295189b2012-06-20 16:38:30 -07002904 // However, it turns out that this is not always the case. Some AP's
2905 // (e.g. D-Link DI-784) ram 11g rates into the Operational Rate set,
2906 // too. Now, we're a little more careful:
2907 pDstRate = OperationalRates;
2908 if(pIes->SuppRates.present)
2909 {
2910 for ( i = 0; i < pIes->SuppRates.num_rates; i++ )
2911 {
2912 if ( csrRatesIsDot11RateSupported( pMac, pIes->SuppRates.rates[ i ] ) &&
2913 ( OperationalRatesLength < CSR_DOT11_SUPPORTED_RATES_MAX ))
2914 {
2915 *pDstRate++ = pIes->SuppRates.rates[ i ];
2916 OperationalRatesLength++;
2917 }
2918 }
2919 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002920 if ( eCSR_CFG_DOT11_MODE_11G == cfgDot11Mode ||
2921 eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode ||
2922 eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode ||
2923 eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
2924 {
2925 // If there are Extended Rates in the beacon, we will reflect those
2926 // extended rates that we support in out Extended Operational Rate
2927 // set:
2928 pDstRate = ExtendedOperationalRates;
2929 if(pIes->ExtSuppRates.present)
2930 {
2931 for ( i = 0; i < pIes->ExtSuppRates.num_rates; i++ )
2932 {
2933 if ( csrRatesIsDot11RateSupported( pMac, pIes->ExtSuppRates.rates[ i ] ) &&
2934 ( ExtendedOperationalRatesLength < CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ))
2935 {
2936 *pDstRate++ = pIes->ExtSuppRates.rates[ i ];
2937 ExtendedOperationalRatesLength++;
2938 }
2939 }
2940 }
2941 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002942 // Enable proprietary MAC features if peer node is Airgo node and STA
2943 // user wants to use them
2944 if( pIes->Airgo.present && pMac->roam.configParam.ProprietaryRatesEnabled )
2945 {
2946 PropRatesEnable = 1;
2947 }
2948 else
2949 {
2950 PropRatesEnable = 0;
2951 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002952 // For ANI network companions, we need to populate the proprietary rate
2953 // set with any proprietary rates we found in the beacon, only if user
2954 // allows them...
2955 if ( PropRatesEnable && pIes->Airgo.PropSuppRates.present &&
2956 ( pIes->Airgo.PropSuppRates.num_rates > 0 ))
2957 {
2958 ProprietaryOperationalRatesLength = pIes->Airgo.PropSuppRates.num_rates;
2959 if ( ProprietaryOperationalRatesLength > sizeof(ProprietaryOperationalRates) )
2960 {
2961 ProprietaryOperationalRatesLength = sizeof (ProprietaryOperationalRates);
2962 }
2963 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates, pIes->Airgo.PropSuppRates.rates, ProprietaryOperationalRatesLength );
2964 }
2965 else {
2966 // No proprietary modes...
2967 ProprietaryOperationalRatesLength = 0;
2968 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002969 /* Get MCS Rate */
2970 pDstRate = MCSRateIdxSet;
2971 if ( pIes->HTCaps.present )
2972 {
2973 for ( i = 0; i < VALID_MAX_MCS_INDEX; i++ )
2974 {
2975 if ( (unsigned int)pIes->HTCaps.supportedMCSSet[0] & (1 << i) )
2976 {
2977 MCSRateLength++;
2978 *pDstRate++ = i;
2979 }
2980 }
2981 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002982 // Set the operational rate set CFG variables...
2983 ccmCfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET, OperationalRates,
2984 OperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2985 ccmCfgSetStr(pMac, WNI_CFG_EXTENDED_OPERATIONAL_RATE_SET, ExtendedOperationalRates,
2986 ExtendedOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2987 ccmCfgSetStr(pMac, WNI_CFG_PROPRIETARY_OPERATIONAL_RATE_SET,
2988 ProprietaryOperationalRates,
2989 ProprietaryOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2990 ccmCfgSetInt(pMac, WNI_CFG_PROPRIETARY_ANI_FEATURES_ENABLED, PropRatesEnable, NULL, eANI_BOOLEAN_FALSE);
2991 ccmCfgSetStr(pMac, WNI_CFG_CURRENT_MCS_SET, MCSRateIdxSet,
2992 MCSRateLength, NULL, eANI_BOOLEAN_FALSE);
2993 }//Parsing BSSDesc
2994 else
2995 {
2996 smsLog(pMac, LOGE, FL("failed to parse BssDesc\n"));
2997 }
2998}
2999
Jeff Johnson295189b2012-06-20 16:38:30 -07003000static void csrSetCfgRateSetFromProfile( tpAniSirGlobal pMac,
3001 tCsrRoamProfile *pProfile )
3002{
3003 tSirMacRateSetIE DefaultSupportedRates11a = { SIR_MAC_RATESET_EID,
3004 { 8,
3005 { SIR_MAC_RATE_6,
3006 SIR_MAC_RATE_9,
3007 SIR_MAC_RATE_12,
3008 SIR_MAC_RATE_18,
3009 SIR_MAC_RATE_24,
3010 SIR_MAC_RATE_36,
3011 SIR_MAC_RATE_48,
3012 SIR_MAC_RATE_54 } } };
Jeff Johnson295189b2012-06-20 16:38:30 -07003013 tSirMacRateSetIE DefaultSupportedRates11b = { SIR_MAC_RATESET_EID,
3014 { 4,
3015 { SIR_MAC_RATE_1,
3016 SIR_MAC_RATE_2,
3017 SIR_MAC_RATE_5_5,
3018 SIR_MAC_RATE_11 } } };
3019
3020
3021 tSirMacPropRateSet DefaultSupportedPropRates = { 3,
3022 { SIR_MAC_RATE_72,
3023 SIR_MAC_RATE_96,
3024 SIR_MAC_RATE_108 } };
3025 eCsrCfgDot11Mode cfgDot11Mode;
3026 eCsrBand eBand;
3027 tANI_U8 OperationalRates[ CSR_DOT11_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
3028 tANI_U32 OperationalRatesLength = 0;
3029 tANI_U8 ExtendedOperationalRates[ CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
3030 tANI_U32 ExtendedOperationalRatesLength = 0;
3031 tANI_U8 ProprietaryOperationalRates[ 4 ]; // leave enough room for the max number of proprietary rates
3032 tANI_U32 ProprietaryOperationalRatesLength = 0;
3033 tANI_U32 PropRatesEnable = 0;
3034 tANI_U8 operationChannel = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003035 if(pProfile->ChannelInfo.ChannelList)
3036 {
3037 operationChannel = pProfile->ChannelInfo.ChannelList[0];
3038 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003039#ifdef WLAN_SOFTAP_FEATURE
3040 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, pProfile, operationChannel, &eBand );
3041#else
3042 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel, &eBand );
3043#endif
3044 // For 11a networks, the 11a rates go into the Operational Rate set. For 11b and 11g
3045 // networks, the 11b rates appear in the Operational Rate set. In either case,
3046 // we can blindly put the rates we support into our Operational Rate set
3047 // (including the basic rates, which we have already verified are supported
3048 // earlier in the roaming decision).
3049 if ( eCSR_BAND_5G == eBand )
3050 {
3051 // 11a rates into the Operational Rate Set.
3052 OperationalRatesLength = DefaultSupportedRates11a.supportedRateSet.numRates *
3053 sizeof(*DefaultSupportedRates11a.supportedRateSet.rate);
3054 palCopyMemory( pMac->hHdd, OperationalRates,
3055 DefaultSupportedRates11a.supportedRateSet.rate,
3056 OperationalRatesLength );
3057
3058 // Nothing in the Extended rate set.
3059 ExtendedOperationalRatesLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003060 // populate proprietary rates if user allows them
3061 if ( pMac->roam.configParam.ProprietaryRatesEnabled )
3062 {
3063 ProprietaryOperationalRatesLength = DefaultSupportedPropRates.numPropRates *
3064 sizeof(*DefaultSupportedPropRates.propRate);
3065 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates,
3066 DefaultSupportedPropRates.propRate,
3067 ProprietaryOperationalRatesLength );
3068 }
3069 else
3070 {
3071 // No proprietary modes
3072 ProprietaryOperationalRatesLength = 0;
3073 }
3074 }
3075 else if ( eCSR_CFG_DOT11_MODE_11B == cfgDot11Mode )
3076 {
3077 // 11b rates into the Operational Rate Set.
3078 OperationalRatesLength = DefaultSupportedRates11b.supportedRateSet.numRates *
3079 sizeof(*DefaultSupportedRates11b.supportedRateSet.rate);
3080 palCopyMemory( pMac->hHdd, OperationalRates,
3081 DefaultSupportedRates11b.supportedRateSet.rate,
3082 OperationalRatesLength );
3083 // Nothing in the Extended rate set.
3084 ExtendedOperationalRatesLength = 0;
3085 // No proprietary modes
3086 ProprietaryOperationalRatesLength = 0;
3087 }
3088 else
3089 {
3090 // 11G
3091
3092 // 11b rates into the Operational Rate Set.
3093 OperationalRatesLength = DefaultSupportedRates11b.supportedRateSet.numRates *
3094 sizeof(*DefaultSupportedRates11b.supportedRateSet.rate);
3095 palCopyMemory( pMac->hHdd, OperationalRates,
3096 DefaultSupportedRates11b.supportedRateSet.rate,
3097 OperationalRatesLength );
3098
3099 // 11a rates go in the Extended rate set.
3100 ExtendedOperationalRatesLength = DefaultSupportedRates11a.supportedRateSet.numRates *
3101 sizeof(*DefaultSupportedRates11a.supportedRateSet.rate);
3102 palCopyMemory( pMac->hHdd, ExtendedOperationalRates,
3103 DefaultSupportedRates11a.supportedRateSet.rate,
3104 ExtendedOperationalRatesLength );
3105
3106 // populate proprietary rates if user allows them
3107 if ( pMac->roam.configParam.ProprietaryRatesEnabled )
3108 {
3109 ProprietaryOperationalRatesLength = DefaultSupportedPropRates.numPropRates *
3110 sizeof(*DefaultSupportedPropRates.propRate);
3111 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates,
3112 DefaultSupportedPropRates.propRate,
3113 ProprietaryOperationalRatesLength );
3114 }
3115 else
3116 {
3117 // No proprietary modes
3118 ProprietaryOperationalRatesLength = 0;
3119 }
3120 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003121 // set this to 1 if prop. rates need to be advertised in to the IBSS beacon and user wants to use them
3122 if ( ProprietaryOperationalRatesLength && pMac->roam.configParam.ProprietaryRatesEnabled )
3123 {
3124 PropRatesEnable = 1;
3125 }
3126 else
3127 {
3128 PropRatesEnable = 0;
3129 }
3130
3131 // Set the operational rate set CFG variables...
3132 ccmCfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET, OperationalRates,
3133 OperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3134 ccmCfgSetStr(pMac, WNI_CFG_EXTENDED_OPERATIONAL_RATE_SET, ExtendedOperationalRates,
3135 ExtendedOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3136 ccmCfgSetStr(pMac, WNI_CFG_PROPRIETARY_OPERATIONAL_RATE_SET,
3137 ProprietaryOperationalRates,
3138 ProprietaryOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3139 ccmCfgSetInt(pMac, WNI_CFG_PROPRIETARY_ANI_FEATURES_ENABLED, PropRatesEnable, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003140}
Jeff Johnson295189b2012-06-20 16:38:30 -07003141void csrRoamCcmCfgSetCallback(tHalHandle hHal, tANI_S32 result)
3142{
3143 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
Jeff Johnsone7245742012-09-05 17:12:55 -07003144
Jeff Johnson295189b2012-06-20 16:38:30 -07003145 tListElem *pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
3146 tANI_U32 sessionId;
3147 tSmeCmd *pCommand = NULL;
3148
3149 if(NULL == pEntry)
3150 {
3151 smsLog(pMac, LOGW, " CFG_CNF with active list empty\n");
3152 return;
3153 }
3154 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
3155 sessionId = pCommand->sessionId;
3156
3157 if(CSR_IS_ROAM_JOINING(pMac, sessionId) && CSR_IS_ROAM_SUBSTATE_CONFIG(pMac, sessionId))
3158 {
3159 csrRoamingStateConfigCnfProcessor(pMac, (tANI_U32)result);
3160 }
3161}
3162
Jeff Johnson295189b2012-06-20 16:38:30 -07003163//This function is very dump. It is here because PE still need WNI_CFG_PHY_MODE
3164tANI_U32 csrRoamGetPhyModeFromDot11Mode(eCsrCfgDot11Mode dot11Mode, eCsrBand band)
3165{
3166 if(eCSR_CFG_DOT11_MODE_11B == dot11Mode)
3167 {
3168 return (WNI_CFG_PHY_MODE_11B);
3169 }
3170 else
3171 {
3172 if(eCSR_BAND_24 == band)
3173 return (WNI_CFG_PHY_MODE_11G);
3174 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003175 return (WNI_CFG_PHY_MODE_11A);
3176}
Jeff Johnson295189b2012-06-20 16:38:30 -07003177
Jeff Johnsone7245742012-09-05 17:12:55 -07003178
3179#ifdef WLAN_FEATURE_11AC
3180ePhyChanBondState csrGetHTCBStateFromVHTCBState(ePhyChanBondState aniCBMode)
3181{
3182 switch ( aniCBMode )
3183 {
3184 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3185 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3186 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3187 return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
3188 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3189 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3190 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3191 return PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
3192 case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
Madan Mohan Koyyalamudi2c112c52012-10-30 17:59:49 -07003193 default :
Jeff Johnsone7245742012-09-05 17:12:55 -07003194 return PHY_SINGLE_CHANNEL_CENTERED;
3195 }
3196}
3197#endif
3198
Jeff Johnson295189b2012-06-20 16:38:30 -07003199//pIes may be NULL
3200eHalStatus csrRoamSetBssConfigCfg(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
3201 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig,
3202 tDot11fBeaconIEs *pIes)
3203{
3204 eHalStatus status = eHAL_STATUS_SUCCESS;
3205 tANI_U32 cfgCb = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
3206 tANI_U8 channel = 0;
3207 //Make sure we have the domain info for the BSS we try to connect to.
3208 //Do we need to worry about sequence for OSs that are not Windows??
3209 if(pBssDesc)
3210 {
3211 if(csrLearnCountryInformation(pMac, pBssDesc, pIes, eANI_BOOLEAN_TRUE))
3212 {
3213 //Make sure the 11d info from this BSSDesc can be applied
3214 pMac->scan.fAmbiguous11dInfoFound = eANI_BOOLEAN_FALSE;
3215 csrApplyCountryInformation( pMac, TRUE );
3216 }
3217 }
3218
3219 //Qos
3220 csrSetQosToCfg( pMac, sessionId, pBssConfig->qosType );
3221 //SSID
3222 csrSetCfgSsid(pMac, &pBssConfig->SSID );
3223 //fragment threshold
3224 //ccmCfgSetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD, csrGetFragThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
3225 //RTS threshold
3226 //ccmCfgSetInt(pMac, WNI_CFG_RTS_THRESHOLD, csrGetRTSThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
3227
3228 //ccmCfgSetInt(pMac, WNI_CFG_DOT11_MODE, csrTranslateToWNICfgDot11Mode(pMac, pBssConfig->uCfgDot11Mode), NULL, eANI_BOOLEAN_FALSE);
3229
3230 //Auth type
3231 ccmCfgSetInt(pMac, WNI_CFG_AUTHENTICATION_TYPE, pBssConfig->authType, NULL, eANI_BOOLEAN_FALSE);
3232 //encryption type
3233 csrSetCfgPrivacy(pMac, pProfile, (tANI_BOOLEAN)pBssConfig->BssCap.privacy );
3234 //short slot time
3235 ccmCfgSetInt(pMac, WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED, pBssConfig->uShortSlotTime, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003236#ifdef WLAN_SOFTAP_FEATURE
3237 //11d
3238 ccmCfgSetInt(pMac, WNI_CFG_11D_ENABLED,
3239 ((pBssConfig->f11hSupport) ? pBssConfig->f11hSupport : pProfile->ieee80211d),
3240 NULL, eANI_BOOLEAN_FALSE);
3241#endif
3242 /*//11h
3243 ccmCfgSetInt(pMac, WNI_CFG_11H_ENABLED, pMac->roam.configParam.Is11hSupportEnabled, NULL, eANI_BOOLEAN_FALSE);
3244 */
3245 ccmCfgSetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, pBssConfig->uPowerLimit, NULL, eANI_BOOLEAN_FALSE);
3246 //CB
Jeff Johnsone7245742012-09-05 17:12:55 -07003247
Jeff Johnson295189b2012-06-20 16:38:30 -07003248 if(CSR_IS_INFRA_AP(pProfile) || CSR_IS_WDS_AP(pProfile))
3249 {
3250 channel = pProfile->operationChannel;
3251 }
3252 else
3253 {
3254 if(pBssDesc)
3255 {
3256 channel = pBssDesc->channelId;
3257 }
3258 }
3259 if(0 != channel)
3260 {
3261 if(CSR_IS_CHANNEL_24GHZ(channel))
3262 {//for now if we are on 2.4 Ghz, CB will be always disabled
3263 cfgCb = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
3264 }
3265 else
3266 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003267 cfgCb = pBssConfig->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003268 }
3269 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003270#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudia0d88932012-11-13 10:51:26 -08003271 // cbMode = 1 in cfg.ini is mapped to PHY_DOUBLE_CHANNEL_HIGH_PRIMARY = 3
3272 // in function csrConvertCBIniValueToPhyCBState()
3273 // So, max value for cbMode in 40MHz mode is 3 (MAC\src\include\sirParams.h)
3274 if(cfgCb > PHY_DOUBLE_CHANNEL_HIGH_PRIMARY)
Jeff Johnsone7245742012-09-05 17:12:55 -07003275 {
Madan Mohan Koyyalamudi2c112c52012-10-30 17:59:49 -07003276 if(!WDA_getFwWlanFeatCaps(DOT11AC)) {
Jeff Johnsone7245742012-09-05 17:12:55 -07003277 cfgCb = csrGetHTCBStateFromVHTCBState(cfgCb);
Madan Mohan Koyyalamudi2c112c52012-10-30 17:59:49 -07003278 }
3279 else
3280 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003281 ccmCfgSetInt(pMac, WNI_CFG_VHT_CHANNEL_WIDTH, pMac->roam.configParam.nVhtChannelWidth, NULL, eANI_BOOLEAN_FALSE);
Madan Mohan Koyyalamudi2c112c52012-10-30 17:59:49 -07003282 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003283 }
3284 else
3285#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003286 ccmCfgSetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, cfgCb, NULL, eANI_BOOLEAN_FALSE);
3287 //Rate
3288 //Fixed Rate
3289 if(pBssDesc)
3290 {
3291 csrSetCfgRateSet(pMac, (eCsrPhyMode)pProfile->phyMode, pProfile, pBssDesc, pIes);
3292 }
3293 else
3294 {
3295 csrSetCfgRateSetFromProfile(pMac, pProfile);
3296 }
3297 //Make this the last CFG to set. The callback will trigger a join_req
3298 //Join time out
3299 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_CONFIG, sessionId );
3300
3301 ccmCfgSetInt(pMac, WNI_CFG_JOIN_FAILURE_TIMEOUT, pBssConfig->uJoinTimeOut, (tCcmCfgSetCallback)csrRoamCcmCfgSetCallback, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003302 return (status);
3303}
3304
Jeff Johnson295189b2012-06-20 16:38:30 -07003305eHalStatus csrRoamStopNetwork( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
3306 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
3307{
3308 eHalStatus status;
3309 tBssConfigParam *pBssConfig;
3310 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003311
3312 if(!pSession)
3313 {
3314 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3315 return eHAL_STATUS_FAILURE;
3316 }
3317
Jeff Johnson295189b2012-06-20 16:38:30 -07003318 status = palAllocateMemory(pMac->hHdd, (void **)&pBssConfig, sizeof(tBssConfigParam));
3319 if(HAL_STATUS_SUCCESS(status))
3320 {
3321 palZeroMemory(pMac->hHdd, pBssConfig, sizeof(tBssConfigParam));
3322 status = csrRoamPrepareBssConfig(pMac, pProfile, pBssDesc, pBssConfig, pIes);
3323 if(HAL_STATUS_SUCCESS(status))
3324 {
3325 pSession->bssParams.uCfgDot11Mode = pBssConfig->uCfgDot11Mode;
Jeff Johnsone7245742012-09-05 17:12:55 -07003326 /* This will allow to pass cbMode during join req */
3327 pSession->bssParams.cbMode= pBssConfig->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003328 //For IBSS, we need to prepare some more information
3329 if( csrIsBssTypeIBSS(pProfile->BSSType) || CSR_IS_WDS( pProfile )
3330#ifdef WLAN_SOFTAP_FEATURE
3331 || CSR_IS_INFRA_AP(pProfile)
3332#endif
3333 )
3334 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003335 csrRoamPrepareBssParams(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07003336 }
3337 // If we are in an IBSS, then stop the IBSS...
3338 ////Not worry about WDS connection for now
3339 if ( csrIsConnStateIbss( pMac, sessionId ) )
3340 {
3341 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
3342 }
3343 else
3344 {
3345 // if we are in an Infrastructure association....
3346 if ( csrIsConnStateInfra( pMac, sessionId ) )
3347 {
3348 // and the new Bss is an Ibss OR we are roaming from Infra to Infra
3349 // across SSIDs (roaming to a new SSID)... //
3350 //Not worry about WDS connection for now
3351 if ( pBssDesc && ( ( csrIsIbssBssDesc( pBssDesc ) ) ||
3352 !csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc, pIes ) ) )
3353 {
3354 // then we need to disassociate from the Infrastructure network...
3355 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
3356 }
3357 else
3358 {
3359 // In an Infrastucture and going to an Infrastructure network with the same SSID. This
3360 // calls for a Reassociation sequence. So issue the CFG sets for this new AP.
3361 if ( pBssDesc )
3362 {
3363 // Set parameters for this Bss.
3364 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
3365 }
3366 }
3367 }
3368 else
3369 {
3370 // Neiher in IBSS nor in Infra. We can go ahead and set the CFG for tne new network...
3371 // Nothing to stop.
3372 if ( pBssDesc || CSR_IS_WDS_AP( pProfile )
3373#ifdef WLAN_SOFTAP_FEATURE
3374 || CSR_IS_INFRA_AP(pProfile)
3375#endif
3376 )
3377 {
3378 // Set parameters for this Bss.
3379 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
3380 }
3381 }
3382 }
3383 }//Success getting BSS config info
3384 palFreeMemory(pMac->hHdd, pBssConfig);
3385 }//Allocate memory
3386
3387 return (status);
3388}
3389
Jeff Johnson295189b2012-06-20 16:38:30 -07003390eCsrJoinState csrRoamJoin( tpAniSirGlobal pMac, tANI_U32 sessionId,
3391 tCsrScanResultInfo *pScanResult, tCsrRoamProfile *pProfile )
3392{
3393 eCsrJoinState eRoamState = eCsrContinueRoaming;
3394 eHalStatus status;
3395 tSirBssDescription *pBssDesc = &pScanResult->BssDescriptor;
3396 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)( pScanResult->pvIes ); //This may be NULL
3397 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003398
3399 if(!pSession)
3400 {
3401 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3402 return (eCsrStopRoaming);
3403 }
3404
Jeff Johnson295189b2012-06-20 16:38:30 -07003405 if( CSR_IS_WDS_STA( pProfile ) )
3406 {
3407 status = csrRoamStartWds( pMac, sessionId, pProfile, pBssDesc );
3408 if( !HAL_STATUS_SUCCESS( status ) )
3409 {
3410 eRoamState = eCsrStopRoaming;
3411 }
3412 }
3413 else
3414 {
3415 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal))) )
3416 {
3417 smsLog(pMac, LOGE, FL(" fail to parse IEs"));
3418 return (eCsrStopRoaming);
3419 }
3420 if ( csrIsInfraBssDesc( pBssDesc ) )
3421 {
3422 // If we are connected in infrastructure mode and the Join Bss description is for the same BssID, then we are
3423 // attempting to join the AP we are already connected with. In that case, see if the Bss or Sta capabilities
3424 // have changed and handle the changes (without disturbing the current association).
3425
3426 if ( csrIsConnStateConnectedInfra(pMac, sessionId) &&
3427 csrIsBssIdEqual( pMac, pBssDesc, pSession->pConnectBssDesc ) &&
3428 csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc, pIesLocal )
3429 )
3430 {
3431 // Check to see if the Auth type has changed in the Profile. If so, we don't want to Reassociate
3432 // with Authenticating first. To force this, stop the current association (Disassociate) and
3433 // then re 'Join' the AP, wihch will force an Authentication (with the new Auth type) followed by
3434 // a new Association.
3435 if(csrIsSameProfile(pMac, &pSession->connectedProfile, pProfile))
3436 {
3437 smsLog(pMac, LOGW, FL(" detect same profile authType = %d encryType = %d\n"), pProfile->AuthType, pProfile->EncryptionType);
3438 if(csrRoamIsSameProfileKeys(pMac, &pSession->connectedProfile, pProfile))
3439 {
3440 eRoamState = eCsrReassocToSelfNoCapChange;
3441 }
3442 else
3443 {
3444 tBssConfigParam bssConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07003445 //The key changes
3446 palZeroMemory(pMac->hHdd, &bssConfig, sizeof(bssConfig));
3447 status = csrRoamPrepareBssConfig(pMac, pProfile, pBssDesc, &bssConfig, pIesLocal);
3448 if(HAL_STATUS_SUCCESS(status))
3449 {
3450 pSession->bssParams.uCfgDot11Mode = bssConfig.uCfgDot11Mode;
Jeff Johnsone7245742012-09-05 17:12:55 -07003451 pSession->bssParams.cbMode = bssConfig.cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003452 //Reapply the config including Keys so reassoc is happening.
3453 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, &bssConfig, pIesLocal);
3454 if(!HAL_STATUS_SUCCESS(status))
3455 {
3456 eRoamState = eCsrStopRoaming;
3457 }
3458 }
3459 else
3460 {
3461 eRoamState = eCsrStopRoaming;
3462 }
3463 }//same profile
3464 }
3465 else
3466 {
3467 if(!HAL_STATUS_SUCCESS(csrRoamIssueDisassociate( pMac, sessionId,
3468 eCSR_ROAM_SUBSTATE_DISASSOC_REQ, FALSE )))
3469 {
3470 smsLog(pMac, LOGW, FL(" fail to issue disassociate\n"));
3471 eRoamState = eCsrStopRoaming;
3472 }
3473 }
3474 }
3475 else
3476 {
3477 // note: we used to pre-auth here with open authentication networks but that was not working so well.
3478 // we had a lot of join timeouts when testing at Samsung. removing this step helped associations
3479 // work much better.
3480 //
3481 //
3482 // stop the existing network before attempting to join the new network...
3483 if(!HAL_STATUS_SUCCESS(csrRoamStopNetwork(pMac, sessionId, pProfile, pBssDesc, pIesLocal)))
3484 {
3485 eRoamState = eCsrStopRoaming;
3486 }
3487 }
3488 }//Infra
3489 else
3490 {
3491 if(!HAL_STATUS_SUCCESS(csrRoamStopNetwork(pMac, sessionId, pProfile, pBssDesc, pIesLocal)))
3492 {
3493 eRoamState = eCsrStopRoaming;
3494 }
3495 }
3496 if( pIesLocal && !pScanResult->pvIes )
3497 {
3498 palFreeMemory(pMac->hHdd, pIesLocal);
3499 }
3500 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003501 return( eRoamState );
3502}
3503
Jeff Johnson295189b2012-06-20 16:38:30 -07003504eHalStatus csrRoamShouldRoam(tpAniSirGlobal pMac, tANI_U32 sessionId,
3505 tSirBssDescription *pBssDesc, tANI_U32 roamId)
3506{
3507 eHalStatus status = eHAL_STATUS_SUCCESS;
3508 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07003509 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
3510 roamInfo.pBssDesc = pBssDesc;
3511 status = csrRoamCallCallback(pMac, sessionId, &roamInfo, roamId, eCSR_ROAM_SHOULD_ROAM, eCSR_ROAM_RESULT_NONE);
3512 return (status);
3513}
Jeff Johnson295189b2012-06-20 16:38:30 -07003514//In case no matching BSS is found, use whatever default we can find
3515static void csrRoamAssignDefaultParam( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3516{
3517 //Need to get all negotiated types in place first
3518 //auth type
3519 switch( pCommand->u.roamCmd.roamProfile.AuthType.authType[0] ) //Take the prefered Auth type.
3520 {
3521 default:
3522 case eCSR_AUTH_TYPE_WPA:
3523 case eCSR_AUTH_TYPE_WPA_PSK:
3524 case eCSR_AUTH_TYPE_WPA_NONE:
3525 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
3526 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
3527 break;
3528
3529 case eCSR_AUTH_TYPE_SHARED_KEY:
3530 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_SHARED_KEY;
3531 break;
3532
3533 case eCSR_AUTH_TYPE_AUTOSWITCH:
3534 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_AUTOSWITCH;
3535 break;
3536 }
3537 pCommand->u.roamCmd.roamProfile.negotiatedUCEncryptionType =
3538 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0];
3539 //In this case, the multicast encryption needs to follow the uncast ones.
3540 pCommand->u.roamCmd.roamProfile.negotiatedMCEncryptionType =
3541 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0];
3542}
3543
3544static eCsrJoinState csrRoamJoinNextBss( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fUseSameBss )
3545{
3546 eHalStatus status;
3547 tCsrScanResult *pScanResult = NULL;
3548 eCsrJoinState eRoamState = eCsrStopRoaming;
3549 tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
3550 tANI_BOOLEAN fDone = eANI_BOOLEAN_FALSE;
3551 tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
3552#ifndef WLAN_MDM_CODE_REDUCTION_OPT
3553 v_U8_t acm_mask = 0;
3554#endif
3555 tANI_U32 sessionId = pCommand->sessionId;
3556 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
3557 tCsrRoamProfile *pProfile = &pCommand->u.roamCmd.roamProfile;
3558 tANI_U8 concurrentChannel = 0;
Jeff Johnson32d95a32012-09-10 13:15:23 -07003559
3560 if(!pSession)
3561 {
3562 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3563 return (eCsrStopRoaming);
3564 }
3565
Jeff Johnson295189b2012-06-20 16:38:30 -07003566 do
3567 {
3568 // Check for Cardbus eject condition, before trying to Roam to any BSS
3569 //***if( !balIsCardPresent(pAdapter) ) break;
3570
3571 if(NULL != pBSSList)
3572 {
3573 // When handling AP's capability change, continue to associate to
3574 // same BSS and make sure pRoamBssEntry is not Null.
3575 if((eANI_BOOLEAN_FALSE == fUseSameBss) || (pCommand->u.roamCmd.pRoamBssEntry == NULL))
3576 {
3577 if(pCommand->u.roamCmd.pRoamBssEntry == NULL)
3578 {
3579 //Try the first BSS
3580 pCommand->u.roamCmd.pLastRoamBss = NULL;
3581 pCommand->u.roamCmd.pRoamBssEntry = csrLLPeekHead(&pBSSList->List, LL_ACCESS_LOCK);
3582 }
3583 else
3584 {
3585 pCommand->u.roamCmd.pRoamBssEntry = csrLLNext(&pBSSList->List, pCommand->u.roamCmd.pRoamBssEntry, LL_ACCESS_LOCK);
3586 if(NULL == pCommand->u.roamCmd.pRoamBssEntry)
3587 {
3588 //Done with all the BSSs
3589 //In this case, will tell HDD the completion
3590 break;
3591 }
3592 else
3593 {
3594 //We need to indicate to HDD that we are done with this one.
3595 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
3596 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss; //this shall not be NULL
3597 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
3598 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
3599 pRoamInfo = &roamInfo;
3600 }
3601 }
3602 while(pCommand->u.roamCmd.pRoamBssEntry)
3603 {
3604 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
Jeff Johnson295189b2012-06-20 16:38:30 -07003605 /*If concurrency enabled take the concurrent connected channel first. */
3606 /* Valid multichannel concurrent sessions exempted */
Jeff Johnsone7245742012-09-05 17:12:55 -07003607 if (vos_concurrent_sessions_running() &&
3608 !csrIsValidMcConcurrentSession(pMac, sessionId, &pScanResult->Result.BssDescriptor))
Jeff Johnson295189b2012-06-20 16:38:30 -07003609 {
3610 concurrentChannel =
3611 csrGetConcurrentOperationChannel(pMac);
3612 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO_HIGH, "%s: "
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003613 " csr Concurrent Channel = %d", __func__, concurrentChannel);
Jeff Johnson295189b2012-06-20 16:38:30 -07003614 if ((concurrentChannel) &&
3615 (concurrentChannel ==
3616 pScanResult->Result.BssDescriptor.channelId))
3617 {
3618 //make this 0 because we do not want the
3619 //below check to pass as we don't want to
3620 //connect on other channel
3621 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
3622 FL("Concurrent channel match =%d"),
3623 concurrentChannel);
3624 concurrentChannel = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003625 }
3626 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003627
3628 if (!concurrentChannel)
3629 {
3630
3631 if(HAL_STATUS_SUCCESS(csrRoamShouldRoam(pMac,
3632 sessionId, &pScanResult->Result.BssDescriptor,
3633 pCommand->u.roamCmd.roamId)))
3634 {
3635 //Ok to roam this
3636 break;
3637 }
3638 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003639 else
3640 {
3641 eRoamState = eCsrStopRoamingDueToConcurrency;
3642 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003643 pCommand->u.roamCmd.pRoamBssEntry = csrLLNext(&pBSSList->List, pCommand->u.roamCmd.pRoamBssEntry, LL_ACCESS_LOCK);
3644 if(NULL == pCommand->u.roamCmd.pRoamBssEntry)
3645 {
3646 //Done with all the BSSs
3647 fDone = eANI_BOOLEAN_TRUE;
3648 break;
3649 }
3650 }
3651 if(fDone)
3652 {
3653 break;
3654 }
3655 }
3656 }
3657 //We have something to roam, tell HDD when it is infra.
3658 //For IBSS, the indication goes back to HDD via eCSR_ROAM_IBSS_IND
3659 //For WDS, the indication is eCSR_ROAM_WDS_IND
3660 if( CSR_IS_INFRASTRUCTURE( pProfile ) )
3661 {
3662 if(pRoamInfo)
3663 {
3664 pSession->bRefAssocStartCnt--;
3665 //Complete the last association attemp because a new one is about to be tried
3666 csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.roamCmd.roamId,
3667 eCSR_ROAM_ASSOCIATION_COMPLETION,
3668 eCSR_ROAM_RESULT_NOT_ASSOCIATED);
3669 }
3670 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
3671 if(pScanResult)
3672 {
3673 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
Jeff Johnson295189b2012-06-20 16:38:30 -07003674 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, &pScanResult->Result.BssDescriptor, &pIesLocal))) )
3675 {
3676 smsLog(pMac, LOGE, FL(" cannot parse IEs\n"));
3677 fDone = eANI_BOOLEAN_TRUE;
3678 eRoamState = eCsrStopRoaming;
3679 break;
3680 }
3681 roamInfo.pBssDesc = &pScanResult->Result.BssDescriptor;
3682 pCommand->u.roamCmd.pLastRoamBss = roamInfo.pBssDesc;
3683 //No need to put uapsd_mask in if the BSS doesn't support uAPSD
3684 if( pCommand->u.roamCmd.roamProfile.uapsd_mask &&
3685 CSR_IS_QOS_BSS(pIesLocal) &&
3686 CSR_IS_UAPSD_BSS(pIesLocal) )
3687 {
3688#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson295189b2012-06-20 16:38:30 -07003689 acm_mask = sme_QosGetACMMask(pMac, &pScanResult->Result.BssDescriptor,
3690 pIesLocal);
3691 pCommand->u.roamCmd.roamProfile.uapsd_mask &= ~(acm_mask);
3692#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
Jeff Johnson295189b2012-06-20 16:38:30 -07003693 }
3694 else
3695 {
3696 pCommand->u.roamCmd.roamProfile.uapsd_mask = 0;
3697 }
3698 if( pIesLocal && !pScanResult->Result.pvIes)
3699 {
3700 palFreeMemory(pMac->hHdd, pIesLocal);
3701 }
3702 }
3703 else
3704 {
3705 pCommand->u.roamCmd.roamProfile.uapsd_mask = 0;
3706 }
3707 roamInfo.pProfile = pProfile;
3708 pSession->bRefAssocStartCnt++;
3709 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
3710 eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
3711 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003712 if ( NULL == pCommand->u.roamCmd.pRoamBssEntry )
3713 {
3714 // If this is a start IBSS profile, then we need to start the IBSS.
3715 if ( CSR_IS_START_IBSS(pProfile) )
3716 {
3717 tANI_BOOLEAN fSameIbss = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003718 // Attempt to start this IBSS...
3719 csrRoamAssignDefaultParam( pMac, pCommand );
3720 status = csrRoamStartIbss( pMac, sessionId, pProfile, &fSameIbss );
3721 if(HAL_STATUS_SUCCESS(status))
3722 {
3723 if ( fSameIbss )
3724 {
3725 eRoamState = eCsrStartIbssSameIbss;
3726 }
3727 else
3728 {
3729 eRoamState = eCsrContinueRoaming;
3730 }
3731 }
3732 else
3733 {
3734 //it somehow fail need to stop
3735 eRoamState = eCsrStopRoaming;
3736 }
3737 break;
3738 }
3739 else if ( (CSR_IS_WDS_AP(pProfile))
3740#ifdef WLAN_SOFTAP_FEATURE
3741 || (CSR_IS_INFRA_AP(pProfile))
3742#endif
3743 )
3744 {
3745 // Attempt to start this WDS...
3746 csrRoamAssignDefaultParam( pMac, pCommand );
3747 /* For AP WDS, we dont have any BSSDescription */
3748 status = csrRoamStartWds( pMac, sessionId, pProfile, NULL );
3749 if(HAL_STATUS_SUCCESS(status))
3750 {
3751 eRoamState = eCsrContinueRoaming;
3752 }
3753 else
3754 {
3755 //it somehow fail need to stop
3756 eRoamState = eCsrStopRoaming;
3757 }
3758 }
3759 else
3760 {
3761 //Nothing we can do
3762 smsLog(pMac, LOGW, FL("cannot continue without BSS list\n"));
3763 eRoamState = eCsrStopRoaming;
3764 break;
3765 }
3766 }
3767 else //We have BSS
3768 {
3769 //Need to assign these value because they are used in csrIsSameProfile
3770 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
3771 pCommand->u.roamCmd.roamProfile.negotiatedUCEncryptionType = pScanResult->ucEncryptionType; //Negotiated while building scan result.
3772 pCommand->u.roamCmd.roamProfile.negotiatedMCEncryptionType = pScanResult->mcEncryptionType;
3773 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = pScanResult->authType;
3774 if ( CSR_IS_START_IBSS(&pCommand->u.roamCmd.roamProfile) )
3775 {
3776 if(csrIsSameProfile(pMac, &pSession->connectedProfile, pProfile))
3777 {
3778 eRoamState = eCsrStartIbssSameIbss;
3779 break;
3780 }
3781 }
3782 if( pCommand->u.roamCmd.fReassocToSelfNoCapChange )
3783 {
3784 //trying to connect to the one already connected
3785 pCommand->u.roamCmd.fReassocToSelfNoCapChange = eANI_BOOLEAN_FALSE;
3786 eRoamState = eCsrReassocToSelfNoCapChange;
3787 break;
3788 }
3789 // Attempt to Join this Bss...
3790 eRoamState = csrRoamJoin( pMac, sessionId, &pScanResult->Result, pProfile );
3791 break;
3792 }
3793
3794 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07003795 if( (eCsrStopRoaming == eRoamState) && (CSR_IS_INFRASTRUCTURE( pProfile )) )
3796 {
3797 //Need to indicate association_completion if association_start has been done
3798 if(pSession->bRefAssocStartCnt > 0)
3799 {
3800 pSession->bRefAssocStartCnt--;
3801 //Complete the last association attemp because a new one is about to be tried
3802 csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.roamCmd.roamId,
3803 eCSR_ROAM_ASSOCIATION_COMPLETION,
3804 eCSR_ROAM_RESULT_NOT_ASSOCIATED);
3805 }
3806 }
3807
3808 return( eRoamState );
3809}
3810
Jeff Johnson295189b2012-06-20 16:38:30 -07003811static eHalStatus csrRoam( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3812{
3813 eHalStatus status = eHAL_STATUS_SUCCESS;
3814 eCsrJoinState RoamState;
3815 tANI_U32 sessionId = pCommand->sessionId;
3816
Jeff Johnson295189b2012-06-20 16:38:30 -07003817 //***if( hddIsRadioStateOn( pAdapter ) )
3818 {
3819 // Attept to join a Bss...
3820 RoamState = csrRoamJoinNextBss( pMac, pCommand, eANI_BOOLEAN_FALSE );
Jeff Johnsone7245742012-09-05 17:12:55 -07003821
Jeff Johnson295189b2012-06-20 16:38:30 -07003822 // if nothing to join..
Jeff Johnsone7245742012-09-05 17:12:55 -07003823 if (( eCsrStopRoaming == RoamState ) || ( eCsrStopRoamingDueToConcurrency == RoamState))
Jeff Johnson295189b2012-06-20 16:38:30 -07003824 {
3825 tANI_BOOLEAN fComplete = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003826 // and if connected in Infrastructure mode...
3827 if ( csrIsConnStateInfra(pMac, sessionId) )
3828 {
3829 //... then we need to issue a disassociation
3830 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISASSOC_NOTHING_TO_JOIN, FALSE );
3831 if(!HAL_STATUS_SUCCESS(status))
3832 {
3833 smsLog(pMac, LOGW, FL(" failed to issue disassociate, status = %d\n"), status);
3834 //roam command is completed by caller in the failed case
3835 fComplete = eANI_BOOLEAN_TRUE;
3836 }
3837 }
3838 else if( csrIsConnStateIbss(pMac, sessionId) )
3839 {
3840 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3841 if(!HAL_STATUS_SUCCESS(status))
3842 {
3843 smsLog(pMac, LOGW, FL(" failed to issue stop bss, status = %d\n"), status);
3844 //roam command is completed by caller in the failed case
3845 fComplete = eANI_BOOLEAN_TRUE;
3846 }
3847 }
3848#ifdef WLAN_SOFTAP_FEATURE
3849 else if (csrIsConnStateConnectedInfraAp(pMac, sessionId))
3850 {
3851 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3852 if(!HAL_STATUS_SUCCESS(status))
3853 {
3854 smsLog(pMac, LOGW, FL(" failed to issue stop bss, status = %d\n"), status);
3855 //roam command is completed by caller in the failed case
3856 fComplete = eANI_BOOLEAN_TRUE;
3857 }
3858 }
3859#endif
3860 else
3861 {
3862 fComplete = eANI_BOOLEAN_TRUE;
3863 }
3864 if(fComplete)
3865 {
3866 // ... otherwise, we can complete the Roam command here.
Jeff Johnsone7245742012-09-05 17:12:55 -07003867 if(eCsrStopRoamingDueToConcurrency == RoamState)
3868 {
3869 csrRoamComplete( pMac, eCsrJoinFailureDueToConcurrency, NULL );
3870 }
3871 else
3872 {
3873 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
3874 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003875 }
3876 }
3877 else if ( eCsrReassocToSelfNoCapChange == RoamState )
3878 {
3879 csrRoamComplete( pMac, eCsrSilentlyStopRoamingSaveState, NULL );
3880 }
3881 else if ( eCsrStartIbssSameIbss == RoamState )
3882 {
3883 csrRoamComplete( pMac, eCsrSilentlyStopRoaming, NULL );
3884 }
3885 }//hddIsRadioStateOn
3886
3887 return status;
3888}
Jeff Johnson295189b2012-06-20 16:38:30 -07003889eHalStatus csrProcessFTReassocRoamCommand ( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3890{
3891 tANI_U32 sessionId;
3892 tCsrRoamSession *pSession;
3893 tCsrScanResult *pScanResult = NULL;
3894 tSirBssDescription *pBssDesc = NULL;
3895 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003896 sessionId = pCommand->sessionId;
3897 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003898
3899 if(!pSession)
3900 {
3901 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3902 return eHAL_STATUS_FAILURE;
3903 }
3904
Jeff Johnson295189b2012-06-20 16:38:30 -07003905 if(CSR_IS_ROAMING(pSession) && pSession->fCancelRoaming)
3906 {
3907 //the roaming is cancelled. Simply complete the command
3908 smsLog(pMac, LOG1, FL(" Roam command cancelled\n"));
3909 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
3910 return eHAL_STATUS_FAILURE;
3911 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003912 if (pCommand->u.roamCmd.pRoamBssEntry)
3913 {
3914 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
3915 pBssDesc = &pScanResult->Result.BssDescriptor;
3916 }
3917 else
3918 {
3919 //the roaming is cancelled. Simply complete the command
3920 smsLog(pMac, LOG1, FL(" Roam command cancelled\n"));
3921 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
3922 return eHAL_STATUS_FAILURE;
3923 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003924 status = csrRoamIssueReassociate(pMac, sessionId, pBssDesc,
3925 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ), &pCommand->u.roamCmd.roamProfile);
3926 return status;
3927}
3928
Jeff Johnson295189b2012-06-20 16:38:30 -07003929eHalStatus csrRoamProcessCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3930{
3931 eHalStatus status = eHAL_STATUS_SUCCESS;
3932 tCsrRoamInfo roamInfo;
3933 tANI_U32 sessionId = pCommand->sessionId;
3934 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003935
3936 if(!pSession)
3937 {
3938 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3939 return eHAL_STATUS_FAILURE;
3940 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003941
3942 switch ( pCommand->u.roamCmd.roamReason )
3943 {
3944 case eCsrForcedDisassoc:
3945 csrFreeRoamProfile(pMac, sessionId);
3946 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, FALSE );
3947 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003948 case eCsrSmeIssuedDisassocForHandoff:
3949 //Not to free pMac->roam.pCurRoamProfile (via csrFreeRoamProfile) because it is needed after disconnect
3950#if 0 // TODO : Confirm this change
3951 status = csrRoamProcessDisassociate( pMac, pCommand, FALSE );
3952#else
3953 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, FALSE );
3954#endif
3955
3956 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003957 case eCsrForcedDisassocMICFailure:
3958 csrFreeRoamProfile(pMac, sessionId);
3959 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, TRUE );
3960 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003961 case eCsrForcedDeauth:
3962 csrFreeRoamProfile(pMac, sessionId);
3963 status = csrRoamProcessDisassocDeauth( pMac, pCommand, FALSE, FALSE );
3964 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003965 case eCsrHddIssuedReassocToSameAP:
3966 case eCsrSmeIssuedReassocToSameAP:
3967 {
3968 tDot11fBeaconIEs *pIes = NULL;
3969
Jeff Johnson295189b2012-06-20 16:38:30 -07003970 if( pSession->pConnectBssDesc )
3971 {
3972 status = csrGetParsedBssDescriptionIEs(pMac, pSession->pConnectBssDesc, &pIes);
3973 if(!HAL_STATUS_SUCCESS(status) )
3974 {
3975 smsLog(pMac, LOGE, FL(" fail to parse IEs\n"));
3976 }
3977 else
3978 {
3979 roamInfo.reasonCode = eCsrRoamReasonStaCapabilityChanged;
3980 csrRoamCallCallback(pMac, pSession->sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
3981 pSession->roamingReason = eCsrReassocRoaming;
Jeff Johnson295189b2012-06-20 16:38:30 -07003982 roamInfo.pBssDesc = pSession->pConnectBssDesc;
3983 roamInfo.pProfile = &pCommand->u.roamCmd.roamProfile;
3984 pSession->bRefAssocStartCnt++;
3985 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
3986 eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
3987
3988 smsLog(pMac, LOG1, FL(" calling csrRoamIssueReassociate\n"));
3989 csrRoamIssueReassociate( pMac, sessionId, pSession->pConnectBssDesc, pIes,
3990 &pCommand->u.roamCmd.roamProfile );
3991 palFreeMemory(pMac->hHdd, pIes);
3992 pIes = NULL;
3993 }
3994 }
3995 break;
3996 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003997 case eCsrCapsChange:
3998 smsLog(pMac, LOGE, FL("received eCsrCapsChange \n"));
3999 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
4000 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE);
4001 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004002 case eCsrSmeIssuedFTReassoc:
4003 smsLog(pMac, LOGE, FL("received FT Reassoc Req \n"));
4004 status = csrProcessFTReassocRoamCommand(pMac, pCommand);
4005 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07004006
Jeff Johnson295189b2012-06-20 16:38:30 -07004007 case eCsrStopBss:
4008 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
4009 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
4010 break;
4011
4012 case eCsrForcedDisassocSta:
4013 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
4014 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_DISASSOC_REQ, sessionId);
4015 status = csrSendMBDisassocReqMsg( pMac, sessionId, pCommand->u.roamCmd.peerMac,
4016 pCommand->u.roamCmd.reason);
4017 break;
4018
4019 case eCsrForcedDeauthSta:
4020 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
4021 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_DEAUTH_REQ, sessionId);
4022 status = csrSendMBDeauthReqMsg( pMac, sessionId, pCommand->u.roamCmd.peerMac,
4023 pCommand->u.roamCmd.reason);
4024 break;
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07004025#if 1
4026 /*Varun*/
4027 case eCsrPerformPreauth:
4028 smsLog(pMac, LOGE, FL("Attempting FT PreAuth Req \n"));
4029 status = csrRoamIssueFTPreauthReq(pMac, sessionId,
4030 pCommand->u.roamCmd.pLastRoamBss);
4031 break;
4032#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004033
4034 default:
4035 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
4036
4037 if( pCommand->u.roamCmd.fUpdateCurRoamProfile )
4038 {
4039 //Remember the roaming profile
4040 csrFreeRoamProfile(pMac, sessionId);
4041 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pSession->pCurRoamProfile, sizeof(tCsrRoamProfile))))
4042 {
4043 palZeroMemory(pMac->hHdd, pSession->pCurRoamProfile, sizeof(tCsrRoamProfile));
4044 csrRoamCopyProfile(pMac, pSession->pCurRoamProfile, &pCommand->u.roamCmd.roamProfile);
4045 }
4046 }
4047
4048 //At this point, original uapsd_mask is saved in pCurRoamProfile
4049 //uapsd_mask in the pCommand may change from this point on.
4050
4051 // Attempt to roam with the new scan results (if we need to..)
4052 status = csrRoam( pMac, pCommand );
4053 break;
4054 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004055 return (status);
4056}
4057
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07004058void csrReinitPreauthCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
4059{
4060 pCommand->u.roamCmd.pLastRoamBss = NULL;
4061 pCommand->u.roamCmd.pRoamBssEntry = NULL;
4062 //Because u.roamCmd is union and share with scanCmd and StatusChange
4063 palZeroMemory(pMac->hHdd, &pCommand->u.roamCmd, sizeof(tRoamCmd));
4064}
4065
Jeff Johnson295189b2012-06-20 16:38:30 -07004066void csrReinitRoamCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
4067{
4068 if(pCommand->u.roamCmd.fReleaseBssList)
4069 {
4070 csrScanResultPurge(pMac, pCommand->u.roamCmd.hBSSList);
4071 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_FALSE;
4072 pCommand->u.roamCmd.hBSSList = CSR_INVALID_SCANRESULT_HANDLE;
4073 }
4074 if(pCommand->u.roamCmd.fReleaseProfile)
4075 {
4076 csrReleaseProfile(pMac, &pCommand->u.roamCmd.roamProfile);
4077 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
4078 }
4079 pCommand->u.roamCmd.pRoamBssEntry = NULL;
4080 //Because u.roamCmd is union and share with scanCmd and StatusChange
4081 palZeroMemory(pMac->hHdd, &pCommand->u.roamCmd, sizeof(tRoamCmd));
4082}
4083
Jeff Johnson295189b2012-06-20 16:38:30 -07004084void csrReinitWmStatusChangeCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
4085{
4086 palZeroMemory(pMac->hHdd, &pCommand->u.wmStatusChangeCmd, sizeof(tWmStatusChangeCmd));
4087}
Jeff Johnson295189b2012-06-20 16:38:30 -07004088void csrRoamComplete( tpAniSirGlobal pMac, eCsrRoamCompleteResult Result, void *Context )
4089{
4090 tListElem *pEntry;
4091 tSmeCmd *pCommand;
4092 tANI_BOOLEAN fReleaseCommand = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004093 smsLog( pMac, LOG2, "roamQ: Roam Completion ...\n" );
Jeff Johnson295189b2012-06-20 16:38:30 -07004094 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
4095 if ( pEntry )
4096 {
4097 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07004098 // If the head of the queue is Active and it is a ROAM command, remove
4099 // and put this on the Free queue.
4100 if ( eSmeCommandRoam == pCommand->command )
4101 {
4102 //we need to process the result first before removing it from active list because state changes
4103 //still happening insides roamQProcessRoamResults so no other roam command should be issued
4104 fReleaseCommand = csrRoamProcessResults( pMac, pCommand, Result, Context );
4105 if( fReleaseCommand )
4106 {
4107 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
4108 {
4109 csrReleaseCommandRoam( pMac, pCommand );
4110 }
4111 else
4112 {
4113 smsLog( pMac, LOGE, " **********csrRoamComplete fail to release command reason %d\n",
4114 pCommand->u.roamCmd.roamReason );
4115 }
4116 }
4117 else
4118 {
4119 smsLog( pMac, LOGE, " **********csrRoamComplete fail to release command reason %d\n",
4120 pCommand->u.roamCmd.roamReason );
4121 }
4122 }
4123 else
4124 {
4125 smsLog( pMac, LOGW, "CSR: Roam Completion called but ROAM command is not ACTIVE ...\n" );
4126 }
4127 }
4128 else
4129 {
4130 smsLog( pMac, LOGW, "CSR: Roam Completion called but NO commands are ACTIVE ...\n" );
4131 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004132 if( fReleaseCommand )
4133 {
4134 smeProcessPendingQueue( pMac );
4135 }
4136}
4137
Jeff Johnson295189b2012-06-20 16:38:30 -07004138void csrResetPMKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId )
4139{
4140 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07004141 if(!pSession)
4142 {
4143 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4144 return;
4145 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004146 palZeroMemory( pMac->hHdd, &(pSession->PmkidCandidateInfo[0]), sizeof(tPmkidCandidateInfo) * CSR_MAX_PMKID_ALLOWED );
4147 pSession->NumPmkidCandidate = 0;
4148}
Jeff Johnson295189b2012-06-20 16:38:30 -07004149#ifdef FEATURE_WLAN_WAPI
4150void csrResetBKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId )
4151{
4152 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07004153 if(!pSession)
4154 {
4155 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4156 return;
4157 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004158 palZeroMemory( pMac->hHdd, &(pSession->BkidCandidateInfo[0]), sizeof(tBkidCandidateInfo) * CSR_MAX_BKID_ALLOWED );
4159 pSession->NumBkidCandidate = 0;
4160}
4161#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07004162extern tANI_U8 csrWpaOui[][ CSR_WPA_OUI_SIZE ];
4163
Jeff Johnson295189b2012-06-20 16:38:30 -07004164static eHalStatus csrRoamSaveSecurityRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrAuthType authType,
4165 tSirBssDescription *pSirBssDesc,
4166 tDot11fBeaconIEs *pIes)
4167{
4168 eHalStatus status = eHAL_STATUS_SUCCESS;
4169 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
4170 tDot11fBeaconIEs *pIesLocal = pIes;
Jeff Johnson32d95a32012-09-10 13:15:23 -07004171
4172 if(!pSession)
4173 {
4174 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4175 return eHAL_STATUS_FAILURE;
4176 }
4177
Jeff Johnson295189b2012-06-20 16:38:30 -07004178 if((eCSR_AUTH_TYPE_WPA == authType) ||
4179 (eCSR_AUTH_TYPE_WPA_PSK == authType) ||
4180 (eCSR_AUTH_TYPE_RSN == authType) ||
4181 (eCSR_AUTH_TYPE_RSN_PSK == authType)
4182#if defined WLAN_FEATURE_VOWIFI_11R
4183 ||
4184 (eCSR_AUTH_TYPE_FT_RSN == authType) ||
4185 (eCSR_AUTH_TYPE_FT_RSN_PSK == authType)
4186#endif /* FEATURE_WLAN_WAPI */
4187#ifdef FEATURE_WLAN_WAPI
4188 ||
4189 (eCSR_AUTH_TYPE_WAPI_WAI_PSK == authType) ||
4190 (eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE == authType)
4191#endif /* FEATURE_WLAN_WAPI */
4192 )
4193 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004194 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesLocal))) )
4195 {
4196 smsLog(pMac, LOGE, FL(" cannot parse IEs\n"));
4197 }
4198 if( pIesLocal )
4199 {
4200 tANI_U32 nIeLen;
4201 tANI_U8 *pIeBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07004202 if((eCSR_AUTH_TYPE_RSN == authType) ||
4203#if defined WLAN_FEATURE_VOWIFI_11R
4204 (eCSR_AUTH_TYPE_FT_RSN == authType) ||
4205 (eCSR_AUTH_TYPE_FT_RSN_PSK == authType) ||
4206#endif /* WLAN_FEATURE_VOWIFI_11R */
4207 (eCSR_AUTH_TYPE_RSN_PSK == authType))
4208 {
4209 if(pIesLocal->RSN.present)
4210 {
4211 //Calculate the actual length
4212 nIeLen = 8 //version + gp_cipher_suite + pwise_cipher_suite_count
4213 + pIesLocal->RSN.pwise_cipher_suite_count * 4 //pwise_cipher_suites
4214 + 2 //akm_suite_count
4215 + pIesLocal->RSN.akm_suite_count * 4 //akm_suites
4216 + 2; //reserved
4217 if( pIesLocal->RSN.pmkid_count )
4218 {
4219 nIeLen += 2 + pIesLocal->RSN.pmkid_count * 4; //pmkid
4220 }
4221 //nIeLen doesn't count EID and length fields
4222 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnRspIE, nIeLen + 2))))
4223 {
4224 pSession->pWpaRsnRspIE[0] = DOT11F_EID_RSN;
4225 pSession->pWpaRsnRspIE[1] = (tANI_U8)nIeLen;
4226 //copy upto akm_suites
4227 pIeBuf = pSession->pWpaRsnRspIE + 2;
4228 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->RSN.version, 8);
4229 pIeBuf += 8;
4230 if( pIesLocal->RSN.pwise_cipher_suite_count )
4231 {
4232 //copy pwise_cipher_suites
4233 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.pwise_cipher_suites,
4234 pIesLocal->RSN.pwise_cipher_suite_count * 4);
4235 pIeBuf += pIesLocal->RSN.pwise_cipher_suite_count * 4;
4236 }
4237 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->RSN.akm_suite_count, 2);
4238 pIeBuf += 2;
4239 if( pIesLocal->RSN.akm_suite_count )
4240 {
4241 //copy akm_suites
4242 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.akm_suites,
4243 pIesLocal->RSN.akm_suite_count * 4);
4244 pIeBuf += pIesLocal->RSN.akm_suite_count * 4;
4245 }
4246 //copy the rest
4247 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.akm_suites +
4248 pIesLocal->RSN.akm_suite_count * 4,
4249 2 + pIesLocal->RSN.pmkid_count * 4);
4250 pSession->nWpaRsnRspIeLength = nIeLen + 2;
4251 }
4252 }
4253 }
4254 else if((eCSR_AUTH_TYPE_WPA == authType) ||
4255 (eCSR_AUTH_TYPE_WPA_PSK == authType))
4256 {
4257 if(pIesLocal->WPA.present)
4258 {
4259 //Calculate the actual length
4260 nIeLen = 12 //OUI + version + multicast_cipher + unicast_cipher_count
4261 + pIesLocal->WPA.unicast_cipher_count * 4 //unicast_ciphers
4262 + 2 //auth_suite_count
4263 + pIesLocal->WPA.auth_suite_count * 4; //auth_suites
4264 // The WPA capabilities follows the Auth Suite (two octects)--
4265 // this field is optional, and we always "send" zero, so just
4266 // remove it. This is consistent with our assumptions in the
4267 // frames compiler; c.f. bug 15234:
4268 //nIeLen doesn't count EID and length fields
4269 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnRspIE, nIeLen + 2))))
4270 {
4271 pSession->pWpaRsnRspIE[0] = DOT11F_EID_WPA;
4272 pSession->pWpaRsnRspIE[1] = (tANI_U8)nIeLen;
4273 pIeBuf = pSession->pWpaRsnRspIE + 2;
4274 //Copy WPA OUI
4275 palCopyMemory(pMac->hHdd, pIeBuf, &csrWpaOui[1], 4);
4276 pIeBuf += 4;
4277 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WPA.version, 8 +
4278 pIesLocal->WPA.unicast_cipher_count * 4);
4279 pIeBuf += 8 + pIesLocal->WPA.unicast_cipher_count * 4;
4280 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WPA.auth_suite_count, 2 +
4281 pIesLocal->WPA.auth_suite_count * 4);
4282 pIeBuf += pIesLocal->WPA.auth_suite_count * 4;
4283 pSession->nWpaRsnRspIeLength = nIeLen + 2;
4284 }
4285 }
4286 }
4287#ifdef FEATURE_WLAN_WAPI
4288 else if((eCSR_AUTH_TYPE_WAPI_WAI_PSK == authType) ||
4289 (eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE == authType))
4290 {
4291 if(pIesLocal->WAPI.present)
4292 {
4293 //Calculate the actual length
4294 nIeLen = 4 //version + akm_suite_count
4295 + pIesLocal->WAPI.akm_suite_count * 4 // akm_suites
4296 + 2 //pwise_cipher_suite_count
4297 + pIesLocal->WAPI.unicast_cipher_suite_count * 4 //pwise_cipher_suites
4298 + 6; //gp_cipher_suite + preauth + reserved
4299 if( pIesLocal->WAPI.bkid_count )
4300 {
4301 nIeLen += 2 + pIesLocal->WAPI.bkid_count * 4; //bkid
4302 }
4303
4304 //nIeLen doesn't count EID and length fields
4305 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWapiRspIE, nIeLen + 2))))
4306 {
4307 pSession->pWapiRspIE[0] = DOT11F_EID_WAPI;
4308 pSession->pWapiRspIE[1] = (tANI_U8)nIeLen;
4309 pIeBuf = pSession->pWapiRspIE + 2;
4310 //copy upto akm_suite_count
4311 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.version, 4);
4312 pIeBuf += 4;
4313 if( pIesLocal->WAPI.akm_suite_count )
4314 {
4315 //copy akm_suites
4316 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.akm_suites,
4317 pIesLocal->WAPI.akm_suite_count * 4);
4318 pIeBuf += pIesLocal->WAPI.akm_suite_count * 4;
4319 }
4320 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.unicast_cipher_suite_count, 2);
4321 pIeBuf += 2;
Jeff Johnson295189b2012-06-20 16:38:30 -07004322 if( pIesLocal->WAPI.unicast_cipher_suite_count )
4323 {
4324 //copy pwise_cipher_suites
4325 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.unicast_cipher_suites,
4326 pIesLocal->WAPI.unicast_cipher_suite_count * 4);
4327 pIeBuf += pIesLocal->WAPI.unicast_cipher_suite_count * 4;
4328 }
4329 //gp_cipher_suite + preauth + reserved + bkid_count
4330 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.multicast_cipher_suite, 8);
4331 pIeBuf += 8;
4332 if( pIesLocal->WAPI.bkid_count )
4333 {
4334 //copy akm_suites
4335 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.bkid, pIesLocal->WAPI.bkid_count * 4);
4336 pIeBuf += pIesLocal->WAPI.bkid_count * 4;
4337 }
4338 pSession->nWapiRspIeLength = nIeLen + 2;
4339 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004340 }
4341 }
4342#endif /* FEATURE_WLAN_WAPI */
4343 if( !pIes )
4344 {
4345 //locally allocated
4346 palFreeMemory(pMac->hHdd, pIesLocal);
4347 }
4348 }
4349 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004350 return (status);
4351}
4352
Jeff Johnson295189b2012-06-20 16:38:30 -07004353static void csrCheckAndUpdateACWeight( tpAniSirGlobal pMac, tDot11fBeaconIEs *pIEs )
4354{
4355 v_U8_t bACWeights[WLANTL_MAX_AC];
4356 v_U8_t paramBk, paramBe, paramVi, paramVo;
4357 v_BOOL_t fWeightChange = VOS_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004358 //Compare two ACs' EDCA parameters, from low to high (BK, BE, VI, VO)
4359 //The "formula" is, if lower AC's AIFSN+CWMin is bigger than a fixed amount
4360 //of the higher AC one, make the higher AC has the same weight as the lower AC.
4361 //This doesn't address the case where the lower AC needs a real higher weight
4362 if( pIEs->WMMParams.present )
4363 {
4364 //no change to the lowest ones
4365 bACWeights[WLANTL_AC_BK] = pMac->roam.ucACWeights[WLANTL_AC_BK];
4366 bACWeights[WLANTL_AC_BE] = pMac->roam.ucACWeights[WLANTL_AC_BE];
4367 bACWeights[WLANTL_AC_VI] = pMac->roam.ucACWeights[WLANTL_AC_VI];
4368 bACWeights[WLANTL_AC_VO] = pMac->roam.ucACWeights[WLANTL_AC_VO];
4369 paramBk = pIEs->WMMParams.acbk_aifsn + pIEs->WMMParams.acbk_acwmin;
4370 paramBe = pIEs->WMMParams.acbe_aifsn + pIEs->WMMParams.acbe_acwmin;
4371 paramVi = pIEs->WMMParams.acvi_aifsn + pIEs->WMMParams.acvi_acwmin;
4372 paramVo = pIEs->WMMParams.acvo_aifsn + pIEs->WMMParams.acvo_acwmin;
4373 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramBe) )
4374 {
4375 bACWeights[WLANTL_AC_BE] = bACWeights[WLANTL_AC_BK];
4376 fWeightChange = VOS_TRUE;
4377 }
4378 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramVi) )
4379 {
4380 bACWeights[WLANTL_AC_VI] = bACWeights[WLANTL_AC_BK];
4381 fWeightChange = VOS_TRUE;
4382 }
4383 else if( SME_DETECT_AC_WEIGHT_DIFF(paramBe, paramVi) )
4384 {
4385 bACWeights[WLANTL_AC_VI] = bACWeights[WLANTL_AC_BE];
4386 fWeightChange = VOS_TRUE;
4387 }
4388 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramVo) )
4389 {
4390 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_BK];
4391 fWeightChange = VOS_TRUE;
4392 }
4393 else if( SME_DETECT_AC_WEIGHT_DIFF(paramBe, paramVo) )
4394 {
4395 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_BE];
4396 fWeightChange = VOS_TRUE;
4397 }
4398 else if( SME_DETECT_AC_WEIGHT_DIFF(paramVi, paramVo) )
4399 {
4400 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_VI];
4401 fWeightChange = VOS_TRUE;
4402 }
4403 if(fWeightChange)
4404 {
4405 smsLog(pMac, LOGE, FL(" change AC weights (%d-%d-%d-%d)\n"), bACWeights[0], bACWeights[1],
4406 bACWeights[2], bACWeights[3]);
4407 WLANTL_SetACWeights(pMac->roam.gVosContext, bACWeights);
4408 }
4409 }
4410}
Jeff Johnson295189b2012-06-20 16:38:30 -07004411#ifdef WLAN_FEATURE_VOWIFI_11R
4412//Returns whether the current association is a 11r assoc or not
4413tANI_BOOLEAN csrRoamIs11rAssoc(tpAniSirGlobal pMac)
4414{
4415#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
4416 return csrNeighborRoamIs11rAssoc(pMac);
4417#else
4418 return eANI_BOOLEAN_FALSE;
4419#endif
4420}
4421#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004422#ifdef FEATURE_WLAN_CCX
4423//Returns whether the current association is a CCX assoc or not
4424tANI_BOOLEAN csrRoamIsCCXAssoc(tpAniSirGlobal pMac)
4425{
4426#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
4427 return csrNeighborRoamIsCCXAssoc(pMac);
4428#else
4429 return eANI_BOOLEAN_FALSE;
4430#endif
4431}
4432#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004433#ifdef FEATURE_WLAN_LFR
4434//Returns whether "Legacy Fast Roaming" is currently enabled...or not
4435tANI_BOOLEAN csrRoamIsFastRoamEnabled(tpAniSirGlobal pMac)
4436{
Madan Mohan Koyyalamudi9ce36ec2012-10-15 16:03:17 -07004437 return (pMac->roam.configParam.isFastRoamIniFeatureEnabled &&
Madan Mohan Koyyalamudi393a4342012-10-15 16:07:09 -07004438 (!csrIsConcurrentSessionRunning(pMac)));
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004439}
4440#endif
4441
Jeff Johnson295189b2012-06-20 16:38:30 -07004442//Return true means the command can be release, else not
4443static tANI_BOOLEAN csrRoamProcessResults( tpAniSirGlobal pMac, tSmeCmd *pCommand,
4444 eCsrRoamCompleteResult Result, void *Context )
4445{
4446 tANI_BOOLEAN fReleaseCommand = eANI_BOOLEAN_TRUE;
4447 tSirBssDescription *pSirBssDesc = NULL;
4448 tSirMacAddr BroadcastMac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
4449 tCsrScanResult *pScanResult = NULL;
4450 tCsrRoamInfo roamInfo;
4451 sme_QosAssocInfo assocInfo;
4452 sme_QosCsrEventIndType ind_qos;//indication for QoS module in SME
4453 tANI_U8 acm_mask = 0; //HDD needs the ACM mask in the assoc rsp callback
4454 tDot11fBeaconIEs *pIes = NULL;
4455 tANI_U32 sessionId = pCommand->sessionId;
4456 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
4457 tCsrRoamProfile *pProfile = &pCommand->u.roamCmd.roamProfile;
4458 eRoamCmdStatus roamStatus;
4459 eCsrRoamResult roamResult;
4460 eHalStatus status;
4461 tANI_U32 key_timeout_interval = 0;
4462#ifdef WLAN_SOFTAP_FEATURE
4463 tSirSmeStartBssRsp *pSmeStartBssRsp = NULL;
4464#endif
4465
Jeff Johnson32d95a32012-09-10 13:15:23 -07004466 if(!pSession)
4467 {
4468 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4469 return eANI_BOOLEAN_FALSE;
4470 }
4471
Jeff Johnson295189b2012-06-20 16:38:30 -07004472 smsLog( pMac, LOG1, FL("Processing ROAM results...\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004473 switch( Result )
4474 {
4475 case eCsrJoinSuccess:
4476 // reset the IDLE timer
4477 // !!
4478 // !! fall through to the next CASE statement here is intentional !!
4479 // !!
4480 case eCsrReassocSuccess:
4481 if(eCsrReassocSuccess == Result)
4482 {
4483 ind_qos = SME_QOS_CSR_REASSOC_COMPLETE;
4484 }
4485 else
4486 {
4487 ind_qos = SME_QOS_CSR_ASSOC_COMPLETE;
4488 }
4489 // Success Join Response from LIM. Tell NDIS we are connected and save the
4490 // Connected state...
4491 smsLog(pMac, LOGW, FL("receives association indication\n"));
4492 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
4493 //always free the memory here
4494 if(pSession->pWpaRsnRspIE)
4495 {
4496 pSession->nWpaRsnRspIeLength = 0;
4497 palFreeMemory(pMac->hHdd, pSession->pWpaRsnRspIE);
4498 pSession->pWpaRsnRspIE = NULL;
4499 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004500#ifdef FEATURE_WLAN_WAPI
4501 if(pSession->pWapiRspIE)
4502 {
4503 pSession->nWapiRspIeLength = 0;
4504 palFreeMemory(pMac->hHdd, pSession->pWapiRspIE);
4505 pSession->pWapiRspIE = NULL;
4506 }
4507#endif /* FEATURE_WLAN_WAPI */
4508#ifdef FEATURE_WLAN_BTAMP_UT_RF
4509 //Reset counter so no join retry is needed.
4510 pSession->maxRetryCount = 0;
4511 csrRoamStopJoinRetryTimer(pMac, sessionId);
4512#endif
4513 /* This creates problem since we have not saved the connected profile.
4514 So moving this after saving the profile
4515 */
4516 //csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED );
4517 if( CSR_IS_INFRASTRUCTURE( pProfile ) )
4518 {
4519 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED;
4520 }
4521 else
4522 {
4523 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED;
4524 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004525 //Use the last connected bssdesc for reassoc-ing to the same AP.
4526 //NOTE: What to do when reassoc to a different AP???
4527 if( (eCsrHddIssuedReassocToSameAP == pCommand->u.roamCmd.roamReason) ||
4528 (eCsrSmeIssuedReassocToSameAP == pCommand->u.roamCmd.roamReason) )
4529 {
4530 pSirBssDesc = pSession->pConnectBssDesc;
4531 if(pSirBssDesc)
4532 {
4533 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4534 }
4535 }
4536 else
4537 {
4538
4539 if(pCommand->u.roamCmd.pRoamBssEntry)
4540 {
4541 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
4542 if(pScanResult != NULL)
4543 {
4544 pSirBssDesc = &pScanResult->Result.BssDescriptor;
4545 //this can be NULL
4546 pIes = (tDot11fBeaconIEs *)( pScanResult->Result.pvIes );
4547 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4548 }
4549 }
4550 }
4551 if( pSirBssDesc )
4552 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004553 roamInfo.staId = HAL_STA_INVALID_IDX;
Jeff Johnson295189b2012-06-20 16:38:30 -07004554 csrRoamSaveConnectedInfomation(pMac, sessionId, pProfile, pSirBssDesc, pIes);
4555 //Save WPA/RSN IE
4556 csrRoamSaveSecurityRspIE(pMac, sessionId, pProfile->negotiatedAuthType, pSirBssDesc, pIes);
4557#ifdef FEATURE_WLAN_CCX
4558 roamInfo.isCCXAssoc = pSession->connectedProfile.isCCXAssoc;
4559#endif
4560
4561 // csrRoamStateChange also affects sub-state. Hence, csrRoamStateChange happens first and then
4562 // substate change.
4563 // Moving even save profile above so that below mentioned conditon is also met.
4564 // JEZ100225: Moved to after saving the profile. Fix needed in main/latest
4565 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07004566 // Make sure the Set Context is issued before link indication to NDIS. After link indication is
4567 // made to NDIS, frames could start flowing. If we have not set context with LIM, the frames
4568 // will be dropped for the security context may not be set properly.
4569 //
4570 // this was causing issues in the 2c_wlan_wep WHQL test when the SetContext was issued after the link
4571 // indication. (Link Indication happens in the profFSMSetConnectedInfra call).
4572 //
4573 // this reordering was done on titan_prod_usb branch and is being replicated here.
4574 //
4575
4576 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ) &&
4577 !pProfile->bWPSAssociation)
4578 {
4579 // Issue the set Context request to LIM to establish the Unicast STA context
4580 if( !HAL_STATUS_SUCCESS( csrRoamIssueSetContextReq( pMac, sessionId,
4581 pProfile->negotiatedUCEncryptionType,
4582 pSirBssDesc, &(pSirBssDesc->bssId),
4583 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ) ) ) // NO keys... these key parameters don't matter.
4584 {
4585 smsLog( pMac, LOGE, FL(" Set context for unicast fail\n") );
4586 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
4587 }
4588 // Issue the set Context request to LIM to establish the Broadcast STA context
4589 csrRoamIssueSetContextReq( pMac, sessionId, pProfile->negotiatedMCEncryptionType,
4590 pSirBssDesc, &BroadcastMac,
4591 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
4592 }
4593 else
4594 {
4595 //Need to wait for supplicant authtication
4596 roamInfo.fAuthRequired = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004597 //Set the subestate to WaitForKey in case authentiation is needed
4598 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_WAIT_FOR_KEY, sessionId );
4599
Jeff Johnson295189b2012-06-20 16:38:30 -07004600 if(pProfile->bWPSAssociation)
4601 {
4602 key_timeout_interval = CSR_WAIT_FOR_WPS_KEY_TIMEOUT_PERIOD;
4603 }
4604 else
4605 {
4606 key_timeout_interval = CSR_WAIT_FOR_KEY_TIMEOUT_PERIOD;
4607 }
4608
4609 //Save sessionId in case of timeout
4610 pMac->roam.WaitForKeyTimerInfo.sessionId = (tANI_U8)sessionId;
4611 //This time should be long enough for the rest of the process plus setting key
4612 if(!HAL_STATUS_SUCCESS( csrRoamStartWaitForKeyTimer( pMac, key_timeout_interval ) ) )
4613 {
4614 //Reset our state so nothting is blocked.
4615 smsLog( pMac, LOGE, FL(" Failed to start pre-auth timer\n") );
4616 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
4617 }
4618 }
4619
4620 assocInfo.pBssDesc = pSirBssDesc; //could be NULL
4621 assocInfo.pProfile = pProfile;
Jeff Johnson295189b2012-06-20 16:38:30 -07004622 if(Context)
4623 {
4624 tSirSmeJoinRsp *pJoinRsp = (tSirSmeJoinRsp *)Context;
4625 tANI_U32 len;
Jeff Johnson295189b2012-06-20 16:38:30 -07004626 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4627 len = pJoinRsp->assocReqLength + pJoinRsp->assocRspLength + pJoinRsp->beaconLength;
4628#ifdef WLAN_FEATURE_VOWIFI_11R
4629 len += pJoinRsp->parsedRicRspLen;
4630#endif /* WLAN_FEATURE_VOWIFI_11R */
4631#ifdef FEATURE_WLAN_CCX
4632 len += pJoinRsp->tspecIeLen;
4633#endif
4634 if(len)
4635 {
4636 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd,
4637 (void **)&pSession->connectedInfo.pbFrames, len)))
4638 {
4639 if(HAL_STATUS_SUCCESS( palCopyMemory(pMac->hHdd,
4640 pSession->connectedInfo.pbFrames, pJoinRsp->frames, len) ))
4641 {
4642 pSession->connectedInfo.nAssocReqLength = pJoinRsp->assocReqLength;
4643 pSession->connectedInfo.nAssocRspLength = pJoinRsp->assocRspLength;
4644 pSession->connectedInfo.nBeaconLength = pJoinRsp->beaconLength;
4645#ifdef WLAN_FEATURE_VOWIFI_11R
4646 pSession->connectedInfo.nRICRspLength = pJoinRsp->parsedRicRspLen;
4647#endif /* WLAN_FEATURE_VOWIFI_11R */
4648#ifdef FEATURE_WLAN_CCX
4649 pSession->connectedInfo.nTspecIeLength = pJoinRsp->tspecIeLen;
4650#endif
4651 roamInfo.nAssocReqLength = pJoinRsp->assocReqLength;
4652 roamInfo.nAssocRspLength = pJoinRsp->assocRspLength;
4653 roamInfo.nBeaconLength = pJoinRsp->beaconLength;
4654 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4655 }
4656 else
4657 {
4658 smsLog(pMac, LOGE, "%s: Copying of memory failed for %d bytes !!!\n",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004659 __func__, len);
Jeff Johnson295189b2012-06-20 16:38:30 -07004660 palFreeMemory( pMac->hHdd, pSession->connectedInfo.pbFrames );
4661 pSession->connectedInfo.pbFrames = NULL;
4662 }
4663 }
4664 }
4665 if(pCommand->u.roamCmd.fReassoc)
4666 {
4667 roamInfo.fReassocReq = roamInfo.fReassocRsp = eANI_BOOLEAN_TRUE;
4668 }
4669 pSession->connectedInfo.staId = ( tANI_U8 )pJoinRsp->staId;
4670 roamInfo.staId = ( tANI_U8 )pJoinRsp->staId;
4671 roamInfo.ucastSig = ( tANI_U8 )pJoinRsp->ucastSig;
4672 roamInfo.bcastSig = ( tANI_U8 )pJoinRsp->bcastSig;
4673 }
4674 else
4675 {
4676 if(pCommand->u.roamCmd.fReassoc)
4677 {
4678 roamInfo.fReassocReq = roamInfo.fReassocRsp = eANI_BOOLEAN_TRUE;
4679 roamInfo.nAssocReqLength = pSession->connectedInfo.nAssocReqLength;
4680 roamInfo.nAssocRspLength = pSession->connectedInfo.nAssocRspLength;
4681 roamInfo.nBeaconLength = pSession->connectedInfo.nBeaconLength;
4682 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4683 }
4684 }
4685#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4686 // Indicate SME-QOS with reassoc success event, only after
4687 // copying the frames
4688 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, ind_qos, &assocInfo);
4689#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004690 roamInfo.pBssDesc = pSirBssDesc;
4691 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4692 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4693#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4694 acm_mask = sme_QosGetACMMask(pMac, pSirBssDesc, NULL);
4695#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
4696 pSession->connectedProfile.acm_mask = acm_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004697#ifdef FEATURE_WLAN_UAPSD_FW_TRG_FRAMES
4698 //start UAPSD if uapsd_mask is not 0 because HDD will configure for trigger frame
4699 //It may be better to let QoS do this????
4700 if( pSession->connectedProfile.modifyProfileFields.uapsd_mask )
4701 {
4702 smsLog(pMac, LOGE, " uapsd_mask (0x%X) set, request UAPSD now\n",
4703 pSession->connectedProfile.modifyProfileFields.uapsd_mask);
4704 pmcStartUapsd( pMac, NULL, NULL );
4705 }
4706#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004707 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
4708 if( pSession->bRefAssocStartCnt > 0 )
4709 {
4710 pSession->bRefAssocStartCnt--;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07004711 //Remove this code once SLM_Sessionization is supported
4712 //BMPS_WORKAROUND_NOT_NEEDED
4713 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) && ( csrIsConcurrentSessionRunning( pMac )))
Jeff Johnsone7245742012-09-05 17:12:55 -07004714 {
4715 pMac->roam.configParam.doBMPSWorkaround = 1;
4716 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004717 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_ASSOCIATED);
4718 }
4719
4720 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_NONE, eANI_BOOLEAN_TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004721 // reset the PMKID candidate list
4722 csrResetPMKIDCandidateList( pMac, sessionId );
4723 //Update TL's AC weight base on the current EDCA parameters
4724 //These parameters may change in the course of the connection, that sictuation
4725 //is not taken care here. This change is mainly to address a WIFI WMM test where
4726 //BE has a equal or higher TX priority than VI.
4727 //We only do this for infra link
4728 if( csrIsConnStateConnectedInfra(pMac, sessionId ) && pIes )
4729 {
4730 csrCheckAndUpdateACWeight(pMac, pIes);
4731 }
4732#ifdef FEATURE_WLAN_WAPI
4733 // reset the BKID candidate list
4734 csrResetBKIDCandidateList( pMac, sessionId );
4735#endif /* FEATURE_WLAN_WAPI */
4736 }
4737 else
4738 {
4739 smsLog(pMac, LOGW, " Roam command doesn't have a BSS desc\n");
4740 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004741 csrScanCancelIdleScan(pMac);
4742 //Not to signal link up because keys are yet to be set.
4743 //The linkup function will overwrite the sub-state that we need to keep at this point.
4744 if( !CSR_IS_WAIT_FOR_KEY(pMac, sessionId) )
4745 {
4746 csrRoamLinkUp(pMac, pSession->connectedProfile.bssid);
4747 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004748 //Check if BMPS is required and start the BMPS retry timer. Timer period is large
4749 //enough to let security and DHCP handshake succeed before entry into BMPS
4750 if (pmcShouldBmpsTimerRun(pMac))
4751 {
4752 if (pmcStartTrafficTimer(pMac, BMPS_TRAFFIC_TIMER_ALLOW_SECURITY_DHCP)
4753 != eHAL_STATUS_SUCCESS)
4754 {
4755 smsLog(pMac, LOGP, FL("Cannot start BMPS Retry timer"));
4756 }
4757 smsLog(pMac, LOG2, FL("BMPS Retry Timer already running or started"));
4758 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004759 break;
4760
Jeff Johnson295189b2012-06-20 16:38:30 -07004761 case eCsrStartBssSuccess:
4762 // on the StartBss Response, LIM is returning the Bss Description that we
4763 // are beaconing. Add this Bss Description to our scan results and
4764 // chain the Profile to this Bss Description. On a Start BSS, there was no
4765 // detected Bss description (no partner) so we issued the Start Bss to
4766 // start the Ibss without any Bss description. Lim was kind enough to return
4767 // the Bss Description that we start beaconing for the newly started Ibss.
4768 smsLog(pMac, LOG2, FL("receives start BSS ok indication\n"));
4769 status = eHAL_STATUS_FAILURE;
4770#ifdef WLAN_SOFTAP_FEATURE
4771 pSmeStartBssRsp = (tSirSmeStartBssRsp *)Context;
4772#endif
4773 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4774 if( CSR_IS_IBSS( pProfile ) )
4775 {
4776 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED;
4777 }
4778#ifdef WLAN_SOFTAP_FEATURE
4779 else if (CSR_IS_INFRA_AP(pProfile))
4780 {
4781 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED;
4782 }
4783#endif
4784 else
4785 {
4786 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED;
4787 }
4788 if( !CSR_IS_WDS_STA( pProfile ) )
4789 {
4790 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
4791#ifdef WLAN_SOFTAP_FEATURE
4792 pSirBssDesc = &pSmeStartBssRsp->bssDescription;
4793#else
4794 pSirBssDesc = (tSirBssDescription *)Context;
4795#endif
4796 if( !HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs( pMac, pSirBssDesc, &pIes )) )
4797 {
4798 smsLog(pMac, LOG2, FL("cannot parse IBSS IEs\n"));
4799 roamInfo.pBssDesc = pSirBssDesc;
4800 //We need to associate_complete it first, becasue Associate_start already indicated.
4801 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4802 eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_IBSS_START_FAILED );
4803 break;
4804 }
4805#ifdef WLAN_SOFTAP_FEATURE
4806 if (!CSR_IS_INFRA_AP(pProfile))
4807#endif
4808 {
4809 pScanResult = csrScanAppendBssDescription( pMac, pSirBssDesc, pIes );
4810 }
4811 csrRoamSaveConnectedBssDesc(pMac, sessionId, pSirBssDesc);
4812 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
4813 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4814 if(pSirBssDesc)
4815 {
4816 csrRoamSaveConnectedInfomation(pMac, sessionId, pProfile, pSirBssDesc, pIes);
4817 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4818 }
4819 //We are doen with the IEs so free it
4820 palFreeMemory(pMac->hHdd, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07004821#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4822 {
4823 vos_log_ibss_pkt_type *pIbssLog;
4824 tANI_U32 bi;
4825
4826 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
4827 if(pIbssLog)
4828 {
4829 if(CSR_INVALID_SCANRESULT_HANDLE == pCommand->u.roamCmd.hBSSList)
4830 {
4831 //We start the IBSS (didn't find any matched IBSS out there)
4832 pIbssLog->eventId = WLAN_IBSS_EVENT_START_IBSS_RSP;
4833 }
4834 else
4835 {
4836 pIbssLog->eventId = WLAN_IBSS_EVENT_JOIN_IBSS_RSP;
4837 }
4838 if(pSirBssDesc)
4839 {
4840 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pSirBssDesc->bssId, 6);
4841 pIbssLog->operatingChannel = pSirBssDesc->channelId;
4842 }
4843 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &bi)))
4844 {
4845 //***U8 is not enough for beacon interval
4846 pIbssLog->beaconInterval = (v_U8_t)bi;
4847 }
4848 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
4849 }
4850 }
4851#endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4852 //Only set context for non-WDS_STA. We don't even need it for WDS_AP. But since the encryption
4853 //is WPA2-PSK so it won't matter.
Jeff Johnson295189b2012-06-20 16:38:30 -07004854#ifdef WLAN_SOFTAP_FEATURE
4855 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ) && !CSR_IS_INFRA_AP( pSession->pCurRoamProfile ))
4856 {
4857#else
4858 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ))
4859 {
4860#endif
4861 // Issue the set Context request to LIM to establish the Broadcast STA context for the Ibss.
4862 csrRoamIssueSetContextReq( pMac, sessionId,
4863 pProfile->negotiatedMCEncryptionType,
4864 pSirBssDesc, &BroadcastMac,
4865 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
4866 }
4867 }
4868 else
4869 {
4870 //Keep the state to eCSR_ROAMING_STATE_JOINING
4871 //Need to send join_req.
4872 if(pCommand->u.roamCmd.pRoamBssEntry)
4873 {
4874 if((pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link)))
4875 {
4876 pSirBssDesc = &pScanResult->Result.BssDescriptor;
4877 pIes = (tDot11fBeaconIEs *)( pScanResult->Result.pvIes );
4878 // Set the roaming substate to 'join attempt'...
4879 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_JOIN_REQ, sessionId);
4880 status = csrSendJoinReqMsg( pMac, sessionId, pSirBssDesc, pProfile, pIes );
4881 }
4882 }
4883 else
4884 {
4885 smsLog( pMac, LOGE, " StartBSS for WDS station with no BssDesc\n" );
4886 VOS_ASSERT( 0 );
4887 }
4888 }
4889 //Only tell upper layer is we start the BSS because Vista doesn't like multiple connection
4890 //indications. If we don't start the BSS ourself, handler of eSIR_SME_JOINED_NEW_BSS will
4891 //trigger the connection start indication in Vista
4892 if( !CSR_IS_JOIN_TO_IBSS( pProfile ) )
4893 {
4894 roamStatus = eCSR_ROAM_IBSS_IND;
4895 roamResult = eCSR_ROAM_RESULT_IBSS_STARTED;
4896 if( CSR_IS_WDS( pProfile ) )
4897 {
4898 roamStatus = eCSR_ROAM_WDS_IND;
4899 roamResult = eCSR_ROAM_RESULT_WDS_STARTED;
4900 }
4901#ifdef WLAN_SOFTAP_FEATURE
4902 if( CSR_IS_INFRA_AP( pProfile ) )
4903 {
4904 roamStatus = eCSR_ROAM_INFRA_IND;
4905 roamResult = eCSR_ROAM_RESULT_INFRA_STARTED;
4906 }
4907#endif
4908
4909 //Only tell upper layer is we start the BSS because Vista doesn't like multiple connection
4910 //indications. If we don't start the BSS ourself, handler of eSIR_SME_JOINED_NEW_BSS will
4911 //trigger the connection start indication in Vista
4912 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4913 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4914 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4915 if(CSR_INVALID_SCANRESULT_HANDLE == pCommand->u.roamCmd.hBSSList)
4916 {
4917 //We start the IBSS (didn't find any matched IBSS out there)
4918 roamInfo.pBssDesc = pSirBssDesc;
4919 }
4920#ifdef WLAN_SOFTAP_FEATURE
4921 roamInfo.staId = (tANI_U8)pSmeStartBssRsp->staId;
4922#endif
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07004923 //Remove this code once SLM_Sessionization is supported
4924 //BMPS_WORKAROUND_NOT_NEEDED
4925 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) &&
Mohit Khanna349bc392012-09-11 17:24:52 -07004926 ( csrIsConcurrentSessionRunning( pMac )))
Jeff Johnsone7245742012-09-05 17:12:55 -07004927 {
4928 pMac->roam.configParam.doBMPSWorkaround = 1;
4929 }
Mohit Khanna349bc392012-09-11 17:24:52 -07004930
Jeff Johnson295189b2012-06-20 16:38:30 -07004931 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, roamStatus, roamResult );
4932 }
4933
4934 csrScanCancelIdleScan(pMac);
4935 //Only use this timer for ibss. BAP has its own timer for WDS
4936 if( CSR_IS_IBSS( pProfile) && CSR_INVALID_SCANRESULT_HANDLE != pCommand->u.roamCmd.hBSSList)
4937 {
4938 //start the join IBSS timer
4939 csrRoamStartIbssJoinTimer(pMac, sessionId, CSR_IBSS_JOIN_TIMEOUT_PERIOD); //interval
4940 pSession->ibss_join_pending = TRUE;
4941 }
4942 if( HAL_STATUS_SUCCESS( status ) )
4943 {
4944 //Already sent join_req for the WDS station
4945 fReleaseCommand = eANI_BOOLEAN_FALSE;
4946 }
4947 else if( CSR_IS_WDS_STA( pProfile ) )
4948 {
4949 //need to send stop BSS because we fail to send join_req
4950 csrRoamIssueDisassociateCmd( pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED );
4951 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4952 eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_STOPPED );
4953 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004954 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004955 case eCsrStartBssFailure:
4956#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4957 {
4958 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07004959 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
4960 if(pIbssLog)
4961 {
4962 pIbssLog->status = WLAN_IBSS_STATUS_FAILURE;
4963 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
4964 }
4965 }
4966#endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07004967 roamStatus = eCSR_ROAM_IBSS_IND;
4968 roamResult = eCSR_ROAM_RESULT_IBSS_STARTED;
4969 if( CSR_IS_WDS( pProfile ) )
4970 {
4971 roamStatus = eCSR_ROAM_WDS_IND;
4972 roamResult = eCSR_ROAM_RESULT_WDS_STARTED;
4973 }
4974#ifdef WLAN_SOFTAP_FEATURE
4975 if( CSR_IS_INFRA_AP( pProfile ) )
4976 {
4977 roamStatus = eCSR_ROAM_INFRA_IND;
4978 roamResult = eCSR_ROAM_RESULT_INFRA_START_FAILED;
4979 }
4980#endif
4981 if(Context)
4982 {
4983 pSirBssDesc = (tSirBssDescription *)Context;
4984 }
4985 else
4986 {
4987 pSirBssDesc = NULL;
4988 }
4989 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4990 roamInfo.pBssDesc = pSirBssDesc;
4991 //We need to associate_complete it first, becasue Associate_start already indicated.
4992 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, roamStatus, roamResult );
4993 csrSetDefaultDot11Mode( pMac );
4994 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004995 case eCsrSilentlyStopRoaming:
4996 // We are here because we try to start the same IBSS
4997 //No message to PE
4998 // return the roaming state to Joined.
4999 smsLog(pMac, LOGW, FL("receives silently roaming indication\n"));
5000 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
5001 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
5002 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
5003 roamInfo.pBssDesc = pSession->pConnectBssDesc;
5004 if( roamInfo.pBssDesc )
5005 {
5006 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &roamInfo.pBssDesc->bssId, sizeof(tCsrBssid));
5007 }
5008 //Since there is no change in the current state, simply pass back no result otherwise
5009 //HDD may be mistakenly mark to disconnected state.
5010 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
5011 eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_NONE );
Jeff Johnson295189b2012-06-20 16:38:30 -07005012 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005013 case eCsrSilentlyStopRoamingSaveState:
5014 //We are here because we try to connect to the same AP
5015 //No message to PE
5016 smsLog(pMac, LOGW, FL("receives silently stop roaming indication\n"));
5017 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
5018
5019 //to aviod resetting the substate to NONE
5020 pMac->roam.curState[sessionId] = eCSR_ROAMING_STATE_JOINED;
5021 //No need to change substate to wai_for_key because there is no state change
5022 roamInfo.pBssDesc = pSession->pConnectBssDesc;
5023 if( roamInfo.pBssDesc )
5024 {
5025 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &roamInfo.pBssDesc->bssId, sizeof(tCsrBssid));
5026 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005027 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
5028 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
5029 roamInfo.nBeaconLength = pSession->connectedInfo.nBeaconLength;
5030 roamInfo.nAssocReqLength = pSession->connectedInfo.nAssocReqLength;
5031 roamInfo.nAssocRspLength = pSession->connectedInfo.nAssocRspLength;
5032 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
5033 roamInfo.staId = pSession->connectedInfo.staId;
5034 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
5035#if defined(VOSS_ENABLED)
5036 VOS_ASSERT( roamInfo.staId != 0 );
5037#endif
5038 pSession->bRefAssocStartCnt--;
5039 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
5040 eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_ASSOCIATED);
5041 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_ASSOCIATED, eANI_BOOLEAN_TRUE);
5042 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005043 case eCsrReassocFailure:
5044#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5045 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_REASSOC_FAILURE, NULL);
5046#endif
5047 case eCsrJoinWdsFailure:
5048 smsLog(pMac, LOGW, FL("failed to join WDS\n"));
5049 csrFreeConnectBssDesc(pMac, sessionId);
5050 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
5051 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
5052 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
5053 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
5054 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
5055 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
5056 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
5057 eCSR_ROAM_WDS_IND,
5058 eCSR_ROAM_RESULT_WDS_NOT_ASSOCIATED);
5059 //Need to issue stop_bss
5060 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005061 case eCsrJoinFailure:
5062 case eCsrNothingToJoin:
Jeff Johnsone7245742012-09-05 17:12:55 -07005063 case eCsrJoinFailureDueToConcurrency:
Jeff Johnson295189b2012-06-20 16:38:30 -07005064 default:
5065 {
5066 smsLog(pMac, LOGW, FL("receives no association indication\n"));
Madan Mohan Koyyalamudi85d140a2012-10-18 20:23:01 -07005067 smsLog(pMac, LOG1, FL("Assoc ref count %d\n"),
5068 pSession->bRefAssocStartCnt);
Jeff Johnson295189b2012-06-20 16:38:30 -07005069 if( CSR_IS_INFRASTRUCTURE( &pSession->connectedProfile ) ||
5070 CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ( pMac, sessionId ) )
5071 {
5072 //do not free for the other profiles as we need to send down stop BSS later
5073 csrFreeConnectBssDesc(pMac, sessionId);
5074 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
5075 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
5076 csrSetDefaultDot11Mode( pMac );
5077 }
5078
5079 switch( pCommand->u.roamCmd.roamReason )
5080 {
5081 // If this transition is because of an 802.11 OID, then we transition
5082 // back to INIT state so we sit waiting for more OIDs to be issued and
5083 // we don't start the IDLE timer.
Jeff Johnsone7245742012-09-05 17:12:55 -07005084 case eCsrSmeIssuedFTReassoc:
Jeff Johnson295189b2012-06-20 16:38:30 -07005085 case eCsrSmeIssuedAssocToSimilarAP:
5086 case eCsrHddIssued:
5087 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5088 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
5089 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
5090 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
5091 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07005092 /* Defeaturize this later if needed */
5093#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
5094 /* If Join fails while Handoff is in progress, indicate disassociated event to supplicant to reconnect */
5095 if (csrRoamIsHandoffInProgress(pMac))
5096 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005097 /* Should indicate neighbor roam algorithm about the connect failure here */
5098 csrNeighborRoamIndicateConnect(pMac, (tANI_U8)sessionId, VOS_STATUS_E_FAILURE);
5099 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005100#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005101 if(pSession->bRefAssocStartCnt > 0)
5102 {
5103 pSession->bRefAssocStartCnt--;
Jeff Johnsone7245742012-09-05 17:12:55 -07005104 if(eCsrJoinFailureDueToConcurrency == Result)
5105 {
5106 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
5107 eCSR_ROAM_ASSOCIATION_COMPLETION,
5108 eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL);
5109 }
5110 else
5111 {
5112 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
Jeff Johnson295189b2012-06-20 16:38:30 -07005113 eCSR_ROAM_ASSOCIATION_COMPLETION,
5114 eCSR_ROAM_RESULT_FAILURE);
Jeff Johnsone7245742012-09-05 17:12:55 -07005115 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005116 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005117 smsLog(pMac, LOG1, FL(" roam(reason %d) failed\n"), pCommand->u.roamCmd.roamReason);
5118#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5119 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5120#endif
5121 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5122 csrScanStartIdleScan(pMac);
5123#ifdef FEATURE_WLAN_BTAMP_UT_RF
5124 //For WDS STA. To fix the issue where the WDS AP side may be too busy by
5125 //BT activity and not able to recevie WLAN traffic. Retry the join
5126 if( CSR_IS_WDS_STA(pProfile) )
5127 {
5128 csrRoamStartJoinRetryTimer(pMac, sessionId, CSR_JOIN_RETRY_TIMEOUT_PERIOD);
5129 }
5130#endif
5131 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005132 case eCsrHddIssuedReassocToSameAP:
5133 case eCsrSmeIssuedReassocToSameAP:
5134 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId);
5135
5136 csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.roamCmd.roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
5137#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5138 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5139#endif
5140 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5141 csrScanStartIdleScan(pMac);
5142 break;
5143 case eCsrForcedDisassoc:
5144 case eCsrForcedDeauth:
5145 case eCsrSmeIssuedIbssJoinFailure:
5146 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId);
5147
5148 if(eCsrSmeIssuedIbssJoinFailure == pCommand->u.roamCmd.roamReason)
5149 {
5150 // Notify HDD that IBSS join failed
5151 csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_IBSS_JOIN_FAILED);
5152 }
5153 else
5154 {
5155 csrRoamCallCallback(pMac, sessionId, NULL,
5156 pCommand->u.roamCmd.roamId,
5157 eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
5158 }
5159#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5160 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5161#endif
5162 csrRoamLinkDown(pMac, sessionId);
5163 csrScanStartIdleScan(pMac);
5164 break;
5165 case eCsrForcedIbssLeave:
5166 csrRoamCallCallback(pMac, sessionId, NULL,
5167 pCommand->u.roamCmd.roamId,
5168 eCSR_ROAM_IBSS_LEAVE,
5169 eCSR_ROAM_RESULT_IBSS_STOP);
5170 break;
5171 case eCsrForcedDisassocMICFailure:
5172 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5173
5174 csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.roamCmd.roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_MIC_FAILURE);
5175#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5176 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_REQ, NULL);
5177#endif
5178 csrScanStartIdleScan(pMac);
5179 break;
5180#ifdef WLAN_SOFTAP_FEATURE
5181 case eCsrStopBss:
5182 csrRoamCallCallback(pMac, sessionId, NULL,
5183 pCommand->u.roamCmd.roamId,
5184 eCSR_ROAM_INFRA_IND,
5185 eCSR_ROAM_RESULT_INFRA_STOPPED);
5186 break;
5187 case eCsrForcedDisassocSta:
5188 case eCsrForcedDeauthSta:
5189 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId);
5190 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
5191 {
5192 pSession = CSR_GET_SESSION(pMac, sessionId);
5193 if (!pSession)
5194 break;
5195
5196 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
5197 {
5198 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
5199 palCopyMemory(pMac->hHdd, roamInfo.peerMac,
5200 pCommand->u.roamCmd.peerMac, sizeof(tSirMacAddr));
5201 roamInfo.reasonCode = eCSR_ROAM_RESULT_FORCED;
5202 roamInfo.statusCode = eSIR_SME_SUCCESS;
5203 status = csrRoamCallCallback(pMac, sessionId,
5204 &roamInfo, pCommand->u.roamCmd.roamId,
5205 eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
5206 }
5207 }
5208 break;
5209#endif
5210 case eCsrLostLink1:
5211 // if lost link roam1 failed, then issue lost link Scan2 ...
5212 csrScanRequestLostLink2(pMac, sessionId);
5213 break;
5214 case eCsrLostLink2:
5215 // if lost link roam2 failed, then issue lost link scan3 ...
5216 csrScanRequestLostLink3(pMac, sessionId);
5217 break;
5218 case eCsrLostLink3:
5219 default:
5220 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5221
5222 //We are done with one round of lostlink roaming here
5223 csrScanHandleFailedLostlink3(pMac, sessionId);
5224 break;
5225 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005226 break;
5227 }
5228 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005229 return ( fReleaseCommand );
5230}
5231
Jeff Johnson295189b2012-06-20 16:38:30 -07005232eHalStatus csrRoamRegisterCallback(tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext)
5233{
5234 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07005235 return (status);
5236}
5237
Jeff Johnson295189b2012-06-20 16:38:30 -07005238eHalStatus csrRoamCopyProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pDstProfile, tCsrRoamProfile *pSrcProfile)
5239{
5240 eHalStatus status = eHAL_STATUS_SUCCESS;
5241 tANI_U32 size = 0;
5242
5243 do
5244 {
5245 palZeroMemory(pMac->hHdd, pDstProfile, sizeof(tCsrRoamProfile));
5246 if(pSrcProfile->BSSIDs.numOfBSSIDs)
5247 {
5248 size = sizeof(tCsrBssid) * pSrcProfile->BSSIDs.numOfBSSIDs;
5249 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->BSSIDs.bssid, size);
5250 if(!HAL_STATUS_SUCCESS(status))
5251 {
5252 break;
5253 }
5254 pDstProfile->BSSIDs.numOfBSSIDs = pSrcProfile->BSSIDs.numOfBSSIDs;
5255 palCopyMemory(pMac->hHdd, pDstProfile->BSSIDs.bssid, pSrcProfile->BSSIDs.bssid, size);
5256 }
5257 if(pSrcProfile->SSIDs.numOfSSIDs)
5258 {
5259 size = sizeof(tCsrSSIDInfo) * pSrcProfile->SSIDs.numOfSSIDs;
5260 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->SSIDs.SSIDList, size);
5261 if(!HAL_STATUS_SUCCESS(status))
5262 {
5263 break;
5264 }
5265 pDstProfile->SSIDs.numOfSSIDs = pSrcProfile->SSIDs.numOfSSIDs;
5266 palCopyMemory(pMac->hHdd, pDstProfile->SSIDs.SSIDList, pSrcProfile->SSIDs.SSIDList, size);
5267 }
5268 if(pSrcProfile->nWPAReqIELength)
5269 {
5270 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pWPAReqIE, pSrcProfile->nWPAReqIELength);
5271 if(!HAL_STATUS_SUCCESS(status))
5272 {
5273 break;
5274 }
5275 pDstProfile->nWPAReqIELength = pSrcProfile->nWPAReqIELength;
5276 palCopyMemory(pMac->hHdd, pDstProfile->pWPAReqIE, pSrcProfile->pWPAReqIE, pSrcProfile->nWPAReqIELength);
5277 }
5278 if(pSrcProfile->nRSNReqIELength)
5279 {
5280 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pRSNReqIE, pSrcProfile->nRSNReqIELength);
5281 if(!HAL_STATUS_SUCCESS(status))
5282 {
5283 break;
5284 }
5285 pDstProfile->nRSNReqIELength = pSrcProfile->nRSNReqIELength;
5286 palCopyMemory(pMac->hHdd, pDstProfile->pRSNReqIE, pSrcProfile->pRSNReqIE, pSrcProfile->nRSNReqIELength);
5287 }
5288#ifdef FEATURE_WLAN_WAPI
5289 if(pSrcProfile->nWAPIReqIELength)
5290 {
5291 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pWAPIReqIE, pSrcProfile->nWAPIReqIELength);
5292 if(!HAL_STATUS_SUCCESS(status))
5293 {
5294 break;
5295 }
5296 pDstProfile->nWAPIReqIELength = pSrcProfile->nWAPIReqIELength;
5297 palCopyMemory(pMac->hHdd, pDstProfile->pWAPIReqIE, pSrcProfile->pWAPIReqIE, pSrcProfile->nWAPIReqIELength);
5298 }
5299#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07005300 if(pSrcProfile->nAddIEScanLength)
5301 {
5302 status = palAllocateMemory(pMac->hHdd,
5303 (void **)&pDstProfile->pAddIEScan, pSrcProfile->nAddIEScanLength);
5304 if(!HAL_STATUS_SUCCESS(status))
5305 {
5306 break;
5307 }
5308 pDstProfile->nAddIEScanLength = pSrcProfile->nAddIEScanLength;
5309 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEScan, pSrcProfile->pAddIEScan,
5310 pSrcProfile->nAddIEScanLength);
5311 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005312 if(pSrcProfile->nAddIEAssocLength)
5313 {
5314 status = palAllocateMemory(pMac->hHdd,
5315 (void **)&pDstProfile->pAddIEAssoc, pSrcProfile->nAddIEAssocLength);
5316 if(!HAL_STATUS_SUCCESS(status))
5317 {
5318 break;
5319 }
5320 pDstProfile->nAddIEAssocLength = pSrcProfile->nAddIEAssocLength;
5321 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEAssoc, pSrcProfile->pAddIEAssoc,
5322 pSrcProfile->nAddIEAssocLength);
5323 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005324 if(pSrcProfile->ChannelInfo.ChannelList)
5325 {
5326 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.numOfChannels);
5327 if(!HAL_STATUS_SUCCESS(status))
5328 {
5329 break;
5330 }
5331 pDstProfile->ChannelInfo.numOfChannels = pSrcProfile->ChannelInfo.numOfChannels;
5332 palCopyMemory(pMac->hHdd, pDstProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.numOfChannels);
5333 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005334 pDstProfile->AuthType = pSrcProfile->AuthType;
5335 pDstProfile->EncryptionType = pSrcProfile->EncryptionType;
5336 pDstProfile->mcEncryptionType = pSrcProfile->mcEncryptionType;
5337 pDstProfile->negotiatedUCEncryptionType = pSrcProfile->negotiatedUCEncryptionType;
5338 pDstProfile->negotiatedMCEncryptionType = pSrcProfile->negotiatedMCEncryptionType;
5339 pDstProfile->negotiatedAuthType = pSrcProfile->negotiatedAuthType;
5340 pDstProfile->BSSType = pSrcProfile->BSSType;
5341 pDstProfile->phyMode = pSrcProfile->phyMode;
5342 pDstProfile->csrPersona = pSrcProfile->csrPersona;
5343
5344#ifdef FEATURE_WLAN_WAPI
5345 if(csrIsProfileWapi(pSrcProfile))
5346 {
5347 if(pDstProfile->phyMode & eCSR_DOT11_MODE_11n)
5348 {
5349 pDstProfile->phyMode &= ~eCSR_DOT11_MODE_11n;
5350 }
5351 }
5352#endif /* FEATURE_WLAN_WAPI */
5353 pDstProfile->CBMode = pSrcProfile->CBMode;
5354 /*Save the WPS info*/
5355 pDstProfile->bWPSAssociation = pSrcProfile->bWPSAssociation;
5356 pDstProfile->uapsd_mask = pSrcProfile->uapsd_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07005357 pDstProfile->beaconInterval = pSrcProfile->beaconInterval;
5358#ifdef WLAN_SOFTAP_FEATURE
5359 pDstProfile->privacy = pSrcProfile->privacy;
5360 pDstProfile->fwdWPSPBCProbeReq = pSrcProfile->fwdWPSPBCProbeReq;
5361 pDstProfile->csr80211AuthType = pSrcProfile->csr80211AuthType;
5362 pDstProfile->dtimPeriod = pSrcProfile->dtimPeriod;
5363 pDstProfile->ApUapsdEnable = pSrcProfile->ApUapsdEnable;
5364 pDstProfile->SSIDs.SSIDList[0].ssidHidden = pSrcProfile->SSIDs.SSIDList[0].ssidHidden;
5365 pDstProfile->protEnabled = pSrcProfile->protEnabled;
5366 pDstProfile->obssProtEnabled = pSrcProfile->obssProtEnabled;
5367 pDstProfile->cfg_protection = pSrcProfile->cfg_protection;
5368 pDstProfile->wps_state = pSrcProfile->wps_state;
5369 pDstProfile->ieee80211d = pSrcProfile->ieee80211d;
5370#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005371 palCopyMemory(pMac->hHdd, &pDstProfile->Keys, &pSrcProfile->Keys, sizeof(pDstProfile->Keys));
Jeff Johnson295189b2012-06-20 16:38:30 -07005372#ifdef WLAN_FEATURE_VOWIFI_11R
5373 if (pSrcProfile->MDID.mdiePresent)
5374 {
5375 pDstProfile->MDID.mdiePresent = 1;
5376 pDstProfile->MDID.mobilityDomain = pSrcProfile->MDID.mobilityDomain;
5377 }
5378#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005379 }while(0);
5380
5381 if(!HAL_STATUS_SUCCESS(status))
5382 {
5383 csrReleaseProfile(pMac, pDstProfile);
5384 pDstProfile = NULL;
5385 }
5386
5387 return (status);
5388}
Jeff Johnson295189b2012-06-20 16:38:30 -07005389eHalStatus csrRoamCopyConnectedProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pDstProfile )
5390{
5391 eHalStatus status = eHAL_STATUS_SUCCESS;
5392 tCsrRoamConnectedProfile *pSrcProfile = &pMac->roam.roamSession[sessionId].connectedProfile;
5393 do
5394 {
5395 palZeroMemory(pMac->hHdd, pDstProfile, sizeof(tCsrRoamProfile));
5396 if(pSrcProfile->bssid)
5397 {
5398 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->BSSIDs.bssid, sizeof(tCsrBssid));
5399 if(!HAL_STATUS_SUCCESS(status))
5400 {
5401 break;
5402 }
5403 pDstProfile->BSSIDs.numOfBSSIDs = 1;
5404 palCopyMemory(pMac->hHdd, pDstProfile->BSSIDs.bssid, pSrcProfile->bssid, sizeof(tCsrBssid));
5405 }
5406 if(pSrcProfile->SSID.ssId)
5407 {
5408 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->SSIDs.SSIDList, sizeof(tCsrSSIDInfo));
5409 if(!HAL_STATUS_SUCCESS(status))
5410 {
5411 break;
5412 }
5413 pDstProfile->SSIDs.numOfSSIDs = 1;
5414 pDstProfile->SSIDs.SSIDList[0].handoffPermitted = pSrcProfile->handoffPermitted;
5415 pDstProfile->SSIDs.SSIDList[0].ssidHidden = pSrcProfile->ssidHidden;
5416 palCopyMemory(pMac->hHdd, &pDstProfile->SSIDs.SSIDList[0].SSID, &pSrcProfile->SSID, sizeof(tSirMacSSid));
5417 }
Madan Mohan Koyyalamudiea22cdc2012-10-18 21:02:23 -07005418 if(pSrcProfile->nAddIEAssocLength)
5419 {
5420 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pAddIEAssoc, pSrcProfile->nAddIEAssocLength);
5421 if(!HAL_STATUS_SUCCESS(status))
5422 {
5423 smsLog( pMac, LOGE, FL(" failed to allocate memory for additional IEs \n") );
5424 break;
5425 }
5426 pDstProfile->nAddIEAssocLength = pSrcProfile->nAddIEAssocLength;
5427 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEAssoc, pSrcProfile->pAddIEAssoc,
5428 pSrcProfile->nAddIEAssocLength);
5429 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005430 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->ChannelInfo.ChannelList, 1);
5431 if(!HAL_STATUS_SUCCESS(status))
5432 {
5433 break;
5434 }
5435 pDstProfile->ChannelInfo.numOfChannels = 1;
5436 pDstProfile->ChannelInfo.ChannelList[0] = pSrcProfile->operationChannel;
Jeff Johnson295189b2012-06-20 16:38:30 -07005437 pDstProfile->AuthType.numEntries = 1;
5438 pDstProfile->AuthType.authType[0] = pSrcProfile->AuthType;
5439 pDstProfile->negotiatedAuthType = pSrcProfile->AuthType;
5440 pDstProfile->EncryptionType.numEntries = 1;
5441 pDstProfile->EncryptionType.encryptionType[0] = pSrcProfile->EncryptionType;
5442 pDstProfile->negotiatedUCEncryptionType = pSrcProfile->EncryptionType;
5443 pDstProfile->mcEncryptionType.numEntries = 1;
5444 pDstProfile->mcEncryptionType.encryptionType[0] = pSrcProfile->mcEncryptionType;
5445 pDstProfile->negotiatedMCEncryptionType = pSrcProfile->mcEncryptionType;
5446 pDstProfile->BSSType = pSrcProfile->BSSType;
5447 pDstProfile->CBMode = pSrcProfile->CBMode;
5448 palCopyMemory(pMac->hHdd, &pDstProfile->Keys, &pSrcProfile->Keys, sizeof(pDstProfile->Keys));
5449#ifdef WLAN_FEATURE_VOWIFI_11R
5450 if (pSrcProfile->MDID.mdiePresent)
5451 {
5452 pDstProfile->MDID.mdiePresent = 1;
5453 pDstProfile->MDID.mobilityDomain = pSrcProfile->MDID.mobilityDomain;
5454 }
5455#endif
5456
5457 }while(0);
5458
5459 if(!HAL_STATUS_SUCCESS(status))
5460 {
5461 csrReleaseProfile(pMac, pDstProfile);
5462 pDstProfile = NULL;
5463 }
5464
5465 return (status);
5466}
5467
Jeff Johnson295189b2012-06-20 16:38:30 -07005468eHalStatus csrRoamIssueConnect(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5469 tScanResultHandle hBSSList,
5470 eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate,
5471 tANI_BOOLEAN fClearScan)
5472{
5473 eHalStatus status = eHAL_STATUS_SUCCESS;
5474 tSmeCmd *pCommand;
5475
5476 pCommand = csrGetCommandBuffer(pMac);
5477 if(NULL == pCommand)
5478 {
5479 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5480 status = eHAL_STATUS_RESOURCES;
5481 }
5482 else
5483 {
5484 if( fClearScan )
5485 {
5486 csrScanCancelIdleScan(pMac);
5487 csrScanAbortMacScanNotForConnect(pMac);
5488 }
5489 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
5490 if(NULL == pProfile)
5491 {
5492 //We can roam now
5493 //Since pProfile is NULL, we need to build our own profile, set everything to default
5494 //We can only support open and no encryption
5495 pCommand->u.roamCmd.roamProfile.AuthType.numEntries = 1;
5496 pCommand->u.roamCmd.roamProfile.AuthType.authType[0] = eCSR_AUTH_TYPE_OPEN_SYSTEM;
5497 pCommand->u.roamCmd.roamProfile.EncryptionType.numEntries = 1;
5498 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_NONE;
5499 pCommand->u.roamCmd.roamProfile.csrPersona = VOS_STA_MODE;
5500 }
5501 else
5502 {
5503 //make a copy of the profile
5504 status = csrRoamCopyProfile(pMac, &pCommand->u.roamCmd.roamProfile, pProfile);
5505 if(HAL_STATUS_SUCCESS(status))
5506 {
5507 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_TRUE;
5508 }
5509 }
5510 pCommand->command = eSmeCommandRoam;
5511 pCommand->sessionId = (tANI_U8)sessionId;
5512 pCommand->u.roamCmd.hBSSList = hBSSList;
5513 pCommand->u.roamCmd.roamId = roamId;
5514 pCommand->u.roamCmd.roamReason = reason;
5515 //We need to free the BssList when the command is done
5516 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_TRUE;
5517 pCommand->u.roamCmd.fUpdateCurRoamProfile = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005518 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
5519 FL("CSR PERSONA=%d"),
5520 pCommand->u.roamCmd.roamProfile.csrPersona);
Jeff Johnson295189b2012-06-20 16:38:30 -07005521 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
5522 if( !HAL_STATUS_SUCCESS( status ) )
5523 {
5524 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
5525 csrReleaseCommandRoam( pMac, pCommand );
5526 }
5527 }
5528
5529 return (status);
5530}
Jeff Johnson295189b2012-06-20 16:38:30 -07005531eHalStatus csrRoamIssueReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5532 tCsrRoamModifyProfileFields *pMmodProfileFields,
5533 eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate)
5534{
5535 eHalStatus status = eHAL_STATUS_SUCCESS;
5536 tSmeCmd *pCommand;
5537
5538 pCommand = csrGetCommandBuffer(pMac);
5539 if(NULL == pCommand)
5540 {
5541 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5542 status = eHAL_STATUS_RESOURCES;
5543 }
5544 else
5545 {
5546 csrScanCancelIdleScan(pMac);
5547 csrScanAbortMacScanNotForConnect(pMac);
5548 if(pProfile)
5549 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005550 //This is likely trying to reassoc to different profile
5551 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
5552 //make a copy of the profile
5553 status = csrRoamCopyProfile(pMac, &pCommand->u.roamCmd.roamProfile, pProfile);
5554 pCommand->u.roamCmd.fUpdateCurRoamProfile = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005555 }
5556 else
5557 {
5558 status = csrRoamCopyConnectedProfile(pMac, sessionId, &pCommand->u.roamCmd.roamProfile);
5559 //how to update WPA/WPA2 info in roamProfile??
5560 pCommand->u.roamCmd.roamProfile.uapsd_mask = pMmodProfileFields->uapsd_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07005561 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005562 if(HAL_STATUS_SUCCESS(status))
5563 {
5564 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_TRUE;
5565 }
5566 pCommand->command = eSmeCommandRoam;
5567 pCommand->sessionId = (tANI_U8)sessionId;
5568 pCommand->u.roamCmd.roamId = roamId;
5569 pCommand->u.roamCmd.roamReason = reason;
5570 //We need to free the BssList when the command is done
5571 //For reassoc there is no BSS list, so the boolean set to false
5572 pCommand->u.roamCmd.hBSSList = CSR_INVALID_SCANRESULT_HANDLE;
5573 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_FALSE;
5574 pCommand->u.roamCmd.fReassoc = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005575 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
5576 if( !HAL_STATUS_SUCCESS( status ) )
5577 {
5578 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
5579 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5580 csrReleaseCommandRoam( pMac, pCommand );
5581 }
5582 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005583 return (status);
5584}
5585
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07005586eHalStatus csrRoamEnqueuePreauth(tpAniSirGlobal pMac, tANI_U32 sessionId, tpSirBssDescription pBssDescription,
5587 eCsrRoamReason reason, tANI_BOOLEAN fImmediate)
5588// , eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate)
5589{
5590 eHalStatus status = eHAL_STATUS_SUCCESS;
5591 tSmeCmd *pCommand;
5592
5593 pCommand = csrGetCommandBuffer(pMac);
5594 if(NULL == pCommand)
5595 {
5596 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5597 status = eHAL_STATUS_RESOURCES;
5598 }
5599 else
5600 {
5601 if(pBssDescription)
5602 {
5603 //copy over the parameters we need later
5604 pCommand->command = eSmeCommandRoam;
5605 pCommand->sessionId = (tANI_U8)sessionId;
5606 pCommand->u.roamCmd.roamReason = reason;
5607 //this is the important parameter
5608 //in this case we are using this field for the "next" BSS
5609 pCommand->u.roamCmd.pLastRoamBss = pBssDescription;
5610 status = csrQueueSmeCommand(pMac, pCommand, fImmediate);
5611 if( !HAL_STATUS_SUCCESS( status ) )
5612 {
5613 smsLog( pMac, LOGE, FL(" fail to enqueue preauth command, status = %d\n"), status );
5614 csrReleaseCommandPreauth( pMac, pCommand );
5615 }
5616 }
5617 else
5618 {
5619 //Return failure
5620 status = eHAL_STATUS_RESOURCES;
5621 }
5622 }
5623 return (status);
5624}
5625
5626eHalStatus csrRoamDequeuePreauth(tpAniSirGlobal pMac)
5627{
5628 tListElem *pEntry;
5629 tSmeCmd *pCommand;
5630 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
5631 if ( pEntry )
5632 {
5633 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
5634 if ( (eSmeCommandRoam == pCommand->command) &&
5635 (eCsrPerformPreauth == pCommand->u.roamCmd.roamReason))
5636 {
5637 smsLog( pMac, LOGE, FL("DQ-Command = %d, Reason = %d \n"),
5638 pCommand->command, pCommand->u.roamCmd.roamReason);
5639 if (csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK )) {
5640 csrReleaseCommandPreauth( pMac, pCommand );
5641 }
5642 } else {
5643 smsLog( pMac, LOGE, FL("Command = %d, Reason = %d \n"),
5644 pCommand->command, pCommand->u.roamCmd.roamReason);
5645 }
5646 }
5647 else {
5648 smsLog( pMac, LOGE, FL("pEntry NULL for eWNI_SME_FT_PRE_AUTH_RSP\n"));
5649 }
5650 smeProcessPendingQueue( pMac );
5651 return eHAL_STATUS_SUCCESS;
5652}
5653
Jeff Johnson295189b2012-06-20 16:38:30 -07005654eHalStatus csrRoamConnectWithBSSList(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5655 tScanResultHandle hBssListIn, tANI_U32 *pRoamId)
5656{
5657 eHalStatus status = eHAL_STATUS_FAILURE;
5658 tScanResultHandle hBSSList;
5659 tANI_U32 roamId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005660 status = csrScanCopyResultList(pMac, hBssListIn, &hBSSList);
5661 if(HAL_STATUS_SUCCESS(status))
5662 {
5663 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5664 if(pRoamId)
5665 {
5666 *pRoamId = roamId;
5667 }
5668 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5669 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5670 if(!HAL_STATUS_SUCCESS(status))
5671 {
5672 smsLog(pMac, LOGE, FL("failed to start a join process\n"));
5673 csrScanResultPurge(pMac, hBSSList);
5674 }
5675 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005676 return (status);
5677}
5678
Jeff Johnson295189b2012-06-20 16:38:30 -07005679eHalStatus csrRoamConnect(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5680 tScanResultHandle hBssListIn, tANI_U32 *pRoamId)
5681{
5682 eHalStatus status = eHAL_STATUS_SUCCESS;
5683 tScanResultHandle hBSSList;
5684 tCsrScanResultFilter *pScanFilter;
5685 tANI_U32 roamId = 0;
5686 tANI_BOOLEAN fCallCallback = eANI_BOOLEAN_FALSE;
5687 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07005688 if (NULL == pProfile)
5689 {
5690 smsLog(pMac, LOGP, FL("No profile specified"));
5691 return eHAL_STATUS_FAILURE;
5692 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005693 smsLog(pMac, LOG1, FL("called BSSType = %d authtype = %d encryType = %d\n"),
5694 pProfile->BSSType, pProfile->AuthType.authType[0], pProfile->EncryptionType.encryptionType[0]);
Jeff Johnson295189b2012-06-20 16:38:30 -07005695 if( CSR_IS_WDS( pProfile ) &&
5696 !HAL_STATUS_SUCCESS( status = csrIsBTAMPAllowed( pMac, pProfile->operationChannel ) ) )
5697 {
5698 return status;
5699 }
5700 csrRoamCancelRoaming(pMac, sessionId);
5701 csrScanRemoveFreshScanCommand(pMac, sessionId);
5702 csrScanCancelIdleScan(pMac);
5703 //Only abort the scan if it is not used for other roam/connect purpose
5704 csrScanAbortMacScan(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07005705#ifdef WLAN_SOFTAP_FEATURE
5706 if (!vos_concurrent_sessions_running() && (VOS_STA_SAP_MODE == pProfile->csrPersona))//In case of AP mode we do not want idle mode scan
5707 {
5708 csrScanDisable(pMac);
5709 }
5710#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005711 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssued);
5712 //Check whether ssid changes
5713 if(csrIsConnStateConnected(pMac, sessionId))
5714 {
5715 if(pProfile->SSIDs.numOfSSIDs && !csrIsSsidInList(pMac, &pSession->connectedProfile.SSID, &pProfile->SSIDs))
5716 {
5717 csrRoamIssueDisassociateCmd(pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED);
5718 }
5719 }
5720#ifdef FEATURE_WLAN_BTAMP_UT_RF
5721 pSession->maxRetryCount = CSR_JOIN_MAX_RETRY_COUNT;
5722#endif
5723 if(CSR_INVALID_SCANRESULT_HANDLE != hBssListIn)
5724 {
5725 smsLog(pMac, LOGW, FL("is called with BSSList\n"));
5726 status = csrRoamConnectWithBSSList(pMac, sessionId, pProfile, hBssListIn, pRoamId);
5727 if(pRoamId)
5728 {
5729 roamId = *pRoamId;
5730 }
5731 if(!HAL_STATUS_SUCCESS(status))
5732 {
5733 fCallCallback = eANI_BOOLEAN_TRUE;
5734 }
5735 }
5736 else
5737 {
5738 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
5739 if(HAL_STATUS_SUCCESS(status))
5740 {
5741 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
5742 //Try to connect to any BSS
5743 if(NULL == pProfile)
5744 {
5745 //No encryption
5746 pScanFilter->EncryptionType.numEntries = 1;
5747 pScanFilter->EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_NONE;
5748 }//we don't have a profile
5749 else
5750 {
5751 //Here is the profile we need to connect to
5752 status = csrRoamPrepareFilterFromProfile(pMac, pProfile, pScanFilter);
5753 }//We have a profile
5754 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5755 if(pRoamId)
5756 {
5757 *pRoamId = roamId;
5758 }
5759
5760 if(HAL_STATUS_SUCCESS(status))
5761 {
5762 /*Save the WPS info*/
5763 if(NULL != pProfile)
5764 {
5765 pScanFilter->bWPSAssociation = pProfile->bWPSAssociation;
5766 }
5767 else
5768 {
5769 pScanFilter->bWPSAssociation = 0;
5770 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005771 do
5772 {
5773 if( (pProfile && CSR_IS_WDS_AP( pProfile ) )
5774#ifdef WLAN_SOFTAP_FEATURE
5775 || (pProfile && CSR_IS_INFRA_AP ( pProfile ))
5776#endif
5777 )
5778 {
5779 //This can be start right away
5780 status = csrRoamIssueConnect(pMac, sessionId, pProfile, NULL, eCsrHddIssued,
5781 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5782 if(!HAL_STATUS_SUCCESS(status))
5783 {
5784 fCallCallback = eANI_BOOLEAN_TRUE;
5785 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005786 break;
5787 }
5788 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
Mohit Khanna23863762012-09-11 17:40:09 -07005789 smsLog(pMac, LOG1, "************ csrScanGetResult Status ********* %d\n", status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005790 if(HAL_STATUS_SUCCESS(status))
5791 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005792 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5793 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5794 if(!HAL_STATUS_SUCCESS(status))
5795 {
5796 csrScanResultPurge(pMac, hBSSList);
5797 fCallCallback = eANI_BOOLEAN_TRUE;
5798 }
5799 }//Have scan result
5800 else if(NULL != pProfile)
5801 {
5802 //Check whether it is for start ibss
5803 if(CSR_IS_START_IBSS(pProfile))
5804 {
5805 status = csrRoamIssueConnect(pMac, sessionId, pProfile, NULL, eCsrHddIssued,
5806 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5807 if(!HAL_STATUS_SUCCESS(status))
5808 {
5809 smsLog(pMac, LOGE, " CSR failed to issue startIBSS command with status = 0x%08X\n", status);
5810 fCallCallback = eANI_BOOLEAN_TRUE;
5811 }
5812 }
5813 else
5814 {
5815 //scan for this SSID
5816 status = csrScanForSSID(pMac, sessionId, pProfile, roamId);
5817 if(!HAL_STATUS_SUCCESS(status))
5818 {
5819 fCallCallback = eANI_BOOLEAN_TRUE;
5820 }
5821 }
5822 }
5823 else
5824 {
5825 fCallCallback = eANI_BOOLEAN_TRUE;
5826 }
5827 } while (0);
5828 if(NULL != pProfile)
5829 {
5830 //we need to free memory for filter if profile exists
5831 csrFreeScanFilter(pMac, pScanFilter);
5832 }
5833 }//Got the scan filter from profile
5834
5835 palFreeMemory(pMac->hHdd, pScanFilter);
5836 }//allocated memory for pScanFilter
5837 }//No Bsslist coming in
5838 //tell the caller if we fail to trigger a join request
5839 if( fCallCallback )
5840 {
5841 csrRoamCallCallback(pMac, sessionId, NULL, roamId, eCSR_ROAM_FAILED, eCSR_ROAM_RESULT_FAILURE);
5842 }
5843
5844 return (status);
5845}
Jeff Johnson295189b2012-06-20 16:38:30 -07005846eHalStatus csrRoamReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5847 tCsrRoamModifyProfileFields modProfileFields,
5848 tANI_U32 *pRoamId)
5849{
5850 eHalStatus status = eHAL_STATUS_SUCCESS;
5851 tANI_BOOLEAN fCallCallback = eANI_BOOLEAN_TRUE;
5852 tANI_U32 roamId = 0;
5853 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07005854 if (NULL == pProfile)
5855 {
5856 smsLog(pMac, LOGP, FL("No profile specified"));
5857 return eHAL_STATUS_FAILURE;
5858 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005859 smsLog(pMac, LOG1, FL("called BSSType = %d authtype = %d encryType = %d\n"), pProfile->BSSType, pProfile->AuthType.authType[0], pProfile->EncryptionType.encryptionType[0]);
5860 csrRoamCancelRoaming(pMac, sessionId);
5861 csrScanRemoveFreshScanCommand(pMac, sessionId);
5862 csrScanCancelIdleScan(pMac);
5863 csrScanAbortMacScanNotForConnect(pMac);
5864 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssuedReassocToSameAP);
Jeff Johnson295189b2012-06-20 16:38:30 -07005865 if(csrIsConnStateConnected(pMac, sessionId))
5866 {
5867 if(pProfile)
5868 {
5869 if(pProfile->SSIDs.numOfSSIDs &&
5870 csrIsSsidInList(pMac, &pSession->connectedProfile.SSID, &pProfile->SSIDs))
5871 {
5872 fCallCallback = eANI_BOOLEAN_FALSE;
5873 }
5874 else
5875 {
5876 smsLog(pMac, LOG1, FL("Not connected to the same SSID asked in the profile\n"));
5877 }
5878 }
5879 else if(!palEqualMemory(pMac->hHdd, &modProfileFields,
5880 &pSession->connectedProfile.modifyProfileFields,
5881 sizeof(tCsrRoamModifyProfileFields)))
5882 {
5883 fCallCallback = eANI_BOOLEAN_FALSE;
5884 }
5885 else
5886 {
5887 smsLog(pMac, LOG1, FL("Either the profile is NULL or none of the fields "
5888 "in tCsrRoamModifyProfileFields got modified\n"));
5889 }
5890 }
5891 else
5892 {
5893 smsLog(pMac, LOG1, FL("Not connected! No need to reassoc\n"));
5894 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005895 if(!fCallCallback)
5896 {
5897 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5898 if(pRoamId)
5899 {
5900 *pRoamId = roamId;
5901 }
5902
Jeff Johnson295189b2012-06-20 16:38:30 -07005903 status = csrRoamIssueReassoc(pMac, sessionId, pProfile, &modProfileFields,
5904 eCsrHddIssuedReassocToSameAP, roamId, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07005905 }
5906 else
5907 {
5908 status = csrRoamCallCallback(pMac, sessionId, NULL, roamId,
5909 eCSR_ROAM_FAILED, eCSR_ROAM_RESULT_FAILURE);
5910 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005911 return status;
5912}
Jeff Johnson295189b2012-06-20 16:38:30 -07005913eHalStatus csrRoamJoinLastProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
5914{
5915 eHalStatus status = eHAL_STATUS_FAILURE;
5916 tScanResultHandle hBSSList = NULL;
5917 tCsrScanResultFilter *pScanFilter = NULL;
5918 tANI_U32 roamId;
5919 tCsrRoamProfile *pProfile = NULL;
5920 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07005921
5922 if(!pSession)
5923 {
5924 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
5925 return eHAL_STATUS_FAILURE;
5926 }
5927
Jeff Johnson295189b2012-06-20 16:38:30 -07005928 do
5929 {
5930 if(pSession->pCurRoamProfile)
5931 {
5932 csrScanCancelIdleScan(pMac);
5933 csrScanAbortMacScanNotForConnect(pMac);
5934 //We have to make a copy of pCurRoamProfile because it will be free inside csrRoamIssueConnect
5935 status = palAllocateMemory(pMac->hHdd, (void **)&pProfile, sizeof(tCsrRoamProfile));
5936 if(!HAL_STATUS_SUCCESS(status))
5937 break;
5938 palZeroMemory(pMac->hHdd, pProfile, sizeof(tCsrRoamProfile));
5939 status = csrRoamCopyProfile(pMac, pProfile, pSession->pCurRoamProfile);
5940 if(!HAL_STATUS_SUCCESS(status))
5941 break;
5942 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
5943 if(!HAL_STATUS_SUCCESS(status))
5944 {
5945 break;
5946 }
5947 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
5948 status = csrRoamPrepareFilterFromProfile(pMac, pProfile, pScanFilter);
5949 if(!HAL_STATUS_SUCCESS(status))
5950 {
5951 break;
5952 }
5953 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5954 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
5955 if(HAL_STATUS_SUCCESS(status))
5956 {
5957 //we want to put the last connected BSS to the very beginning, if possible
5958 csrMoveBssToHeadFromBSSID(pMac, &pSession->connectedProfile.bssid, hBSSList);
5959 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5960 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5961 if(!HAL_STATUS_SUCCESS(status))
5962 {
5963 csrScanResultPurge(pMac, hBSSList);
5964 break;
5965 }
5966 }
5967 else
5968 {
5969 //Do a scan on this profile
5970 //scan for this SSID only in case the AP suppresses SSID
5971 status = csrScanForSSID(pMac, sessionId, pProfile, roamId);
5972 if(!HAL_STATUS_SUCCESS(status))
5973 {
5974 break;
5975 }
5976 }
5977 }//We have a profile
5978 else
5979 {
5980 smsLog(pMac, LOGW, FL("cannot find a roaming profile\n"));
5981 break;
5982 }
5983 }while(0);
5984 if(pScanFilter)
5985 {
5986 csrFreeScanFilter(pMac, pScanFilter);
5987 palFreeMemory(pMac->hHdd, pScanFilter);
5988 }
5989 if(NULL != pProfile)
5990 {
5991 csrReleaseProfile(pMac, pProfile);
5992 palFreeMemory(pMac->hHdd, pProfile);
5993 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005994 return (status);
5995}
Jeff Johnson295189b2012-06-20 16:38:30 -07005996eHalStatus csrRoamReconnect(tpAniSirGlobal pMac, tANI_U32 sessionId)
5997{
5998 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005999 if(csrIsConnStateConnected(pMac, sessionId))
6000 {
6001 status = csrRoamIssueDisassociateCmd(pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED);
6002 if(HAL_STATUS_SUCCESS(status))
6003 {
6004 status = csrRoamJoinLastProfile(pMac, sessionId);
6005 }
6006 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006007 return (status);
6008}
6009
Jeff Johnson295189b2012-06-20 16:38:30 -07006010eHalStatus csrRoamConnectToLastProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
6011{
6012 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006013 smsLog(pMac, LOGW, FL("is called\n"));
6014 csrRoamCancelRoaming(pMac, sessionId);
6015 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssued);
6016 if(csrIsConnStateDisconnected(pMac, sessionId))
6017 {
6018 status = csrRoamJoinLastProfile(pMac, sessionId);
6019 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006020 return (status);
6021}
6022
Jeff Johnson295189b2012-06-20 16:38:30 -07006023eHalStatus csrRoamProcessDisassocDeauth( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fDisassoc, tANI_BOOLEAN fMICFailure )
6024{
6025 eHalStatus status = eHAL_STATUS_SUCCESS;
6026 tANI_BOOLEAN fComplete = eANI_BOOLEAN_FALSE;
6027 eCsrRoamSubState NewSubstate;
6028 tANI_U32 sessionId = pCommand->sessionId;
6029
6030 // change state to 'Roaming'...
6031 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
6032
6033 if ( csrIsConnStateIbss( pMac, sessionId ) )
6034 {
6035 // If we are in an IBSS, then stop the IBSS...
6036 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
6037 fComplete = (!HAL_STATUS_SUCCESS(status));
6038 }
6039 else if ( csrIsConnStateInfra( pMac, sessionId ) )
6040 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07006041 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 -07006042 pMac->roam.ucACWeights[2], pMac->roam.ucACWeights[3]);
6043 //Restore AC weight in case we change it
6044 WLANTL_SetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
6045 // in Infrasturcture, we need to disassociate from the Infrastructure network...
6046 NewSubstate = eCSR_ROAM_SUBSTATE_DISASSOC_FORCED;
6047 if(eCsrSmeIssuedDisassocForHandoff == pCommand->u.roamCmd.roamReason)
6048 {
6049 NewSubstate = eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF;
6050 }
6051 if( fDisassoc )
6052 {
6053 status = csrRoamIssueDisassociate( pMac, sessionId, NewSubstate, fMICFailure );
6054 }
6055 else
6056 {
6057 status = csrRoamIssueDeauth( pMac, sessionId, eCSR_ROAM_SUBSTATE_DEAUTH_REQ );
6058 }
6059 fComplete = (!HAL_STATUS_SUCCESS(status));
6060 }
6061 else if ( csrIsConnStateWds( pMac, sessionId ) )
6062 {
6063 if( CSR_IS_WDS_AP( &pMac->roam.roamSession[sessionId].connectedProfile ) )
6064 {
6065 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
6066 fComplete = (!HAL_STATUS_SUCCESS(status));
6067 }
6068 //This has to be WDS station
6069 else if( csrIsConnStateConnectedWds( pMac, sessionId ) ) //This has to be WDS station
6070 {
6071
6072 pCommand->u.roamCmd.fStopWds = eANI_BOOLEAN_TRUE;
6073 if( fDisassoc )
6074 {
6075 status = csrRoamIssueDisassociate( pMac, sessionId,
6076 eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, fMICFailure );
6077 fComplete = (!HAL_STATUS_SUCCESS(status));
6078 }
6079 }
6080 } else {
6081 // we got a dis-assoc request while not connected to any peer
6082 // just complete the command
6083 fComplete = eANI_BOOLEAN_TRUE;
6084 status = eHAL_STATUS_FAILURE;
6085 }
6086 if(fComplete)
6087 {
6088 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6089 }
6090
6091 if(HAL_STATUS_SUCCESS(status))
6092 {
6093 if ( csrIsConnStateInfra( pMac, sessionId ) )
6094 {
6095 //Set the state to disconnect here
6096 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
6097 }
6098 }
6099 return (status);
6100}
6101
Jeff Johnson295189b2012-06-20 16:38:30 -07006102/* This is been removed from latest code base */
6103/*
6104static eHalStatus csrRoamProcessStopBss( tpAniSirGlobal pMac, tSmeCmd *pCommand )
6105{
6106 eHalStatus status;
6107 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07006108 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING );
6109 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
Jeff Johnson295189b2012-06-20 16:38:30 -07006110 return ( status );
6111}
6112*/
6113
Jeff Johnson295189b2012-06-20 16:38:30 -07006114eHalStatus csrRoamIssueDisassociateCmd( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason )
6115{
6116 eHalStatus status = eHAL_STATUS_SUCCESS;
6117 tSmeCmd *pCommand;
6118 tANI_BOOLEAN fHighPriority = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006119 do
6120 {
6121 smsLog( pMac, LOGE, FL(" reason = %d\n"), reason );
6122 pCommand = csrGetCommandBuffer( pMac );
6123 if ( !pCommand )
6124 {
6125 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6126 status = eHAL_STATUS_RESOURCES;
6127 break;
6128 }
6129 //Change the substate in case it is wait-for-key
6130 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
6131 {
6132 csrRoamStopWaitForKeyTimer( pMac );
6133 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
6134 }
6135 pCommand->command = eSmeCommandRoam;
6136 pCommand->sessionId = (tANI_U8)sessionId;
6137 switch ( reason )
6138 {
6139 case eCSR_DISCONNECT_REASON_MIC_ERROR:
6140 pCommand->u.roamCmd.roamReason = eCsrForcedDisassocMICFailure;
6141 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006142 case eCSR_DISCONNECT_REASON_DEAUTH:
6143 pCommand->u.roamCmd.roamReason = eCsrForcedDeauth;
6144 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006145 case eCSR_DISCONNECT_REASON_HANDOFF:
6146 fHighPriority = eANI_BOOLEAN_TRUE;
6147 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedDisassocForHandoff;
6148 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006149 case eCSR_DISCONNECT_REASON_UNSPECIFIED:
6150 case eCSR_DISCONNECT_REASON_DISASSOC:
6151 pCommand->u.roamCmd.roamReason = eCsrForcedDisassoc;
6152 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006153 case eCSR_DISCONNECT_REASON_IBSS_JOIN_FAILURE:
6154 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedIbssJoinFailure;
6155 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006156 case eCSR_DISCONNECT_REASON_IBSS_LEAVE:
6157 pCommand->u.roamCmd.roamReason = eCsrForcedIbssLeave;
6158 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006159 default:
6160 break;
6161 }
6162 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6163 if( !HAL_STATUS_SUCCESS( status ) )
6164 {
6165 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6166 csrReleaseCommandRoam( pMac, pCommand );
6167 }
6168 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07006169 return( status );
6170}
6171
Jeff Johnson295189b2012-06-20 16:38:30 -07006172eHalStatus csrRoamIssueStopBssCmd( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_BOOLEAN fHighPriority )
6173{
6174 eHalStatus status = eHAL_STATUS_SUCCESS;
6175 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07006176 pCommand = csrGetCommandBuffer( pMac );
6177 if ( NULL != pCommand )
6178 {
6179 //Change the substate in case it is wait-for-key
6180 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId) )
6181 {
6182 csrRoamStopWaitForKeyTimer( pMac );
6183 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
6184 }
6185 pCommand->command = eSmeCommandRoam;
6186 pCommand->sessionId = (tANI_U8)sessionId;
6187 pCommand->u.roamCmd.roamReason = eCsrStopBss;
6188 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6189 if( !HAL_STATUS_SUCCESS( status ) )
6190 {
6191 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6192 csrReleaseCommandRoam( pMac, pCommand );
6193 }
6194 }
6195 else
6196 {
6197 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6198 status = eHAL_STATUS_RESOURCES;
6199 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006200 return ( status );
6201}
6202
Jeff Johnson295189b2012-06-20 16:38:30 -07006203eHalStatus csrRoamDisconnectInternal(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason)
6204{
6205 eHalStatus status = eHAL_STATUS_SUCCESS;
6206 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006207
6208 if(!pSession)
6209 {
6210 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6211 return eHAL_STATUS_FAILURE;
6212 }
6213
Jeff Johnson295189b2012-06-20 16:38:30 -07006214#ifdef FEATURE_WLAN_BTAMP_UT_RF
6215 //Stop te retry
6216 pSession->maxRetryCount = 0;
6217 csrRoamStopJoinRetryTimer(pMac, sessionId);
6218#endif
6219 //Not to call cancel roaming here
6220 //Only issue disconnect when necessary
6221 if(csrIsConnStateConnected(pMac, sessionId) || csrIsBssTypeIBSS(pSession->connectedProfile.BSSType)
6222 || csrIsBssTypeWDS(pSession->connectedProfile.BSSType)
6223 || csrIsRoamCommandWaitingForSession(pMac, sessionId) )
6224
6225 {
6226 smsLog(pMac, LOG2, FL("called\n"));
6227 status = csrRoamIssueDisassociateCmd(pMac, sessionId, reason);
6228 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006229 return (status);
6230}
6231
Jeff Johnson295189b2012-06-20 16:38:30 -07006232eHalStatus csrRoamDisconnect(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason)
6233{
6234 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006235
6236 if(!pSession)
6237 {
6238 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6239 return eHAL_STATUS_FAILURE;
6240 }
6241
Jeff Johnson295189b2012-06-20 16:38:30 -07006242 csrRoamCancelRoaming(pMac, sessionId);
6243 pSession->ibss_join_pending = FALSE;
6244 csrRoamStopIbssJoinTimer(pMac, sessionId);
6245 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrForcedDisassoc);
6246
6247 return (csrRoamDisconnectInternal(pMac, sessionId, reason));
6248}
6249
Jeff Johnson295189b2012-06-20 16:38:30 -07006250eHalStatus csrRoamSaveConnectedInfomation(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
6251 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes)
6252{
6253 eHalStatus status = eHAL_STATUS_SUCCESS;
6254 tDot11fBeaconIEs *pIesTemp = pIes;
6255 tANI_U8 index;
6256 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
6257 tCsrRoamConnectedProfile *pConnectProfile = &pSession->connectedProfile;
Jeff Johnson32d95a32012-09-10 13:15:23 -07006258
6259 if(!pSession)
6260 {
6261 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6262 return eHAL_STATUS_FAILURE;
6263 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006264
6265 palZeroMemory(pMac->hHdd, &pSession->connectedProfile, sizeof(tCsrRoamConnectedProfile));
6266 pConnectProfile->AuthType = pProfile->negotiatedAuthType;
6267 pConnectProfile->AuthInfo = pProfile->AuthType;
6268 pConnectProfile->CBMode = pProfile->CBMode; //*** this may not be valid
6269 pConnectProfile->EncryptionType = pProfile->negotiatedUCEncryptionType;
6270 pConnectProfile->EncryptionInfo = pProfile->EncryptionType;
6271 pConnectProfile->mcEncryptionType = pProfile->negotiatedMCEncryptionType;
6272 pConnectProfile->mcEncryptionInfo = pProfile->mcEncryptionType;
6273 pConnectProfile->BSSType = pProfile->BSSType;
6274 pConnectProfile->modifyProfileFields.uapsd_mask = pProfile->uapsd_mask;
6275 pConnectProfile->operationChannel = pSirBssDesc->channelId;
Jeff Johnsone7245742012-09-05 17:12:55 -07006276 pConnectProfile->beaconInterval = pSirBssDesc->beaconInterval;
6277
Jeff Johnson295189b2012-06-20 16:38:30 -07006278 palCopyMemory(pMac->hHdd, &pConnectProfile->Keys, &pProfile->Keys, sizeof(tCsrKeys));
Madan Mohan Koyyalamudiea22cdc2012-10-18 21:02:23 -07006279 /* saving the addional IE`s like Hot spot indication element and extended capabilities */
6280 if(pProfile->nAddIEAssocLength)
6281 {
6282 status = palAllocateMemory(pMac->hHdd,
6283 (void **)&pConnectProfile->pAddIEAssoc, pProfile->nAddIEAssocLength);
6284 if(!HAL_STATUS_SUCCESS(status))
6285 {
6286 smsLog(pMac, LOGE, FL("Failed to allocate memory for additional IEs")) ;
6287 return eHAL_STATUS_FAILURE;
6288 }
6289 pConnectProfile->nAddIEAssocLength = pProfile->nAddIEAssocLength;
6290 palCopyMemory(pMac->hHdd, pConnectProfile->pAddIEAssoc, pProfile->pAddIEAssoc,
6291 pProfile->nAddIEAssocLength);
6292 }
6293
Jeff Johnson295189b2012-06-20 16:38:30 -07006294 //Save bssid
6295 csrGetBssIdBssDesc(pMac, pSirBssDesc, &pConnectProfile->bssid);
6296#ifdef WLAN_FEATURE_VOWIFI_11R
6297 if (pSirBssDesc->mdiePresent)
6298 {
6299 pConnectProfile->MDID.mdiePresent = 1;
6300 pConnectProfile->MDID.mobilityDomain = (pSirBssDesc->mdie[1] << 8) | (pSirBssDesc->mdie[0]);
6301 }
6302#endif
6303#ifdef FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -07006304 if ((csrIsProfileCCX(pProfile) ||
6305 ((pIesTemp->CCXVersion.present)
6306 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
6307 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
6308 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
6309 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
6310 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
6311 && (!(csrIsProfile11r( pProfile )))
6312 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -07006313 {
6314 pConnectProfile->isCCXAssoc = 1;
6315 }
6316#endif
6317 //save ssid
6318 if( NULL == pIesTemp )
6319 {
6320 status = csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesTemp);
6321 }
6322 if(HAL_STATUS_SUCCESS(status))
6323 {
6324 if(pIesTemp->SSID.present)
6325 {
6326 pConnectProfile->SSID.length = pIesTemp->SSID.num_ssid;
6327 palCopyMemory(pMac->hHdd, pConnectProfile->SSID.ssId,
6328 pIesTemp->SSID.ssid, pIesTemp->SSID.num_ssid);
6329 }
6330
6331 //Save the bss desc
6332 status = csrRoamSaveConnectedBssDesc(pMac, sessionId, pSirBssDesc);
Pratik Bhalgatb5b19b02012-11-22 16:28:19 +05306333
6334 if( CSR_IS_QOS_BSS(pIesTemp) || pIesTemp->HTCaps.present)
Jeff Johnson295189b2012-06-20 16:38:30 -07006335 {
Pratik Bhalgatb5b19b02012-11-22 16:28:19 +05306336 //Some HT AP's dont send WMM IE so in that case we assume all HT Ap's are Qos Enabled AP's
Jeff Johnson295189b2012-06-20 16:38:30 -07006337 pConnectProfile->qap = TRUE;
6338 }
6339 else
6340 {
6341 pConnectProfile->qap = FALSE;
6342 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006343 if ( NULL == pIes )
6344 {
6345 //Free memory if it allocated locally
6346 palFreeMemory(pMac->hHdd, pIesTemp);
6347 }
6348 }
6349 //Save Qos connection
6350 pConnectProfile->qosConnection = pMac->roam.roamSession[sessionId].fWMMConnection;
6351
6352 if(!HAL_STATUS_SUCCESS(status))
6353 {
6354 csrFreeConnectBssDesc(pMac, sessionId);
6355 }
6356 for(index = 0; index < pProfile->SSIDs.numOfSSIDs; index++)
6357 {
6358 if((pProfile->SSIDs.SSIDList[index].SSID.length == pConnectProfile->SSID.length) &&
6359 palEqualMemory(pMac->hHdd, pProfile->SSIDs.SSIDList[index].SSID.ssId,
6360 pConnectProfile->SSID.ssId, pConnectProfile->SSID.length))
6361 {
6362 pConnectProfile->handoffPermitted = pProfile->SSIDs.SSIDList[index].handoffPermitted;
6363 break;
6364 }
6365 pConnectProfile->handoffPermitted = FALSE;
6366 }
6367
6368 return (status);
6369}
6370
Jeff Johnson295189b2012-06-20 16:38:30 -07006371static void csrRoamJoinRspProcessor( tpAniSirGlobal pMac, tSirSmeJoinRsp *pSmeJoinRsp )
6372{
6373 tListElem *pEntry = NULL;
6374 tSmeCmd *pCommand = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006375 //The head of the active list is the request we sent
6376 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6377 if(pEntry)
6378 {
6379 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6380 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006381 if ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode )
6382 {
6383 if(pCommand && eCsrSmeIssuedAssocToSimilarAP == pCommand->u.roamCmd.roamReason)
6384 {
6385#ifndef WLAN_MDM_CODE_REDUCTION_OPT
6386 sme_QosCsrEventInd(pMac, pSmeJoinRsp->sessionId, SME_QOS_CSR_HANDOFF_COMPLETE, NULL);
6387#endif
6388 }
6389 csrRoamComplete( pMac, eCsrJoinSuccess, (void *)pSmeJoinRsp );
6390 }
6391 else
6392 {
6393 tANI_U32 roamId = 0;
6394 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pSmeJoinRsp->sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006395 if(!pSession)
6396 {
6397 smsLog(pMac, LOGE, FL(" session %d not found "), pSmeJoinRsp->sessionId);
6398 return;
6399 }
6400
Jeff Johnson295189b2012-06-20 16:38:30 -07006401
6402 //The head of the active list is the request we sent
6403 //Try to get back the same profile and roam again
6404 if(pCommand)
6405 {
6406 roamId = pCommand->u.roamCmd.roamId;
6407 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006408 pSession->joinFailStatusCode.statusCode = pSmeJoinRsp->statusCode;
6409 pSession->joinFailStatusCode.reasonCode = pSmeJoinRsp->protStatusCode;
6410 smsLog( pMac, LOGW, "SmeJoinReq failed with statusCode= 0x%08lX [%d]\n", pSmeJoinRsp->statusCode, pSmeJoinRsp->statusCode );
6411#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
6412 /* If Join fails while Handoff is in progress, indicate disassociated event to supplicant to reconnect */
6413 if (csrRoamIsHandoffInProgress(pMac))
6414 {
6415 csrRoamCallCallback(pMac, pSmeJoinRsp->sessionId, NULL, roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
6416 /* Should indicate neighbor roam algorithm about the connect failure here */
6417 csrNeighborRoamIndicateConnect(pMac, pSmeJoinRsp->sessionId, VOS_STATUS_E_FAILURE);
6418 }
6419#endif
6420 if (pCommand)
6421 {
6422 if(CSR_IS_WDS_STA( &pCommand->u.roamCmd.roamProfile ))
6423 {
6424 pCommand->u.roamCmd.fStopWds = eANI_BOOLEAN_TRUE;
6425 pSession->connectedProfile.BSSType = eCSR_BSS_TYPE_WDS_STA;
6426 csrRoamReissueRoamCommand(pMac);
6427 }
6428 else if( CSR_IS_WDS( &pCommand->u.roamCmd.roamProfile ) )
6429 {
6430 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6431 }
6432 else
6433 {
6434 csrRoam(pMac, pCommand);
6435 }
6436 }
6437 else
6438 {
6439 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6440 }
6441 } /*else: ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode ) */
6442}
6443
Jeff Johnson295189b2012-06-20 16:38:30 -07006444eHalStatus csrRoamIssueJoin( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pSirBssDesc,
6445 tDot11fBeaconIEs *pIes,
6446 tCsrRoamProfile *pProfile, tANI_U32 roamId )
6447{
6448 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -07006449 smsLog( pMac, LOG1, "Attempting to Join Bssid= %02x-%02x-%02x-%02x-%02x-%02x\n",
6450 pSirBssDesc->bssId[ 0 ],pSirBssDesc->bssId[ 1 ],pSirBssDesc->bssId[ 2 ],
6451 pSirBssDesc->bssId[ 3 ],pSirBssDesc->bssId[ 4 ],pSirBssDesc->bssId[ 5 ] );
6452
6453 // Set the roaming substate to 'join attempt'...
6454 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_JOIN_REQ, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07006455 // attempt to Join this BSS...
6456 status = csrSendJoinReqMsg( pMac, sessionId, pSirBssDesc, pProfile, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07006457 return (status);
6458}
6459
Jeff Johnson295189b2012-06-20 16:38:30 -07006460static eHalStatus csrRoamIssueReassociate( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pSirBssDesc,
6461 tDot11fBeaconIEs *pIes, tCsrRoamProfile *pProfile)
6462{
6463 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07006464 // Set the roaming substate to 'join attempt'...
6465 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_REASSOC_REQ, sessionId );
6466
6467 smsLog(pMac, LOGE, FL(" calling csrSendSmeReassocReqMsg\n"));
6468
6469 // attempt to Join this BSS...
6470 return csrSendSmeReassocReqMsg( pMac, sessionId, pSirBssDesc, pIes, pProfile );
6471}
6472
Jeff Johnson295189b2012-06-20 16:38:30 -07006473void csrRoamReissueRoamCommand(tpAniSirGlobal pMac)
6474{
6475 tListElem *pEntry;
6476 tSmeCmd *pCommand;
6477 tCsrRoamInfo roamInfo;
6478 tANI_U32 sessionId;
6479 tCsrRoamSession *pSession;
6480
6481 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6482 if(pEntry)
6483 {
6484 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6485 if ( eSmeCommandRoam == pCommand->command )
6486 {
6487 sessionId = pCommand->sessionId;
6488 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006489
6490 if(!pSession)
6491 {
6492 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6493 return;
6494 }
6495
Jeff Johnson295189b2012-06-20 16:38:30 -07006496 if( pCommand->u.roamCmd.fStopWds )
6497 {
6498 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
6499 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
6500 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
6501 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
6502#ifdef WLAN_SOFTAP_FEATURE
6503 if (CSR_IS_WDS(&pSession->connectedProfile)){
6504#endif
6505 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED;
6506 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
6507 eCSR_ROAM_WDS_IND,
6508 eCSR_ROAM_RESULT_WDS_DISASSOCIATED);
6509#ifdef WLAN_SOFTAP_FEATURE
6510 }else if (CSR_IS_INFRA_AP(&pSession->connectedProfile)){
6511 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED;
6512 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
6513 eCSR_ROAM_INFRA_IND,
6514 eCSR_ROAM_RESULT_INFRA_DISASSOCIATED);
6515 }
6516
6517#endif
6518
Jeff Johnson295189b2012-06-20 16:38:30 -07006519 if( !HAL_STATUS_SUCCESS( csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ ) ) )
6520 {
6521 smsLog(pMac, LOGE, " Failed to reissue stop_bss command for WDS after disassociated\n");
6522 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6523 }
6524 }
6525 else if(eCsrStopRoaming == csrRoamJoinNextBss(pMac, pCommand, eANI_BOOLEAN_TRUE))
6526 {
6527 smsLog(pMac, LOGW, " Failed to reissue join command after disassociated\n");
6528 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6529 }
6530 }
6531 else
6532 {
6533 smsLog(pMac, LOGW, " Command is not roaming after disassociated\n");
6534 }
6535 }
6536 else
6537 {
6538 smsLog(pMac, LOGE, " Disassoc rsp cannot continue because no command is available\n");
6539 }
6540}
6541
Jeff Johnson295189b2012-06-20 16:38:30 -07006542tANI_BOOLEAN csrIsRoamCommandWaitingForSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
6543{
6544 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6545 tListElem *pEntry;
6546 tSmeCmd *pCommand = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006547 //alwasy lock active list before locking pending list
6548 csrLLLock( &pMac->sme.smeCmdActiveList );
6549 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6550 if(pEntry)
6551 {
6552 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6553 if( ( eSmeCommandRoam == pCommand->command ) && ( sessionId == pCommand->sessionId ) )
6554 {
6555 fRet = eANI_BOOLEAN_TRUE;
6556 }
6557 }
6558 if(eANI_BOOLEAN_FALSE == fRet)
6559 {
6560 csrLLLock(&pMac->sme.smeCmdPendingList);
6561 pEntry = csrLLPeekHead(&pMac->sme.smeCmdPendingList, LL_ACCESS_NOLOCK);
6562 while(pEntry)
6563 {
6564 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6565 if( ( eSmeCommandRoam == pCommand->command ) && ( sessionId == pCommand->sessionId ) )
6566 {
6567 fRet = eANI_BOOLEAN_TRUE;
6568 break;
6569 }
6570 pEntry = csrLLNext(&pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK);
6571 }
6572 csrLLUnlock(&pMac->sme.smeCmdPendingList);
6573 }
6574 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006575 return (fRet);
6576}
6577
Jeff Johnson295189b2012-06-20 16:38:30 -07006578tANI_BOOLEAN csrIsRoamCommandWaiting(tpAniSirGlobal pMac)
6579{
6580 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6581 tANI_U32 i;
Jeff Johnson295189b2012-06-20 16:38:30 -07006582 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
6583 {
6584 if( CSR_IS_SESSION_VALID( pMac, i ) && ( fRet = csrIsRoamCommandWaitingForSession( pMac, i ) ) )
6585 {
6586 break;
6587 }
6588 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006589 return ( fRet );
6590}
6591
Jeff Johnson295189b2012-06-20 16:38:30 -07006592tANI_BOOLEAN csrIsCommandWaiting(tpAniSirGlobal pMac)
6593{
6594 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006595 //alwasy lock active list before locking pending list
6596 csrLLLock( &pMac->sme.smeCmdActiveList );
6597 fRet = csrLLIsListEmpty(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6598 if(eANI_BOOLEAN_FALSE == fRet)
6599 {
6600 fRet = csrLLIsListEmpty(&pMac->sme.smeCmdPendingList, LL_ACCESS_LOCK);
6601 }
6602 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006603 return (fRet);
6604}
6605
Jeff Johnson295189b2012-06-20 16:38:30 -07006606tANI_BOOLEAN csrIsScanForRoamCommandActive( tpAniSirGlobal pMac )
6607{
6608 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6609 tListElem *pEntry;
6610 tCsrCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07006611 //alwasy lock active list before locking pending list
6612 csrLLLock( &pMac->sme.smeCmdActiveList );
6613 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6614 if( pEntry )
6615 {
6616 pCommand = GET_BASE_ADDR(pEntry, tCsrCmd, Link);
6617 if( ( eCsrRoamCommandScan == pCommand->command ) &&
6618 ( ( eCsrScanForSsid == pCommand->u.scanCmd.reason ) ||
6619 ( eCsrScanForCapsChange == pCommand->u.scanCmd.reason ) ||
6620 ( eCsrScanP2PFindPeer == pCommand->u.scanCmd.reason ) ) )
6621 {
6622 fRet = eANI_BOOLEAN_TRUE;
6623 }
6624 }
6625 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006626 return (fRet);
6627}
Jeff Johnson295189b2012-06-20 16:38:30 -07006628eHalStatus csrRoamIssueReassociateCmd( tpAniSirGlobal pMac, tANI_U32 sessionId )
6629{
6630 eHalStatus status = eHAL_STATUS_SUCCESS;
6631 tSmeCmd *pCommand = NULL;
6632 tANI_BOOLEAN fHighPriority = eANI_BOOLEAN_TRUE;
6633 tANI_BOOLEAN fRemoveCmd = FALSE;
6634 tListElem *pEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -07006635 // Delete the old assoc command. All is setup for reassoc to be serialized
6636 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
6637 if ( pEntry )
6638 {
6639 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
6640 if ( !pCommand )
6641 {
6642 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6643 return eHAL_STATUS_RESOURCES;
6644 }
6645 if ( eSmeCommandRoam == pCommand->command )
6646 {
6647 if (pCommand->u.roamCmd.roamReason == eCsrSmeIssuedAssocToSimilarAP)
6648 {
6649 fRemoveCmd = csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK );
6650 }
6651 else
6652 {
6653 smsLog( pMac, LOGE, FL(" Unexpected active roam command present \n") );
6654 }
6655 if (fRemoveCmd == FALSE)
6656 {
6657 // Implies we did not get the serialized assoc command we
6658 // were expecting
6659 pCommand = NULL;
6660 }
6661 }
6662 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006663 if(NULL == pCommand)
6664 {
6665 smsLog( pMac, LOGE, FL(" fail to get command buffer as expected based on previous connect roam command\n") );
6666 return eHAL_STATUS_RESOURCES;
6667 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006668 do
6669 {
6670 //Change the substate in case it is wait-for-key
6671 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
6672 {
6673 csrRoamStopWaitForKeyTimer( pMac );
6674 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
6675 }
6676 pCommand->command = eSmeCommandRoam;
6677 pCommand->sessionId = (tANI_U8)sessionId;
6678 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedFTReassoc;
Jeff Johnson295189b2012-06-20 16:38:30 -07006679 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6680 if( !HAL_STATUS_SUCCESS( status ) )
6681 {
6682 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6683 csrReleaseCommandRoam( pMac, pCommand );
6684 }
6685 } while( 0 );
6686
Jeff Johnson295189b2012-06-20 16:38:30 -07006687 return( status );
6688}
6689static void csrRoamingStateConfigCnfProcessor( tpAniSirGlobal pMac, tANI_U32 result )
6690{
6691 tListElem *pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6692 tCsrScanResult *pScanResult = NULL;
6693 tSirBssDescription *pBssDesc = NULL;
6694 tSmeCmd *pCommand = NULL;
6695 tANI_U32 sessionId;
6696 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07006697 if(NULL == pEntry)
6698 {
6699 smsLog(pMac, LOGW, " CFG_CNF with active list empty\n");
6700 return;
6701 }
6702 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6703 sessionId = pCommand->sessionId;
6704 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006705
6706 if(!pSession)
6707 {
6708 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6709 return;
6710 }
6711
Jeff Johnson295189b2012-06-20 16:38:30 -07006712 if(CSR_IS_ROAMING(pSession) && pSession->fCancelRoaming)
6713 {
6714 //the roaming is cancelled. Simply complete the command
6715 smsLog(pMac, LOGW, FL(" Roam command cancelled\n"));
6716 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
6717 }
6718 else
6719 {
6720 if ( CCM_IS_RESULT_SUCCESS(result) )
6721 {
6722 smsLog(pMac, LOG2, "Cfg sequence complete\n");
6723 // Successfully set the configuration parameters for the new Bss. Attempt to
6724 // join the roaming Bss.
6725 if(pCommand->u.roamCmd.pRoamBssEntry)
6726 {
6727 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
6728 pBssDesc = &pScanResult->Result.BssDescriptor;
6729 }
6730 if ( csrIsBssTypeIBSS( pCommand->u.roamCmd.roamProfile.BSSType ) ||
6731 CSR_IS_WDS( &pCommand->u.roamCmd.roamProfile )
6732#ifdef WLAN_SOFTAP_FEATURE
6733 || CSR_IS_INFRA_AP(&pCommand->u.roamCmd.roamProfile)
6734#endif
6735 )
6736 {
6737 if(!HAL_STATUS_SUCCESS(csrRoamIssueStartBss( pMac, sessionId,
6738 &pSession->bssParams, &pCommand->u.roamCmd.roamProfile,
6739 pBssDesc, pCommand->u.roamCmd.roamId )))
6740 {
6741 smsLog(pMac, LOGW, " CSR start BSS failed\n");
6742 //We need to complete the command
6743 csrRoamComplete(pMac, eCsrStartBssFailure, NULL);
6744 }
6745 }
6746 else
6747 {
6748 if (!pCommand->u.roamCmd.pRoamBssEntry)
6749 {
6750 smsLog(pMac, LOGW, " pRoamBssEntry is NULL\n");
6751 //We need to complete the command
6752 csrRoamComplete(pMac, eCsrJoinFailure, NULL);
6753 return;
6754 }
6755 // If we are roaming TO an Infrastructure BSS...
6756 VOS_ASSERT(pScanResult != NULL);
6757 if ( csrIsInfraBssDesc( pBssDesc ) )
6758 {
6759 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
Jeff Johnson295189b2012-06-20 16:38:30 -07006760 if(pIesLocal || (HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal))) )
6761 {
6762 // ..and currently in an Infrastructure connection....
6763 if( csrIsConnStateConnectedInfra( pMac, sessionId ) )
6764 {
6765 // ...and the SSIDs are equal, then we Reassoc.
6766 if ( csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc,
6767 pIesLocal ) )
6768 // ..and currently in an infrastructure connection
6769 {
6770 // then issue a Reassoc.
6771 pCommand->u.roamCmd.fReassoc = eANI_BOOLEAN_TRUE;
6772 csrRoamIssueReassociate( pMac, sessionId, pBssDesc, pIesLocal,
6773 &pCommand->u.roamCmd.roamProfile );
6774 }
6775 else
6776 {
6777
6778 // otherwise, we have to issue a new Join request to LIM because we disassociated from the
6779 // previously associated AP.
6780 if(!HAL_STATUS_SUCCESS(csrRoamIssueJoin( pMac, sessionId, pBssDesc,
6781 pIesLocal,
6782 &pCommand->u.roamCmd.roamProfile, pCommand->u.roamCmd.roamId )))
6783 {
6784 //try something else
6785 csrRoam( pMac, pCommand );
6786 }
6787 }
6788 }
6789 else
6790 {
6791 eHalStatus status = eHAL_STATUS_SUCCESS;
6792
6793 /* We need to come with other way to figure out that this is because of HO in BMP
6794 The below API will be only available for Android as it uses a different HO algorithm */
6795 /* Reassoc request will be used only for CCX and 11r handoff whereas other legacy roaming should
6796 * use join request */
6797#ifdef WLAN_FEATURE_VOWIFI_11R
6798 if (csrRoamIsHandoffInProgress(pMac) &&
6799 csrRoamIs11rAssoc(pMac))
6800 {
6801 status = csrRoamIssueReassociate(pMac, sessionId, pBssDesc,
6802 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ), &pCommand->u.roamCmd.roamProfile);
6803 }
6804 else
6805#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006806#ifdef FEATURE_WLAN_CCX
6807 if (csrRoamIsHandoffInProgress(pMac) &&
6808 csrRoamIsCCXAssoc(pMac))
6809 {
6810 // Now serialize the reassoc command.
6811 status = csrRoamIssueReassociateCmd(pMac, sessionId);
6812 }
6813 else
6814#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07006815#ifdef FEATURE_WLAN_LFR
6816 if (csrRoamIsHandoffInProgress(pMac) &&
6817 csrRoamIsFastRoamEnabled(pMac))
6818 {
6819 // Now serialize the reassoc command.
6820 status = csrRoamIssueReassociateCmd(pMac, sessionId);
6821 }
6822 else
6823#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006824 // else we are not connected and attempting to Join. Issue the
6825 // Join request.
6826 {
6827 status = csrRoamIssueJoin( pMac, sessionId, pBssDesc,
6828 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ),
6829 &pCommand->u.roamCmd.roamProfile, pCommand->u.roamCmd.roamId );
6830 }
6831 if(!HAL_STATUS_SUCCESS(status))
6832 {
6833 //try something else
6834 csrRoam( pMac, pCommand );
6835 }
6836 }
6837 if( !pScanResult->Result.pvIes )
6838 {
6839 //Locally allocated
6840 palFreeMemory(pMac->hHdd, pIesLocal);
6841 }
6842 }
6843 }//if ( csrIsInfraBssDesc( pBssDesc ) )
6844 else
6845 {
6846 smsLog(pMac, LOGW, FL(" found BSSType mismatching the one in BSS description\n"));
6847 }
6848 }//else
6849 }//if ( WNI_CFG_SUCCESS == result )
6850 else
6851 {
6852 // In the event the configuration failed, for infra let the roam processor
6853 //attempt to join something else...
6854 if( pCommand->u.roamCmd.pRoamBssEntry && CSR_IS_INFRASTRUCTURE( &pCommand->u.roamCmd.roamProfile ) )
6855 {
6856 csrRoam(pMac, pCommand);
6857 }
6858 else
6859 {
6860 //We need to complete the command
6861 if ( csrIsBssTypeIBSS( pCommand->u.roamCmd.roamProfile.BSSType ) )
6862 {
6863 csrRoamComplete(pMac, eCsrStartBssFailure, NULL);
6864 }
6865 else
6866 {
6867 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6868 }
6869 }
6870 }
6871 }//we have active entry
6872}
6873
Jeff Johnson295189b2012-06-20 16:38:30 -07006874static void csrRoamRoamingStateAuthRspProcessor( tpAniSirGlobal pMac, tSirSmeAuthRsp *pSmeAuthRsp )
6875{
6876 //No one is sending eWNI_SME_AUTH_REQ to PE.
6877 smsLog(pMac, LOGW, FL("is no-op\n"));
6878 if ( eSIR_SME_SUCCESS == pSmeAuthRsp->statusCode )
6879 {
6880 smsLog( pMac, LOGW, "CSR SmeAuthReq Successful\n" );
6881 // Successfully authenticated with a new Bss. Attempt to stop the current Bss and
6882 // join the new one...
6883 /***pBssDesc = profGetRoamingBssDesc( pAdapter, &pHddProfile );
Jeff Johnson295189b2012-06-20 16:38:30 -07006884 roamStopNetwork( pAdapter, &pBssDesc->SirBssDescription );***/
6885 }
6886 else {
6887 smsLog( pMac, LOGW, "CSR SmeAuthReq failed with statusCode= 0x%08lX [%d]\n", pSmeAuthRsp->statusCode, pSmeAuthRsp->statusCode );
6888 /***profHandleLostLinkAfterReset(pAdapter);
6889 // In the event the authenticate fails, let the roam processor attempt to join something else...
6890 roamRoam( pAdapter );***/
6891 }
6892}
6893
Jeff Johnson295189b2012-06-20 16:38:30 -07006894static void csrRoamRoamingStateReassocRspProcessor( tpAniSirGlobal pMac, tpSirSmeJoinRsp pSmeJoinRsp )
6895{
6896 eCsrRoamCompleteResult result;
6897 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
6898 tCsrRoamInfo roamInfo;
6899 tANI_U32 roamId = 0;
6900
6901 if ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode )
6902 {
6903 smsLog( pMac, LOGW, "CSR SmeReassocReq Successful\n" );
6904 result = eCsrReassocSuccess;
Jeff Johnson295189b2012-06-20 16:38:30 -07006905 /* Defeaturize this part later if needed */
6906#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
6907 /* Since the neighbor roam algorithm uses reassoc req for handoff instead of join,
6908 * we need the response contents while processing the result in csrRoamProcessResults() */
6909 if (csrRoamIsHandoffInProgress(pMac))
6910 {
6911 /* Need to dig more on indicating events to SME QoS module */
6912 sme_QosCsrEventInd(pMac, pSmeJoinRsp->sessionId, SME_QOS_CSR_HANDOFF_COMPLETE, NULL);
6913 csrRoamComplete( pMac, result, pSmeJoinRsp);
6914 }
6915 else
6916#endif
6917 {
6918 csrRoamComplete( pMac, result, NULL );
6919 }
6920 }
6921 /* Should we handle this similar to handling the join failure? Is it ok
6922 * to call csrRoamComplete() with state as CsrJoinFailure */
6923 else
6924 {
6925 smsLog( pMac, LOGW, "CSR SmeReassocReq failed with statusCode= 0x%08lX [%d]\n", pSmeJoinRsp->statusCode, pSmeJoinRsp->statusCode );
6926 result = eCsrReassocFailure;
6927#ifdef WLAN_FEATURE_VOWIFI_11R
6928 if ((eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE == pSmeJoinRsp->statusCode) ||
6929 (eSIR_SME_FT_REASSOC_FAILURE == pSmeJoinRsp->statusCode))
6930 {
6931 // Inform HDD to turn off FT flag in HDD
6932 if (pNeighborRoamInfo)
6933 {
6934 vos_mem_zero(&roamInfo, sizeof(tCsrRoamInfo));
6935 csrRoamCallCallback(pMac, pNeighborRoamInfo->csrSessionId,
6936 &roamInfo, roamId, eCSR_ROAM_FT_REASSOC_FAILED, eSIR_SME_SUCCESS);
Madan Mohan Koyyalamudi57772162012-10-18 19:46:14 -07006937 /*
6938 * Since the above callback sends a disconnect
6939 * to HDD, we should clean-up our state
6940 * machine as well to be in sync with the upper
6941 * layers. There is no need to send a disassoc
6942 * since: 1) we will never reassoc to the current
6943 * AP in LFR, and 2) there is no need to issue a
6944 * disassoc to the AP with which we were trying
6945 * to reassoc.
6946 */
6947 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
6948 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07006949 }
6950 }
6951#endif
6952 // In the event that the Reassociation fails, then we need to Disassociate the current association and keep
6953 // roaming. Note that we will attempt to Join the AP instead of a Reassoc since we may have attempted a
6954 // 'Reassoc to self', which AP's that don't support Reassoc will force a Disassoc.
6955 //The disassoc rsp message will remove the command from active list
6956 if(!HAL_STATUS_SUCCESS(csrRoamIssueDisassociate( pMac, pSmeJoinRsp->sessionId,
6957 eCSR_ROAM_SUBSTATE_DISASSOC_REASSOC_FAILURE, FALSE )))
6958 {
6959 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
6960 }
6961 }
6962}
6963
Jeff Johnson295189b2012-06-20 16:38:30 -07006964static void csrRoamRoamingStateStopBssRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSmeRsp)
6965{
Jeff Johnson295189b2012-06-20 16:38:30 -07006966#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
6967 {
6968 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07006969 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
6970 if(pIbssLog)
6971 {
6972 pIbssLog->eventId = WLAN_IBSS_EVENT_STOP_RSP;
6973 if(eSIR_SME_SUCCESS != pSmeRsp->statusCode)
6974 {
6975 pIbssLog->status = WLAN_IBSS_STATUS_FAILURE;
6976 }
6977 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
6978 }
6979 }
6980#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07006981 pMac->roam.roamSession[pSmeRsp->sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
6982 if(CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ( pMac, pSmeRsp->sessionId))
6983 {
6984 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6985 }
6986 else if(CSR_IS_ROAM_SUBSTATE_DISCONNECT_CONTINUE( pMac, pSmeRsp->sessionId))
6987 {
6988 csrRoamReissueRoamCommand(pMac);
6989 }
6990}
6991
Jeff Johnson295189b2012-06-20 16:38:30 -07006992void csrRoamRoamingStateDisassocRspProcessor( tpAniSirGlobal pMac, tSirSmeDisassocRsp *pSmeRsp )
6993{
6994 tSirResultCodes statusCode;
6995#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
6996 tScanResultHandle hBSSList;
6997 tANI_BOOLEAN fCallCallback, fRemoveCmd;
6998 eHalStatus status;
6999 tCsrRoamInfo roamInfo;
7000 tCsrScanResultFilter *pScanFilter = NULL;
7001 tANI_U32 roamId = 0;
7002 tCsrRoamProfile *pCurRoamProfile = NULL;
7003 tListElem *pEntry = NULL;
7004 tSmeCmd *pCommand = NULL;
7005#endif
7006 tANI_U32 sessionId;
7007 tCsrRoamSession *pSession;
Jeff Johnsone7245742012-09-05 17:12:55 -07007008
Jeff Johnson295189b2012-06-20 16:38:30 -07007009 tSirSmeDisassocRsp SmeDisassocRsp;
7010
7011 csrSerDesUnpackDiassocRsp((tANI_U8 *)pSmeRsp, &SmeDisassocRsp);
7012 sessionId = SmeDisassocRsp.sessionId;
7013 statusCode = SmeDisassocRsp.statusCode;
7014
7015 smsLog( pMac, LOG2, "csrRoamRoamingStateDisassocRspProcessor sessionId %d\n", sessionId);
7016
7017 if ( csrIsConnStateInfra( pMac, sessionId ) )
7018 {
7019 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
7020 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007021 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07007022
7023 if(!pSession)
7024 {
7025 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
7026 return;
7027 }
7028
Jeff Johnson295189b2012-06-20 16:38:30 -07007029 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_NO_JOIN( pMac, sessionId ) )
7030 {
7031 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
7032 }
7033 else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_FORCED( pMac, sessionId ) ||
7034 CSR_IS_ROAM_SUBSTATE_DISASSOC_REQ( pMac, sessionId ) )
7035 {
7036 if ( eSIR_SME_SUCCESS == statusCode )
7037 {
7038 smsLog( pMac, LOG2, "CSR SmeDisassocReq force disassociated Successfully\n" );
7039 //A callback to HDD will be issued from csrRoamComplete so no need to do anything here
7040 }
7041 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
7042 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007043 else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac, sessionId ) )
7044 {
7045 smsLog( pMac, LOGE, "CSR SmeDisassocReq due to HO\n" );
7046#if defined (WLAN_FEATURE_NEIGHBOR_ROAMING)
7047 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
7048 if ( pEntry )
7049 {
7050 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07007051 // If the head of the queue is Active and it is a ROAM command, remove
7052 // and put this on the Free queue.
7053 if ( eSmeCommandRoam == pCommand->command )
7054 {
Jeff Johnsone7245742012-09-05 17:12:55 -07007055
Jeff Johnson295189b2012-06-20 16:38:30 -07007056 //we need to process the result first before removing it from active list because state changes
7057 //still happening insides roamQProcessRoamResults so no other roam command should be issued
7058 fRemoveCmd = csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK );
7059 if(pCommand->u.roamCmd.fReleaseProfile)
7060 {
7061 csrReleaseProfile(pMac, &pCommand->u.roamCmd.roamProfile);
7062 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
7063 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007064 if( fRemoveCmd )
7065 {
7066 csrReleaseCommandRoam( pMac, pCommand );
7067 }
7068 else
7069 {
7070 smsLog( pMac, LOGE, " ********csrRoamRoamingStateDisassocRspProcessor fail to remove cmd reason %d\n",
7071 pCommand->u.roamCmd.roamReason );
7072 }
7073 }
7074 else
7075 {
7076 smsLog( pMac, LOGW, "CSR: Roam Completion called but ROAM command is not ACTIVE ...\n" );
7077 }
7078 }
7079 else
7080 {
7081 smsLog( pMac, LOGW, "CSR: Roam Completion called but NO commands are ACTIVE ...\n" );
7082 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007083 //notify HDD for handoff, providing the BSSID too
7084 roamInfo.reasonCode = eCsrRoamReasonBetterAP;
7085
7086 palCopyMemory(pMac->hHdd, roamInfo.bssid, pMac->roam.neighborRoamInfo.csrNeighborRoamProfile.BSSIDs.bssid, sizeof(tSirMacAddr));
7087
Jeff Johnsone7245742012-09-05 17:12:55 -07007088 csrRoamCallCallback(pMac,sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
Jeff Johnson295189b2012-06-20 16:38:30 -07007089
7090 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
7091 if(HAL_STATUS_SUCCESS(status))
7092 {
7093 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
7094 status = csrRoamPrepareFilterFromProfile(pMac, &pMac->roam.neighborRoamInfo.csrNeighborRoamProfile, pScanFilter);
7095 if(!HAL_STATUS_SUCCESS(status))
7096 {
7097 smsLog(pMac, LOGE, FL(" csrRoamPrepareFilterFromProfile fail to create scan filter\n"));
7098 }
7099
7100 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
7101 if(HAL_STATUS_SUCCESS(status))
7102 {
7103 //copy over the connected profile to apply the same for this connection as well
7104 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pCurRoamProfile, sizeof(tCsrRoamProfile))))
7105 {
7106 palZeroMemory(pMac->hHdd, pCurRoamProfile, sizeof(tCsrRoamProfile));
7107 csrRoamCopyProfile(pMac, pCurRoamProfile, pSession->pCurRoamProfile);
7108 }
7109 //make sure to put it at the head of the cmd queue
7110 status = csrRoamIssueConnect(pMac, sessionId, pCurRoamProfile,
7111 hBSSList, eCsrSmeIssuedAssocToSimilarAP,
7112 roamId, eANI_BOOLEAN_TRUE, eANI_BOOLEAN_FALSE);
7113 if(!HAL_STATUS_SUCCESS(status))
7114 {
7115 //msg
7116 fCallCallback = eANI_BOOLEAN_TRUE;
7117 }
7118 /* Notify sub-modules like QoS etc. that handoff happening */
7119 sme_QosCsrEventInd(pMac, sessionId, SME_QOS_CSR_HANDOFF_ASSOC_REQ, NULL);
7120 palFreeMemory(pMac->hHdd, pCurRoamProfile);
7121 }
7122 else
7123 {
7124 //msg
7125 smsLog( pMac, LOGE,"csrRoamRoamingStateDisassocRspProcessor: csrScanGetResult failed");
7126 // should have asserted, sending up roam complete instead. Let upper layer
7127 // decide what to do next
7128 csrCallRoamingCompletionCallback(pMac, pSession, &roamInfo, 0, eCSR_ROAM_RESULT_FAILURE);
7129 }
7130 }
7131 else
7132 {
7133 smsLog(pMac, LOGE, FL(" fail to allocate memory for scan filter\n"));
7134 csrCallRoamingCompletionCallback(pMac, pSession, &roamInfo, 0, eCSR_ROAM_RESULT_FAILURE);
7135 }
7136 if( pScanFilter )
7137 {
Jeff Johnsone7245742012-09-05 17:12:55 -07007138
Jeff Johnson295189b2012-06-20 16:38:30 -07007139 csrFreeScanFilter(pMac, pScanFilter);
7140 palFreeMemory( pMac->hHdd, pScanFilter );
7141 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007142#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07007143
Jeff Johnson295189b2012-06-20 16:38:30 -07007144 } //else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac ) )
7145 else if ( CSR_IS_ROAM_SUBSTATE_REASSOC_FAIL( pMac, sessionId ) )
7146 {
7147 // Disassoc due to Reassoc failure falls into this codepath....
7148 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
7149 }
7150 else
7151 {
7152 if ( eSIR_SME_SUCCESS == statusCode )
7153 {
7154 // Successfully disassociated from the 'old' Bss...
7155 //
7156 // We get Disassociate response in three conditions.
7157 // - First is the case where we are disasociating from an Infra Bss to start an IBSS.
7158 // - Second is the when we are disassociating from an Infra Bss to join an IBSS or a new
7159 // Infrastructure network.
7160 // - Third is where we are doing an Infra to Infra roam between networks with different
7161 // SSIDs. In all cases, we set the new Bss configuration here and attempt to join
7162
7163 smsLog( pMac, LOG2, "CSR SmeDisassocReq disassociated Successfully\n" );
7164 }
7165 else
7166 {
7167 smsLog( pMac, LOGE, "SmeDisassocReq failed with statusCode= 0x%08lX\n", statusCode );
7168 }
7169 //We are not done yet. Get the data and continue roaming
7170 csrRoamReissueRoamCommand(pMac);
7171 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007172}
7173
Jeff Johnson295189b2012-06-20 16:38:30 -07007174static void csrRoamRoamingStateDeauthRspProcessor( tpAniSirGlobal pMac, tSirSmeDeauthRsp *pSmeRsp )
7175{
7176 tSirResultCodes statusCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07007177 //No one is sending eWNI_SME_DEAUTH_REQ to PE.
7178 smsLog(pMac, LOGW, FL("is no-op\n"));
7179 statusCode = csrGetDeAuthRspStatusCode( pSmeRsp );
7180 if ( CSR_IS_ROAM_SUBSTATE_DEAUTH_REQ( pMac, pSmeRsp->sessionId) )
7181 {
7182 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
7183 }
7184 else
7185 {
7186 if ( eSIR_SME_SUCCESS == statusCode )
7187 {
7188 // Successfully deauth from the 'old' Bss...
7189 //
7190 smsLog( pMac, LOG2, "CSR SmeDeauthReq disassociated Successfully\n" );
7191 }
7192 else
7193 {
7194 smsLog( pMac, LOGW, "SmeDeauthReq failed with statusCode= 0x%08lX\n", statusCode );
7195 }
7196 //We are not done yet. Get the data and continue roaming
7197 csrRoamReissueRoamCommand(pMac);
7198 }
7199}
7200
Jeff Johnson295189b2012-06-20 16:38:30 -07007201static void csrRoamRoamingStateStartBssRspProcessor( tpAniSirGlobal pMac, tSirSmeStartBssRsp *pSmeStartBssRsp )
7202{
7203 eCsrRoamCompleteResult result;
7204
7205 if ( eSIR_SME_SUCCESS == pSmeStartBssRsp->statusCode )
7206 {
7207 smsLog( pMac, LOGW, "SmeStartBssReq Successful\n" );
7208 result = eCsrStartBssSuccess;
7209 }
7210 else
7211 {
7212 smsLog( pMac, LOGW, "SmeStartBssReq failed with statusCode= 0x%08lX\n", pSmeStartBssRsp->statusCode );
7213 //Let csrRoamComplete decide what to do
7214 result = eCsrStartBssFailure;
7215 }
7216#ifdef WLAN_SOFTAP_FEATURE
7217 csrRoamComplete( pMac, result, pSmeStartBssRsp);
7218#else
7219 csrRoamComplete( pMac, result, &pSmeStartBssRsp->bssDescription );
7220#endif
7221}
7222
Jeff Johnson295189b2012-06-20 16:38:30 -07007223/*
7224 We need to be careful on whether to cast pMsgBuf (pSmeRsp) to other type of strucutres.
7225 It depends on how the message is constructed. If the message is sent by limSendSmeRsp,
7226 the pMsgBuf is only a generic response and can only be used as pointer to tSirSmeRsp.
7227 For the messages where sender allocates memory for specific structures, then it can be
7228 cast accordingly.
7229*/
7230void csrRoamingStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
7231{
7232 tSirSmeRsp *pSmeRsp;
7233 tSmeIbssPeerInd *pIbssPeerInd;
7234 tCsrRoamInfo roamInfo;
7235 // TODO Session Id need to be acquired in this function
7236 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07007237 pSmeRsp = (tSirSmeRsp *)pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07007238 smsLog( pMac, LOG2, "Message %d[0x%04X] received in substate %d\n",
7239 pSmeRsp->messageType, pSmeRsp->messageType,
7240 pMac->roam.curSubState[pSmeRsp->sessionId] );
7241#if defined ANI_PRODUCT_TYPE_AP
7242 pSmeRsp->messageType = pal_be16_to_cpu(pSmeRsp->messageType);
7243 pSmeRsp->length = pal_be16_to_cpu(pSmeRsp->length);
7244 pSmeRsp->statusCode = pal_be32_to_cpu(pSmeRsp->statusCode);
7245#else
7246 pSmeRsp->messageType = (pSmeRsp->messageType);
7247 pSmeRsp->length = (pSmeRsp->length);
7248 pSmeRsp->statusCode = (pSmeRsp->statusCode);
7249#endif
7250 switch (pSmeRsp->messageType)
7251 {
7252
7253 case eWNI_SME_JOIN_RSP: // in Roaming state, process the Join response message...
7254 if (CSR_IS_ROAM_SUBSTATE_JOIN_REQ(pMac, pSmeRsp->sessionId))
7255 {
7256 //We sent a JOIN_REQ
7257 csrRoamJoinRspProcessor( pMac, (tSirSmeJoinRsp *)pSmeRsp );
7258 }
7259 break;
7260
7261 case eWNI_SME_AUTH_RSP: // or the Authenticate response message...
7262 if (CSR_IS_ROAM_SUBSTATE_AUTH_REQ( pMac, pSmeRsp->sessionId) )
7263 {
7264 //We sent a AUTH_REQ
7265 csrRoamRoamingStateAuthRspProcessor( pMac, (tSirSmeAuthRsp *)pSmeRsp );
7266 }
7267 break;
7268
7269 case eWNI_SME_REASSOC_RSP: // or the Reassociation response message...
7270 if (CSR_IS_ROAM_SUBSTATE_REASSOC_REQ( pMac, pSmeRsp->sessionId) )
7271 {
7272 csrRoamRoamingStateReassocRspProcessor( pMac, (tpSirSmeJoinRsp )pSmeRsp );
7273 }
7274 break;
7275
7276 case eWNI_SME_STOP_BSS_RSP: // or the Stop Bss response message...
7277 {
7278 csrRoamRoamingStateStopBssRspProcessor(pMac, pSmeRsp);
7279 }
7280 break;
7281
7282 case eWNI_SME_DISASSOC_RSP: // or the Disassociate response message...
7283 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_REQ( pMac, pSmeRsp->sessionId ) ||
7284 CSR_IS_ROAM_SUBSTATE_DISASSOC_NO_JOIN( pMac, pSmeRsp->sessionId ) ||
7285 CSR_IS_ROAM_SUBSTATE_REASSOC_FAIL( pMac, pSmeRsp->sessionId ) ||
7286 CSR_IS_ROAM_SUBSTATE_DISASSOC_FORCED( pMac, pSmeRsp->sessionId ) ||
7287 CSR_IS_ROAM_SUBSTATE_DISCONNECT_CONTINUE( pMac, pSmeRsp->sessionId ) ||
7288//HO
7289 CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac, pSmeRsp->sessionId ) )
7290 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07007291 smsLog(pMac, LOG1, FL("eWNI_SME_DISASSOC_RSP subState = %d\n"), pMac->roam.curSubState[pSmeRsp->sessionId]);
Jeff Johnson295189b2012-06-20 16:38:30 -07007292 csrRoamRoamingStateDisassocRspProcessor( pMac, (tSirSmeDisassocRsp *)pSmeRsp );
7293 }
7294 break;
7295
7296 case eWNI_SME_DEAUTH_RSP: // or the Deauthentication response message...
7297 if ( CSR_IS_ROAM_SUBSTATE_DEAUTH_REQ( pMac, pSmeRsp->sessionId ) )
7298 {
7299 csrRoamRoamingStateDeauthRspProcessor( pMac, (tSirSmeDeauthRsp *)pSmeRsp );
7300 }
7301 break;
7302
7303 case eWNI_SME_START_BSS_RSP: // or the Start BSS response message...
7304 if (CSR_IS_ROAM_SUBSTATE_START_BSS_REQ( pMac, pSmeRsp->sessionId ) )
7305 {
7306 csrRoamRoamingStateStartBssRspProcessor( pMac, (tSirSmeStartBssRsp *)pSmeRsp );
7307 }
7308 break;
7309
7310 case WNI_CFG_SET_CNF: // process the Config Confirm messages when we are in 'Config' substate...
7311 if ( CSR_IS_ROAM_SUBSTATE_CONFIG( pMac, pSmeRsp->sessionId ) )
7312 {
7313 csrRoamingStateConfigCnfProcessor( pMac, ((tCsrCfgSetRsp *)pSmeRsp)->respStatus );
7314 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007315 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07007316 //In case CSR issues STOP_BSS, we need to tell HDD about peer departed becasue PE is removing them
7317 case eWNI_SME_IBSS_PEER_DEPARTED_IND:
7318 pIbssPeerInd = (tSmeIbssPeerInd*)pSmeRsp;
7319 smsLog(pMac, LOGE, "CSR: Peer departed notification from LIM in joining state\n");
7320 palZeroMemory( pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo) );
7321 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
7322 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
7323 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
7324 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
7325 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
7326 eCSR_ROAM_CONNECT_STATUS_UPDATE,
7327 eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
7328 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07007329 default:
7330 smsLog( pMac, LOG1, "Unexpected message type = %d[0x%X] received in substate %d\n",
7331 pSmeRsp->messageType, pSmeRsp->messageType,
7332 pMac->roam.curSubState[pSmeRsp->sessionId] );
7333
7334 //If we are connected, check the link status change
7335 if(!csrIsConnStateDisconnected(pMac, sessionId))
7336 {
7337 csrRoamCheckForLinkStatusChange( pMac, pSmeRsp );
7338 }
7339 break;
7340 }
7341}
7342
Jeff Johnson295189b2012-06-20 16:38:30 -07007343void csrRoamJoinedStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
7344{
7345 tSirSmeRsp *pSirMsg = (tSirSmeRsp *)pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07007346 switch (pSirMsg->messageType)
7347 {
7348 case eWNI_SME_GET_STATISTICS_RSP:
Mohit Khanna23863762012-09-11 17:40:09 -07007349 smsLog( pMac, LOG2, FL("Stats rsp from PE\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07007350 csrRoamStatsRspProcessor( pMac, pSirMsg );
7351 break;
7352#ifdef WLAN_SOFTAP_FEATURE
7353 case eWNI_SME_UPPER_LAYER_ASSOC_CNF:
7354 {
7355 tCsrRoamSession *pSession;
7356 tSirSmeAssocIndToUpperLayerCnf *pUpperLayerAssocCnf;
7357 tCsrRoamInfo roamInfo;
7358 tCsrRoamInfo *pRoamInfo = NULL;
7359 tANI_U32 sessionId;
7360 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007361 smsLog( pMac, LOG1, FL("ASSOCIATION confirmation can be given to upper layer \n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07007362 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
7363 pRoamInfo = &roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07007364 pUpperLayerAssocCnf = (tSirSmeAssocIndToUpperLayerCnf *)pMsgBuf;
7365 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pUpperLayerAssocCnf->bssId, &sessionId );
7366 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07007367
7368 if(!pSession)
7369 {
7370 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
7371 return;
7372 }
7373
Jeff Johnson295189b2012-06-20 16:38:30 -07007374 pRoamInfo->statusCode = eSIR_SME_SUCCESS; //send the status code as Success
7375 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
Jeff Johnson295189b2012-06-20 16:38:30 -07007376 pRoamInfo->staId = (tANI_U8)pUpperLayerAssocCnf->aid;
7377 pRoamInfo->rsnIELen = (tANI_U8)pUpperLayerAssocCnf->rsnIE.length;
7378 pRoamInfo->prsnIE = pUpperLayerAssocCnf->rsnIE.rsnIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07007379 pRoamInfo->addIELen = (tANI_U8)pUpperLayerAssocCnf->addIE.length;
7380 pRoamInfo->paddIE = pUpperLayerAssocCnf->addIE.addIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07007381 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pUpperLayerAssocCnf->peerMacAddr, sizeof(tSirMacAddr));
7382 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pUpperLayerAssocCnf->bssId, sizeof(tCsrBssid));
Jeff Johnson295189b2012-06-20 16:38:30 -07007383 pRoamInfo->wmmEnabledSta = pUpperLayerAssocCnf->wmmEnabledSta;
Jeff Johnson295189b2012-06-20 16:38:30 -07007384 if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile) )
7385 {
7386 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED;
7387 pRoamInfo->fReassocReq = pUpperLayerAssocCnf->reassocReq;
7388 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_CNF);
7389 }
7390 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
7391 {
7392 vos_sleep( 100 );
7393 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED;//Sta
7394 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND);//Sta
7395 }
7396
Jeff Johnson295189b2012-06-20 16:38:30 -07007397 }
7398 break;
7399#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07007400 default:
7401 csrRoamCheckForLinkStatusChange( pMac, pSirMsg );
7402 break;
7403 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007404}
7405
Jeff Johnson295189b2012-06-20 16:38:30 -07007406eHalStatus csrRoamIssueSetContextReq( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrEncryptionType EncryptType,
7407 tSirBssDescription *pBssDescription,
7408 tSirMacAddr *bssId, tANI_BOOLEAN addKey,
7409 tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
7410 tANI_U8 keyId, tANI_U16 keyLength,
7411 tANI_U8 *pKey, tANI_U8 paeRole )
7412{
7413 eHalStatus status = eHAL_STATUS_SUCCESS;
7414 tAniEdType edType;
7415
7416 if(eCSR_ENCRYPT_TYPE_UNKNOWN == EncryptType)
7417 {
7418 EncryptType = eCSR_ENCRYPT_TYPE_NONE; //***
7419 }
7420
7421 edType = csrTranslateEncryptTypeToEdType( EncryptType );
7422
7423 // Allow 0 keys to be set for the non-WPA encrypt types... For WPA encrypt types, the num keys must be non-zero
7424 // or LIM will reject the set context (assumes the SET_CONTEXT does not occur until the keys are distrubuted).
7425 if ( CSR_IS_ENC_TYPE_STATIC( EncryptType ) ||
7426 addKey )
7427 {
7428 tCsrRoamSetKey setKey;
Jeff Johnson295189b2012-06-20 16:38:30 -07007429 setKey.encType = EncryptType;
7430 setKey.keyDirection = aniKeyDirection; //Tx, Rx or Tx-and-Rx
7431 palCopyMemory( pMac->hHdd, &setKey.peerMac, bssId, sizeof(tCsrBssid) );
7432 setKey.paeRole = paeRole; //0 for supplicant
7433 setKey.keyId = keyId; // Kye index
7434 setKey.keyLength = keyLength;
7435 if( keyLength )
7436 {
7437 palCopyMemory( pMac->hHdd, setKey.Key, pKey, keyLength );
7438 }
7439 status = csrRoamIssueSetKeyCommand( pMac, sessionId, &setKey, 0 );
7440 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007441 return (status);
7442}
7443
Jeff Johnson295189b2012-06-20 16:38:30 -07007444static eHalStatus csrRoamIssueSetKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
7445 tCsrRoamSetKey *pSetKey, tANI_U32 roamId )
7446{
7447 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
7448 tSmeCmd *pCommand = NULL;
7449#ifdef FEATURE_WLAN_CCX
7450 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7451#endif /* FEATURE_WLAN_CCX */
7452
7453 do
7454 {
7455 pCommand = csrGetCommandBuffer(pMac);
7456 if(NULL == pCommand)
7457 {
7458 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7459 status = eHAL_STATUS_RESOURCES;
7460 break;
7461 }
7462 pCommand->command = eSmeCommandSetKey;
7463 pCommand->sessionId = (tANI_U8)sessionId;
7464 // validate the key length, Adjust if too long...
7465 // for static WEP the keys are not set thru' SetContextReq
7466 if ( ( eCSR_ENCRYPT_TYPE_WEP40 == pSetKey->encType ) ||
7467 ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pSetKey->encType ) )
7468 {
7469 //KeyLength maybe 0 for static WEP
7470 if( pSetKey->keyLength )
7471 {
7472 if ( pSetKey->keyLength < CSR_WEP40_KEY_LEN )
7473 {
7474 smsLog( pMac, LOGW, "Invalid WEP40 keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7475 break;
7476 }
7477
7478 pCommand->u.setKeyCmd.keyLength = CSR_WEP40_KEY_LEN;
7479 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WEP40_KEY_LEN );
7480 }
7481 }
7482 else if ( ( eCSR_ENCRYPT_TYPE_WEP104 == pSetKey->encType ) ||
7483 ( eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pSetKey->encType ) )
7484 {
7485 //KeyLength maybe 0 for static WEP
7486 if( pSetKey->keyLength )
7487 {
7488 if ( pSetKey->keyLength < CSR_WEP104_KEY_LEN )
7489 {
7490 smsLog( pMac, LOGW, "Invalid WEP104 keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7491 break;
7492 }
7493
7494 pCommand->u.setKeyCmd.keyLength = CSR_WEP104_KEY_LEN;
7495 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WEP104_KEY_LEN );
7496 }
7497 }
7498 else if ( eCSR_ENCRYPT_TYPE_TKIP == pSetKey->encType )
7499 {
7500 if ( pSetKey->keyLength < CSR_TKIP_KEY_LEN )
7501 {
7502 smsLog( pMac, LOGW, "Invalid TKIP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7503 break;
7504 }
7505 pCommand->u.setKeyCmd.keyLength = CSR_TKIP_KEY_LEN;
7506 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_TKIP_KEY_LEN );
7507 }
7508 else if ( eCSR_ENCRYPT_TYPE_AES == pSetKey->encType )
7509 {
7510 if ( pSetKey->keyLength < CSR_AES_KEY_LEN )
7511 {
7512 smsLog( pMac, LOGW, "Invalid AES/CCMP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7513 break;
7514 }
7515 pCommand->u.setKeyCmd.keyLength = CSR_AES_KEY_LEN;
7516 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_AES_KEY_LEN );
7517 }
7518#ifdef FEATURE_WLAN_WAPI
7519 else if ( eCSR_ENCRYPT_TYPE_WPI == pSetKey->encType )
7520 {
7521 if ( pSetKey->keyLength < CSR_WAPI_KEY_LEN )
7522 {
7523 smsLog( pMac, LOGW, "Invalid WAPI keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7524 break;
7525 }
7526 pCommand->u.setKeyCmd.keyLength = CSR_WAPI_KEY_LEN;
7527 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WAPI_KEY_LEN );
7528 }
7529#endif /* FEATURE_WLAN_WAPI */
7530#ifdef FEATURE_WLAN_CCX
7531 else if ( eCSR_ENCRYPT_TYPE_KRK == pSetKey->encType )
7532 {
7533 if ( pSetKey->keyLength < CSR_KRK_KEY_LEN )
7534 {
7535 smsLog( pMac, LOGW, "Invalid KRK keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7536 break;
7537 }
7538 palCopyMemory( pMac->hHdd, pSession->ccxCckmInfo.krk, pSetKey->Key, CSR_KRK_KEY_LEN );
7539 pSession->ccxCckmInfo.reassoc_req_num=1;
7540 pSession->ccxCckmInfo.krk_plumbed = eANI_BOOLEAN_TRUE;
7541 status = eHAL_STATUS_SUCCESS;
7542 break;
7543 }
7544#endif /* FEATURE_WLAN_CCX */
Jeff Johnsone7245742012-09-05 17:12:55 -07007545
Jeff Johnson295189b2012-06-20 16:38:30 -07007546#ifdef WLAN_FEATURE_11W
7547 //Check for 11w BIP
7548 else if ( eCSR_ENCRYPT_TYPE_AES_CMAC == pSetKey->encType )
7549 {
7550 tANI_U16 count = 0;
7551 if ( pSetKey->keyLength < CSR_AES_KEY_LEN )
7552 {
7553 smsLog( pMac, LOGW, "Invalid AES/CCMP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7554 break;
7555 }
7556 pCommand->u.setKeyCmd.keyLength = CSR_AES_KEY_LEN;
7557 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_AES_KEY_LEN );
7558 }
7559#endif
7560 status = eHAL_STATUS_SUCCESS;
7561 pCommand->u.setKeyCmd.roamId = roamId;
7562 pCommand->u.setKeyCmd.encType = pSetKey->encType;
7563 pCommand->u.setKeyCmd.keyDirection = pSetKey->keyDirection; //Tx, Rx or Tx-and-Rx
7564 palCopyMemory( pMac->hHdd, &pCommand->u.setKeyCmd.peerMac, &pSetKey->peerMac, sizeof(tCsrBssid) );
7565 pCommand->u.setKeyCmd.paeRole = pSetKey->paeRole; //0 for supplicant
7566 pCommand->u.setKeyCmd.keyId = pSetKey->keyId;
7567 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.keyRsc, pSetKey->keyRsc, CSR_MAX_RSC_LEN );
7568 //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
7569
7570 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_TRUE);
7571 if( !HAL_STATUS_SUCCESS( status ) )
7572 {
7573 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
7574 }
7575 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07007576 // Free the command if there has been a failure, or it is a
7577 // "local" operation like the set CCX CCKM KRK key.
7578 if( (!HAL_STATUS_SUCCESS( status ) && ( NULL != pCommand ))
7579#ifdef FEATURE_WLAN_CCX
7580 || ( eCSR_ENCRYPT_TYPE_KRK == pSetKey->encType )
7581#endif /* FEATURE_WLAN_CCX */
7582 )
7583 {
7584 csrReleaseCommandSetKey( pMac, pCommand );
7585 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007586 return( status );
7587}
7588
Jeff Johnson295189b2012-06-20 16:38:30 -07007589eHalStatus csrRoamIssueRemoveKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
7590 tCsrRoamRemoveKey *pRemoveKey, tANI_U32 roamId )
7591{
7592 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
7593 tSmeCmd *pCommand = NULL;
7594 tANI_BOOLEAN fImediate = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07007595 do
7596 {
7597 if( !csrIsSetKeyAllowed(pMac, sessionId) )
7598 {
7599 smsLog( pMac, LOGW, FL(" wrong state not allowed to set key\n") );
7600 status = eHAL_STATUS_CSR_WRONG_STATE;
7601 break;
7602 }
7603 pCommand = csrGetCommandBuffer(pMac);
7604 if(NULL == pCommand)
7605 {
7606 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7607 status = eHAL_STATUS_RESOURCES;
7608 break;
7609 }
7610 pCommand->command = eSmeCommandRemoveKey;
7611 pCommand->sessionId = (tANI_U8)sessionId;
7612 pCommand->u.removeKeyCmd.roamId = roamId;
7613 pCommand->u.removeKeyCmd.encType = pRemoveKey->encType;
7614 palCopyMemory( pMac->hHdd, &pCommand->u.removeKeyCmd.peerMac, &pRemoveKey->peerMac, sizeof(tSirMacAddr) );
7615 pCommand->u.removeKeyCmd.keyId = pRemoveKey->keyId;
7616 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
7617 {
7618 //in this case, put it to the end of the Q incase there is a set key pending.
7619 fImediate = eANI_BOOLEAN_FALSE;
7620 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007621 smsLog( pMac, LOGE, FL("keyType=%d, keyId=%d, PeerMac=%02x, %02x, %02x, %02x, %02x, %02x\n"),
7622 pRemoveKey->encType, pRemoveKey->keyId,
7623 pCommand->u.removeKeyCmd.peerMac[0],
7624 pCommand->u.removeKeyCmd.peerMac[1],
7625 pCommand->u.removeKeyCmd.peerMac[2],
7626 pCommand->u.removeKeyCmd.peerMac[3],
7627 pCommand->u.removeKeyCmd.peerMac[4],
7628 pCommand->u.removeKeyCmd.peerMac[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -07007629 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
7630 if( !HAL_STATUS_SUCCESS( status ) )
7631 {
7632 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
7633 break;
7634 }
7635 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07007636 if( !HAL_STATUS_SUCCESS( status ) && ( NULL != pCommand ) )
7637 {
7638 csrReleaseCommandRemoveKey( pMac, pCommand );
7639 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007640 return (status );
7641}
7642
Jeff Johnson295189b2012-06-20 16:38:30 -07007643eHalStatus csrRoamProcessSetKeyCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
7644{
7645 eHalStatus status;
7646 tANI_U8 numKeys = ( pCommand->u.setKeyCmd.keyLength ) ? 1 : 0;
7647 tAniEdType edType = csrTranslateEncryptTypeToEdType( pCommand->u.setKeyCmd.encType );
7648 tANI_BOOLEAN fUnicast = ( pCommand->u.setKeyCmd.peerMac[0] == 0xFF ) ? eANI_BOOLEAN_FALSE : eANI_BOOLEAN_TRUE;
7649 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007650#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7651 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7652 WLAN_VOS_DIAG_EVENT_DEF(setKeyEvent, vos_event_wlan_security_payload_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07007653 if(eCSR_ENCRYPT_TYPE_NONE != edType)
7654 {
7655 palZeroMemory(pMac->hHdd, &setKeyEvent, sizeof(vos_event_wlan_security_payload_type));
7656 if( *(( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac) & 0x01 )
7657 {
7658 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_REQ;
7659 setKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pCommand->u.setKeyCmd.encType);
7660 setKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
7661 }
7662 else
7663 {
7664 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_REQ;
7665 setKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pCommand->u.setKeyCmd.encType);
7666 setKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
7667 }
7668 palCopyMemory( pMac->hHdd, setKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
7669 if(CSR_IS_ENC_TYPE_STATIC(edType))
7670 {
7671 tANI_U32 defKeyId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007672 //It has to be static WEP here
7673 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_WEP_DEFAULT_KEYID, &defKeyId)))
7674 {
7675 setKeyEvent.keyId = (v_U8_t)defKeyId;
7676 }
7677 }
7678 else
7679 {
7680 setKeyEvent.keyId = pCommand->u.setKeyCmd.keyId;
7681 }
7682 setKeyEvent.authMode = (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
7683 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
7684 }
7685#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007686 if( csrIsSetKeyAllowed(pMac, sessionId) )
7687 {
7688 status = csrSendMBSetContextReqMsg( pMac, sessionId,
7689 ( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac,
7690 numKeys, edType, fUnicast, pCommand->u.setKeyCmd.keyDirection,
7691 pCommand->u.setKeyCmd.keyId, pCommand->u.setKeyCmd.keyLength,
7692 pCommand->u.setKeyCmd.Key, pCommand->u.setKeyCmd.paeRole,
7693 pCommand->u.setKeyCmd.keyRsc);
7694 }
7695 else
7696 {
7697 smsLog( pMac, LOGW, FL(" cannot process not connected\n") );
7698 //Set this status so the error handling take care of the case.
7699 status = eHAL_STATUS_CSR_WRONG_STATE;
7700 }
7701 if( !HAL_STATUS_SUCCESS(status) )
7702 {
7703 smsLog( pMac, LOGE, FL(" error status %d\n"), status );
7704 csrRoamCallCallback( pMac, sessionId, NULL, pCommand->u.setKeyCmd.roamId, eCSR_ROAM_SET_KEY_COMPLETE, eCSR_ROAM_RESULT_FAILURE);
Jeff Johnson295189b2012-06-20 16:38:30 -07007705#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7706 if(eCSR_ENCRYPT_TYPE_NONE != edType)
7707 {
7708 if( *(( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac) & 0x01 )
7709 {
7710 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_RSP;
7711 }
7712 else
7713 {
7714 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_RSP;
7715 }
7716 setKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
7717 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
7718 }
7719#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007720 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007721 return ( status );
7722}
7723
Jeff Johnson295189b2012-06-20 16:38:30 -07007724eHalStatus csrRoamProcessRemoveKeyCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
7725{
7726 eHalStatus status;
7727 tpSirSmeRemoveKeyReq pMsg = NULL;
7728 tANI_U16 wMsgLen = sizeof(tSirSmeRemoveKeyReq);
7729 tANI_U8 *p;
7730 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007731#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7732 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7733 WLAN_VOS_DIAG_EVENT_DEF(removeKeyEvent, vos_event_wlan_security_payload_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07007734 palZeroMemory(pMac->hHdd, &removeKeyEvent, sizeof(vos_event_wlan_security_payload_type));
7735 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_REQ;
7736 removeKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
7737 removeKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
7738 palCopyMemory( pMac->hHdd, removeKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
7739 removeKeyEvent.keyId = pCommand->u.removeKeyCmd.keyId;
7740 removeKeyEvent.authMode = (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
7741 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
7742#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007743 if( csrIsSetKeyAllowed(pMac, sessionId) )
7744 {
7745 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, wMsgLen );
7746 }
7747 else
7748 {
7749 smsLog( pMac, LOGW, FL(" wrong state not allowed to set key\n") );
7750 //Set the error status so error handling kicks in below
7751 status = eHAL_STATUS_CSR_WRONG_STATE;
7752 }
7753 if( HAL_STATUS_SUCCESS( status ) )
7754 {
7755 palZeroMemory(pMac->hHdd, pMsg, wMsgLen);
7756 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_REMOVEKEY_REQ);
7757 pMsg->length = pal_cpu_to_be16(wMsgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -07007758 pMsg->sessionId = (tANI_U8)sessionId;
7759 pMsg->transactionId = 0;
7760 p = (tANI_U8 *)pMsg + sizeof(pMsg->messageType) + sizeof(pMsg->length) +
7761 sizeof(pMsg->sessionId) + sizeof(pMsg->transactionId);
7762 // bssId - copy from session Info
7763 palCopyMemory( pMac->hHdd, p, &pMac->roam.roamSession[sessionId].connectedProfile.bssid, sizeof(tSirMacAddr) );
7764 p += sizeof(tSirMacAddr);
7765 // peerMacAddr
7766 palCopyMemory( pMac->hHdd, p, pCommand->u.removeKeyCmd.peerMac, sizeof(tSirMacAddr) );
7767 p += sizeof(tSirMacAddr);
7768 // edType
7769 *p = (tANI_U8)csrTranslateEncryptTypeToEdType( pCommand->u.removeKeyCmd.encType );
7770 p++;
7771 // weptype
7772 if( ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pCommand->u.removeKeyCmd.encType ) ||
7773 ( eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pCommand->u.removeKeyCmd.encType ) )
7774 {
7775 *p = (tANI_U8)eSIR_WEP_STATIC;
7776 }
7777 else
7778 {
7779 *p = (tANI_U8)eSIR_WEP_DYNAMIC;
7780 }
7781 p++;
7782 //keyid
7783 *p = pCommand->u.removeKeyCmd.keyId;
7784 p++;
7785 *p = (pCommand->u.removeKeyCmd.peerMac[0] == 0xFF ) ? 0 : 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07007786 status = palSendMBMessage(pMac->hHdd, pMsg);
7787 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007788 if( !HAL_STATUS_SUCCESS( status ) )
7789 {
7790 smsLog( pMac, LOGE, FL(" error status \n"), status );
Jeff Johnson295189b2012-06-20 16:38:30 -07007791#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7792 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_RSP;
Madan Mohan Koyyalamudi4e31b132012-11-02 13:13:52 -07007793 removeKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07007794 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
7795#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007796 csrRoamCallCallback( pMac, sessionId, NULL, pCommand->u.removeKeyCmd.roamId, eCSR_ROAM_REMOVE_KEY_COMPLETE, eCSR_ROAM_RESULT_FAILURE);
7797 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007798 return ( status );
7799}
7800
Jeff Johnson295189b2012-06-20 16:38:30 -07007801eHalStatus csrRoamSetKey( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamSetKey *pSetKey, tANI_U32 roamId )
7802{
7803 eHalStatus status;
7804
7805 if( !csrIsSetKeyAllowed(pMac, sessionId) )
7806 {
7807 status = eHAL_STATUS_CSR_WRONG_STATE;
7808 }
7809 else
7810 {
7811 status = csrRoamIssueSetKeyCommand( pMac, sessionId, pSetKey, roamId );
7812 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007813 return ( status );
7814}
7815
Jeff Johnson295189b2012-06-20 16:38:30 -07007816/*
7817 Prepare a filter base on a profile for parsing the scan results.
7818 Upon successful return, caller MUST call csrFreeScanFilter on
7819 pScanFilter when it is done with the filter.
7820*/
7821eHalStatus csrRoamPrepareFilterFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
7822 tCsrScanResultFilter *pScanFilter)
7823{
7824 eHalStatus status = eHAL_STATUS_SUCCESS;
7825 tANI_U32 size = 0;
7826 tANI_U8 index = 0;
7827
7828 do
7829 {
7830 if(pProfile->BSSIDs.numOfBSSIDs)
7831 {
7832 size = sizeof(tCsrBssid) * pProfile->BSSIDs.numOfBSSIDs;
7833 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->BSSIDs.bssid, size);
7834 if(!HAL_STATUS_SUCCESS(status))
7835 {
7836 break;
7837 }
7838 pScanFilter->BSSIDs.numOfBSSIDs = pProfile->BSSIDs.numOfBSSIDs;
7839 palCopyMemory(pMac->hHdd, pScanFilter->BSSIDs.bssid, pProfile->BSSIDs.bssid, size);
7840 }
7841 if(pProfile->SSIDs.numOfSSIDs)
7842 {
7843 if( !CSR_IS_WDS_STA( pProfile ) )
7844 {
7845 pScanFilter->SSIDs.numOfSSIDs = pProfile->SSIDs.numOfSSIDs;
7846 }
7847 else
7848 {
7849 //For WDS station
7850 //We always use index 1 for self SSID. Index 0 for peer's SSID that we want to join
7851 pScanFilter->SSIDs.numOfSSIDs = 1;
7852 }
7853 size = sizeof(tCsrSSIDInfo) * pProfile->SSIDs.numOfSSIDs;
7854 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->SSIDs.SSIDList, size);
7855 if(!HAL_STATUS_SUCCESS(status))
7856 {
7857 break;
7858 }
7859 palCopyMemory(pMac->hHdd, pScanFilter->SSIDs.SSIDList, pProfile->SSIDs.SSIDList, size);
7860 }
7861 if(!pProfile->ChannelInfo.ChannelList || (pProfile->ChannelInfo.ChannelList[0] == 0) )
7862 {
7863 pScanFilter->ChannelInfo.numOfChannels = 0;
7864 pScanFilter->ChannelInfo.ChannelList = NULL;
7865 }
7866 else if(pProfile->ChannelInfo.numOfChannels)
7867 {
7868 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->ChannelInfo.ChannelList, sizeof(*pScanFilter->ChannelInfo.ChannelList) * pProfile->ChannelInfo.numOfChannels);
7869 pScanFilter->ChannelInfo.numOfChannels = 0;
7870 if(HAL_STATUS_SUCCESS(status))
7871 {
7872 for(index = 0; index < pProfile->ChannelInfo.numOfChannels; index++)
7873 {
7874 if(csrRoamIsChannelValid(pMac, pProfile->ChannelInfo.ChannelList[index]))
7875 {
7876 pScanFilter->ChannelInfo.ChannelList[pScanFilter->ChannelInfo.numOfChannels]
7877 = pProfile->ChannelInfo.ChannelList[index];
7878 pScanFilter->ChannelInfo.numOfChannels++;
7879 }
7880 else
7881 {
7882 smsLog(pMac, LOG1, FL("process a channel (%d) that is invalid\n"), pProfile->ChannelInfo.ChannelList[index]);
7883 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007884 }
7885 }
7886 else
7887 {
7888 break;
7889 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007890 }
7891 else
7892 {
7893 smsLog(pMac, LOGW, FL("Channel list empty\n"));
7894 status = eHAL_STATUS_FAILURE;
7895 break;
7896 }
7897 pScanFilter->uapsd_mask = pProfile->uapsd_mask;
7898 pScanFilter->authType = pProfile->AuthType;
7899 pScanFilter->EncryptionType = pProfile->EncryptionType;
7900 pScanFilter->mcEncryptionType = pProfile->mcEncryptionType;
7901 pScanFilter->BSSType = pProfile->BSSType;
7902 pScanFilter->phyMode = pProfile->phyMode;
7903#ifdef FEATURE_WLAN_WAPI
7904 //check if user asked for WAPI with 11n or auto mode, in that case modify
7905 //the phymode to 11g
7906 if(csrIsProfileWapi(pProfile))
7907 {
7908 if(pScanFilter->phyMode & eCSR_DOT11_MODE_11n)
7909 {
7910 pScanFilter->phyMode &= ~eCSR_DOT11_MODE_11n;
7911 }
7912 if(pScanFilter->phyMode & eCSR_DOT11_MODE_AUTO)
7913 {
7914 pScanFilter->phyMode &= ~eCSR_DOT11_MODE_AUTO;
7915 }
7916 if(!pScanFilter->phyMode)
7917 {
7918 pScanFilter->phyMode = eCSR_DOT11_MODE_11g;
7919 }
7920 }
7921#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07007922 /*Save the WPS info*/
7923 pScanFilter->bWPSAssociation = pProfile->bWPSAssociation;
Jeff Johnson295189b2012-06-20 16:38:30 -07007924 if( pProfile->countryCode[0] )
7925 {
7926 //This causes the matching function to use countryCode as one of the criteria.
7927 palCopyMemory( pMac->hHdd, pScanFilter->countryCode, pProfile->countryCode,
7928 WNI_CFG_COUNTRY_CODE_LEN );
7929 }
7930#ifdef WLAN_FEATURE_VOWIFI_11R
7931 if (pProfile->MDID.mdiePresent)
7932 {
7933 pScanFilter->MDID.mdiePresent = 1;
7934 pScanFilter->MDID.mobilityDomain = pProfile->MDID.mobilityDomain;
7935 }
7936#endif
7937
7938 }while(0);
7939
7940 if(!HAL_STATUS_SUCCESS(status))
7941 {
7942 csrFreeScanFilter(pMac, pScanFilter);
7943 }
7944
7945 return(status);
7946}
7947
Jeff Johnson295189b2012-06-20 16:38:30 -07007948tANI_BOOLEAN csrRoamIssueWmStatusChange( tpAniSirGlobal pMac, tANI_U32 sessionId,
7949 eCsrRoamWmStatusChangeTypes Type, tSirSmeRsp *pSmeRsp )
7950{
7951 tANI_BOOLEAN fCommandQueued = eANI_BOOLEAN_FALSE;
7952 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07007953 do
7954 {
7955 // Validate the type is ok...
7956 if ( ( eCsrDisassociated != Type ) && ( eCsrDeauthenticated != Type ) ) break;
7957 pCommand = csrGetCommandBuffer( pMac );
7958 if ( !pCommand )
7959 {
7960 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7961 break;
7962 }
7963 //Change the substate in case it is waiting for key
7964 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
7965 {
7966 csrRoamStopWaitForKeyTimer( pMac );
7967 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
7968 }
7969 pCommand->command = eSmeCommandWmStatusChange;
7970 pCommand->sessionId = (tANI_U8)sessionId;
7971 pCommand->u.wmStatusChangeCmd.Type = Type;
7972 if ( eCsrDisassociated == Type )
7973 {
7974 palCopyMemory( pMac->hHdd, &pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg, pSmeRsp,
7975 sizeof( pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg ) );
7976 }
7977 else
7978 {
7979 palCopyMemory( pMac->hHdd, &pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg, pSmeRsp,
7980 sizeof( pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg ) );
7981 }
7982 if( HAL_STATUS_SUCCESS( csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_TRUE) ) )
7983 {
7984 fCommandQueued = eANI_BOOLEAN_TRUE;
7985 }
7986 else
7987 {
7988 smsLog( pMac, LOGE, FL(" fail to send message \n") );
7989 csrReleaseCommandWmStatusChange( pMac, pCommand );
7990 }
7991
Jeff Johnson295189b2012-06-20 16:38:30 -07007992 /* AP has issued Dissac/Deauth, Set the operating mode value to configured value */
7993 csrSetDefaultDot11Mode( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -07007994 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07007995 return( fCommandQueued );
7996}
7997
Jeff Johnson295189b2012-06-20 16:38:30 -07007998static void csrUpdateRssi(tpAniSirGlobal pMac, void* pMsg)
7999{
8000 v_S7_t rssi = 0;
8001 tAniGetRssiReq *pGetRssiReq = (tAniGetRssiReq*)pMsg;
8002 if(pGetRssiReq)
8003 {
8004 if(NULL != pGetRssiReq->pVosContext)
8005 {
8006 WLANTL_GetRssi(pGetRssiReq->pVosContext, pGetRssiReq->staId, &rssi);
8007 }
8008 else
8009 {
8010 smsLog( pMac, LOGE, FL("pGetRssiReq->pVosContext is NULL\n"));
8011 return;
8012 }
8013
8014 if(NULL != pGetRssiReq->rssiCallback)
8015 {
8016 ((tCsrRssiCallback)(pGetRssiReq->rssiCallback))(rssi, pGetRssiReq->staId, pGetRssiReq->pDevContext);
8017 }
8018 else
8019 {
8020 smsLog( pMac, LOGE, FL("pGetRssiReq->rssiCallback is NULL\n"));
8021 return;
8022 }
8023 }
8024 else
8025 {
8026 smsLog( pMac, LOGE, FL("pGetRssiReq is NULL\n"));
8027 }
8028 return;
8029}
Jeff Johnsone7245742012-09-05 17:12:55 -07008030static void csrRoamRssiIndHdlr(tpAniSirGlobal pMac, void* pMsg)
8031{
8032 WLANTL_TlIndicationReq *pTlRssiInd = (WLANTL_TlIndicationReq*)pMsg;
8033 if(pTlRssiInd)
8034 {
8035 if(NULL != pTlRssiInd->tlCallback)
8036 {
8037 ((WLANTL_RSSICrossThresholdCBType)(pTlRssiInd->tlCallback))
8038 (pTlRssiInd->pAdapter, pTlRssiInd->rssiNotification, pTlRssiInd->pUserCtxt);
8039 }
8040 else
8041 {
8042 smsLog( pMac, LOGE, FL("pTlRssiInd->tlCallback is NULL\n"));
8043 }
8044 }
8045 else
8046 {
8047 smsLog( pMac, LOGE, FL("pTlRssiInd is NULL\n"));
8048 }
8049 return;
8050}
Jeff Johnson295189b2012-06-20 16:38:30 -07008051
8052void csrRoamCheckForLinkStatusChange( tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg )
8053{
8054 tSirSmeAssocInd *pAssocInd;
8055 tSirSmeDisassocInd *pDisassocInd;
8056 tSirSmeDeauthInd *pDeauthInd;
8057 tSirSmeWmStatusChangeNtf *pStatusChangeMsg;
8058 tSirSmeNewBssInfo *pNewBss;
8059 tSmeIbssPeerInd *pIbssPeerInd;
8060 tSirMacAddr Broadcastaddr = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
8061 tSirSmeApNewCaps *pApNewCaps;
8062 eCsrRoamResult result = eCSR_ROAM_RESULT_NONE;
8063 eRoamCmdStatus roamStatus = eCSR_ROAM_FAILED;
8064 tCsrRoamInfo *pRoamInfo = NULL;
8065 tCsrRoamInfo roamInfo;
8066 eHalStatus status;
8067 tANI_U32 sessionId = CSR_SESSION_ID_INVALID;
8068 tCsrRoamSession *pSession = NULL;
8069 tpSirSmeSwitchChannelInd pSwitchChnInd;
8070 tSmeMaxAssocInd *pSmeMaxAssocInd;
Jeff Johnson295189b2012-06-20 16:38:30 -07008071#if defined ANI_PRODUCT_TYPE_AP
8072 pSirMsg->messageType = pal_be16_to_cpu(pSirMsg->messageType);
8073 pSirMsg->length = pal_be16_to_cpu(pSirMsg->length);
8074 pSirMsg->statusCode = pal_be32_to_cpu(pSirMsg->statusCode);
8075#else
8076 pSirMsg->messageType = (pSirMsg->messageType);
8077 pSirMsg->length = (pSirMsg->length);
8078 pSirMsg->statusCode = (pSirMsg->statusCode);
8079#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008080 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
Jeff Johnson295189b2012-06-20 16:38:30 -07008081 switch( pSirMsg->messageType )
8082 {
8083 case eWNI_SME_ASSOC_IND:
8084 {
8085 tCsrRoamSession *pSession;
8086 smsLog( pMac, LOG1, FL("ASSOCIATION Indication from SME\n"));
8087 pAssocInd = (tSirSmeAssocInd *)pSirMsg;
8088 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pAssocInd->bssId, &sessionId );
8089 if( HAL_STATUS_SUCCESS( status ) )
8090 {
8091 pSession = CSR_GET_SESSION(pMac, sessionId);
8092
Jeff Johnson32d95a32012-09-10 13:15:23 -07008093 if(!pSession)
8094 {
8095 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8096 return;
8097 }
8098
Jeff Johnson295189b2012-06-20 16:38:30 -07008099 pRoamInfo = &roamInfo;
8100
8101 // Required for indicating the frames to upper layer
8102 pRoamInfo->assocReqLength = pAssocInd->assocReqLength;
8103 pRoamInfo->assocReqPtr = pAssocInd->assocReqPtr;
8104
8105 pRoamInfo->beaconPtr = pAssocInd->beaconPtr;
8106 pRoamInfo->beaconLength = pAssocInd->beaconLength;
8107 pRoamInfo->statusCode = eSIR_SME_SUCCESS; //send the status code as Success
8108 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8109
8110 pRoamInfo->staId = (tANI_U8)pAssocInd->staId;
8111 pRoamInfo->rsnIELen = (tANI_U8)pAssocInd->rsnIE.length;
8112 pRoamInfo->prsnIE = pAssocInd->rsnIE.rsnIEdata;
8113
8114 pRoamInfo->addIELen = (tANI_U8)pAssocInd->addIE.length;
8115 pRoamInfo->paddIE = pAssocInd->addIE.addIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07008116 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
8117 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pAssocInd->bssId, sizeof(tCsrBssid));
8118#ifdef WLAN_SOFTAP_FEATURE
8119 pRoamInfo->wmmEnabledSta = pAssocInd->wmmEnabledSta;
8120 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
8121#endif
8122 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND);//Sta
8123#ifdef WLAN_SOFTAP_FEATURE
8124 if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile))
8125 {
8126 if( CSR_IS_ENC_TYPE_STATIC( pSession->pCurRoamProfile->negotiatedUCEncryptionType ))
8127 {
8128 csrRoamIssueSetContextReq( pMac, sessionId, pSession->pCurRoamProfile->negotiatedUCEncryptionType,
8129 pSession->pConnectBssDesc,
8130 &(pRoamInfo->peerMac),
8131 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
8132 pRoamInfo->fAuthRequired = FALSE;
8133 }
8134 else
8135 {
8136 pRoamInfo->fAuthRequired = TRUE;
8137 }
8138 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_IND);
8139 if (!HAL_STATUS_SUCCESS(status))
8140 pRoamInfo->statusCode = eSIR_SME_ASSOC_REFUSED;// Refused due to Mac filtering
8141 }
8142#endif
8143 /* Send Association completion message to PE */
8144 status = csrSendAssocCnfMsg( pMac, pAssocInd, status );//Sta
8145
8146 /* send a message to CSR itself just to avoid the EAPOL frames going
8147 * OTA before association response */
Jeff Johnson295189b2012-06-20 16:38:30 -07008148 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
8149 {
8150 status = csrSendAssocIndToUpperLayerCnfMsg(pMac, pAssocInd, status, sessionId);
8151 }
8152#ifdef WLAN_SOFTAP_FEATURE
8153 else if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile) && (pRoamInfo->statusCode != eSIR_SME_ASSOC_REFUSED))
8154 {
8155 pRoamInfo->fReassocReq = pAssocInd->reassocReq;
8156 //status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_CNF);
8157 status = csrSendAssocIndToUpperLayerCnfMsg(pMac, pAssocInd, status, sessionId);
8158 }
8159#endif
8160 }
8161 }
8162 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008163 case eWNI_SME_DISASSOC_IND:
8164 smsLog( pMac, LOGE, FL("DISASSOCIATION Indication from MAC\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008165 // Check if AP dis-associated us because of MIC failure. If so,
8166 // then we need to take action immediately and not wait till the
8167 // the WmStatusChange requests is pushed and processed
8168 pDisassocInd = (tSirSmeDisassocInd *)pSirMsg;
8169 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pDisassocInd->bssId, &sessionId );
8170 if( HAL_STATUS_SUCCESS( status ) )
8171 {
8172 // If we are in neighbor preauth done state then on receiving
8173 // disassoc or deauth we dont roam instead we just disassoc
8174 // from current ap and then go to disconnected state
8175 // This happens for CCX and 11r FT connections ONLY.
8176#ifdef WLAN_FEATURE_VOWIFI_11R
8177 if (csrRoamIs11rAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8178 {
8179 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8180 }
8181#endif
8182#ifdef FEATURE_WLAN_CCX
8183 if (csrRoamIsCCXAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8184 {
8185 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8186 }
8187#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07008188#ifdef FEATURE_WLAN_LFR
8189 if (csrRoamIsFastRoamEnabled(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8190 {
8191 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8192 }
8193#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008194 pSession = CSR_GET_SESSION( pMac, sessionId );
8195
Jeff Johnson32d95a32012-09-10 13:15:23 -07008196 if(!pSession)
8197 {
8198 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8199 return;
8200 }
8201
Jeff Johnson295189b2012-06-20 16:38:30 -07008202 if ( csrIsConnStateInfra( pMac, sessionId ) )
8203 {
8204 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
8205 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008206#ifndef WLAN_MDM_CODE_REDUCTION_OPT
8207 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
8208#endif
8209 csrRoamLinkDown(pMac, sessionId);
8210 csrRoamIssueWmStatusChange( pMac, sessionId, eCsrDisassociated, pSirMsg );
8211#ifdef WLAN_SOFTAP_FEATURE
8212 if(CSR_IS_INFRA_AP(&pSession->connectedProfile))
8213 {
8214
8215 pRoamInfo = &roamInfo;
8216
8217 pRoamInfo->statusCode = pDisassocInd->statusCode;
8218 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8219
8220 pRoamInfo->staId = (tANI_U8)pDisassocInd->staId;
8221
8222 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDisassocInd->peerMacAddr, sizeof(tSirMacAddr));
8223 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pDisassocInd->bssId, sizeof(tCsrBssid));
8224
8225 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_DISASSOC_IND);
8226 }
8227#endif
8228 }
8229 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008230 case eWNI_SME_DEAUTH_IND:
8231 smsLog( pMac, LOG1, FL("DEAUTHENTICATION Indication from MAC\n"));
8232 pDeauthInd = (tpSirSmeDeauthInd)pSirMsg;
8233 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pDeauthInd->bssId, &sessionId );
8234 if( HAL_STATUS_SUCCESS( status ) )
8235 {
8236 // If we are in neighbor preauth done state then on receiving
8237 // disassoc or deauth we dont roam instead we just disassoc
8238 // from current ap and then go to disconnected state
8239 // This happens for CCX and 11r FT connections ONLY.
8240#ifdef WLAN_FEATURE_VOWIFI_11R
8241 if (csrRoamIs11rAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8242 {
8243 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8244 }
8245#endif
8246#ifdef FEATURE_WLAN_CCX
8247 if (csrRoamIsCCXAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8248 {
8249 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8250 }
8251#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07008252#ifdef FEATURE_WLAN_LFR
8253 if (csrRoamIsFastRoamEnabled(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8254 {
8255 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8256 }
8257#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008258 pSession = CSR_GET_SESSION( pMac, sessionId );
8259
Jeff Johnson32d95a32012-09-10 13:15:23 -07008260 if(!pSession)
8261 {
8262 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8263 return;
8264 }
8265
Jeff Johnson295189b2012-06-20 16:38:30 -07008266 if ( csrIsConnStateInfra( pMac, sessionId ) )
8267 {
8268 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
8269 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008270#ifndef WLAN_MDM_CODE_REDUCTION_OPT
8271 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
8272#endif
8273 csrRoamLinkDown(pMac, sessionId);
8274 csrRoamIssueWmStatusChange( pMac, sessionId, eCsrDeauthenticated, pSirMsg );
8275#ifdef WLAN_SOFTAP_FEATURE
8276 if(CSR_IS_INFRA_AP(&pSession->connectedProfile))
8277 {
8278
8279 pRoamInfo = &roamInfo;
8280
8281 pRoamInfo->statusCode = pDeauthInd->statusCode;
8282 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8283
8284 pRoamInfo->staId = (tANI_U8)pDeauthInd->staId;
8285
8286 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDeauthInd->peerMacAddr, sizeof(tSirMacAddr));
8287 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pDeauthInd->bssId, sizeof(tCsrBssid));
8288
8289 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_DEAUTH_IND);
8290 }
8291#endif
8292 }
8293 break;
8294
8295 case eWNI_SME_SWITCH_CHL_REQ: // in case of STA, the SWITCH_CHANNEL originates from its AP
8296 smsLog( pMac, LOGW, FL("eWNI_SME_SWITCH_CHL_REQ from SME\n"));
8297 pSwitchChnInd = (tpSirSmeSwitchChannelInd)pSirMsg;
8298 //Update with the new channel id.
8299 //The channel id is hidden in the statusCode.
8300 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pSwitchChnInd->bssId, &sessionId );
8301 if( HAL_STATUS_SUCCESS( status ) )
8302 {
8303 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008304 if(!pSession)
8305 {
8306 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8307 return;
8308 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008309 pSession->connectedProfile.operationChannel = (tANI_U8)pSwitchChnInd->newChannelId;
8310 if(pSession->pConnectBssDesc)
8311 {
8312 pSession->pConnectBssDesc->channelId = (tANI_U8)pSwitchChnInd->newChannelId;
8313 }
8314 }
8315 break;
8316
8317 case eWNI_SME_DEAUTH_RSP:
8318 smsLog( pMac, LOGW, FL("eWNI_SME_DEAUTH_RSP from SME\n"));
8319#ifdef WLAN_SOFTAP_FEATURE
8320 {
8321 tSirSmeDeauthRsp* pDeauthRsp = (tSirSmeDeauthRsp *)pSirMsg;
8322 sessionId = pDeauthRsp->sessionId;
8323 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
8324 {
8325 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07008326 if(!pSession)
8327 {
8328 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8329 return;
8330 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008331 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
8332 {
8333 pRoamInfo = &roamInfo;
8334 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8335 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDeauthRsp->peerMacAddr, sizeof(tSirMacAddr));
8336 pRoamInfo->reasonCode = eCSR_ROAM_RESULT_FORCED;
8337 pRoamInfo->statusCode = pDeauthRsp->statusCode;
8338 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
8339 }
8340 }
8341 }
8342#endif
8343 break;
8344
8345 case eWNI_SME_DISASSOC_RSP:
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07008346 /* session id is invalid here so cant use it to access the array curSubstate as index */
8347 smsLog( pMac, LOGW, FL("eWNI_SME_DISASSOC_RSP from SME \n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008348#ifdef WLAN_SOFTAP_FEATURE
8349 {
8350 tSirSmeDisassocRsp *pDisassocRsp = (tSirSmeDisassocRsp *)pSirMsg;
8351 sessionId = pDisassocRsp->sessionId;
8352 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
8353 {
8354 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07008355 if(!pSession)
8356 {
8357 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8358 return;
8359 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008360 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
8361 {
8362 pRoamInfo = &roamInfo;
8363 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8364 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDisassocRsp->peerMacAddr, sizeof(tSirMacAddr));
8365 pRoamInfo->reasonCode = eCSR_ROAM_RESULT_FORCED;
8366 pRoamInfo->statusCode = pDisassocRsp->statusCode;
8367 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
8368 }
8369 }
8370 }
8371#endif
8372 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008373 case eWNI_SME_MIC_FAILURE_IND:
8374 {
8375 tpSirSmeMicFailureInd pMicInd = (tpSirSmeMicFailureInd)pSirMsg;
8376 tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
8377 eCsrRoamResult result = eCSR_ROAM_RESULT_MIC_ERROR_UNICAST;
Jeff Johnson295189b2012-06-20 16:38:30 -07008378#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8379 {
8380 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008381 if(!pSession)
8382 {
8383 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8384 return;
8385 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008386 WLAN_VOS_DIAG_EVENT_DEF(secEvent, vos_event_wlan_security_payload_type);
8387 palZeroMemory(pMac->hHdd, &secEvent, sizeof(vos_event_wlan_security_payload_type));
8388 secEvent.eventId = WLAN_SECURITY_EVENT_MIC_ERROR;
8389 secEvent.encryptionModeMulticast =
8390 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8391 secEvent.encryptionModeUnicast =
8392 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8393 secEvent.authMode =
8394 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8395 palCopyMemory( pMac->hHdd, secEvent.bssid, pSession->connectedProfile.bssid, 6 );
8396 WLAN_VOS_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
8397 }
8398#endif//FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008399 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pMicInd->bssId, &sessionId );
8400 if( HAL_STATUS_SUCCESS( status ) )
8401 {
8402 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
8403 roamInfo.u.pMICFailureInfo = &pMicInd->info;
8404 pRoamInfo = &roamInfo;
8405 if(pMicInd->info.multicast)
8406 {
8407 result = eCSR_ROAM_RESULT_MIC_ERROR_GROUP;
8408 }
8409 else
8410 {
8411 result = eCSR_ROAM_RESULT_MIC_ERROR_UNICAST;
8412 }
8413 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_MIC_ERROR_IND, result);
8414 }
8415 }
8416 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008417#ifdef WLAN_SOFTAP_FEATURE
8418 case eWNI_SME_WPS_PBC_PROBE_REQ_IND:
8419 {
8420 tpSirSmeProbeReqInd pProbeReqInd = (tpSirSmeProbeReqInd)pSirMsg;
8421 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07008422 smsLog( pMac, LOG1, FL("WPS PBC Probe request Indication from SME\n"));
8423
8424 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pProbeReqInd->bssId, &sessionId );
8425 if( HAL_STATUS_SUCCESS( status ) )
8426 {
8427 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
8428 roamInfo.u.pWPSPBCProbeReq = &pProbeReqInd->WPSPBCProbeReq;
8429 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_WPS_PBC_PROBE_REQ_IND,
8430 eCSR_ROAM_RESULT_WPS_PBC_PROBE_REQ_IND);
8431 }
8432 }
8433 break;
8434#endif
8435
Jeff Johnson295189b2012-06-20 16:38:30 -07008436 case eWNI_SME_WM_STATUS_CHANGE_NTF:
8437 pStatusChangeMsg = (tSirSmeWmStatusChangeNtf *)pSirMsg;
8438 switch( pStatusChangeMsg->statusChangeCode )
8439 {
8440 case eSIR_SME_IBSS_ACTIVE:
8441 sessionId = csrFindIbssSession( pMac );
8442 if( CSR_SESSION_ID_INVALID != sessionId )
8443 {
8444 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008445 if(!pSession)
8446 {
8447 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8448 return;
8449 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008450 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_CONNECTED;
8451 if(pSession->pConnectBssDesc)
8452 {
8453 palCopyMemory(pMac->hHdd, &roamInfo.bssid, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
8454 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
8455 pRoamInfo = &roamInfo;
8456 }
8457 else
8458 {
8459 smsLog(pMac, LOGE, " CSR eSIR_SME_IBSS_NEW_PEER connected BSS is empty\n");
8460 }
8461 result = eCSR_ROAM_RESULT_IBSS_CONNECT;
8462 roamStatus = eCSR_ROAM_CONNECT_STATUS_UPDATE;
8463 }
8464 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008465 case eSIR_SME_IBSS_INACTIVE:
8466 sessionId = csrFindIbssSession( pMac );
8467 if( CSR_SESSION_ID_INVALID != sessionId )
8468 {
8469 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008470 if(!pSession)
8471 {
8472 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8473 return;
8474 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008475 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED;
8476 result = eCSR_ROAM_RESULT_IBSS_INACTIVE;
8477 roamStatus = eCSR_ROAM_CONNECT_STATUS_UPDATE;
8478 }
8479 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008480 case eSIR_SME_JOINED_NEW_BSS: // IBSS coalescing.
8481 sessionId = csrFindIbssSession( pMac );
8482 if( CSR_SESSION_ID_INVALID != sessionId )
8483 {
8484 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008485 if(!pSession)
8486 {
8487 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8488 return;
8489 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008490 // update the connection state information
8491 pNewBss = &pStatusChangeMsg->statusChangeInfo.newBssInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07008492#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8493 {
8494 vos_log_ibss_pkt_type *pIbssLog;
8495 tANI_U32 bi;
Jeff Johnson295189b2012-06-20 16:38:30 -07008496 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8497 if(pIbssLog)
8498 {
8499 pIbssLog->eventId = WLAN_IBSS_EVENT_COALESCING;
8500 if(pNewBss)
8501 {
8502 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pNewBss->bssId, 6);
8503 if(pNewBss->ssId.length)
8504 {
8505 palCopyMemory(pMac->hHdd, pIbssLog->ssid, pNewBss->ssId.ssId, pNewBss->ssId.length);
8506 }
8507 pIbssLog->operatingChannel = pNewBss->channelNumber;
8508 }
8509 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &bi)))
8510 {
8511 //***U8 is not enough for beacon interval
8512 pIbssLog->beaconInterval = (v_U8_t)bi;
8513 }
8514 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8515 }
8516 }
8517#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008518 csrRoamUpdateConnectedProfileFromNewBss( pMac, sessionId, pNewBss );
8519 csrRoamIssueSetContextReq( pMac, sessionId, pSession->connectedProfile.EncryptionType,
8520 pSession->pConnectBssDesc,
8521 &Broadcastaddr,
8522 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 );
8523 result = eCSR_ROAM_RESULT_IBSS_COALESCED;
8524 roamStatus = eCSR_ROAM_IBSS_IND;
8525 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pNewBss->bssId, sizeof(tCsrBssid));
8526 pRoamInfo = &roamInfo;
8527 //This BSSID is th ereal BSSID, let's save it
8528 if(pSession->pConnectBssDesc)
8529 {
8530 palCopyMemory(pMac->hHdd, pSession->pConnectBssDesc->bssId, &pNewBss->bssId, sizeof(tCsrBssid));
8531 }
8532 // Stop the join IBSS timer in case of join, for
8533 // genuine merge do nothing
8534 if(pSession->ibss_join_pending)
8535 {
8536 pSession->ibss_join_pending = FALSE;
8537 csrRoamStopIbssJoinTimer(pMac, sessionId);
8538 result = eCSR_ROAM_RESULT_IBSS_JOIN_SUCCESS;
8539 }
8540 }
8541 smsLog(pMac, LOGW, "CSR: eSIR_SME_JOINED_NEW_BSS received from PE\n");
8542 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008543 // detection by LIM that the capabilities of the associated AP have changed.
8544 case eSIR_SME_AP_CAPS_CHANGED:
8545 pApNewCaps = &pStatusChangeMsg->statusChangeInfo.apNewCaps;
8546 smsLog(pMac, LOGW, "CSR handling eSIR_SME_AP_CAPS_CHANGED\n");
8547 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pApNewCaps->bssId, &sessionId );
8548 if( HAL_STATUS_SUCCESS( status ) )
8549 {
8550 csrScanForCapabilityChange( pMac, pApNewCaps );
8551 result = eCSR_ROAM_RESULT_CAP_CHANGED;
8552 roamStatus = eCSR_ROAM_GEN_INFO;
8553 }
8554 break;
8555
8556 default:
8557 roamStatus = eCSR_ROAM_FAILED;
8558 result = eCSR_ROAM_RESULT_NONE;
8559 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008560 } // end switch on statusChangeCode
8561 if(eCSR_ROAM_RESULT_NONE != result)
8562 {
8563 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, roamStatus, result);
8564 }
8565 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008566 case eWNI_SME_IBSS_NEW_PEER_IND:
8567 pIbssPeerInd = (tSmeIbssPeerInd *)pSirMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -07008568#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8569 {
8570 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07008571 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8572 if(pIbssLog)
8573 {
8574 pIbssLog->eventId = WLAN_IBSS_EVENT_PEER_JOIN;
8575 palCopyMemory(pMac->hHdd, pIbssLog->peerMacAddr, &pIbssPeerInd->peerAddr, 6);
8576 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8577 }
8578 }
8579#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008580 sessionId = csrFindIbssSession( pMac );
8581 if( CSR_SESSION_ID_INVALID != sessionId )
8582 {
8583 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008584
8585 if(!pSession)
8586 {
8587 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8588 return;
8589 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008590 // Issue the set Context request to LIM to establish the Unicast STA context for the new peer...
8591 if(pSession->pConnectBssDesc)
8592 {
8593 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
8594 palCopyMemory(pMac->hHdd, &roamInfo.bssid, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
8595 if(pIbssPeerInd->mesgLen > sizeof(tSmeIbssPeerInd))
8596 {
8597 status = palAllocateMemory(pMac->hHdd, (void **)&roamInfo.pbFrames,
8598 (pIbssPeerInd->mesgLen - sizeof(tSmeIbssPeerInd)));
8599 if(HAL_STATUS_SUCCESS(status))
8600 {
8601 roamInfo.nBeaconLength = (pIbssPeerInd->mesgLen - sizeof(tSmeIbssPeerInd));
8602 palCopyMemory(pMac->hHdd, roamInfo.pbFrames, ((tANI_U8 *)pIbssPeerInd) + sizeof(tSmeIbssPeerInd),
8603 roamInfo.nBeaconLength);
8604 }
8605 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
8606 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
8607 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
8608 status = palAllocateMemory(pMac->hHdd, (void **)&roamInfo.pBssDesc,
8609 pSession->pConnectBssDesc->length);
8610 if(HAL_STATUS_SUCCESS(status))
8611 {
8612 palCopyMemory(pMac->hHdd, roamInfo.pBssDesc, pSession->pConnectBssDesc,
8613 pSession->pConnectBssDesc->length);
8614 }
8615 if(HAL_STATUS_SUCCESS(status))
8616 {
8617 pRoamInfo = &roamInfo;
8618 }
8619 else
8620 {
8621 if(roamInfo.pbFrames)
8622 {
8623 palFreeMemory(pMac->hHdd, roamInfo.pbFrames);
8624 }
8625 if(roamInfo.pBssDesc)
8626 {
8627 palFreeMemory(pMac->hHdd, roamInfo.pBssDesc);
8628 }
8629 }
8630 }
8631 else
8632 {
8633 pRoamInfo = &roamInfo;
8634 }
8635 csrRoamIssueSetContextReq( pMac, sessionId, pSession->connectedProfile.EncryptionType,
8636 pSession->pConnectBssDesc,
8637 &(pIbssPeerInd->peerAddr),
8638 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
8639 }
8640 else
8641 {
8642 smsLog(pMac, LOGW, " CSR eSIR_SME_IBSS_NEW_PEER connected BSS is empty\n");
8643 }
8644 //send up the sec type for the new peer
8645 if (pRoamInfo)
8646 {
8647 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8648 }
8649 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0,
8650 eCSR_ROAM_CONNECT_STATUS_UPDATE, eCSR_ROAM_RESULT_IBSS_NEW_PEER);
8651 if(pRoamInfo)
8652 {
8653 if(roamInfo.pbFrames)
8654 {
8655 palFreeMemory(pMac->hHdd, roamInfo.pbFrames);
8656 }
8657 if(roamInfo.pBssDesc)
8658 {
8659 palFreeMemory(pMac->hHdd, roamInfo.pBssDesc);
8660 }
8661 }
8662 }
8663 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008664 case eWNI_SME_IBSS_PEER_DEPARTED_IND:
8665 pIbssPeerInd = (tSmeIbssPeerInd*)pSirMsg;
8666 sessionId = csrFindIbssSession( pMac );
8667 if( CSR_SESSION_ID_INVALID != sessionId )
8668 {
Jeff Johnson295189b2012-06-20 16:38:30 -07008669#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8670 {
8671 vos_log_ibss_pkt_type *pIbssLog;
8672
8673 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8674 if(pIbssLog)
8675 {
8676 pIbssLog->eventId = WLAN_IBSS_EVENT_PEER_LEAVE;
8677 if(pIbssPeerInd)
8678 {
8679 palCopyMemory(pMac->hHdd, pIbssLog->peerMacAddr, &pIbssPeerInd->peerAddr, 6);
8680 }
8681 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8682 }
8683 }
8684#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008685 smsLog(pMac, LOGW, "CSR: Peer departed notification from LIM\n");
8686 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
8687 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
8688 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
8689 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
8690 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
8691 eCSR_ROAM_CONNECT_STATUS_UPDATE, eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
8692 }
8693 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008694 case eWNI_SME_SETCONTEXT_RSP:
8695 {
8696 tSirSmeSetContextRsp *pRsp = (tSirSmeSetContextRsp *)pSirMsg;
8697 tListElem *pEntry;
8698 tSmeCmd *pCommand;
8699
8700 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
8701 if ( pEntry )
8702 {
8703 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
8704 if ( eSmeCommandSetKey == pCommand->command )
8705 {
8706 sessionId = pCommand->sessionId;
8707 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008708
8709 if(!pSession)
8710 {
8711 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8712 return;
8713 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008714
8715#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8716 if(eCSR_ENCRYPT_TYPE_NONE != pSession->connectedProfile.EncryptionType)
8717 {
8718 WLAN_VOS_DIAG_EVENT_DEF(setKeyEvent, vos_event_wlan_security_payload_type);
8719 palZeroMemory(pMac->hHdd, &setKeyEvent, sizeof(vos_event_wlan_security_payload_type));
8720 if( pRsp->peerMacAddr[0] & 0x01 )
8721 {
8722 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_RSP;
8723 }
8724 else
8725 {
8726 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_RSP;
8727 }
8728 setKeyEvent.encryptionModeMulticast =
8729 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8730 setKeyEvent.encryptionModeUnicast =
8731 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8732 palCopyMemory( pMac->hHdd, setKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
8733 setKeyEvent.authMode =
8734 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8735 if( eSIR_SUCCESS != pRsp->statusCode )
8736 {
8737 setKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
8738 }
8739 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
8740 }
8741#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
8742 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId) )
8743 {
8744 //We are done with authentication, whethere succeed or not
8745 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
8746
8747 csrRoamStopWaitForKeyTimer( pMac );
8748 //We do it here because this linkup function is not called after association
8749 //when a key needs to be set.
8750 if( csrIsConnStateConnectedInfra(pMac, sessionId) )
8751 {
8752 csrRoamLinkUp(pMac, pSession->connectedProfile.bssid);
8753 }
8754 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008755 if( eSIR_SME_SUCCESS == pRsp->statusCode )
Jeff Johnson295189b2012-06-20 16:38:30 -07008756 {
8757 palCopyMemory( pMac, &roamInfo.peerMac, &pRsp->peerMacAddr, sizeof(tCsrBssid) );
Jeff Johnsone7245742012-09-05 17:12:55 -07008758 //Make sure we install the GTK before indicating to HDD as authenticated
8759 //This is to prevent broadcast packets go out after PTK and before GTK.
8760 if( palEqualMemory( pMac->hHdd, &Broadcastaddr, pRsp->peerMacAddr,
8761 sizeof(tSirMacAddr) ) )
8762 {
8763 result = eCSR_ROAM_RESULT_AUTHENTICATED;
8764 }
8765 else
8766 {
8767 result = eCSR_ROAM_RESULT_NONE;
8768 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008769 pRoamInfo = &roamInfo;
8770 }
8771 else
8772 {
8773 result = eCSR_ROAM_RESULT_FAILURE;
8774 smsLog( pMac, LOGE, "CSR: Roam Completion setkey command failed(%d) PeerMac %02X-%02X-%02X-%02X-%02X-%02X...\n",
8775 pRsp->statusCode, pRsp->peerMacAddr[0], pRsp->peerMacAddr[1], pRsp->peerMacAddr[2],
8776 pRsp->peerMacAddr[3], pRsp->peerMacAddr[4], pRsp->peerMacAddr[5] );
8777 }
8778 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.setKeyCmd.roamId,
8779 eCSR_ROAM_SET_KEY_COMPLETE, result);
Jeff Johnson295189b2012-06-20 16:38:30 -07008780 // Indicate SME_QOS that the SET_KEY is completed, so that SME_QOS
8781 // can go ahead and initiate the TSPEC if any are pending
8782 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_SET_KEY_SUCCESS_IND, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -07008783#ifdef FEATURE_WLAN_CCX
8784 //Send Adjacent AP repot to new AP.
8785 if (result == eCSR_ROAM_RESULT_AUTHENTICATED &&
8786 pSession->isPrevApInfoValid &&
8787 pSession->connectedProfile.isCCXAssoc)
8788 {
8789#ifdef WLAN_FEATURE_VOWIFI
8790 csrCcxSendAdjacentApRepMsg(pMac, pSession);
8791#endif
8792 pSession->isPrevApInfoValid = FALSE;
8793 }
8794#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008795 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
8796 {
8797 csrReleaseCommandSetKey( pMac, pCommand );
8798 }
8799 }
8800 else
8801 {
8802 smsLog( pMac, LOGE, "CSR: Roam Completion called but setkey command is not ACTIVE ...\n" );
8803 }
8804 }
8805 else
8806 {
8807 smsLog( pMac, LOGE, "CSR: SetKey Completion called but NO commands are ACTIVE ...\n" );
8808 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008809 smeProcessPendingQueue( pMac );
8810 }
8811 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008812 case eWNI_SME_REMOVEKEY_RSP:
8813 {
8814 tSirSmeRemoveKeyRsp *pRsp = (tSirSmeRemoveKeyRsp *)pSirMsg;
8815 tListElem *pEntry;
8816 tSmeCmd *pCommand;
8817
8818 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
8819 if ( pEntry )
8820 {
8821 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
8822 if ( eSmeCommandRemoveKey == pCommand->command )
8823 {
8824 sessionId = pCommand->sessionId;
8825 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008826
8827 if(!pSession)
8828 {
8829 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8830 return;
8831 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008832#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8833 {
8834 WLAN_VOS_DIAG_EVENT_DEF(removeKeyEvent, vos_event_wlan_security_payload_type);
8835 palZeroMemory(pMac->hHdd, &removeKeyEvent, sizeof(vos_event_wlan_security_payload_type));
8836 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_RSP;
8837 removeKeyEvent.encryptionModeMulticast =
8838 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8839 removeKeyEvent.encryptionModeUnicast =
8840 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8841 palCopyMemory( pMac->hHdd, removeKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
8842 removeKeyEvent.authMode =
8843 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8844 if( eSIR_SUCCESS != pRsp->statusCode )
8845 {
8846 removeKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
8847 }
8848 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
8849 }
8850#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson43971f52012-07-17 12:26:56 -07008851 if( eSIR_SME_SUCCESS == pRsp->statusCode )
Jeff Johnson295189b2012-06-20 16:38:30 -07008852 {
8853 palCopyMemory( pMac, &roamInfo.peerMac, &pRsp->peerMacAddr, sizeof(tCsrBssid) );
8854 result = eCSR_ROAM_RESULT_NONE;
8855 pRoamInfo = &roamInfo;
8856 }
8857 else
8858 {
8859 result = eCSR_ROAM_RESULT_FAILURE;
8860 }
8861 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.setKeyCmd.roamId,
8862 eCSR_ROAM_REMOVE_KEY_COMPLETE, result);
8863 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
8864 {
8865 csrReleaseCommandRemoveKey( pMac, pCommand );
8866 }
8867 }
8868 else
8869 {
8870 smsLog( pMac, LOGW, "CSR: Roam Completion called but setkey command is not ACTIVE ...\n" );
8871 }
8872 }
8873 else
8874 {
8875 smsLog( pMac, LOGW, "CSR: SetKey Completion called but NO commands are ACTIVE ...\n" );
8876 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008877 smeProcessPendingQueue( pMac );
8878 }
8879 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008880 case eWNI_SME_GET_STATISTICS_RSP:
Mohit Khanna23863762012-09-11 17:40:09 -07008881 smsLog( pMac, LOG2, FL("Stats rsp from PE\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008882 csrRoamStatsRspProcessor( pMac, pSirMsg );
8883 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008884 case eWNI_SME_GET_RSSI_REQ:
Mohit Khanna23863762012-09-11 17:40:09 -07008885 smsLog( pMac, LOG2, FL("GetRssiReq from self\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008886 csrUpdateRssi( pMac, pSirMsg );
8887 break;
8888
Jeff Johnson295189b2012-06-20 16:38:30 -07008889#ifdef WLAN_FEATURE_VOWIFI_11R
8890 case eWNI_SME_FT_PRE_AUTH_RSP:
8891 csrRoamFTPreAuthRspProcessor( pMac, (tpSirFTPreAuthRsp)pSirMsg );
8892 break;
8893#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008894 case eWNI_SME_MAX_ASSOC_EXCEEDED:
8895 pSmeMaxAssocInd = (tSmeMaxAssocInd*)pSirMsg;
8896 smsLog( pMac, LOG1, FL("send indication that max assoc have been reached and the new peer cannot be accepted\n"));
8897 sessionId = pSmeMaxAssocInd->sessionId;
8898 roamInfo.sessionId = sessionId;
8899 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pSmeMaxAssocInd->peerMac, sizeof(tCsrBssid));
8900 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
8901 eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_MAX_ASSOC_EXCEEDED);
8902 break;
8903
8904 case eWNI_SME_BTAMP_LOG_LINK_IND:
8905 smsLog( pMac, LOG1, FL("Establish logical link req from HCI serialized through MC thread\n"));
8906 btampEstablishLogLinkHdlr( pSirMsg );
8907 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07008908 case eWNI_SME_RSSI_IND:
8909 smsLog( pMac, LOG1, FL("RSSI indication from TL serialized through MC thread\n"));
8910 csrRoamRssiIndHdlr( pMac, pSirMsg );
8911 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008912
8913 default:
8914 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008915 } // end switch on message type
Jeff Johnson295189b2012-06-20 16:38:30 -07008916}
8917
Jeff Johnson295189b2012-06-20 16:38:30 -07008918void csrCallRoamingCompletionCallback(tpAniSirGlobal pMac, tCsrRoamSession *pSession,
8919 tCsrRoamInfo *pRoamInfo, tANI_U32 roamId, eCsrRoamResult roamResult)
8920{
8921 if(pSession)
8922 {
8923 if(pSession->bRefAssocStartCnt)
8924 {
8925 pSession->bRefAssocStartCnt--;
8926 VOS_ASSERT( pSession->bRefAssocStartCnt == 0);
8927 //Need to call association_completion because there is an assoc_start pending.
8928 csrRoamCallCallback(pMac, pSession->sessionId, NULL, roamId,
8929 eCSR_ROAM_ASSOCIATION_COMPLETION,
8930 eCSR_ROAM_RESULT_FAILURE);
8931 }
8932 csrRoamCallCallback(pMac, pSession->sessionId, pRoamInfo, roamId, eCSR_ROAM_ROAMING_COMPLETION, roamResult);
8933 }
8934 else
8935 {
8936 smsLog(pMac, LOGW, FL(" pSession is NULL"));
8937 }
8938}
8939
8940
8941eHalStatus csrRoamStartRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamingReason roamingReason)
8942{
8943 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07008944 if(CSR_IS_LOSTLINK_ROAMING(roamingReason) &&
8945 (eANI_BOOLEAN_FALSE == pMac->roam.roamSession[sessionId].fCancelRoaming))
8946 {
8947 status = csrScanRequestLostLink1( pMac, sessionId );
8948 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008949 return(status);
8950}
8951
Jeff Johnson295189b2012-06-20 16:38:30 -07008952//return a boolean to indicate whether roaming completed or continue.
8953tANI_BOOLEAN csrRoamCompleteRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId,
8954 tANI_BOOLEAN fForce, eCsrRoamResult roamResult)
8955{
8956 tANI_BOOLEAN fCompleted = eANI_BOOLEAN_TRUE;
8957 tANI_TIMESTAMP roamTime = (tANI_TIMESTAMP)(pMac->roam.configParam.nRoamingTime * PAL_TICKS_PER_SECOND);
8958 tANI_TIMESTAMP curTime = (tANI_TIMESTAMP)palGetTickCount(pMac->hHdd);
8959 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07008960 if(!pSession)
8961 {
8962 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8963 return eANI_BOOLEAN_FALSE;
8964 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008965 //Check whether time is up
8966 if(pSession->fCancelRoaming || fForce ||
8967 ((curTime - pSession->roamingStartTime) > roamTime) ||
8968 eCsrReassocRoaming == pSession->roamingReason ||
8969 eCsrDynamicRoaming == pSession->roamingReason)
8970 {
8971 smsLog(pMac, LOGW, FL(" indicates roaming completion\n"));
8972 if(pSession->fCancelRoaming && CSR_IS_LOSTLINK_ROAMING(pSession->roamingReason))
8973 {
8974 //roaming is cancelled, tell HDD to indicate disconnect
8975 //Because LIM overload deauth_ind for both deauth frame and missed beacon
8976 //we need to use this logic to detinguish it. For missed beacon, LIM set reason
8977 //to be eSIR_BEACON_MISSED
8978 if(eSIR_BEACON_MISSED == pSession->roamingStatusCode)
8979 {
8980 roamResult = eCSR_ROAM_RESULT_LOSTLINK;
8981 }
8982 else if(eCsrLostlinkRoamingDisassoc == pSession->roamingReason)
8983 {
8984 roamResult = eCSR_ROAM_RESULT_DISASSOC_IND;
8985 }
8986 else if(eCsrLostlinkRoamingDeauth == pSession->roamingReason)
8987 {
8988 roamResult = eCSR_ROAM_RESULT_DEAUTH_IND;
8989 }
8990 else
8991 {
8992 roamResult = eCSR_ROAM_RESULT_LOSTLINK;
8993 }
8994 }
8995 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, roamResult);
8996 pSession->roamingReason = eCsrNotRoaming;
8997 }
8998 else
8999 {
9000 pSession->roamResult = roamResult;
9001 if(!HAL_STATUS_SUCCESS(csrRoamStartRoamingTimer(pMac, sessionId, PAL_TIMER_TO_SEC_UNIT)))
9002 {
9003 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, roamResult);
9004 pSession->roamingReason = eCsrNotRoaming;
9005 }
9006 else
9007 {
9008 fCompleted = eANI_BOOLEAN_FALSE;
9009 }
9010 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009011 return(fCompleted);
9012}
9013
Jeff Johnson295189b2012-06-20 16:38:30 -07009014void csrRoamCancelRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId)
9015{
9016 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009017
9018 if(!pSession)
9019 {
9020 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9021 return;
9022 }
9023
Jeff Johnson295189b2012-06-20 16:38:30 -07009024 if(CSR_IS_ROAMING(pSession))
9025 {
9026 smsLog(pMac, LOGW, " Cancelling roaming\n");
9027 pSession->fCancelRoaming = eANI_BOOLEAN_TRUE;
9028 if(CSR_IS_ROAM_JOINING(pMac, sessionId) && CSR_IS_ROAM_SUBSTATE_CONFIG(pMac, sessionId))
9029 {
9030 //No need to do anything in here because the handler takes care of it
9031 }
9032 else
9033 {
9034 eCsrRoamResult roamResult = CSR_IS_LOSTLINK_ROAMING(pSession->roamingReason) ?
9035 eCSR_ROAM_RESULT_LOSTLINK : eCSR_ROAM_RESULT_NONE;
9036 //Roaming is stopped after here
9037 csrRoamCompleteRoaming(pMac, sessionId, eANI_BOOLEAN_TRUE, roamResult);
9038 //Since CSR may be in lostlink roaming situation, abort all roaming related activities
9039 csrScanAbortMacScan(pMac);
9040 csrRoamStopRoamingTimer(pMac, sessionId);
9041 }
9042 }
9043}
9044
Jeff Johnson295189b2012-06-20 16:38:30 -07009045void csrRoamRoamingTimerHandler(void *pv)
9046{
9047 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
9048 tpAniSirGlobal pMac = pInfo->pMac;
9049 tANI_U32 sessionId = pInfo->sessionId;
9050 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009051
9052 if(!pSession)
9053 {
9054 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9055 return;
9056 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009057
9058 if(eANI_BOOLEAN_FALSE == pSession->fCancelRoaming)
9059 {
9060 if(!HAL_STATUS_SUCCESS(csrRoamStartRoaming(pMac, sessionId, pSession->roamingReason)))
9061 {
9062 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, pSession->roamResult);
9063 pSession->roamingReason = eCsrNotRoaming;
9064 }
9065 }
9066}
9067
Jeff Johnson295189b2012-06-20 16:38:30 -07009068eHalStatus csrRoamStartRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
9069{
9070 eHalStatus status;
9071 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009072
9073 if(!pSession)
9074 {
9075 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9076 return eHAL_STATUS_FAILURE;
9077 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009078
9079 smsLog(pMac, LOG1, " csrScanStartRoamingTimer \n ");
9080 pSession->roamingTimerInfo.sessionId = (tANI_U8)sessionId;
9081 status = palTimerStart(pMac->hHdd, pSession->hTimerRoaming, interval, eANI_BOOLEAN_FALSE);
9082
9083 return (status);
9084}
9085
Jeff Johnson295189b2012-06-20 16:38:30 -07009086eHalStatus csrRoamStopRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
9087{
9088 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerRoaming));
9089}
9090
Jeff Johnson295189b2012-06-20 16:38:30 -07009091void csrRoamWaitForKeyTimeOutHandler(void *pv)
9092{
9093 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
9094 tpAniSirGlobal pMac = pInfo->pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -07009095 if( CSR_IS_WAIT_FOR_KEY( pMac, pInfo->sessionId ) )
9096 {
9097 smsLog(pMac, LOGW, " SME pre-auth state timeout. \n ");
9098 //Change the substate so command queue is unblocked.
9099 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, pInfo->sessionId);
9100 }
9101
9102}
9103
Jeff Johnson295189b2012-06-20 16:38:30 -07009104eHalStatus csrRoamStartWaitForKeyTimer(tpAniSirGlobal pMac, tANI_U32 interval)
9105{
9106 eHalStatus status;
9107
9108 smsLog(pMac, LOG1, " csrScanStartWaitForKeyTimer \n ");
9109 status = palTimerStart(pMac->hHdd, pMac->roam.hTimerWaitForKey, interval, eANI_BOOLEAN_FALSE);
9110
9111 return (status);
9112}
9113
Jeff Johnson295189b2012-06-20 16:38:30 -07009114eHalStatus csrRoamStopWaitForKeyTimer(tpAniSirGlobal pMac)
9115{
9116 return (palTimerStop(pMac->hHdd, pMac->roam.hTimerWaitForKey));
9117}
9118
Jeff Johnson295189b2012-06-20 16:38:30 -07009119void csrRoamIbssJoinTimerHandler(void *pv)
9120{
9121 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
9122 tpAniSirGlobal pMac = pInfo->pMac;
9123 eCsrRoamDisconnectReason reason = eCSR_DISCONNECT_REASON_IBSS_JOIN_FAILURE;
9124 tANI_U32 sessionId = pInfo->sessionId;
9125 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009126
9127 if(!pSession)
9128 {
9129 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9130 return;
9131 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009132
9133 pSession->ibss_join_pending = FALSE;
9134 // JEZ100225: As of main/latest "tip", we are no longer doing this. Check on this.
9135 //csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_IBS_IND, eCSR_ROAM_RESULT_IBSS_JOIN_FAILED);
9136 // Send an IBSS stop request to PE
9137 csrRoamDisconnectInternal(pMac, sessionId, reason);
Jeff Johnson295189b2012-06-20 16:38:30 -07009138}
Jeff Johnson295189b2012-06-20 16:38:30 -07009139eHalStatus csrRoamStartIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
9140{
9141 eHalStatus status;
9142 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009143
9144 if(!pSession)
9145 {
9146 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9147 return eHAL_STATUS_FAILURE;
9148 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009149
9150 smsLog(pMac, LOG1, " csrRoamStartIbssJoinTimer \n ");
9151 pSession->ibssJoinTimerInfo.sessionId = (tANI_U8)sessionId;
9152 status = palTimerStart(pMac->hHdd, pSession->hTimerIbssJoining, interval, eANI_BOOLEAN_FALSE);
9153
9154 return (status);
9155}
Jeff Johnson295189b2012-06-20 16:38:30 -07009156eHalStatus csrRoamStopIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
9157{
9158 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerIbssJoining));
9159}
Jeff Johnson295189b2012-06-20 16:38:30 -07009160void csrRoamCompletion(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamInfo *pRoamInfo, tSmeCmd *pCommand,
9161 eCsrRoamResult roamResult, tANI_BOOLEAN fSuccess)
9162{
9163 eRoamCmdStatus roamStatus = csrGetRoamCompleteStatus(pMac, sessionId);
9164 tANI_U32 roamId = 0;
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009165 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
9166 /* To silence the KW tool Null chaeck is added */
9167 if(!pSession)
9168 {
9169 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9170 return;
9171 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009172
9173 if(pCommand)
9174 {
9175 roamId = pCommand->u.roamCmd.roamId;
9176#if defined(VOSS_ENABLED)
9177 VOS_ASSERT( sessionId == pCommand->sessionId );
9178#endif
9179 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009180 if(eCSR_ROAM_ROAMING_COMPLETION == roamStatus)
9181 {
9182 //if success, force roaming completion
9183 csrRoamCompleteRoaming(pMac, sessionId, fSuccess, roamResult);
9184 }
9185 else
9186 {
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009187 VOS_ASSERT(pSession->bRefAssocStartCnt == 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07009188 smsLog(pMac, LOGW, FL(" indicates association completion. roamResult = %d\n"), roamResult);
9189 csrRoamCallCallback(pMac, sessionId, pRoamInfo, roamId, roamStatus, roamResult);
9190 }
9191}
9192
Jeff Johnson295189b2012-06-20 16:38:30 -07009193eHalStatus csrRoamLostLink( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 type, tSirSmeRsp *pSirMsg)
9194{
9195 eHalStatus status = eHAL_STATUS_SUCCESS;
9196 tSirSmeDeauthInd *pDeauthIndMsg = NULL;
9197 tSirSmeDisassocInd *pDisassocIndMsg = NULL;
9198 eCsrRoamResult result = eCSR_ROAM_RESULT_LOSTLINK;
9199 tCsrRoamInfo *pRoamInfo = NULL;
9200 tCsrRoamInfo roamInfo;
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009201 tANI_BOOLEAN fToRoam;
Jeff Johnson295189b2012-06-20 16:38:30 -07009202 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009203 /* To silence the KW tool Null chaeck is added */
9204 if(!pSession)
9205 {
9206 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9207 return eHAL_STATUS_FAILURE;
9208 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009209 //Only need to roam for infra station. In this case P2P client will roam as well
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009210 fToRoam = CSR_IS_INFRASTRUCTURE(&pSession->connectedProfile);
Jeff Johnson295189b2012-06-20 16:38:30 -07009211 pSession->fCancelRoaming = eANI_BOOLEAN_FALSE;
9212 if ( eWNI_SME_DISASSOC_IND == type )
9213 {
9214 result = eCSR_ROAM_RESULT_DISASSOC_IND;
9215 pDisassocIndMsg = (tSirSmeDisassocInd *)pSirMsg;
9216 pSession->roamingStatusCode = pDisassocIndMsg->statusCode;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009217 pSession->joinFailStatusCode.reasonCode = pDisassocIndMsg->reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009218 }
9219 else if ( eWNI_SME_DEAUTH_IND == type )
9220 {
9221 result = eCSR_ROAM_RESULT_DEAUTH_IND;
9222 pDeauthIndMsg = (tSirSmeDeauthInd *)pSirMsg;
9223 pSession->roamingStatusCode = pDeauthIndMsg->statusCode;
Madan Mohan Koyyalamudi6a808932012-11-06 16:05:54 -08009224 /* Convert into proper reason code */
9225 pSession->joinFailStatusCode.reasonCode =
9226 (pDeauthIndMsg->reasonCode == eSIR_BEACON_MISSED) ?
9227 eSIR_MAC_DISASSOC_LEAVING_BSS_REASON : pDeauthIndMsg->reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009228 }
9229 else
9230 {
9231 smsLog(pMac, LOGW, FL("gets an unknown type (%d)\n"), type);
9232 result = eCSR_ROAM_RESULT_NONE;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009233 pSession->joinFailStatusCode.reasonCode = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07009234 }
9235
9236 // call profile lost link routine here
9237#ifdef WLAN_SOFTAP_FEATURE
9238 if(!CSR_IS_INFRA_AP(&pSession->connectedProfile))
9239#endif
9240 {
9241 csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_LOSTLINK_DETECTED, result);
9242 }
9243
9244 if ( eWNI_SME_DISASSOC_IND == type )
9245 {
9246 status = csrSendMBDisassocCnfMsg(pMac, pDisassocIndMsg);
9247 }
9248 else if ( eWNI_SME_DEAUTH_IND == type )
9249 {
9250 status = csrSendMBDeauthCnfMsg(pMac, pDeauthIndMsg);
9251 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009252 if(!HAL_STATUS_SUCCESS(status))
9253 {
9254 //If fail to send confirmation to PE, not to trigger roaming
9255 fToRoam = eANI_BOOLEAN_FALSE;
9256 }
9257
9258 //tell HDD to disconnect
9259 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
9260 roamInfo.statusCode = (tSirResultCodes)pSession->roamingStatusCode;
9261 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
9262#ifdef WLAN_SOFTAP_FEATURE
9263 if( eWNI_SME_DISASSOC_IND == type)
9264 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009265 //staMacAddr
9266 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDisassocIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9267 roamInfo.staId = (tANI_U8)pDisassocIndMsg->staId;
9268 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009269 else if( eWNI_SME_DEAUTH_IND == type )
9270 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009271 //staMacAddr
9272 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDeauthIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9273 roamInfo.staId = (tANI_U8)pDeauthIndMsg->staId;
9274 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009275#endif
9276 smsLog(pMac, LOGW, FL("roamInfo.staId (%d)\n"), roamInfo.staId);
Jeff Johnson295189b2012-06-20 16:38:30 -07009277 if(fToRoam)
9278 {
Madan Mohan Koyyalamudiaf854cf2012-10-30 17:56:25 -07009279 //Tell HDD about the lost link
9280 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_LOSTLINK, result);
Jeff Johnson295189b2012-06-20 16:38:30 -07009281 //Only remove the connected BSS in infrastructure mode
9282 csrRoamRemoveConnectedBssFromScanCache(pMac, &pSession->connectedProfile);
9283 //Not to do anying for lostlink with WDS
9284 if( pMac->roam.configParam.nRoamingTime )
9285 {
9286 if(HAL_STATUS_SUCCESS(status = csrRoamStartRoaming(pMac, sessionId,
9287 ( eWNI_SME_DEAUTH_IND == type ) ?
9288 eCsrLostlinkRoamingDeauth : eCsrLostlinkRoamingDisassoc)))
9289 {
9290 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
9291 //For IBSS, we need to give some more info to HDD
9292 if(csrIsBssTypeIBSS(pSession->connectedProfile.BSSType))
9293 {
9294 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
9295 roamInfo.statusCode = (tSirResultCodes)pSession->roamingStatusCode;
9296 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
9297 }
9298 else
9299 {
9300 roamInfo.reasonCode = eCsrRoamReasonSmeIssuedForLostLink;
9301 }
Jeff Johnsone7245742012-09-05 17:12:55 -07009302 pRoamInfo = &roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07009303 pSession->roamingReason = ( eWNI_SME_DEAUTH_IND == type ) ?
9304 eCsrLostlinkRoamingDeauth : eCsrLostlinkRoamingDisassoc;
9305 pSession->roamingStartTime = (tANI_TIMESTAMP)palGetTickCount(pMac->hHdd);
9306 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_LOSTLINK);
9307 }
9308 else
9309 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07009310 smsLog(pMac, LOGW, " %s Fail to start roaming, status = %d", __func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07009311 fToRoam = eANI_BOOLEAN_FALSE;
9312 }
9313 }
9314 else
9315 {
9316 //We are told not to roam, indicate lostlink
9317 fToRoam = eANI_BOOLEAN_FALSE;
9318 }
9319 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009320 if(!fToRoam)
9321 {
9322 if( eWNI_SME_DISASSOC_IND == type)
9323 {
9324 //staMacAddr
9325 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDisassocIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9326 roamInfo.staId = (tANI_U8)pDisassocIndMsg->staId;
9327 }
9328 else if( eWNI_SME_DEAUTH_IND == type )
9329 {
9330 //staMacAddr
9331 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDeauthIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9332 roamInfo.staId = (tANI_U8)pDeauthIndMsg->staId;
9333 }
Madan Mohan Koyyalamudiaf854cf2012-10-30 17:56:25 -07009334 //Tell HDD about the lost link
Jeff Johnson295189b2012-06-20 16:38:30 -07009335 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_LOSTLINK, result);
9336
9337 /*No need to start idle scan in case of IBSS/SAP
9338 Still enable idle scan for polling in case concurrent sessions are running */
9339 if(CSR_IS_INFRASTRUCTURE(&pSession->connectedProfile))
9340 {
9341 csrScanStartIdleScan(pMac);
9342 }
9343 }
9344
9345 return (status);
9346}
9347
Jeff Johnson295189b2012-06-20 16:38:30 -07009348eHalStatus csrRoamLostLinkAfterhandoffFailure( tpAniSirGlobal pMac,tANI_U32 sessionId)
9349{
9350 eHalStatus status = eHAL_STATUS_SUCCESS;
9351 tListElem *pEntry = NULL;
9352 tSmeCmd *pCommand = NULL;
9353 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009354
9355 if(!pSession)
9356 {
9357 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9358 return eHAL_STATUS_FAILURE;
9359 }
9360
Jeff Johnson295189b2012-06-20 16:38:30 -07009361 pSession->fCancelRoaming = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07009362 //Only remove the connected BSS in infrastructure mode
9363 csrRoamRemoveConnectedBssFromScanCache(pMac, &pSession->connectedProfile);
9364 if(pMac->roam.configParam.nRoamingTime)
9365 {
9366 if(HAL_STATUS_SUCCESS(status = csrRoamStartRoaming(pMac,sessionId, pSession->roamingReason)))
9367 {
9368 //before starting the lost link logic release the roam command for handoff
9369 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
9370 if(pEntry)
9371 {
9372 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
9373 }
9374 if(pCommand)
9375 {
9376 if (( eSmeCommandRoam == pCommand->command ) &&
9377 ( eCsrSmeIssuedAssocToSimilarAP == pCommand->u.roamCmd.roamReason))
9378 {
9379 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
9380 {
9381 csrReleaseCommandRoam( pMac, pCommand );
9382 }
9383 }
9384 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009385 smsLog( pMac, LOGW, "Lost link roaming started ...\n");
9386 }
9387 }
9388 else
9389 {
9390 //We are told not to roam, indicate lostlink
9391 status = eHAL_STATUS_FAILURE;
9392 }
9393
9394 return (status);
9395}
Jeff Johnson295189b2012-06-20 16:38:30 -07009396void csrRoamWmStatusChangeComplete( tpAniSirGlobal pMac )
9397{
9398 tListElem *pEntry;
9399 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07009400 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
9401 if ( pEntry )
9402 {
9403 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
9404 if ( eSmeCommandWmStatusChange == pCommand->command )
9405 {
9406 // Nothing to process in a Lost Link completion.... It just kicks off a
9407 // roaming sequence.
9408 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
9409 {
9410 csrReleaseCommandWmStatusChange( pMac, pCommand );
9411 }
9412 else
9413 {
9414 smsLog( pMac, LOGE, " ******csrRoamWmStatusChangeComplete fail to release command\n");
9415 }
9416
9417 }
9418 else
9419 {
9420 smsLog( pMac, LOGW, "CSR: WmStatusChange Completion called but LOST LINK command is not ACTIVE ...\n" );
9421 }
9422 }
9423 else
9424 {
9425 smsLog( pMac, LOGW, "CSR: WmStatusChange Completion called but NO commands are ACTIVE ...\n" );
9426 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009427 smeProcessPendingQueue( pMac );
9428}
9429
Jeff Johnson295189b2012-06-20 16:38:30 -07009430void csrRoamProcessWmStatusChangeCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
9431{
9432 eHalStatus status = eHAL_STATUS_FAILURE;
9433 tSirSmeRsp *pSirSmeMsg;
9434 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pCommand->sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009435
9436 if(!pSession)
9437 {
9438 smsLog(pMac, LOGE, FL(" session %d not found "), pCommand->sessionId);
9439 return;
9440 }
9441
Jeff Johnson295189b2012-06-20 16:38:30 -07009442 switch ( pCommand->u.wmStatusChangeCmd.Type )
9443 {
9444 case eCsrDisassociated:
9445 pSirSmeMsg = (tSirSmeRsp *)&pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg;
9446 status = csrRoamLostLink(pMac, pCommand->sessionId, eWNI_SME_DISASSOC_IND, pSirSmeMsg);
9447 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009448 case eCsrDeauthenticated:
9449 pSirSmeMsg = (tSirSmeRsp *)&pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg;
9450 status = csrRoamLostLink(pMac, pCommand->sessionId, eWNI_SME_DEAUTH_IND, pSirSmeMsg);
9451 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009452 default:
9453 smsLog(pMac, LOGW, FL("gets an unknown command %d\n"), pCommand->u.wmStatusChangeCmd.Type);
9454 break;
9455 }
9456 //For WDS, we want to stop BSS as well when it is indicated that it is disconnected.
9457 if( CSR_IS_CONN_WDS(&pSession->connectedProfile) )
9458 {
9459 if( !HAL_STATUS_SUCCESS(csrRoamIssueStopBssCmd( pMac, pCommand->sessionId, eANI_BOOLEAN_TRUE )) )
9460 {
9461 //This is not good
9462 smsLog(pMac, LOGE, FL(" failed to issue stopBSS command\n"));
9463 }
9464 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009465 // Lost Link just triggers a roaming sequence. We can complte the Lost Link
9466 // command here since there is nothing else to do.
9467 csrRoamWmStatusChangeComplete( pMac );
9468}
9469
Jeff Johnson295189b2012-06-20 16:38:30 -07009470//This function returns band and mode information.
9471//The only tricky part is that if phyMode is set to 11abg, this function may return eCSR_CFG_DOT11_MODE_11B
9472//instead of eCSR_CFG_DOT11_MODE_11G if everything is set to auto-pick.
9473#ifdef WLAN_SOFTAP_FEATURE
9474static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
9475 tANI_U8 operationChn, eCsrBand *pBand )
9476#else
9477static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, eCsrPhyMode phyModeIn,
9478 tANI_U8 operationChn, eCsrBand *pBand )
9479#endif
9480{
Jeff Johnson295189b2012-06-20 16:38:30 -07009481#ifdef WLAN_SOFTAP_FEATURE
9482 eCsrPhyMode phyModeIn = (eCsrPhyMode)pProfile->phyMode;
9483 eCsrCfgDot11Mode cfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(pProfile, phyModeIn,
9484 pMac->roam.configParam.ProprietaryRatesEnabled);
9485#else
9486 eCsrCfgDot11Mode cfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(phyModeIn,
9487 pMac->roam.configParam.ProprietaryRatesEnabled);
9488#endif
9489 eCsrBand eBand;
Madan Mohan Koyyalamudi4ff9cd62012-10-30 17:48:57 -07009490
Jeff Johnson295189b2012-06-20 16:38:30 -07009491 //If the global setting for dot11Mode is set to auto/abg, we overwrite the setting in the profile.
9492#ifdef WLAN_SOFTAP_FEATURE
9493 if( ((!CSR_IS_INFRA_AP(pProfile )&& !CSR_IS_WDS(pProfile )) &&
9494 ((eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode) ||
9495 (eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode))) ||
9496 (eCSR_CFG_DOT11_MODE_AUTO == cfgDot11Mode) || (eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode) )
9497#else
9498 if( (eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode) ||
9499 (eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode) ||
9500 (eCSR_CFG_DOT11_MODE_AUTO == cfgDot11Mode) || (eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode) )
Jeff Johnson295189b2012-06-20 16:38:30 -07009501#endif
9502 {
9503 switch( pMac->roam.configParam.uCfgDot11Mode )
9504 {
9505 case eCSR_CFG_DOT11_MODE_11A:
9506 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9507 eBand = eCSR_BAND_5G;
9508 break;
9509 case eCSR_CFG_DOT11_MODE_11B:
9510 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9511 eBand = eCSR_BAND_24;
9512 break;
9513 case eCSR_CFG_DOT11_MODE_11G:
9514 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
9515 eBand = eCSR_BAND_24;
9516 break;
9517 case eCSR_CFG_DOT11_MODE_11N:
9518 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
9519 eBand = eCSR_BAND_24;
9520 break;
9521 //case eCSR_CFG_DOT11_MODE_BEST:
9522 // cfgDot11Mode = eCSR_CFG_DOT11_MODE_BEST;
9523 // eBand = eCSR_BAND_24;
9524 // break;
9525 default:
9526 // Global dot11 Mode setting is 11a/b/g.
9527 // use the channel number to determine the Mode setting.
9528 if ( eCSR_OPERATING_CHANNEL_AUTO == operationChn )
9529 {
9530 eBand = pMac->roam.configParam.eBand;
9531 if(eCSR_BAND_24 == eBand)
9532 {
9533 //See reason in else if ( CSR_IS_CHANNEL_24GHZ(operationChn) ) to pick 11B
9534 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9535 }
9536 else
9537 {
9538 //prefer 5GHz
9539 eBand = eCSR_BAND_5G;
9540 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9541 }
9542 }
9543 else if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9544 {
9545 // channel is a 2.4GHz channel. Set mode to 11g.
9546 //
9547 // !!LAC - WiFi tests require IBSS networks to start in 11b mode without any change to the
9548 // default parameter settings on the adapter. We use ACU to start an IBSS through creation
9549 // of a startIBSS profile. this startIBSS profile has Auto MACProtocol and the
9550 // adapter property setting for dot11Mode is also AUTO. So in this case, let's start
9551 // the IBSS network in 11b mode instead of 11g mode.
9552 //
9553 // so this is for Auto=profile->MacProtocol && Auto=Global.dot11Mode && profile->channel is < 14,
9554 // then start the IBSS in b mode.
9555 //
9556 // Note: we used to have this start as an 11g IBSS for best performance... now to specify that
9557 // the user will have to set the do11Mode in the property page to 11g to force it.
9558 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9559 eBand = eCSR_BAND_24;
9560 }
9561 else
9562 {
9563 // else, it's a 5.0GHz channel. Set mode to 11a.
9564 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9565 eBand = eCSR_BAND_5G;
9566 }
9567 break;
9568 }//switch
9569 }//if( eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
9570 else
9571 {
9572 //dot11 mode is set, lets pick the band
9573 if ( eCSR_OPERATING_CHANNEL_AUTO == operationChn )
9574 {
9575 // channel is Auto also.
9576 eBand = pMac->roam.configParam.eBand;
9577 if(eCSR_BAND_ALL == eBand)
9578 {
9579 //prefer 5GHz
9580 eBand = eCSR_BAND_5G;
9581 }
9582 }
9583 else if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9584 {
9585 eBand = eCSR_BAND_24;
9586 }
9587 else
9588 {
9589 eBand = eCSR_BAND_5G;
9590 }
9591 }
9592 if(pBand)
9593 {
9594 *pBand = eBand;
9595 }
9596
9597 if (operationChn == 14){
9598 smsLog(pMac, LOGE, FL(" Switching to Dot11B mode \n"));
9599 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9600 }
Madan Mohan Koyyalamudi91f8e9f2012-10-22 15:11:56 -07009601
Madan Mohan Koyyalamudi84a8b2e2012-10-22 15:15:14 -07009602 if( (!CSR_IS_11n_ALLOWED(pProfile->EncryptionType.encryptionType[0] )) &&
9603 ((eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode) ||
Madan Mohan Koyyalamudi91f8e9f2012-10-22 15:11:56 -07009604#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudi84a8b2e2012-10-22 15:15:14 -07009605 (eCSR_CFG_DOT11_MODE_11AC == cfgDot11Mode) ||
Madan Mohan Koyyalamudi91f8e9f2012-10-22 15:11:56 -07009606#endif
Madan Mohan Koyyalamudi84a8b2e2012-10-22 15:15:14 -07009607 (eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode)) )
9608 {
9609 //We cannot do 11n here
9610 if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9611 {
9612 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
9613 }
9614 else
9615 {
9616 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9617 }
9618 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009619 return( cfgDot11Mode );
9620}
9621
Jeff Johnson295189b2012-06-20 16:38:30 -07009622eHalStatus csrRoamIssueStopBss( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamSubState NewSubstate )
9623{
9624 eHalStatus status;
9625 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009626
9627 if(!pSession)
9628 {
9629 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9630 return eHAL_STATUS_FAILURE;
9631 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009632
9633#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
9634 {
9635 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07009636 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
9637 if(pIbssLog)
9638 {
9639 pIbssLog->eventId = WLAN_IBSS_EVENT_STOP_REQ;
9640 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
9641 }
9642 }
9643#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07009644 pSession->ibss_join_pending = FALSE;
9645 csrRoamStopIbssJoinTimer(pMac, sessionId );
9646 // Set the roaming substate to 'stop Bss request'...
9647 csrRoamSubstateChange( pMac, NewSubstate, sessionId );
9648
9649 // attempt to stop the Bss (reason code is ignored...)
9650 status = csrSendMBStopBssReqMsg( pMac, sessionId );
9651
9652 return (status);
9653}
9654
Jeff Johnson295189b2012-06-20 16:38:30 -07009655//pNumChan is a caller allocated space with the sizeof pChannels
9656eHalStatus csrGetCfgValidChannels(tpAniSirGlobal pMac, tANI_U8 *pChannels, tANI_U32 *pNumChan)
9657{
9658
9659 return (ccmCfgGetStr(pMac, WNI_CFG_VALID_CHANNEL_LIST,
9660 (tANI_U8 *)pChannels,
9661 pNumChan));
9662}
9663
Jeff Johnson295189b2012-06-20 16:38:30 -07009664tANI_BOOLEAN csrRoamIsChannelValid( tpAniSirGlobal pMac, tANI_U8 channel )
9665{
9666 tANI_BOOLEAN fValid = FALSE;
9667 tANI_U32 idxValidChannels;
9668 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9669
9670 if (HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, pMac->roam.validChannelList, &len)))
9671 {
9672 for ( idxValidChannels = 0; ( idxValidChannels < len ); idxValidChannels++ )
9673 {
9674 if ( channel == pMac->roam.validChannelList[ idxValidChannels ] )
9675 {
9676 fValid = TRUE;
9677 break;
9678 }
9679 }
9680 }
9681 pMac->roam.numValidChannels = len;
9682 return fValid;
9683}
9684
Jeff Johnson295189b2012-06-20 16:38:30 -07009685tANI_BOOLEAN csrRoamIsValid40MhzChannel(tpAniSirGlobal pMac, tANI_U8 channel)
9686{
9687 tANI_BOOLEAN fValid = eANI_BOOLEAN_FALSE;
9688 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -07009689 for(i = 0; i < pMac->scan.base40MHzChannels.numChannels; i++)
9690 {
9691 if(channel == pMac->scan.base40MHzChannels.channelList[i])
9692 {
9693 fValid = eANI_BOOLEAN_TRUE;
9694 break;
9695 }
9696 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009697 return (fValid);
9698}
9699
Jeff Johnson295189b2012-06-20 16:38:30 -07009700//This function check and validate whether the NIC can do CB (40MHz)
Jeff Johnsone7245742012-09-05 17:12:55 -07009701 static ePhyChanBondState csrGetCBModeFromIes(tpAniSirGlobal pMac, tANI_U8 primaryChn, tDot11fBeaconIEs *pIes)
Jeff Johnson295189b2012-06-20 16:38:30 -07009702{
Jeff Johnsone7245742012-09-05 17:12:55 -07009703 ePhyChanBondState eRet = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -07009704 tANI_U8 centerChn;
9705 tANI_U32 ChannelBondingMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009706 if(CSR_IS_CHANNEL_24GHZ(primaryChn))
9707 {
9708 ChannelBondingMode = pMac->roam.configParam.channelBondingMode24GHz;
9709 }
9710 else
9711 {
9712 ChannelBondingMode = pMac->roam.configParam.channelBondingMode5GHz;
9713 }
9714 //Figure what the other side's CB mode
9715 if(WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != ChannelBondingMode)
9716 {
9717 if(pIes->HTCaps.present && (eHT_CHANNEL_WIDTH_40MHZ == pIes->HTCaps.supportedChannelWidthSet))
9718 {
9719 if(pIes->HTInfo.present)
9720 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009721 /* This is called during INFRA STA/CLIENT and should use the merged value of
9722 * supported channel width and recommended tx width as per standard
9723 */
9724 smsLog(pMac, LOG1, "scws %u rtws %u sco %u\n",
9725 pIes->HTCaps.supportedChannelWidthSet,
9726 pIes->HTInfo.recommendedTxWidthSet,
9727 pIes->HTInfo.secondaryChannelOffset);
9728
9729 if (pIes->HTInfo.recommendedTxWidthSet == eHT_CHANNEL_WIDTH_40MHZ)
9730 eRet = (ePhyChanBondState)pIes->HTInfo.secondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07009731 else
Jeff Johnsone7245742012-09-05 17:12:55 -07009732 eRet = PHY_SINGLE_CHANNEL_CENTERED;
9733 switch (eRet) {
9734 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
9735 centerChn = primaryChn + CSR_CB_CENTER_CHANNEL_OFFSET;
9736 break;
9737 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
9738 centerChn = primaryChn - CSR_CB_CENTER_CHANNEL_OFFSET;
9739 break;
9740 case PHY_SINGLE_CHANNEL_CENTERED:
9741 default:
9742 centerChn = primaryChn;
9743 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009744 }
Jeff Johnsone7245742012-09-05 17:12:55 -07009745 if((PHY_SINGLE_CHANNEL_CENTERED != eRet) && !csrRoamIsValid40MhzChannel(pMac, centerChn))
Jeff Johnson295189b2012-06-20 16:38:30 -07009746 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009747 smsLog(pMac, LOGE, " Invalid center channel (%d), disable 40MHz mode\n", centerChn);
9748 //eRet = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -07009749 }
9750 }
9751 }
9752 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009753 return eRet;
9754}
Jeff Johnson295189b2012-06-20 16:38:30 -07009755tANI_BOOLEAN csrIsEncryptionInList( tpAniSirGlobal pMac, tCsrEncryptionList *pCipherList, eCsrEncryptionType encryptionType )
9756{
9757 tANI_BOOLEAN fFound = FALSE;
9758 tANI_U32 idx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009759 for( idx = 0; idx < pCipherList->numEntries; idx++ )
9760 {
9761 if( pCipherList->encryptionType[idx] == encryptionType )
9762 {
9763 fFound = TRUE;
9764 break;
9765 }
9766 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009767 return fFound;
9768}
Jeff Johnson295189b2012-06-20 16:38:30 -07009769tANI_BOOLEAN csrIsAuthInList( tpAniSirGlobal pMac, tCsrAuthList *pAuthList, eCsrAuthType authType )
9770{
9771 tANI_BOOLEAN fFound = FALSE;
9772 tANI_U32 idx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009773 for( idx = 0; idx < pAuthList->numEntries; idx++ )
9774 {
9775 if( pAuthList->authType[idx] == authType )
9776 {
9777 fFound = TRUE;
9778 break;
9779 }
9780 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009781 return fFound;
9782}
Jeff Johnson295189b2012-06-20 16:38:30 -07009783tANI_BOOLEAN csrIsSameProfile(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pProfile1, tCsrRoamProfile *pProfile2)
9784{
9785 tANI_BOOLEAN fCheck = eANI_BOOLEAN_FALSE;
9786 tCsrScanResultFilter *pScanFilter = NULL;
9787 eHalStatus status = eHAL_STATUS_SUCCESS;
9788
9789 if(pProfile1 && pProfile2)
9790 {
9791 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
9792 if(HAL_STATUS_SUCCESS(status))
9793 {
9794 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
9795 status = csrRoamPrepareFilterFromProfile(pMac, pProfile2, pScanFilter);
9796 if(HAL_STATUS_SUCCESS(status))
9797 {
9798 fCheck = eANI_BOOLEAN_FALSE;
9799 do
9800 {
9801 tANI_U32 i;
9802 for(i = 0; i < pScanFilter->SSIDs.numOfSSIDs; i++)
9803 {
9804 fCheck = csrIsSsidMatch( pMac, pScanFilter->SSIDs.SSIDList[i].SSID.ssId,
9805 pScanFilter->SSIDs.SSIDList[i].SSID.length,
9806 pProfile1->SSID.ssId, pProfile1->SSID.length, eANI_BOOLEAN_FALSE );
9807 if ( fCheck ) break;
9808 }
9809 if(!fCheck)
9810 {
9811 break;
9812 }
9813 if( !csrIsAuthInList( pMac, &pProfile2->AuthType, pProfile1->AuthType)
9814 || pProfile2->BSSType != pProfile1->BSSType
9815 || !csrIsEncryptionInList( pMac, &pProfile2->EncryptionType, pProfile1->EncryptionType )
9816 )
9817 {
9818 fCheck = eANI_BOOLEAN_FALSE;
9819 break;
9820 }
9821#ifdef WLAN_FEATURE_VOWIFI_11R
9822 if (pProfile1->MDID.mdiePresent || pProfile2->MDID.mdiePresent)
9823 {
9824 if (pProfile1->MDID.mobilityDomain != pProfile2->MDID.mobilityDomain)
9825 {
9826 fCheck = eANI_BOOLEAN_FALSE;
9827 break;
9828 }
9829 }
9830#endif
9831 //Match found
9832 fCheck = eANI_BOOLEAN_TRUE;
9833 }while(0);
9834 csrFreeScanFilter(pMac, pScanFilter);
9835 }
9836 palFreeMemory(pMac->hHdd, pScanFilter);
9837 }
9838 }
9839
9840 return (fCheck);
9841}
9842
Jeff Johnson295189b2012-06-20 16:38:30 -07009843tANI_BOOLEAN csrRoamIsSameProfileKeys(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pConnProfile, tCsrRoamProfile *pProfile2)
9844{
9845 tANI_BOOLEAN fCheck = eANI_BOOLEAN_FALSE;
9846 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -07009847 do
9848 {
9849 //Only check for static WEP
9850 if(!csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, eCSR_ENCRYPT_TYPE_WEP40_STATICKEY) &&
9851 !csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, eCSR_ENCRYPT_TYPE_WEP104_STATICKEY))
9852 {
9853 fCheck = eANI_BOOLEAN_TRUE;
9854 break;
9855 }
9856 if(!csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, pConnProfile->EncryptionType)) break;
9857 if(pConnProfile->Keys.defaultIndex != pProfile2->Keys.defaultIndex) break;
9858 for(i = 0; i < CSR_MAX_NUM_KEY; i++)
9859 {
9860 if(pConnProfile->Keys.KeyLength[i] != pProfile2->Keys.KeyLength[i]) break;
9861 if(!palEqualMemory(pMac->hHdd, &pConnProfile->Keys.KeyMaterial[i],
9862 &pProfile2->Keys.KeyMaterial[i], pProfile2->Keys.KeyLength[i]))
9863 {
9864 break;
9865 }
9866 }
9867 if( i == CSR_MAX_NUM_KEY)
9868 {
9869 fCheck = eANI_BOOLEAN_TRUE;
9870 }
9871 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07009872 return (fCheck);
9873}
9874
Jeff Johnson295189b2012-06-20 16:38:30 -07009875//IBSS
9876
Jeff Johnson295189b2012-06-20 16:38:30 -07009877tANI_U8 csrRoamGetIbssStartChannelNumber50( tpAniSirGlobal pMac )
9878{
9879 tANI_U8 channel = 0;
9880 tANI_U32 idx;
9881 tANI_U32 idxValidChannels;
9882 tANI_BOOLEAN fFound = FALSE;
9883 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9884
9885 if(eCSR_OPERATING_CHANNEL_ANY != pMac->roam.configParam.AdHocChannel5G)
9886 {
9887 channel = pMac->roam.configParam.AdHocChannel5G;
9888 if(!csrRoamIsChannelValid(pMac, channel))
9889 {
9890 channel = 0;
9891 }
9892 }
9893 if (0 == channel && HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &len)))
9894 {
9895 for ( idx = 0; ( idx < CSR_NUM_IBSS_START_CHANNELS_50 ) && !fFound; idx++ )
9896 {
9897 for ( idxValidChannels = 0; ( idxValidChannels < len ) && !fFound; idxValidChannels++ )
9898 {
9899 if ( csrStartIbssChannels50[ idx ] == pMac->roam.validChannelList[ idxValidChannels ] )
9900 {
9901 fFound = TRUE;
9902 channel = csrStartIbssChannels50[ idx ];
9903 }
9904 }
9905 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009906 // this is rare, but if it does happen, we find anyone in 11a bandwidth and return the first 11a channel found!
9907 if (!fFound)
9908 {
9909 for ( idxValidChannels = 0; idxValidChannels < len ; idxValidChannels++ )
9910 {
9911 if ( CSR_IS_CHANNEL_5GHZ(pMac->roam.validChannelList[ idx ]) ) // the max channel# in 11g is 14
9912 {
9913 channel = csrStartIbssChannels50[ idx ];
9914 break;
9915 }
9916 }
9917 }
9918 }//if
9919
9920 return( channel );
9921}
9922
Jeff Johnson295189b2012-06-20 16:38:30 -07009923tANI_U8 csrRoamGetIbssStartChannelNumber24( tpAniSirGlobal pMac )
9924{
9925 tANI_U8 channel = 1;
9926 tANI_U32 idx;
9927 tANI_U32 idxValidChannels;
9928 tANI_BOOLEAN fFound = FALSE;
9929 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9930
9931 if(eCSR_OPERATING_CHANNEL_ANY != pMac->roam.configParam.AdHocChannel24)
9932 {
9933 channel = pMac->roam.configParam.AdHocChannel24;
9934 if(!csrRoamIsChannelValid(pMac, channel))
9935 {
9936 channel = 0;
9937 }
9938 }
9939
9940 if (0 == channel && HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &len)))
9941 {
9942 for ( idx = 0; ( idx < CSR_NUM_IBSS_START_CHANNELS_24 ) && !fFound; idx++ )
9943 {
9944 for ( idxValidChannels = 0; ( idxValidChannels < len ) && !fFound; idxValidChannels++ )
9945 {
9946 if ( csrStartIbssChannels24[ idx ] == pMac->roam.validChannelList[ idxValidChannels ] )
9947 {
9948 fFound = TRUE;
9949 channel = csrStartIbssChannels24[ idx ];
9950 }
9951 }
9952 }
9953 }
9954
9955 return( channel );
9956}
9957
Jeff Johnson295189b2012-06-20 16:38:30 -07009958static void csrRoamGetBssStartParms( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
9959 tCsrRoamStartBssParams *pParam )
9960{
9961 eCsrCfgDot11Mode cfgDot11Mode;
9962 eCsrBand eBand;
9963 tANI_U8 channel = 0;
9964 tSirNwType nwType;
9965 tANI_U8 operationChannel = 0;
9966
9967 if(pProfile->ChannelInfo.numOfChannels && pProfile->ChannelInfo.ChannelList)
9968 {
9969 operationChannel = pProfile->ChannelInfo.ChannelList[0];
9970 }
9971
9972#ifdef WLAN_SOFTAP_FEATURE
9973 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, pProfile, operationChannel, &eBand );
9974#else
9975 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel, &eBand );
9976#endif
9977
9978#ifdef WLAN_FEATURE_P2P
9979 if( ( (pProfile->csrPersona == VOS_P2P_CLIENT_MODE) ||
9980 (pProfile->csrPersona == VOS_P2P_GO_MODE) )
9981 && ( cfgDot11Mode == eCSR_CFG_DOT11_MODE_11B)
9982 )
9983 {
9984 /* This should never happen */
9985 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_FATAL,
9986 FL("For P2PClient/P2P-GO (persona %d) cfgDot11Mode is 11B\n"),
9987 pProfile->csrPersona);
9988 VOS_ASSERT(0);
9989 }
9990#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009991 switch( cfgDot11Mode )
9992 {
9993 case eCSR_CFG_DOT11_MODE_11G:
9994 nwType = eSIR_11G_NW_TYPE;
9995 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009996 case eCSR_CFG_DOT11_MODE_11B:
9997 nwType = eSIR_11B_NW_TYPE;
9998 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009999 case eCSR_CFG_DOT11_MODE_11A:
10000 nwType = eSIR_11A_NW_TYPE;
10001 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070010002 default:
10003 case eCSR_CFG_DOT11_MODE_11N:
10004 case eCSR_CFG_DOT11_MODE_TAURUS:
10005 //Because LIM only verifies it against 11a, 11b or 11g, set only 11g or 11a here
10006 if(eCSR_BAND_24 == eBand)
10007 {
10008 nwType = eSIR_11G_NW_TYPE;
10009 }
10010 else
10011 {
10012 nwType = eSIR_11A_NW_TYPE;
10013 }
10014 break;
10015 }
10016
10017 pParam->extendedRateSet.numRates = 0;
10018
10019 switch ( nwType )
10020 {
10021 default:
10022 smsLog(pMac, LOGE, FL("sees an unknown pSirNwType (%d)\n"), nwType);
10023 case eSIR_11A_NW_TYPE:
10024
10025 pParam->operationalRateSet.numRates = 8;
10026
10027 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_6 | CSR_DOT11_BASIC_RATE_MASK;
10028 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_9;
10029 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_12 | CSR_DOT11_BASIC_RATE_MASK;
10030 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_18;
10031 pParam->operationalRateSet.rate[4] = SIR_MAC_RATE_24 | CSR_DOT11_BASIC_RATE_MASK;
10032 pParam->operationalRateSet.rate[5] = SIR_MAC_RATE_36;
10033 pParam->operationalRateSet.rate[6] = SIR_MAC_RATE_48;
10034 pParam->operationalRateSet.rate[7] = SIR_MAC_RATE_54;
10035
10036 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
10037 {
10038 channel = csrRoamGetIbssStartChannelNumber50( pMac );
10039 if( 0 == channel &&
10040 CSR_IS_PHY_MODE_DUAL_BAND(pProfile->phyMode) &&
10041 CSR_IS_PHY_MODE_DUAL_BAND(pMac->roam.configParam.phyMode)
10042 )
10043 {
10044 //We could not find a 5G channel by auto pick, let's try 2.4G channels
10045 //We only do this here because csrRoamGetPhyModeBandForBss always picks 11a for AUTO
10046 nwType = eSIR_11B_NW_TYPE;
10047 channel = csrRoamGetIbssStartChannelNumber24( pMac );
10048 pParam->operationalRateSet.numRates = 4;
10049 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
10050 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
10051 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
10052 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
10053 }
10054 }
10055 else
10056 {
10057 channel = operationChannel;
10058 }
10059 break;
10060
10061 case eSIR_11B_NW_TYPE:
10062 pParam->operationalRateSet.numRates = 4;
10063 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
10064 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
10065 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
10066 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
Jeff Johnson295189b2012-06-20 16:38:30 -070010067 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
10068 {
10069 channel = csrRoamGetIbssStartChannelNumber24( pMac );
10070 }
10071 else
10072 {
10073 channel = operationChannel;
10074 }
10075
10076 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070010077 case eSIR_11G_NW_TYPE:
10078#ifdef WLAN_FEATURE_P2P
10079 /* For P2P Client and P2P GO, disable 11b rates */
10080 if( (pProfile->csrPersona == VOS_P2P_CLIENT_MODE) ||
10081 (pProfile->csrPersona == VOS_P2P_GO_MODE)
10082 )
10083 {
10084 pParam->operationalRateSet.numRates = 8;
10085
10086 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_6 | CSR_DOT11_BASIC_RATE_MASK;
10087 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_9;
10088 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_12 | CSR_DOT11_BASIC_RATE_MASK;
10089 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_18;
10090 pParam->operationalRateSet.rate[4] = SIR_MAC_RATE_24 | CSR_DOT11_BASIC_RATE_MASK;
10091 pParam->operationalRateSet.rate[5] = SIR_MAC_RATE_36;
10092 pParam->operationalRateSet.rate[6] = SIR_MAC_RATE_48;
10093 pParam->operationalRateSet.rate[7] = SIR_MAC_RATE_54;
10094 }
10095 else
10096#endif
10097 {
10098 pParam->operationalRateSet.numRates = 4;
Jeff Johnson295189b2012-06-20 16:38:30 -070010099 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
10100 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
10101 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
10102 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
10103
10104 pParam->extendedRateSet.numRates = 8;
Jeff Johnson295189b2012-06-20 16:38:30 -070010105 pParam->extendedRateSet.rate[0] = SIR_MAC_RATE_6;
10106 pParam->extendedRateSet.rate[1] = SIR_MAC_RATE_9;
10107 pParam->extendedRateSet.rate[2] = SIR_MAC_RATE_12;
10108 pParam->extendedRateSet.rate[3] = SIR_MAC_RATE_18;
10109 pParam->extendedRateSet.rate[4] = SIR_MAC_RATE_24;
10110 pParam->extendedRateSet.rate[5] = SIR_MAC_RATE_36;
10111 pParam->extendedRateSet.rate[6] = SIR_MAC_RATE_48;
10112 pParam->extendedRateSet.rate[7] = SIR_MAC_RATE_54;
10113 }
10114
10115 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
10116 {
10117 channel = csrRoamGetIbssStartChannelNumber24( pMac );
10118 }
10119 else
10120 {
10121 channel = operationChannel;
10122 }
10123
10124 break;
10125 }
10126 pParam->operationChn = channel;
10127 pParam->sirNwType = nwType;
10128}
10129
Jeff Johnson295189b2012-06-20 16:38:30 -070010130static void csrRoamGetBssStartParmsFromBssDesc( tpAniSirGlobal pMac, tSirBssDescription *pBssDesc,
10131 tDot11fBeaconIEs *pIes, tCsrRoamStartBssParams *pParam )
10132{
10133
10134 if( pParam )
10135 {
10136 pParam->sirNwType = pBssDesc->nwType;
Jeff Johnsone7245742012-09-05 17:12:55 -070010137 pParam->cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010138 pParam->operationChn = pBssDesc->channelId;
10139 palCopyMemory( pMac->hHdd, &pParam->bssid, pBssDesc->bssId, sizeof(tCsrBssid) );
10140
10141 if( pIes )
10142 {
10143 if(pIes->SuppRates.present)
10144 {
10145 pParam->operationalRateSet.numRates = pIes->SuppRates.num_rates;
10146 if(pIes->SuppRates.num_rates > SIR_MAC_RATESET_EID_MAX)
10147 {
10148 smsLog(pMac, LOGE, FL("num_rates :%d is more than SIR_MAC_RATESET_EID_MAX, resetting to SIR_MAC_RATESET_EID_MAX\n"),
10149 pIes->SuppRates.num_rates);
10150 pIes->SuppRates.num_rates = SIR_MAC_RATESET_EID_MAX;
10151 }
10152 palCopyMemory(pMac->hHdd, pParam->operationalRateSet.rate, pIes->SuppRates.rates,
10153 sizeof(*pIes->SuppRates.rates) * pIes->SuppRates.num_rates);
10154 }
10155 if( pIes->SSID.present )
10156 {
10157 pParam->ssId.length = pIes->SSID.num_ssid;
10158 palCopyMemory(pMac->hHdd, pParam->ssId.ssId, pIes->SSID.ssid, pParam->ssId.length);
10159 }
10160 pParam->cbMode = csrGetCBModeFromIes(pMac, pParam->operationChn, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -070010161 }
10162 else
10163 {
10164 pParam->ssId.length = 0;
10165 pParam->operationalRateSet.numRates = 0;
10166 }
10167 }
10168}
10169
Jeff Johnson295189b2012-06-20 16:38:30 -070010170static void csrRoamDetermineMaxRateForAdHoc( tpAniSirGlobal pMac, tSirMacRateSet *pSirRateSet )
10171{
10172 tANI_U8 MaxRate = 0;
10173 tANI_U32 i;
10174 tANI_U8 *pRate;
10175
10176 pRate = pSirRateSet->rate;
10177 for ( i = 0; i < pSirRateSet->numRates; i++ )
10178 {
10179 MaxRate = CSR_MAX( MaxRate, ( pRate[ i ] & (~CSR_DOT11_BASIC_RATE_MASK) ) );
10180 }
10181
10182 // Save the max rate in the connected state information...
10183
10184 // modify LastRates variable as well
10185
10186 return;
10187}
10188
Jeff Johnson295189b2012-06-20 16:38:30 -070010189//this function finds a valid secondary channel for channel bonding with "channel".
10190//Param: channel -- primary channel, caller must validate it
10191// cbChoice -- CB directory
10192//Return: if 0, no secondary channel is found. Otherwise a valid secondary channel.
10193static tANI_U8 csrRoamGetSecondaryChannel(tpAniSirGlobal pMac, tANI_U8 channel, eCsrCBChoice cbChoice)
10194{
10195 tANI_U8 chnUp = 0, chnDown = 0, chnRet = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010196 switch (cbChoice)
10197 {
10198 case eCSR_CB_OFF:
10199 chnUp = 0;
10200 chnDown = 0;
10201 break;
10202 case eCSR_CB_DOWN:
10203 chnUp = 0;
10204 chnDown = channel - CSR_CB_CHANNEL_GAP;
10205 break;
10206 case eCSR_CB_UP:
10207 chnUp = channel + CSR_CB_CHANNEL_GAP;
10208 chnDown = 0;
10209 break;
10210 case eCSR_CB_AUTO:
10211 //consider every other value means auto
10212 default:
10213 chnUp = channel + CSR_CB_CHANNEL_GAP;
10214 chnDown = channel - CSR_CB_CHANNEL_GAP;
10215 break;
10216 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010217 //if CB_UP or auto, try channel up first
10218 if(chnUp && CSR_IS_SAME_BAND_CHANNELS(chnUp, channel) && csrRoamIsChannelValid(pMac, chnUp))
10219 {
10220 //found a valid up channel for channel bonding
10221 //check whether the center channel is valid
10222 if(csrRoamIsValid40MhzChannel(pMac, channel + CSR_CB_CENTER_CHANNEL_OFFSET))
10223 {
10224 chnRet = chnUp;
10225 }
10226 }
10227 if(chnRet == 0 && chnDown && CSR_IS_SAME_BAND_CHANNELS(chnDown, channel) && csrRoamIsChannelValid(pMac, chnDown))
10228 {
10229 //found a valid down channel for channel bonding
10230 if(csrRoamIsValid40MhzChannel(pMac, channel - CSR_CB_CENTER_CHANNEL_OFFSET))
10231 {
10232 chnRet = chnDown;
10233 }
10234 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010235 return chnRet;
10236}
10237
Jeff Johnson295189b2012-06-20 16:38:30 -070010238eHalStatus csrRoamIssueStartBss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamStartBssParams *pParam,
10239 tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc, tANI_U32 roamId )
10240{
10241 eHalStatus status = eHAL_STATUS_SUCCESS;
10242 eCsrBand eBand;
Jeff Johnson295189b2012-06-20 16:38:30 -070010243 // Set the roaming substate to 'Start BSS attempt'...
10244 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_START_BSS_REQ, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070010245#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
10246 //Need to figure out whether we need to log WDS???
10247 if( CSR_IS_IBSS( pProfile ) )
10248 {
10249 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -070010250 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
10251 if(pIbssLog)
10252 {
10253 if(pBssDesc)
10254 {
10255 pIbssLog->eventId = WLAN_IBSS_EVENT_JOIN_IBSS_REQ;
10256 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pBssDesc->bssId, 6);
10257 }
10258 else
10259 {
10260 pIbssLog->eventId = WLAN_IBSS_EVENT_START_IBSS_REQ;
10261 }
10262 palCopyMemory(pMac->hHdd, pIbssLog->ssid, pParam->ssId.ssId,
10263 pParam->ssId.length);
10264 if(pProfile->ChannelInfo.numOfChannels == 0)
10265 {
10266 pIbssLog->channelSetting = AUTO_PICK;
10267 }
10268 else
10269 {
10270 pIbssLog->channelSetting = SPECIFIED;
10271 }
10272 pIbssLog->operatingChannel = pParam->operationChn;
10273 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
10274 }
10275 }
10276#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
10277 //Put RSN information in for Starting BSS
10278 pParam->nRSNIELength = (tANI_U16)pProfile->nRSNReqIELength;
10279 pParam->pRSNIE = pProfile->pRSNReqIE;
10280
Jeff Johnson295189b2012-06-20 16:38:30 -070010281#ifdef WLAN_SOFTAP_FEATURE
10282 pParam->privacy = pProfile->privacy;
10283 pParam->fwdWPSPBCProbeReq = pProfile->fwdWPSPBCProbeReq;
10284 pParam->authType = pProfile->csr80211AuthType;
10285 pParam->beaconInterval = pProfile->beaconInterval;
10286 pParam->dtimPeriod = pProfile->dtimPeriod;
10287 pParam->ApUapsdEnable = pProfile->ApUapsdEnable;
10288 pParam->ssidHidden = pProfile->SSIDs.SSIDList[0].ssidHidden;
10289 if (CSR_IS_INFRA_AP(pProfile)&& (pParam->operationChn != 0))
10290 {
10291 if (csrIsValidChannel(pMac, pParam->operationChn) != eHAL_STATUS_SUCCESS)
10292 {
10293 pParam->operationChn = INFRA_AP_DEFAULT_CHANNEL;
10294 }
10295 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010296 pParam->protEnabled = pProfile->protEnabled;
10297 pParam->obssProtEnabled = pProfile->obssProtEnabled;
10298 pParam->ht_protection = pProfile->cfg_protection;
10299 pParam->wps_state = pProfile->wps_state;
10300#endif
10301
Jeff Johnson295189b2012-06-20 16:38:30 -070010302#ifdef WLAN_SOFTAP_FEATURE
10303 pParam->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, pParam->operationChn /* pProfile->operationChannel*/,
10304 &eBand);
10305#else
10306 pParam->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, (eCsrPhyMode)pProfile->phyMode, pProfile->operationChannel,
10307 &eBand);
10308#endif
10309 pParam->bssPersona = pProfile->csrPersona;
10310 // When starting an IBSS, start on the channel from the Profile.
10311 status = csrSendMBStartBssReqMsg( pMac, sessionId, pProfile->BSSType, pParam, pBssDesc );
Jeff Johnson295189b2012-06-20 16:38:30 -070010312 return (status);
10313}
10314
Jeff Johnson295189b2012-06-20 16:38:30 -070010315static void csrRoamPrepareBssParams(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
Jeff Johnsone7245742012-09-05 17:12:55 -070010316 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig, tDot11fBeaconIEs *pIes)
Jeff Johnson295189b2012-06-20 16:38:30 -070010317{
10318 tANI_U8 Channel, SecondChn;
Jeff Johnsone7245742012-09-05 17:12:55 -070010319 ePhyChanBondState cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010320 eCsrCBChoice cbChoice;
10321 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010322
10323 if(!pSession)
10324 {
10325 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10326 return;
10327 }
10328
Jeff Johnson295189b2012-06-20 16:38:30 -070010329 if( pBssDesc )
10330 {
10331 csrRoamGetBssStartParmsFromBssDesc( pMac, pBssDesc, pIes, &pSession->bssParams );
10332 //Since csrRoamGetBssStartParmsFromBssDesc fills in the bssid for pSession->bssParams
10333 //The following code has to be do after that.
10334 //For WDS station, use selfMac as the self BSSID
10335 if( CSR_IS_WDS_STA( pProfile ) )
10336 {
10337 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, &pSession->selfMacAddr, sizeof(tCsrBssid));
10338 }
10339 }
10340 else
10341 {
10342 csrRoamGetBssStartParms(pMac, pProfile, &pSession->bssParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010343 //Use the first SSID
10344 if(pProfile->SSIDs.numOfSSIDs)
10345 {
10346 palCopyMemory(pMac->hHdd, &pSession->bssParams.ssId, pProfile->SSIDs.SSIDList, sizeof(tSirMacSSid));
10347 }
10348 //For WDS station, use selfMac as the self BSSID
10349 if( CSR_IS_WDS_STA( pProfile ) )
10350 {
10351 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, &pSession->selfMacAddr, sizeof(tCsrBssid));
10352 }
10353 //Use the first BSSID
10354 else if( pProfile->BSSIDs.numOfBSSIDs )
10355 {
10356 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, pProfile->BSSIDs.bssid, sizeof(tCsrBssid));
10357 }
10358 else
10359 {
10360 palZeroMemory( pMac->hHdd, &pSession->bssParams.bssid, sizeof(tCsrBssid) );
10361 }
10362 }
10363 Channel = pSession->bssParams.operationChn;
Jeff Johnson295189b2012-06-20 16:38:30 -070010364 //Set operating channel in pProfile which will be used
10365 //in csrRoamSetBssConfigCfg() to determine channel bonding
10366 //mode and will be configured in CFG later
10367 pProfile->operationChannel = Channel;
10368
10369 if(Channel == 0)
10370 {
10371 smsLog(pMac, LOGW, " CSR cannot find a channel to start IBSS\n");
10372 }
10373 else
10374 {
10375
10376 csrRoamDetermineMaxRateForAdHoc( pMac, &pSession->bssParams.operationalRateSet );
Jeff Johnsone7245742012-09-05 17:12:55 -070010377 if (CSR_IS_INFRA_AP(pProfile))
10378 {
10379 if(CSR_IS_CHANNEL_24GHZ(Channel))
10380 {
10381 cbMode = pMac->roam.configParam.channelBondingMode24GHz;
10382 }
10383 else
10384 {
10385 cbMode = pMac->roam.configParam.channelBondingMode5GHz;
10386 }
10387 smsLog(pMac, LOG1, "##softap cbMode %d\n", cbMode);
10388 pBssConfig->cbMode = cbMode;
10389 pSession->bssParams.cbMode = cbMode;
10390 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010391
10392 if( CSR_IS_START_IBSS( pProfile ) )
10393 {
10394 //TBH: channel bonding is not supported for Libra
10395 if( pProfile->ChannelInfo.ChannelList && eCSR_OPERATING_CHANNEL_AUTO != pProfile->ChannelInfo.ChannelList[0] )
10396 {
10397 Channel = pProfile->ChannelInfo.ChannelList[0];
10398 cbChoice = pProfile->CBMode;
10399 }
10400 else {
10401 cbChoice = pMac->roam.configParam.cbChoice;
10402 }
10403 pSession->bssParams.operationChn = Channel;
10404 //make sure channel is valid
10405 if(!csrRoamIsChannelValid(pMac, Channel))
10406 {
10407 //set Channel to 0 to let lim know this is invalid
10408 //We still send this request down to lim even though we know the channel is wrong because
10409 //lim will response with error and hdd's eWNI_SME_START_BSS_RSP handler will roam other profile (if any)
10410 Channel = 0;
10411 pSession->bssParams.operationChn = 0;
10412 }
10413 else {
10414 tANI_U32 ChannelBondingMode;
Jeff Johnson295189b2012-06-20 16:38:30 -070010415 if(CSR_IS_CHANNEL_24GHZ(Channel))
10416 {
10417 ChannelBondingMode = pMac->roam.configParam.channelBondingMode24GHz;
10418 }
10419 else
10420 {
10421 ChannelBondingMode = pMac->roam.configParam.channelBondingMode5GHz;
10422 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010423 //now we have a valid channel
10424 if(WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != ChannelBondingMode)
10425 {
10426 //let's pick a secondard channel
10427 SecondChn = csrRoamGetSecondaryChannel(pMac, Channel, cbChoice);
Jeff Johnson295189b2012-06-20 16:38:30 -070010428 if(SecondChn > Channel)
10429 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010430 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
Jeff Johnson295189b2012-06-20 16:38:30 -070010431 }
10432 else if(SecondChn && SecondChn < Channel)
10433 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010434 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
Jeff Johnson295189b2012-06-20 16:38:30 -070010435 }
10436 else
10437 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010438 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010439 }
10440 pSession->bssParams.cbMode = cbMode;
10441 }
10442 else
10443 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010444 pSession->bssParams.cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010445 }
10446 }
10447 }
10448 }
10449}
10450
Jeff Johnson295189b2012-06-20 16:38:30 -070010451static eHalStatus csrRoamStartIbss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
10452 tANI_BOOLEAN *pfSameIbss )
10453{
10454 eHalStatus status = eHAL_STATUS_SUCCESS;
10455 tANI_BOOLEAN fSameIbss = FALSE;
10456
10457 if ( csrIsConnStateIbss( pMac, sessionId ) )
10458 {
10459 // Check if any profile parameter has changed ? If any profile parameter
10460 // has changed then stop old BSS and start a new one with new parameters
10461 if ( csrIsSameProfile( pMac, &pMac->roam.roamSession[sessionId].connectedProfile, pProfile ) )
10462 {
10463 fSameIbss = TRUE;
10464 }
10465 else
10466 {
10467 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
10468 }
10469 }
10470 else if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
10471 {
10472 // Disassociate from the connected Infrastructure network...
10473 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
10474 }
10475 else
10476 {
10477 tBssConfigParam *pBssConfig;
10478
10479 status = palAllocateMemory(pMac->hHdd, (void **)&pBssConfig, sizeof(tBssConfigParam));
10480 if(HAL_STATUS_SUCCESS(status))
10481 {
10482 palZeroMemory(pMac->hHdd, pBssConfig, sizeof(tBssConfigParam));
10483 // there is no Bss description before we start an IBSS so we need to adopt
10484 // all Bss configuration parameters from the Profile.
10485 status = csrRoamPrepareBssConfigFromProfile(pMac, pProfile, pBssConfig, NULL);
10486 if(HAL_STATUS_SUCCESS(status))
10487 {
10488 //save dotMode
10489 pMac->roam.roamSession[sessionId].bssParams.uCfgDot11Mode = pBssConfig->uCfgDot11Mode;
10490 //Prepare some more parameters for this IBSS
Jeff Johnsone7245742012-09-05 17:12:55 -070010491 csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, pBssConfig, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070010492 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, NULL, pBssConfig, NULL);
10493 }
10494
10495 palFreeMemory(pMac->hHdd, pBssConfig);
10496 }//Allocate memory
10497 }
10498
10499 if(pfSameIbss)
10500 {
10501 *pfSameIbss = fSameIbss;
10502 }
10503 return( status );
10504}
10505
Jeff Johnson295189b2012-06-20 16:38:30 -070010506static void csrRoamUpdateConnectedProfileFromNewBss( tpAniSirGlobal pMac, tANI_U32 sessionId,
10507 tSirSmeNewBssInfo *pNewBss )
10508{
10509 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010510
10511 if(!pSession)
10512 {
10513 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10514 return;
10515 }
10516
Jeff Johnson295189b2012-06-20 16:38:30 -070010517 if( pNewBss )
10518 {
10519 // Set the operating channel.
10520 pSession->connectedProfile.operationChannel = pNewBss->channelNumber;
10521 // move the BSSId from the BSS description into the connected state information.
10522 palCopyMemory( pMac->hHdd, &pSession->connectedProfile.bssid,
10523 &(pNewBss->bssId), sizeof( tCsrBssid ) );
10524 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010525 return;
10526}
10527
Jeff Johnson295189b2012-06-20 16:38:30 -070010528#ifdef FEATURE_WLAN_WAPI
10529eHalStatus csrRoamSetBKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId, tBkidCacheInfo *pBKIDCache,
10530 tANI_U32 numItems )
10531{
10532 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10533 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070010534 if(!CSR_IS_SESSION_VALID( pMac, sessionId ))
10535 {
10536 smsLog(pMac, LOGE, FL(" Invalid session ID\n"));
10537 return status;
10538 }
10539 smsLog(pMac, LOGW, "csrRoamSetBKIDCache called, numItems = %d\n", numItems);
10540 pSession = CSR_GET_SESSION( pMac, sessionId );
10541 if(numItems <= CSR_MAX_BKID_ALLOWED)
10542 {
10543 status = eHAL_STATUS_SUCCESS;
10544 //numItems may be 0 to clear the cache
10545 pSession->NumBkidCache = (tANI_U16)numItems;
10546 if(numItems && pBKIDCache)
10547 {
10548 status = palCopyMemory( pMac->hHdd, pSession->BkidCacheInfo, pBKIDCache,
10549 sizeof(tBkidCacheInfo) * numItems );
10550 }
10551 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010552 return (status);
10553}
Jeff Johnson295189b2012-06-20 16:38:30 -070010554eHalStatus csrRoamGetBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pNum,
10555 tBkidCacheInfo *pBkidCache)
10556{
10557 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10558 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070010559 if(!CSR_IS_SESSION_VALID( pMac, sessionId ))
10560 {
10561 smsLog(pMac, LOGE, FL(" Invalid session ID\n"));
10562 return status;
10563 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010564 pSession = CSR_GET_SESSION( pMac, sessionId );
10565 if(pNum && pBkidCache)
10566 {
10567 if(pSession->NumBkidCache == 0)
10568 {
10569 *pNum = 0;
10570 status = eHAL_STATUS_SUCCESS;
10571 }
10572 else if(*pNum >= pSession->NumBkidCache)
10573 {
10574 if(pSession->NumBkidCache > CSR_MAX_PMKID_ALLOWED)
10575 {
10576 smsLog(pMac, LOGE, FL("NumPmkidCache :%d is more than CSR_MAX_PMKID_ALLOWED, resetting to CSR_MAX_PMKID_ALLOWED\n"),
10577 pSession->NumBkidCache);
10578 pSession->NumBkidCache = CSR_MAX_PMKID_ALLOWED;
10579 }
10580 palCopyMemory( pMac->hHdd, pBkidCache, pSession->BkidCacheInfo,
10581 sizeof(tBkidCacheInfo) * pSession->NumBkidCache );
10582 *pNum = pSession->NumBkidCache;
10583 status = eHAL_STATUS_SUCCESS;
10584 }
10585 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010586 return (status);
Jeff Johnson295189b2012-06-20 16:38:30 -070010587}
Jeff Johnson295189b2012-06-20 16:38:30 -070010588tANI_U32 csrRoamGetNumBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId)
10589{
10590 return (pMac->roam.roamSession[sessionId].NumBkidCache);
Jeff Johnson295189b2012-06-20 16:38:30 -070010591}
10592#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070010593eHalStatus csrRoamSetPMKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId,
10594 tPmkidCacheInfo *pPMKIDCache, tANI_U32 numItems )
10595{
10596 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10597 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010598
10599 if(!pSession)
10600 {
10601 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10602 return eHAL_STATUS_FAILURE;
10603 }
10604
Jeff Johnson295189b2012-06-20 16:38:30 -070010605 smsLog(pMac, LOGW, "csrRoamSetPMKIDCache called, numItems = %d\n", numItems);
10606 if(numItems <= CSR_MAX_PMKID_ALLOWED)
10607 {
10608#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
10609 {
10610 WLAN_VOS_DIAG_EVENT_DEF(secEvent, vos_event_wlan_security_payload_type);
10611 palZeroMemory(pMac->hHdd, &secEvent, sizeof(vos_event_wlan_security_payload_type));
10612 secEvent.eventId = WLAN_SECURITY_EVENT_PMKID_UPDATE;
10613 secEvent.encryptionModeMulticast =
10614 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
10615 secEvent.encryptionModeUnicast =
10616 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
10617 palCopyMemory( pMac->hHdd, secEvent.bssid, pSession->connectedProfile.bssid, 6 );
10618 secEvent.authMode =
10619 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
10620 WLAN_VOS_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
10621 }
10622#endif//FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -070010623 status = eHAL_STATUS_SUCCESS;
10624 //numItems may be 0 to clear the cache
10625 pSession->NumPmkidCache = (tANI_U16)numItems;
10626 if(numItems && pPMKIDCache)
10627 {
10628 status = palCopyMemory( pMac->hHdd, pSession->PmkidCacheInfo, pPMKIDCache,
10629 sizeof(tPmkidCacheInfo) * numItems );
10630 }
10631 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010632 return (status);
10633}
10634
Jeff Johnson295189b2012-06-20 16:38:30 -070010635tANI_U32 csrRoamGetNumPMKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId)
10636{
10637 return (pMac->roam.roamSession[sessionId].NumPmkidCache);
10638}
10639
Jeff Johnson295189b2012-06-20 16:38:30 -070010640eHalStatus csrRoamGetPMKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pNum, tPmkidCacheInfo *pPmkidCache)
10641{
10642 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10643 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010644
10645 if(!pSession)
10646 {
10647 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10648 return eHAL_STATUS_FAILURE;
10649 }
10650
Jeff Johnson295189b2012-06-20 16:38:30 -070010651 if(pNum && pPmkidCache)
10652 {
10653 if(pSession->NumPmkidCache == 0)
10654 {
10655 *pNum = 0;
10656 status = eHAL_STATUS_SUCCESS;
10657 }
10658 else if(*pNum >= pSession->NumPmkidCache)
10659 {
10660 if(pSession->NumPmkidCache > CSR_MAX_PMKID_ALLOWED)
10661 {
10662 smsLog(pMac, LOGE, FL("NumPmkidCache :%d is more than CSR_MAX_PMKID_ALLOWED, resetting to CSR_MAX_PMKID_ALLOWED\n"),
10663 pSession->NumPmkidCache);
10664 pSession->NumPmkidCache = CSR_MAX_PMKID_ALLOWED;
10665 }
10666 palCopyMemory( pMac->hHdd, pPmkidCache, pSession->PmkidCacheInfo,
10667 sizeof(tPmkidCacheInfo) * pSession->NumPmkidCache );
10668 *pNum = pSession->NumPmkidCache;
10669 status = eHAL_STATUS_SUCCESS;
10670 }
10671 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010672 return (status);
10673}
10674
Jeff Johnson295189b2012-06-20 16:38:30 -070010675eHalStatus csrRoamGetWpaRsnReqIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10676{
10677 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10678 tANI_U32 len;
10679 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010680
10681 if(!pSession)
10682 {
10683 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10684 return eHAL_STATUS_FAILURE;
10685 }
10686
Jeff Johnson295189b2012-06-20 16:38:30 -070010687 if(pLen)
10688 {
10689 len = *pLen;
10690 *pLen = pSession->nWpaRsnReqIeLength;
10691 if(pBuf)
10692 {
10693 if(len >= pSession->nWpaRsnReqIeLength)
10694 {
10695 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWpaRsnReqIE, pSession->nWpaRsnReqIeLength);
10696 }
10697 }
10698 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010699 return (status);
10700}
10701
Jeff Johnson295189b2012-06-20 16:38:30 -070010702eHalStatus csrRoamGetWpaRsnRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10703{
10704 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10705 tANI_U32 len;
10706 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010707
10708 if(!pSession)
10709 {
10710 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10711 return eHAL_STATUS_FAILURE;
10712 }
10713
Jeff Johnson295189b2012-06-20 16:38:30 -070010714 if(pLen)
10715 {
10716 len = *pLen;
10717 *pLen = pSession->nWpaRsnRspIeLength;
10718 if(pBuf)
10719 {
10720 if(len >= pSession->nWpaRsnRspIeLength)
10721 {
10722 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWpaRsnRspIE, pSession->nWpaRsnRspIeLength);
10723 }
10724 }
10725 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010726 return (status);
10727}
Jeff Johnson295189b2012-06-20 16:38:30 -070010728#ifdef FEATURE_WLAN_WAPI
10729eHalStatus csrRoamGetWapiReqIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10730{
10731 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10732 tANI_U32 len;
10733 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010734
10735 if(!pSession)
10736 {
10737 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10738 return eHAL_STATUS_FAILURE;
10739 }
10740
Jeff Johnson295189b2012-06-20 16:38:30 -070010741 if(pLen)
10742 {
10743 len = *pLen;
10744 *pLen = pSession->nWapiReqIeLength;
10745 if(pBuf)
10746 {
10747 if(len >= pSession->nWapiReqIeLength)
10748 {
10749 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWapiReqIE, pSession->nWapiReqIeLength);
10750 }
10751 }
10752 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010753 return (status);
10754}
Jeff Johnson295189b2012-06-20 16:38:30 -070010755eHalStatus csrRoamGetWapiRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10756{
10757 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10758 tANI_U32 len;
10759 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010760
10761 if(!pSession)
10762 {
10763 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10764 return eHAL_STATUS_FAILURE;
10765 }
10766
Jeff Johnson295189b2012-06-20 16:38:30 -070010767 if(pLen)
10768 {
10769 len = *pLen;
10770 *pLen = pSession->nWapiRspIeLength;
10771 if(pBuf)
10772 {
10773 if(len >= pSession->nWapiRspIeLength)
10774 {
10775 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWapiRspIE, pSession->nWapiRspIeLength);
10776 }
10777 }
10778 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010779 return (status);
10780}
10781#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070010782eRoamCmdStatus csrGetRoamCompleteStatus(tpAniSirGlobal pMac, tANI_U32 sessionId)
10783{
10784 eRoamCmdStatus retStatus = eCSR_ROAM_CONNECT_COMPLETION;
10785 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010786
10787 if(!pSession)
10788 {
10789 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10790 return (retStatus);
10791 }
10792
Jeff Johnson295189b2012-06-20 16:38:30 -070010793 if(CSR_IS_ROAMING(pSession))
10794 {
10795 retStatus = eCSR_ROAM_ROAMING_COMPLETION;
10796 pSession->fRoaming = eANI_BOOLEAN_FALSE;
10797 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010798 return (retStatus);
10799}
10800
Jeff Johnson295189b2012-06-20 16:38:30 -070010801//This function remove the connected BSS from te cached scan result
10802eHalStatus csrRoamRemoveConnectedBssFromScanCache(tpAniSirGlobal pMac,
10803 tCsrRoamConnectedProfile *pConnProfile)
10804{
10805 eHalStatus status = eHAL_STATUS_FAILURE;
10806 tCsrScanResultFilter *pScanFilter = NULL;
10807 tListElem *pEntry;
10808 tCsrScanResult *pResult;
10809 tDot11fBeaconIEs *pIes;
10810 tANI_BOOLEAN fMatch;
Jeff Johnson295189b2012-06-20 16:38:30 -070010811 if(!(csrIsMacAddressZero(pMac, &pConnProfile->bssid) ||
10812 csrIsMacAddressBroadcast(pMac, &pConnProfile->bssid)))
10813 {
10814 do
10815 {
10816 //Prepare the filter. Only fill in the necessary fields. Not all fields are needed
10817 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
10818 if(!HAL_STATUS_SUCCESS(status)) break;
10819 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
10820 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->BSSIDs.bssid, sizeof(tCsrBssid));
10821 if(!HAL_STATUS_SUCCESS(status)) break;
10822 palCopyMemory(pMac->hHdd, pScanFilter->BSSIDs.bssid, &pConnProfile->bssid, sizeof(tCsrBssid));
10823 pScanFilter->BSSIDs.numOfBSSIDs = 1;
10824 if(!csrIsNULLSSID(pConnProfile->SSID.ssId, pConnProfile->SSID.length))
10825 {
10826 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->SSIDs.SSIDList, sizeof(tCsrSSIDInfo));
10827 if(!HAL_STATUS_SUCCESS(status)) break;
10828 palCopyMemory(pMac->hHdd, &pScanFilter->SSIDs.SSIDList[0].SSID, &pConnProfile->SSID, sizeof(tSirMacSSid));
10829 }
10830 pScanFilter->authType.numEntries = 1;
10831 pScanFilter->authType.authType[0] = pConnProfile->AuthType;
10832 pScanFilter->BSSType = pConnProfile->BSSType;
10833 pScanFilter->EncryptionType.numEntries = 1;
10834 pScanFilter->EncryptionType.encryptionType[0] = pConnProfile->EncryptionType;
10835 pScanFilter->mcEncryptionType.numEntries = 1;
10836 pScanFilter->mcEncryptionType.encryptionType[0] = pConnProfile->mcEncryptionType;
10837 //We ignore the channel for now, BSSID should be enough
10838 pScanFilter->ChannelInfo.numOfChannels = 0;
10839 //Also ignore the following fields
10840 pScanFilter->uapsd_mask = 0;
10841 pScanFilter->bWPSAssociation = eANI_BOOLEAN_FALSE;
10842 pScanFilter->countryCode[0] = 0;
10843 pScanFilter->phyMode = eCSR_DOT11_MODE_TAURUS;
Jeff Johnson295189b2012-06-20 16:38:30 -070010844 csrLLLock(&pMac->scan.scanResultList);
10845 pEntry = csrLLPeekHead( &pMac->scan.scanResultList, LL_ACCESS_NOLOCK );
10846 while( pEntry )
10847 {
10848 pResult = GET_BASE_ADDR( pEntry, tCsrScanResult, Link );
10849 pIes = (tDot11fBeaconIEs *)( pResult->Result.pvIes );
10850 fMatch = csrMatchBSS(pMac, &pResult->Result.BssDescriptor,
10851 pScanFilter, NULL, NULL, NULL, &pIes);
10852 //Release the IEs allocated by csrMatchBSS is needed
10853 if( !pResult->Result.pvIes )
10854 {
10855 //need to free the IEs since it is allocated by csrMatchBSS
10856 palFreeMemory(pMac->hHdd, pIes);
10857 }
10858 if(fMatch)
10859 {
10860 //We found the one
10861 if( csrLLRemoveEntry(&pMac->scan.scanResultList, pEntry, LL_ACCESS_NOLOCK) )
10862 {
10863 //Free the memory
10864 csrFreeScanResultEntry( pMac, pResult );
10865 }
10866 break;
10867 }
10868 pEntry = csrLLNext(&pMac->scan.scanResultList, pEntry, LL_ACCESS_NOLOCK);
10869 }//while
10870 csrLLUnlock(&pMac->scan.scanResultList);
10871 }while(0);
10872 if(pScanFilter)
10873 {
10874 csrFreeScanFilter(pMac, pScanFilter);
10875 palFreeMemory(pMac->hHdd, pScanFilter);
10876 }
10877 }
10878 return (status);
10879}
10880
Jeff Johnson295189b2012-06-20 16:38:30 -070010881//BT-AMP
Jeff Johnson295189b2012-06-20 16:38:30 -070010882eHalStatus csrIsBTAMPAllowed( tpAniSirGlobal pMac, tANI_U32 chnId )
10883{
10884 eHalStatus status = eHAL_STATUS_SUCCESS;
10885 tANI_U32 sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070010886 for( sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
10887 {
10888 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
10889 {
10890 if( csrIsConnStateIbss( pMac, sessionId ) || csrIsBTAMP( pMac, sessionId ) )
10891 {
10892 //co-exist with IBSS or BT-AMP is not supported
10893 smsLog( pMac, LOGW, " BTAMP is not allowed due to IBSS/BT-AMP exist in session %d\n", sessionId );
10894 status = eHAL_STATUS_CSR_WRONG_STATE;
10895 break;
10896 }
10897 if( csrIsConnStateInfra( pMac, sessionId ) )
10898 {
10899 if( chnId &&
10900 ( (tANI_U8)chnId != pMac->roam.roamSession[sessionId].connectedProfile.operationChannel ) )
10901 {
10902 smsLog( pMac, LOGW, " BTAMP is not allowed due to channel (%d) diff than infr channel (%d)\n",
10903 chnId, pMac->roam.roamSession[sessionId].connectedProfile.operationChannel );
10904 status = eHAL_STATUS_CSR_WRONG_STATE;
10905 break;
10906 }
10907 }
10908 }
10909 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010910 return ( status );
10911}
10912
Jeff Johnson295189b2012-06-20 16:38:30 -070010913static eHalStatus csrRoamStartWds( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc )
10914{
10915 eHalStatus status = eHAL_STATUS_SUCCESS;
10916 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
10917 tBssConfigParam bssConfig;
Jeff Johnson32d95a32012-09-10 13:15:23 -070010918
10919 if(!pSession)
10920 {
10921 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10922 return eHAL_STATUS_FAILURE;
10923 }
10924
Jeff Johnson295189b2012-06-20 16:38:30 -070010925 if ( csrIsConnStateIbss( pMac, sessionId ) )
10926 {
10927 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
10928 }
10929 else if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
10930 {
10931 // Disassociate from the connected Infrastructure network...
10932 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
10933 }
10934 else
10935 {
10936#if defined(VOSS_ENABLED)
10937 //We don't expect Bt-AMP HDD not to disconnect the last connection first at this time.
10938 //Otherwise we need to add code to handle the
10939 //situation just like IBSS. Though for WDS station, we need to send disassoc to PE first then
10940 //send stop_bss to PE, before we can continue.
10941 VOS_ASSERT( !csrIsConnStateWds( pMac, sessionId ) );
10942#endif
10943 palZeroMemory(pMac->hHdd, &bssConfig, sizeof(tBssConfigParam));
10944 /* Assume HDD provide bssid in profile */
10945 palCopyMemory( pMac->hHdd, &pSession->bssParams.bssid, pProfile->BSSIDs.bssid[0], sizeof(tCsrBssid) );
10946 // there is no Bss description before we start an WDS so we need
10947 // to adopt all Bss configuration parameters from the Profile.
10948 status = csrRoamPrepareBssConfigFromProfile(pMac, pProfile, &bssConfig, pBssDesc);
10949 if(HAL_STATUS_SUCCESS(status))
10950 {
10951 //Save profile for late use
10952 csrFreeRoamProfile( pMac, sessionId );
10953 if (HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd,
10954 (void **)&pSession->pCurRoamProfile,
10955 sizeof(tCsrRoamProfile))))
10956 {
10957 palZeroMemory(pMac->hHdd, pSession->pCurRoamProfile, sizeof(tCsrRoamProfile));
10958 csrRoamCopyProfile(pMac, pSession->pCurRoamProfile, pProfile);
10959 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010960 //Prepare some more parameters for this WDS
Jeff Johnsone7245742012-09-05 17:12:55 -070010961 csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, &bssConfig, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070010962 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, NULL, &bssConfig, NULL);
10963 }
10964 }
10965
10966 return( status );
10967}
10968
Jeff Johnson295189b2012-06-20 16:38:30 -070010969////////////////////Mail box
10970
Jeff Johnson295189b2012-06-20 16:38:30 -070010971//pBuf is caller allocated memory point to &(tSirSmeJoinReq->rsnIE.rsnIEdata[ 0 ]) + pMsg->rsnIE.length;
10972//or &(tSirSmeReassocReq->rsnIE.rsnIEdata[ 0 ]) + pMsg->rsnIE.length;
10973static void csrPrepareJoinReassocReqBuffer( tpAniSirGlobal pMac,
10974 tSirBssDescription *pBssDescription,
10975 tANI_U8 *pBuf, tANI_U8 uapsdMask)
10976{
10977 tCsrChannelSet channelGroup;
10978 tSirMacCapabilityInfo *pAP_capabilityInfo;
10979 tAniBool fTmp;
10980 tANI_BOOLEAN found = FALSE;
10981 tANI_U32 size = 0;
10982 tANI_U16 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010983 // plug in neighborhood occupancy info (i.e. BSSes on primary or secondary channels)
10984 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundPri
10985 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundSecDown
10986 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundSecUp
Jeff Johnson295189b2012-06-20 16:38:30 -070010987 // 802.11h
10988 //We can do this because it is in HOST CPU order for now.
10989 pAP_capabilityInfo = (tSirMacCapabilityInfo *)&pBssDescription->capabilityInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -070010990 //tell the target AP my 11H capability only if both AP and STA support 11H and the channel being used is 11a
10991 if ( csrIs11hSupported( pMac ) && pAP_capabilityInfo->spectrumMgt && eSIR_11A_NW_TYPE == pBssDescription->nwType )
10992 {
10993 fTmp = (tAniBool)pal_cpu_to_be32(1);
10994 }
10995 else
10996 fTmp = (tAniBool)0;
10997
10998 // corresponds to --- pMsg->spectrumMgtIndicator = ON;
10999 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&fTmp, sizeof(tAniBool) );
11000 pBuf += sizeof(tAniBool);
11001 *pBuf++ = MIN_STA_PWR_CAP_DBM; // it is for pMsg->powerCap.minTxPower = 0;
11002 found = csrSearchChannelListForTxPower(pMac, pBssDescription, &channelGroup);
Jeff Johnson295189b2012-06-20 16:38:30 -070011003 // This is required for 11k test VoWiFi Ent: Test 2.
11004 // We need the power capabilities for Assoc Req.
11005 // This macro is provided by the halPhyCfg.h. We pick our
11006 // max and min capability by the halPhy provided macros
11007 *pBuf++ = MAX_STA_PWR_CAP_DBM;
Jeff Johnson295189b2012-06-20 16:38:30 -070011008 size = sizeof(pMac->roam.validChannelList);
11009 if(HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &size)))
11010 {
11011 *pBuf++ = (tANI_U8)size; //tSirSupChnl->numChnl
11012 for ( i = 0; i < size; i++)
11013 {
11014 *pBuf++ = pMac->roam.validChannelList[ i ]; //tSirSupChnl->channelList[ i ]
11015
11016 }
11017 }
11018 else
11019 {
11020 smsLog(pMac, LOGE, FL("can not find any valid channel\n"));
11021 *pBuf++ = 0; //tSirSupChnl->numChnl
11022 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011023 //Check whether it is ok to enter UAPSD
11024#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11025 if( btcIsReadyForUapsd(pMac) )
11026#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
11027 {
11028 *pBuf++ = uapsdMask;
11029 }
11030#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11031 else
11032 {
11033 smsLog(pMac, LOGE, FL(" BTC doesn't allow UAPSD for uapsd_mask(0x%X)\n"), uapsdMask);
11034 *pBuf++ = 0;
11035 }
11036#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
11037
Jeff Johnson295189b2012-06-20 16:38:30 -070011038 // move the entire BssDescription into the join request.
11039 palCopyMemory( pMac->hHdd, pBuf, pBssDescription,
11040 pBssDescription->length + sizeof( pBssDescription->length ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070011041 pBuf += pBssDescription->length + sizeof( pBssDescription->length ); // update to new location
11042}
11043
Jeff Johnson295189b2012-06-20 16:38:30 -070011044/*
11045 * The communication between HDD and LIM is thru mailbox (MB).
11046 * Both sides will access the data structure "tSirSmeJoinReq".
11047 * The rule is, while the components of "tSirSmeJoinReq" can be accessed in the regular way like tSirSmeJoinReq.assocType, this guideline
11048 * stops at component tSirRSNie; any acces to the components after tSirRSNie is forbidden because the space from tSirRSNie is quueezed
11049 * with the component "tSirBssDescription". And since the size of actual 'tSirBssDescription' varies, the receiving side (which is the routine
11050 * limJoinReqSerDes() of limSerDesUtils.cc) should keep in mind not to access the components DIRECTLY after tSirRSNie.
11051 */
11052eHalStatus csrSendJoinReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDescription,
11053 tCsrRoamProfile *pProfile, tDot11fBeaconIEs *pIes )
11054{
11055 eHalStatus status = eHAL_STATUS_SUCCESS;
11056 tSirSmeJoinReq *pMsg;
11057 tANI_U8 *pBuf;
11058 tANI_U16 msgLen, wTmp, ieLen;
11059 tSirMacRateSet OpRateSet;
11060 tSirMacRateSet ExRateSet;
11061 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11062 tANI_U32 dwTmp;
11063 tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN]; //RSN MAX is bigger than WPA MAX
Jeff Johnson32d95a32012-09-10 13:15:23 -070011064
11065 if(!pSession)
11066 {
11067 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
11068 return eHAL_STATUS_FAILURE;
11069 }
11070
Jeff Johnson295189b2012-06-20 16:38:30 -070011071 do {
11072 pSession->joinFailStatusCode.statusCode = eSIR_SME_SUCCESS;
11073 pSession->joinFailStatusCode.reasonCode = 0;
11074 // There are a number of variable length fields to consider. First, the tSirSmeJoinReq
11075 // includes a single bssDescription. bssDescription includes a single tANI_U32 for the
11076 // IE fields, but the length field in the bssDescription needs to be interpreted to
11077 // determine length of the IE fields.
11078 //
11079 // So, take the size of the JoinReq, subtract the size of the bssDescription and
11080 // add in the length from the bssDescription (then add the size of the 'length' field
11081 // itself because that is NOT included in the length field).
11082 msgLen = sizeof( tSirSmeJoinReq ) - sizeof( *pBssDescription ) +
11083 pBssDescription->length + sizeof( pBssDescription->length ) +
11084 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 -070011085 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
11086 if ( !HAL_STATUS_SUCCESS(status) ) break;
11087 palZeroMemory(pMac->hHdd, pMsg, msgLen);
11088 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_JOIN_REQ);
11089 pMsg->length = pal_cpu_to_be16(msgLen);
11090 pBuf = &pMsg->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070011091 // sessionId
11092 *pBuf = (tANI_U8)sessionId;
11093 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011094 // transactionId
11095 *pBuf = 0;
11096 *( pBuf + 1 ) = 0;
11097 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011098 // ssId
11099 if( pIes->SSID.present && pIes->SSID.num_ssid )
11100 {
11101 // ssId len
11102 *pBuf = pIes->SSID.num_ssid;
11103 pBuf++;
11104 palCopyMemory( pMac->hHdd, pBuf, pIes->SSID.ssid, pIes->SSID.num_ssid );
11105 pBuf += pIes->SSID.num_ssid;
11106 }
11107 else
11108 {
11109 *pBuf = 0;
11110 pBuf++;
11111 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011112 // selfMacAddr
11113 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
11114 pBuf += sizeof(tSirMacAddr);
11115 // bsstype
11116 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( pProfile->BSSType ) );
11117 if (dwTmp == eSIR_BTAMP_STA_MODE) dwTmp = eSIR_BTAMP_AP_MODE; // Override BssType for BTAMP
11118 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
11119 pBuf += sizeof(tSirBssType);
11120 // dot11mode
11121 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pSession->bssParams.uCfgDot11Mode );
11122 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011123 //Persona
11124 *pBuf = (tANI_U8)pProfile->csrPersona;
11125 pBuf++;
Jeff Johnsone7245742012-09-05 17:12:55 -070011126 //CBMode
11127 *pBuf = (tANI_U8)pSession->bssParams.cbMode;
11128 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011129
11130 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
Jeff Johnsone7245742012-09-05 17:12:55 -070011131 FL("CSR PERSONA=%d CSR CbMode %d"), pProfile->csrPersona, pSession->bssParams.cbMode);
11132
Jeff Johnson295189b2012-06-20 16:38:30 -070011133 // uapsdPerAcBitmask
11134 *pBuf = pProfile->uapsd_mask;
11135 pBuf++;
11136
Jeff Johnsone7245742012-09-05 17:12:55 -070011137
Jeff Johnson295189b2012-06-20 16:38:30 -070011138
11139#if (WNI_POLARIS_FW_PACKAGE == ADVANCED)
11140#endif /*(WNI_POLARIS_FW_PACKAGE == ADVANCED)*/
Jeff Johnson295189b2012-06-20 16:38:30 -070011141 status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode, pBssDescription, pIes, &OpRateSet, &ExRateSet);
11142 if (HAL_STATUS_SUCCESS(status) )
11143 {
11144 // OperationalRateSet
11145 if (OpRateSet.numRates) {
11146 *pBuf++ = OpRateSet.numRates;
11147 palCopyMemory(pMac->hHdd, pBuf, OpRateSet.rate, OpRateSet.numRates);
11148 pBuf += OpRateSet.numRates;
11149 } else *pBuf++ = 0;
11150 // ExtendedRateSet
11151 if (ExRateSet.numRates) {
11152 *pBuf++ = ExRateSet.numRates;
11153 palCopyMemory(pMac->hHdd, pBuf, ExRateSet.rate, ExRateSet.numRates);
11154 pBuf += ExRateSet.numRates;
11155 } else *pBuf++ = 0;
11156 }
11157 else
11158 {
11159 *pBuf++ = 0;
11160 *pBuf++ = 0;
11161 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011162 // rsnIE
11163 if ( csrIsProfileWpa( pProfile ) )
11164 {
11165 // Insert the Wpa IE into the join request
11166 ieLen = csrRetrieveWpaIe( pMac, pProfile, pBssDescription, pIes,
11167 (tCsrWpaIe *)( wpaRsnIE ) );
11168 }
11169 else if( csrIsProfileRSN( pProfile ) )
11170 {
11171 // Insert the RSN IE into the join request
11172 ieLen = csrRetrieveRsnIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11173 (tCsrRSNIe *)( wpaRsnIE ) );
11174 }
11175#ifdef FEATURE_WLAN_WAPI
11176 else if( csrIsProfileWapi( pProfile ) )
11177 {
11178 // Insert the WAPI IE into the join request
11179 ieLen = csrRetrieveWapiIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11180 (tCsrWapiIe *)( wpaRsnIE ) );
11181 }
11182#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070011183 else
11184 {
11185 ieLen = 0;
11186 }
11187 //remember the IE for future use
11188 if( ieLen )
11189 {
11190 if(ieLen > DOT11F_IE_RSN_MAX_LEN)
11191 {
11192 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);
11193 ieLen = DOT11F_IE_RSN_MAX_LEN;
11194 }
11195#ifdef FEATURE_WLAN_WAPI
11196 if( csrIsProfileWapi( pProfile ) )
11197 {
11198 //Check whether we need to allocate more memory
11199 if(ieLen > pSession->nWapiReqIeLength)
11200 {
11201 if(pSession->pWapiReqIE && pSession->nWapiReqIeLength)
11202 {
11203 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
11204 }
11205 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWapiReqIE, ieLen);
11206 if(!HAL_STATUS_SUCCESS(status)) break;
11207 }
11208 pSession->nWapiReqIeLength = ieLen;
11209 palCopyMemory(pMac->hHdd, pSession->pWapiReqIE, wpaRsnIE, ieLen);
11210 wTmp = pal_cpu_to_be16( ieLen );
11211 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11212 pBuf += sizeof(tANI_U16);
11213 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11214 pBuf += ieLen;
11215 }
11216 else//should be WPA/WPA2 otherwise
11217#endif /* FEATURE_WLAN_WAPI */
11218 {
11219 //Check whether we need to allocate more memory
11220 if(ieLen > pSession->nWpaRsnReqIeLength)
11221 {
11222 if(pSession->pWpaRsnReqIE && pSession->nWpaRsnReqIeLength)
11223 {
11224 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11225 }
11226 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnReqIE, ieLen);
11227 if(!HAL_STATUS_SUCCESS(status)) break;
11228 }
11229 pSession->nWpaRsnReqIeLength = ieLen;
11230 palCopyMemory(pMac->hHdd, pSession->pWpaRsnReqIE, wpaRsnIE, ieLen);
11231 wTmp = pal_cpu_to_be16( ieLen );
11232 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11233 pBuf += sizeof(tANI_U16);
11234 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11235 pBuf += ieLen;
11236 }
11237 }
11238 else
11239 {
11240 //free whatever old info
11241 pSession->nWpaRsnReqIeLength = 0;
11242 if(pSession->pWpaRsnReqIE)
11243 {
11244 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11245 pSession->pWpaRsnReqIE = NULL;
11246 }
11247#ifdef FEATURE_WLAN_WAPI
11248 pSession->nWapiReqIeLength = 0;
11249 if(pSession->pWapiReqIE)
11250 {
11251 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
11252 pSession->pWapiReqIE = NULL;
11253 }
11254#endif /* FEATURE_WLAN_WAPI */
11255 //length is two bytes
11256 *pBuf = 0;
11257 *(pBuf + 1) = 0;
11258 pBuf += 2;
11259 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011260#ifdef FEATURE_WLAN_CCX
11261 // Never include the cckmIE in an Join Request
11262 //length is two bytes
11263 *pBuf = 0;
11264 *(pBuf + 1) = 0;
11265 pBuf += 2;
11266#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011267 // addIEScan
11268 if(pProfile->nAddIEScanLength && pProfile->pAddIEScan)
11269 {
11270 ieLen = pProfile->nAddIEScanLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011271 if(ieLen > pSession->nAddIEScanLength)
11272 {
11273 if(pSession->pAddIEScan && pSession->nAddIEScanLength)
11274 {
11275 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11276 }
11277 status = palAllocateMemory(pMac->hHdd,
11278 (void **)&pSession->pAddIEScan, ieLen);
11279 if(!HAL_STATUS_SUCCESS(status)) break;
11280 }
11281 pSession->nAddIEScanLength = ieLen;
11282 palCopyMemory(pMac->hHdd, pSession->pAddIEScan,
11283 pProfile->pAddIEScan, ieLen);
11284 wTmp = pal_cpu_to_be16( ieLen );
11285 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11286 pBuf += sizeof(tANI_U16);
11287 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEScan, ieLen );
11288 pBuf += ieLen;
11289 }
11290 else
11291 {
11292 pSession->nAddIEScanLength = 0;
11293 if(pSession->pAddIEScan)
11294 {
11295 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11296 pSession->pAddIEScan = NULL;
11297 }
11298 *pBuf = 0;
11299 *(pBuf + 1) = 0;
11300 pBuf += 2;
11301 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011302 // addIEAssoc
11303 if(pProfile->nAddIEAssocLength && pProfile->pAddIEAssoc)
11304 {
11305 ieLen = pProfile->nAddIEAssocLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011306 if(ieLen > pSession->nAddIEAssocLength)
11307 {
11308 if(pSession->pAddIEAssoc && pSession->nAddIEAssocLength)
11309 {
11310 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11311 }
11312 status = palAllocateMemory(pMac->hHdd,
11313 (void **)&pSession->pAddIEAssoc, ieLen);
11314 if(!HAL_STATUS_SUCCESS(status)) break;
11315 }
11316 pSession->nAddIEAssocLength = ieLen;
11317 palCopyMemory(pMac->hHdd, pSession->pAddIEAssoc,
11318 pProfile->pAddIEAssoc, ieLen);
11319 wTmp = pal_cpu_to_be16( ieLen );
11320 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11321 pBuf += sizeof(tANI_U16);
11322 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEAssoc, ieLen );
11323 pBuf += ieLen;
11324 }
11325 else
11326 {
11327 pSession->nAddIEAssocLength = 0;
11328 if(pSession->pAddIEAssoc)
11329 {
11330 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11331 pSession->pAddIEAssoc = NULL;
11332 }
11333 *pBuf = 0;
11334 *(pBuf + 1) = 0;
11335 pBuf += 2;
11336 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011337 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedUCEncryptionType) );
11338 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11339 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011340 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
11341 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11342 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011343#ifdef WLAN_FEATURE_VOWIFI_11R
11344 if (csrIsProfile11r( pProfile ) )
11345 {
11346 // is11Rconnection;
11347 dwTmp = pal_cpu_to_be32(TRUE);
11348 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11349 pBuf += sizeof(tAniBool);
11350 }
11351 else
11352 {
11353 // is11Rconnection;
11354 dwTmp = pal_cpu_to_be32(FALSE);
11355 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11356 pBuf += sizeof(tAniBool);
11357 }
11358#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011359#ifdef FEATURE_WLAN_CCX
11360 /* A profile can not be both CCX and 11R. But an 802.11R AP
11361 * may be advertising support for CCX as well. So if we are
11362 * associating Open or explicitly CCX then we will get CCX.
11363 * If we are associating explictly 11R only then we will get
11364 * 11R.
11365 */
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011366 if ((csrIsProfileCCX(pProfile) ||
11367 ((pIes->CCXVersion.present)
11368 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11369 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11370 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11371 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11372 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11373 && (!(csrIsProfile11r( pProfile )))
11374 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -070011375 {
11376 // isCCXconnection;
11377 dwTmp = pal_cpu_to_be32(TRUE);
11378 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11379 pBuf += sizeof(tAniBool);
11380 }
11381 else
11382 {
11383 //isCCXconnection;
11384 dwTmp = pal_cpu_to_be32(FALSE);
11385 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11386 pBuf += sizeof(tAniBool);
11387 }
11388 {
11389 tCCXTspecInfo ccxTspec;
11390 // CCX-Tspec IEs in the ASSOC request is presently not supported
11391 // so nullify the TSPEC parameters
11392 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11393 palCopyMemory( pMac->hHdd, pBuf, &ccxTspec, sizeof(tCCXTspecInfo));
11394 pBuf += sizeof(tCCXTspecInfo);
11395 }
11396#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011397#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -070011398 // Fill in isFastTransitionEnabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011399 if (pMac->roam.configParam.isFastTransitionEnabled
11400#ifdef FEATURE_WLAN_LFR
11401 || csrRoamIsFastRoamEnabled(pMac)
11402#endif
11403 )
Jeff Johnson295189b2012-06-20 16:38:30 -070011404 {
11405 dwTmp = pal_cpu_to_be32(TRUE);
11406 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11407 pBuf += sizeof(tAniBool);
11408 }
11409 else
11410 {
11411 dwTmp = pal_cpu_to_be32(FALSE);
11412 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11413 pBuf += sizeof(tAniBool);
11414 }
11415#endif
Jeff Johnson43971f52012-07-17 12:26:56 -070011416#ifdef FEATURE_WLAN_LFR
11417 if(csrRoamIsFastRoamEnabled(pMac))
11418 {
11419 //legacy fast roaming enabled
11420 dwTmp = pal_cpu_to_be32(TRUE);
11421 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11422 pBuf += sizeof(tAniBool);
11423 }
11424 else
11425 {
11426 dwTmp = pal_cpu_to_be32(FALSE);
11427 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11428 pBuf += sizeof(tAniBool);
11429 }
11430#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011431 //BssDesc
11432 csrPrepareJoinReassocReqBuffer( pMac, pBssDescription, pBuf,
11433 (tANI_U8)pProfile->uapsd_mask);
Jeff Johnson295189b2012-06-20 16:38:30 -070011434 status = palSendMBMessage(pMac->hHdd, pMsg );
11435 if(!HAL_STATUS_SUCCESS(status))
11436 {
11437 break;
11438 }
11439 //Tush-QoS: notify QoS module that join happening
11440 else
11441 {
11442#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11443 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_JOIN_REQ, NULL);
11444#endif
11445 }
11446 } while( 0 );
11447 return( status );
11448}
11449
Jeff Johnson295189b2012-06-20 16:38:30 -070011450eHalStatus csrSendSmeReassocReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDescription,
11451 tDot11fBeaconIEs *pIes, tCsrRoamProfile *pProfile )
11452{
11453 eHalStatus status;
11454 tSirSmeReassocReq *pMsg;
11455 tANI_U8 *pBuf;
11456 v_U8_t acm_mask = 0, uapsd_mask;
11457 tANI_U16 msgLen, ieLen, wTmp;
11458 tANI_U32 dwTmp;
11459 tSirMacRateSet OpRateSet;
11460 tSirMacRateSet ExRateSet;
11461 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11462 tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN]; //RSN MAX is bigger than WPA MAX
Jeff Johnson32d95a32012-09-10 13:15:23 -070011463
11464 if(!pSession)
11465 {
11466 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
11467 return eHAL_STATUS_FAILURE;
11468 }
11469
Jeff Johnson295189b2012-06-20 16:38:30 -070011470 /* To satisfy klockworks */
11471 if (pBssDescription == NULL)
11472 {
11473 smsLog(pMac, LOGE, FL(" pBssDescription is NULL\n"));
11474 return eHAL_STATUS_FAILURE;
11475 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011476 do {
11477 // There are a number of variable length fields to consider. First, the tSirSmeJoinReq
11478 // includes a single bssDescription. bssDescription includes a single tANI_U32 for the
11479 // IE fields, but the length field in the bssDescription needs to be interpreted to
11480 // determine length of the IE fields.
11481 //
11482 // So, take the size of the JoinReq, subtract the size of the bssDescription and
11483 // add in the length from the bssDescription (then add the size of the 'length' field
11484 // itself because that is NOT included in the length field).
11485 msgLen = sizeof( tSirSmeReassocReq ) - sizeof( *pBssDescription ) +
11486 pBssDescription->length + sizeof( pBssDescription->length ) +
11487 sizeof( tCsrWpaIe ) + sizeof( tCsrWpaAuthIe ) + sizeof( tANI_U16 ); // add in the size of the WPA IE that we may build.
11488 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
11489 if ( !HAL_STATUS_SUCCESS(status) ) break;
11490 palZeroMemory(pMac->hHdd, pMsg, msgLen);
11491 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_REASSOC_REQ);
11492 pMsg->length = pal_cpu_to_be16(msgLen);
11493 pBuf = &pMsg->sessionId;
11494 // sessionId
11495 *pBuf++ = (tANI_U8)sessionId;
11496 // transactionId
11497 *pBuf = 0;
11498 *(pBuf + 1) = 0;
11499 pBuf += sizeof (tANI_U16);
11500 // ssId
11501 if( pIes->SSID.present && pIes->SSID.num_ssid )
11502 {
11503 // ssId len
11504 *pBuf++ = pIes->SSID.num_ssid;
11505 palCopyMemory( pMac->hHdd, pBuf, pIes->SSID.ssid, pIes->SSID.num_ssid );
11506 pBuf += pIes->SSID.num_ssid;
11507 }
11508 else
11509 {
11510 *pBuf++ = 0;
11511 }
11512 // selfMacAddr
11513 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
11514 pBuf += sizeof(tSirMacAddr);
11515 // bsstype
11516 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( pProfile->BSSType ) );
11517 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
11518 pBuf += sizeof(tSirBssType);
11519 // dot11mode
11520 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pSession->bssParams.uCfgDot11Mode );
11521 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011522 //Persona
11523 *pBuf = (tANI_U8)pProfile->csrPersona;
11524 pBuf++;
Jeff Johnsone7245742012-09-05 17:12:55 -070011525 //CBMode
11526 *pBuf = (tANI_U8)pSession->bssParams.cbMode;
11527 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011528
Jeff Johnsone7245742012-09-05 17:12:55 -070011529 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
11530 FL("CSR PERSONA=%d CSR CBMode=%u\n"), pProfile->csrPersona, pSession->bssParams.cbMode);
11531
Jeff Johnson295189b2012-06-20 16:38:30 -070011532 // uapsdPerAcBitmask
11533 *pBuf = pProfile->uapsd_mask;
11534 pBuf++;
11535
Jeff Johnson295189b2012-06-20 16:38:30 -070011536 status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode,
11537 pBssDescription, pIes, &OpRateSet, &ExRateSet);
11538 if (HAL_STATUS_SUCCESS(status) )
11539 {
11540 // OperationalRateSet
11541 if (OpRateSet.numRates)
11542 {
11543 *pBuf++ = OpRateSet.numRates;
11544 palCopyMemory(pMac->hHdd, pBuf, OpRateSet.rate, OpRateSet.numRates);
11545 pBuf += OpRateSet.numRates;
11546 }
11547 else *pBuf++ = 0;
11548 // ExtendedRateSet
11549 if (ExRateSet.numRates)
11550 {
11551 *pBuf++ = ExRateSet.numRates;
11552 palCopyMemory(pMac->hHdd, pBuf, ExRateSet.rate, ExRateSet.numRates);
11553 pBuf += ExRateSet.numRates;
11554 }
11555 else *pBuf++ = 0;
11556 }
11557 else
11558 {
11559 *pBuf++ = 0;
11560 *pBuf++ = 0;
11561 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011562 // rsnIE
11563 if ( csrIsProfileWpa( pProfile ) )
11564 {
11565 // Insert the Wpa IE into the join request
11566 ieLen = csrRetrieveWpaIe( pMac, pProfile, pBssDescription, pIes,
11567 (tCsrWpaIe *)( wpaRsnIE ) );
11568 }
11569 else if( csrIsProfileRSN( pProfile ) )
11570 {
11571 // Insert the RSN IE into the join request
11572 ieLen = csrRetrieveRsnIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11573 (tCsrRSNIe *)( wpaRsnIE ) );
11574 }
11575#ifdef FEATURE_WLAN_WAPI
11576 else if( csrIsProfileWapi( pProfile ) )
11577 {
11578 // Insert the WAPI IE into the join request
11579 ieLen = csrRetrieveWapiIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11580 (tCsrWapiIe *)( wpaRsnIE) );
11581 }
11582#endif /* FEATURE_WLAN_WAPI */
11583 else
11584 {
11585 ieLen = 0;
11586 }
11587 //remember the IE for future use
11588 if( ieLen )
11589 {
11590 if(ieLen > DOT11F_IE_RSN_MAX_LEN)
11591 {
11592 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);
11593 ieLen = DOT11F_IE_RSN_MAX_LEN;
11594 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011595 //Check whether we need to allocate more memory
11596 if(ieLen > pSession->nWpaRsnReqIeLength)
11597 {
11598 if(pSession->pWpaRsnReqIE && pSession->nWpaRsnReqIeLength)
11599 {
11600 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11601 }
11602 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnReqIE, ieLen);
11603 if(!HAL_STATUS_SUCCESS(status)) break;
11604 }
11605 pSession->nWpaRsnReqIeLength = ieLen;
11606 palCopyMemory(pMac->hHdd, pSession->pWpaRsnReqIE, wpaRsnIE, ieLen);
11607 wTmp = pal_cpu_to_be16( ieLen );
11608 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11609 pBuf += sizeof(tANI_U16);
11610 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11611 pBuf += ieLen;
11612 }
11613 else
11614 {
11615 //free whatever old info
11616 pSession->nWpaRsnReqIeLength = 0;
11617 if(pSession->pWpaRsnReqIE)
11618 {
11619 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11620 pSession->pWpaRsnReqIE = NULL;
11621 }
11622 //length is two bytes
11623 *pBuf = 0;
11624 *(pBuf + 1) = 0;
11625 pBuf += 2;
11626 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011627#ifdef FEATURE_WLAN_CCX
11628 // cckmIE
11629 if( csrIsProfileCCX( pProfile ) )
11630 {
11631 // Insert the CCKM IE into the join request
11632 ieLen = csrConstructCcxCckmIe( pMac,
11633 pSession,
11634 pProfile,
11635 pBssDescription,
11636 pSession->pWpaRsnReqIE,
11637 pSession->nWpaRsnReqIeLength,
11638 (void *)( wpaRsnIE ) );
11639 }
11640 else
11641 {
11642 ieLen = 0;
11643 }
11644 //If present, copy the IE into the eWNI_SME_REASSOC_REQ message buffer
11645 if( ieLen )
11646 {
11647 //Copy the CCKM IE over from the temp buffer (wpaRsnIE)
11648 wTmp = pal_cpu_to_be16( ieLen );
11649 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11650 pBuf += sizeof(tANI_U16);
11651 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11652 pBuf += ieLen;
11653 }
11654 else
11655 {
11656 //Indicate you have no CCKM IE
11657 //length is two bytes
11658 *pBuf = 0;
11659 *(pBuf + 1) = 0;
11660 pBuf += 2;
11661 }
11662#endif /* FEATURE_WLAN_CCX */
Jeff Johnson295189b2012-06-20 16:38:30 -070011663 // addIEScan
11664 if(pProfile->nAddIEScanLength && pProfile->pAddIEScan)
11665 {
11666 ieLen = pProfile->nAddIEScanLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011667 if(ieLen > pSession->nAddIEScanLength)
11668 {
11669 if(pSession->pAddIEScan && pSession->nAddIEScanLength)
11670 {
11671 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11672 }
11673 status = palAllocateMemory(pMac->hHdd,
11674 (void **)&pSession->pAddIEScan, ieLen);
11675 if(!HAL_STATUS_SUCCESS(status)) break;
11676 }
11677 pSession->nAddIEScanLength = ieLen;
11678 palCopyMemory(pMac->hHdd, pSession->pAddIEScan,
11679 pProfile->pAddIEScan, ieLen);
11680 wTmp = pal_cpu_to_be16( ieLen );
11681 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11682 pBuf += sizeof(tANI_U16);
11683 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEScan, ieLen );
11684 pBuf += ieLen;
11685 }
11686 else
11687 {
11688 pSession->nAddIEScanLength = 0;
11689 if(pSession->pAddIEScan)
11690 {
11691 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11692 pSession->pAddIEScan = NULL;
11693 }
11694 *pBuf = 0;
11695 *(pBuf + 1) = 0;
11696 pBuf += 2;
11697 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011698 // addIEAssoc
11699 if(pProfile->nAddIEAssocLength && pProfile->pAddIEAssoc)
11700 {
11701 ieLen = pProfile->nAddIEAssocLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011702 if(ieLen > pSession->nAddIEAssocLength)
11703 {
11704 if(pSession->pAddIEAssoc && pSession->nAddIEAssocLength)
11705 {
11706 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11707 }
11708 status = palAllocateMemory(pMac->hHdd,
11709 (void **)&pSession->pAddIEAssoc, ieLen);
11710 if(!HAL_STATUS_SUCCESS(status)) break;
11711 }
11712 pSession->nAddIEAssocLength = ieLen;
11713 palCopyMemory(pMac->hHdd, pSession->pAddIEAssoc,
11714 pProfile->pAddIEAssoc, ieLen);
11715 wTmp = pal_cpu_to_be16( ieLen );
11716 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11717 pBuf += sizeof(tANI_U16);
11718 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEAssoc, ieLen );
11719 pBuf += ieLen;
11720 }
11721 else
11722 {
11723 pSession->nAddIEAssocLength = 0;
11724 if(pSession->pAddIEAssoc)
11725 {
11726 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11727 pSession->pAddIEAssoc = NULL;
11728 }
11729 *pBuf = 0;
11730 *(pBuf + 1) = 0;
11731 pBuf += 2;
11732 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011733 //Unmask any AC in reassoc that is ACM-set
11734 uapsd_mask = (v_U8_t)pProfile->uapsd_mask;
11735 if( uapsd_mask && ( NULL != pBssDescription ) )
11736 {
11737 if( CSR_IS_QOS_BSS(pIes) && CSR_IS_UAPSD_BSS(pIes) )
11738 {
11739#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11740 acm_mask = sme_QosGetACMMask(pMac, pBssDescription, pIes);
11741#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
11742 uapsd_mask &= ~(acm_mask);
11743 }
11744 else
11745 {
11746 uapsd_mask = 0;
11747 }
11748 }
11749
11750 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedUCEncryptionType) );
11751 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11752 pBuf += sizeof(tANI_U32);
11753
11754 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
11755 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11756 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011757#ifdef WLAN_FEATURE_VOWIFI_11R
11758 // is11Rconnection;
11759 dwTmp = csrIsProfile11r( pProfile )? pal_cpu_to_be32(TRUE) : 0;
11760 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11761 pBuf += sizeof(tAniBool);
Jeff Johnson295189b2012-06-20 16:38:30 -070011762#ifdef FEATURE_WLAN_CCX
11763 //isCCXconnection;
11764 //CCKM profile, ccxversion ie present, not 11r and ini file has CCX enabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011765 dwTmp = ( ((csrIsProfileCCX(pProfile) ||
11766 ((pIes->CCXVersion.present)
11767 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11768 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11769 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11770 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11771 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11772 && (!(csrIsProfile11r( pProfile )))
11773 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
11774 ? pal_cpu_to_be32(TRUE) : 0);
Jeff Johnson295189b2012-06-20 16:38:30 -070011775 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11776 pBuf += sizeof(tAniBool);
11777#endif // FEATURE_WLAN_CCX
11778#endif // WLAN_FEATURE_VOWIFI_11R
Jeff Johnson295189b2012-06-20 16:38:30 -070011779#ifdef FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011780 if ((csrIsProfileCCX(pProfile) ||
11781 ((pIes->CCXVersion.present)
11782 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11783 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11784 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11785 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11786 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11787 && (!(csrIsProfile11r( pProfile )))
11788 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -070011789 {
11790 tCCXTspecInfo ccxTspec;
Jeff Johnson295189b2012-06-20 16:38:30 -070011791 // CCX Tspec information
11792 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11793 ccxTspec.numTspecs = sme_QosCCxRetrieveTspecInfo(pMac, sessionId, (tTspecInfo *) &ccxTspec.tspec[0]);
11794 *pBuf = ccxTspec.numTspecs;
11795 pBuf += sizeof(tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070011796 // Copy the TSPEC information only if present
11797 if (ccxTspec.numTspecs) {
11798 palCopyMemory(pMac->hHdd, pBuf, (void*)&ccxTspec.tspec[0], (ccxTspec.numTspecs*sizeof(tTspecInfo)));
11799 }
11800 pBuf += sizeof(ccxTspec.tspec);
11801 }
11802 else
11803 {
11804 {
11805 tCCXTspecInfo ccxTspec;
11806 // CCX-Tspec IEs in the ASSOC request is presently not supported
11807 // so nullify the TSPEC parameters
11808 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11809 palCopyMemory( pMac->hHdd, pBuf, &ccxTspec, sizeof(tCCXTspecInfo));
11810 pBuf += sizeof(tCCXTspecInfo);
11811 }
11812 }
11813#endif // FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011814#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -070011815 // Fill in isFastTransitionEnabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011816 if (pMac->roam.configParam.isFastTransitionEnabled
11817#ifdef FEATURE_WLAN_LFR
11818 || csrRoamIsFastRoamEnabled(pMac)
11819#endif
11820 )
Jeff Johnson295189b2012-06-20 16:38:30 -070011821 {
11822 dwTmp = pal_cpu_to_be32(TRUE);
11823 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11824 pBuf += sizeof(tAniBool);
11825 }
11826 else
11827 {
11828 dwTmp = pal_cpu_to_be32(FALSE);
11829 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11830 pBuf += sizeof(tAniBool);
11831 }
11832#endif
Jeff Johnson43971f52012-07-17 12:26:56 -070011833#ifdef FEATURE_WLAN_LFR
11834 if(csrRoamIsFastRoamEnabled(pMac))
11835 {
11836 //legacy fast roaming enabled
11837 dwTmp = pal_cpu_to_be32(TRUE);
11838 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11839 pBuf += sizeof(tAniBool);
11840 }
11841 else
11842 {
11843 dwTmp = pal_cpu_to_be32(FALSE);
11844 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11845 pBuf += sizeof(tAniBool);
11846 }
11847#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011848 csrPrepareJoinReassocReqBuffer( pMac, pBssDescription, pBuf, uapsd_mask);
11849
11850#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11851 //Tush-QoS: notify QoS module that reassoc happening
11852 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_REASSOC_REQ, NULL);
11853#endif
11854 status = palSendMBMessage( pMac->hHdd, pMsg );
11855 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011856 return( status );
Jeff Johnson295189b2012-06-20 16:38:30 -070011857}
11858
Jeff Johnson295189b2012-06-20 16:38:30 -070011859//
11860eHalStatus csrSendMBDisassocReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr bssId, tANI_U16 reasonCode )
11861{
11862 eHalStatus status = eHAL_STATUS_SUCCESS;
11863 tSirSmeDisassocReq *pMsg;
11864 tANI_U8 *pBuf;
11865 tANI_U16 wTmp;
11866#ifdef WLAN_SOFTAP_FEATURE
11867 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11868 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
11869 return eHAL_STATUS_FAILURE;
11870#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011871 do {
11872 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDisassocReq ));
11873 if ( !HAL_STATUS_SUCCESS(status) ) break;
11874 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDisassocReq ));
11875 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DISASSOC_REQ);
11876 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDisassocReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -070011877 pBuf = &pMsg->sessionId;
11878 // sessionId
11879 *pBuf++ = (tANI_U8)sessionId;
11880 // transactionId
11881 *pBuf = 0;
11882 *( pBuf + 1 ) = 0;
11883 pBuf += sizeof(tANI_U16);
11884
11885#ifdef WLAN_SOFTAP_FEATURE
11886 if ( (pSession->pCurRoamProfile != NULL ) &&
11887 ( reasonCode == eSIR_MAC_UNSPEC_FAILURE_REASON ) &&
11888 ((CSR_IS_INFRA_AP(pSession->pCurRoamProfile)) || (CSR_IS_WDS_AP(pSession->pCurRoamProfile))))
11889 {
11890 // Set the bssid address before sending the message to LIM
11891 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pSession->selfMacAddr, sizeof( tSirMacAddr ) );
11892 pBuf = pBuf + sizeof ( tSirMacAddr );
Jeff Johnson295189b2012-06-20 16:38:30 -070011893 // Set the peer MAC address before sending the message to LIM
11894 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( tSirMacAddr ) ); //perMacAddr is passed as bssId for softAP
11895 pBuf = pBuf + sizeof ( tSirMacAddr );
11896 }
11897 else
11898 {
11899#endif
11900 // Set the peer MAC address before sending the message to LIM
11901 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( tSirMacAddr ) );
11902 pBuf = pBuf + sizeof ( tSirMacAddr );
Jeff Johnson295189b2012-06-20 16:38:30 -070011903 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( pMsg->bssId ) );
11904 pBuf = pBuf + sizeof ( tSirMacAddr );
11905#ifdef WLAN_SOFTAP_FEATURE
11906 }
11907#endif
11908 if(!HAL_STATUS_SUCCESS(status))
11909 {
11910 palFreeMemory(pMac->hHdd, pMsg);
11911 break;
11912 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011913 // reasonCode
11914 wTmp = pal_cpu_to_be16(reasonCode);
11915 status = palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11916 if(!HAL_STATUS_SUCCESS(status))
11917 {
11918 palFreeMemory(pMac->hHdd, pMsg);
11919 break;
11920 }
11921 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011922 /* The state will be DISASSOC_HANDOFF only when we are doing handoff.
11923 Here we should not send the disassoc over the air to the AP */
11924 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO(pMac, sessionId)
11925#ifdef WLAN_FEATURE_VOWIFI_11R
11926 && csrRoamIs11rAssoc(pMac)
11927#endif
11928 )
11929 {
11930 *pBuf = CSR_DONT_SEND_DISASSOC_OVER_THE_AIR; /* Set DoNotSendOverTheAir flag to 1 only for handoff case */
11931 }
11932 pBuf += sizeof(tANI_U8);
11933 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011934 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011935 return( status );
11936}
Jeff Johnson295189b2012-06-20 16:38:30 -070011937#ifdef WLAN_SOFTAP_FEATURE
11938eHalStatus csrSendMBTkipCounterMeasuresReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_BOOLEAN bEnable, tSirMacAddr bssId )
11939{
11940 eHalStatus status = eHAL_STATUS_SUCCESS;
11941 tSirSmeTkipCntrMeasReq *pMsg;
11942 tANI_U8 *pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011943 do
11944 {
11945 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeTkipCntrMeasReq ));
11946 if ( !HAL_STATUS_SUCCESS(status) ) break;
11947 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeTkipCntrMeasReq ));
11948 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_TKIP_CNTR_MEAS_REQ);
11949 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeTkipCntrMeasReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -070011950 pBuf = &pMsg->sessionId;
11951 // sessionId
11952 *pBuf++ = (tANI_U8)sessionId;
11953 // transactionId
11954 *pBuf = 0;
11955 *( pBuf + 1 ) = 0;
11956 pBuf += sizeof(tANI_U16);
11957 // bssid
11958 status = palCopyMemory( pMac->hHdd, pMsg->bssId, bssId, sizeof( tSirMacAddr ) );
11959 pBuf = pBuf + sizeof ( tSirMacAddr );
11960 // bEnable
11961 *pBuf = (tANI_BOOLEAN)bEnable;
11962 if(!HAL_STATUS_SUCCESS(status))
11963 {
11964 palFreeMemory(pMac->hHdd, pMsg);
11965 break;
11966 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011967 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011968 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011969 return( status );
11970}
Jeff Johnson295189b2012-06-20 16:38:30 -070011971eHalStatus
11972csrSendMBGetAssociatedStasReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId,
11973 VOS_MODULE_ID modId, tSirMacAddr bssId,
11974 void *pUsrContext, void *pfnSapEventCallback,
11975 tANI_U8 *pAssocStasBuf )
11976{
11977 eHalStatus status = eHAL_STATUS_SUCCESS;
11978 tSirSmeGetAssocSTAsReq *pMsg;
11979 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
11980 tANI_U32 dwTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011981 do
11982 {
11983 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeGetAssocSTAsReq ) );
11984 if (!HAL_STATUS_SUCCESS(status)) break;
11985 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirSmeGetAssocSTAsReq ) );
11986 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_ASSOC_STAS_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070011987 pBuf = (tANI_U8 *)&pMsg->bssId;
11988 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011989 // bssId
11990 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof(tSirMacAddr) );
11991 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070011992 // modId
11993 dwTmp = pal_cpu_to_be16((tANI_U16)modId);
11994 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U16));
11995 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011996 // pUsrContext
11997 dwTmp = pal_cpu_to_be32((tANI_U32)pUsrContext);
11998 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11999 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012000 // pfnSapEventCallback
12001 dwTmp = pal_cpu_to_be32((tANI_U32)pfnSapEventCallback);
12002 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
12003 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012004 // pAssocStasBuf
12005 dwTmp = pal_cpu_to_be32((tANI_U32)pAssocStasBuf);
12006 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
12007 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012008 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)));//msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070012009 status = palSendMBMessage( pMac->hHdd, pMsg );
12010 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012011 return( status );
12012 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012013eHalStatus
12014csrSendMBGetWPSPBCSessions( tpAniSirGlobal pMac, tANI_U32 sessionId,
12015 tSirMacAddr bssId, void *pUsrContext, void *pfnSapEventCallback,v_MACADDR_t pRemoveMac)
12016 {
12017 eHalStatus status = eHAL_STATUS_SUCCESS;
12018 tSirSmeGetWPSPBCSessionsReq *pMsg;
12019 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
12020 tANI_U32 dwTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012021 do
12022 {
12023 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirSmeGetWPSPBCSessionsReq) );
12024 if (!HAL_STATUS_SUCCESS(status)) break;
12025 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirSmeGetWPSPBCSessionsReq ) );
12026 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_WPSPBC_SESSION_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012027 pBuf = (tANI_U8 *)&pMsg->pUsrContext;
12028 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012029 // pUsrContext
12030 dwTmp = pal_cpu_to_be32((tANI_U32)pUsrContext);
12031 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
12032 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012033 // pSapEventCallback
12034 dwTmp = pal_cpu_to_be32((tANI_U32)pfnSapEventCallback);
12035 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
12036 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012037 // bssId
12038 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof(tSirMacAddr) );
12039 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070012040 // MAC Address of STA in WPS session
12041 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pRemoveMac.bytes, sizeof(v_MACADDR_t));
12042 pBuf += sizeof(v_MACADDR_t);
Jeff Johnson295189b2012-06-20 16:38:30 -070012043 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)));//msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070012044 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012045 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012046 return( status );
12047}
12048#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070012049eHalStatus csrSendMBDeauthReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr bssId, tANI_U16 reasonCode )
12050{
12051 eHalStatus status = eHAL_STATUS_SUCCESS;
12052 tSirSmeDeauthReq *pMsg;
12053 tANI_U8 *pBuf;
12054 tANI_U16 wTmp;
12055 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
12056 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
12057 return eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012058 do {
12059 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDeauthReq ));
12060 if ( !HAL_STATUS_SUCCESS(status) ) break;
12061 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDeauthReq ));
12062 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEAUTH_REQ);
12063 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDeauthReq ));
12064 //sessionId
12065 pBuf = &pMsg->sessionId;
12066 *pBuf++ = (tANI_U8)sessionId;
12067
12068 //tansactionId
12069 *pBuf = 0;
12070 *(pBuf + 1 ) = 0;
12071 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012072 if ((pSession->pCurRoamProfile != NULL) && (
12073#ifdef WLAN_SOFTAP_FEATURE
12074 (CSR_IS_INFRA_AP(pSession->pCurRoamProfile)) ||
12075#endif
12076 (CSR_IS_WDS_AP(pSession->pCurRoamProfile)))){
12077 // Set the BSSID before sending the message to LIM
12078 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pSession->selfMacAddr, sizeof( pMsg->peerMacAddr ) );
12079 pBuf = pBuf + sizeof(tSirMacAddr);
12080 }
12081 else
12082 {
12083 // Set the BSSID before sending the message to LIM
12084 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( pMsg->peerMacAddr ) );
12085 pBuf = pBuf + sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070012086 }
12087 if(!HAL_STATUS_SUCCESS(status))
12088 {
12089 palFreeMemory(pMac->hHdd, pMsg);
12090 break;
12091 }
12092 // Set the peer MAC address before sending the message to LIM
12093 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *) pBuf, bssId, sizeof( pMsg->peerMacAddr ) );
12094 pBuf = pBuf + sizeof(tSirMacAddr);
12095 if(!HAL_STATUS_SUCCESS(status))
12096 {
12097 palFreeMemory(pMac->hHdd, pMsg);
12098 break;
12099 }
12100 wTmp = pal_cpu_to_be16(reasonCode);
12101 status = palCopyMemory( pMac->hHdd, pBuf, &wTmp,sizeof( tANI_U16 ) );
12102 if(!HAL_STATUS_SUCCESS(status))
12103 {
12104 palFreeMemory(pMac->hHdd, pMsg);
12105 break;
12106 }
12107 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012108 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012109 return( status );
12110}
12111
Jeff Johnson295189b2012-06-20 16:38:30 -070012112eHalStatus csrSendMBDisassocCnfMsg( tpAniSirGlobal pMac, tpSirSmeDisassocInd pDisassocInd )
12113{
12114 eHalStatus status = eHAL_STATUS_SUCCESS;
12115 tSirSmeDisassocCnf *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -070012116 do {
12117 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDisassocCnf ));
12118 if ( !HAL_STATUS_SUCCESS(status) ) break;
12119 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDisassocCnf ));
12120 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DISASSOC_CNF);
12121 pMsg->statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12122 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDisassocCnf ));
12123 status = palCopyMemory(pMac->hHdd, pMsg->peerMacAddr, pDisassocInd->peerMacAddr, sizeof(pMsg->peerMacAddr));
12124 if(!HAL_STATUS_SUCCESS(status))
12125 {
12126 palFreeMemory(pMac->hHdd, pMsg);
12127 break;
12128 }
12129//To test reconn
12130 status = palCopyMemory(pMac->hHdd, pMsg->bssId, pDisassocInd->bssId, sizeof(pMsg->peerMacAddr));
12131 if(!HAL_STATUS_SUCCESS(status))
12132 {
12133 palFreeMemory(pMac->hHdd, pMsg);
12134 break;
12135 }
12136//To test reconn ends
Jeff Johnson295189b2012-06-20 16:38:30 -070012137 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012138 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012139 return( status );
12140}
12141
Jeff Johnson295189b2012-06-20 16:38:30 -070012142eHalStatus csrSendMBDeauthCnfMsg( tpAniSirGlobal pMac, tpSirSmeDeauthInd pDeauthInd )
12143{
12144 eHalStatus status = eHAL_STATUS_SUCCESS;
12145 tSirSmeDeauthCnf *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -070012146 do {
12147 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDeauthCnf ));
12148 if ( !HAL_STATUS_SUCCESS(status) ) break;
12149 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDeauthCnf ));
12150 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEAUTH_CNF);
12151 pMsg->statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12152 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDeauthCnf ));
12153 status = palCopyMemory(pMac->hHdd, pMsg->bssId, pDeauthInd->bssId, sizeof(pMsg->bssId));
12154 if(!HAL_STATUS_SUCCESS(status))
12155 {
12156 palFreeMemory(pMac->hHdd, pMsg);
12157 break;
12158 }
12159 status = palCopyMemory(pMac->hHdd, pMsg->peerMacAddr, pDeauthInd->peerMacAddr, sizeof(pMsg->peerMacAddr));
12160 if(!HAL_STATUS_SUCCESS(status))
12161 {
12162 palFreeMemory(pMac->hHdd, pMsg);
12163 break;
12164 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012165 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012166 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012167 return( status );
12168}
Jeff Johnson295189b2012-06-20 16:38:30 -070012169eHalStatus csrSendAssocCnfMsg( tpAniSirGlobal pMac, tpSirSmeAssocInd pAssocInd, eHalStatus Halstatus )
12170{
12171 eHalStatus status = eHAL_STATUS_SUCCESS;
12172 tSirSmeAssocCnf *pMsg;
12173 tANI_U8 *pBuf;
12174 tSirResultCodes statusCode;
12175 tANI_U16 wTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012176 do {
12177 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeAssocCnf ));
12178 if ( !HAL_STATUS_SUCCESS(status) ) break;
12179 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeAssocCnf ));
12180 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_ASSOC_CNF);
12181 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeAssocCnf ));
Jeff Johnson295189b2012-06-20 16:38:30 -070012182 pBuf = (tANI_U8 *)&pMsg->statusCode;
12183 if(HAL_STATUS_SUCCESS(Halstatus))
12184 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12185 else
12186 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_ASSOC_REFUSED);
12187 palCopyMemory( pMac->hHdd, pBuf, &statusCode, sizeof(tSirResultCodes) );
12188 pBuf += sizeof(tSirResultCodes);
12189 // bssId
12190 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12191 pBuf += sizeof (tSirMacAddr);
12192 // peerMacAddr
12193 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
12194 pBuf += sizeof (tSirMacAddr);
12195 // aid
12196 wTmp = pal_cpu_to_be16(pAssocInd->aid);
12197 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12198 pBuf += sizeof (tANI_U16);
12199 // alternateBssId
12200 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12201 pBuf += sizeof (tSirMacAddr);
12202 // alternateChannelId
12203 *pBuf = 11;
Jeff Johnson295189b2012-06-20 16:38:30 -070012204 status = palSendMBMessage( pMac->hHdd, pMsg );
12205 if(!HAL_STATUS_SUCCESS(status))
12206 {
12207 //pMsg is freed by palSendMBMessage
12208 break;
12209 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012210 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012211 return( status );
12212}
Jeff Johnson295189b2012-06-20 16:38:30 -070012213#ifdef WLAN_SOFTAP_FEATURE
12214eHalStatus csrSendAssocIndToUpperLayerCnfMsg( tpAniSirGlobal pMac,
12215 tpSirSmeAssocInd pAssocInd,
12216 eHalStatus Halstatus,
12217 tANI_U8 sessionId)
12218{
12219 tSirMsgQ msgQ;
12220 eHalStatus status = eHAL_STATUS_SUCCESS;
12221 tSirSmeAssocIndToUpperLayerCnf *pMsg;
12222 tANI_U8 *pBuf;
12223 tSirResultCodes statusCode;
12224 tANI_U16 wTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012225 do {
12226 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeAssocIndToUpperLayerCnf ));
12227 if ( !HAL_STATUS_SUCCESS(status) ) break;
12228 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeAssocIndToUpperLayerCnf ));
Jeff Johnsone7245742012-09-05 17:12:55 -070012229
Jeff Johnson295189b2012-06-20 16:38:30 -070012230 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_UPPER_LAYER_ASSOC_CNF);
12231 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeAssocIndToUpperLayerCnf ));
12232
12233 pMsg->sessionId = sessionId;
12234
12235 pBuf = (tANI_U8 *)&pMsg->statusCode;
12236 if(HAL_STATUS_SUCCESS(Halstatus))
12237 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12238 else
12239 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_ASSOC_REFUSED);
12240 palCopyMemory( pMac->hHdd, pBuf, &statusCode, sizeof(tSirResultCodes) );
12241 pBuf += sizeof(tSirResultCodes);
12242 // bssId
12243 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12244 pBuf += sizeof (tSirMacAddr);
12245 // peerMacAddr
12246 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
12247 pBuf += sizeof (tSirMacAddr);
12248 // StaId
12249 wTmp = pal_cpu_to_be16(pAssocInd->staId);
12250 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12251 pBuf += sizeof (tANI_U16);
12252 // alternateBssId
12253 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12254 pBuf += sizeof (tSirMacAddr);
12255 // alternateChannelId
12256 *pBuf = 11;
12257 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012258 // Instead of copying roam Info, we just copy only WmmEnabled , RsnIE information
12259 //Wmm
12260 *pBuf = pAssocInd->wmmEnabledSta;
12261 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012262 //RSN IE
12263 status = palCopyMemory(pMac->hHdd, (tSirRSNie *)pBuf, &pAssocInd->rsnIE, sizeof(tSirRSNie));
12264 pBuf += sizeof (tSirRSNie);
Jeff Johnson295189b2012-06-20 16:38:30 -070012265 //Additional IE
12266 status = palCopyMemory(pMac->hHdd, (void *)pBuf, &pAssocInd->addIE, sizeof(tSirAddie));
12267 pBuf += sizeof (tSirAddie);
Jeff Johnson295189b2012-06-20 16:38:30 -070012268 //reassocReq
12269 *pBuf = pAssocInd->reassocReq;
12270 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012271 msgQ.type = eWNI_SME_UPPER_LAYER_ASSOC_CNF;
12272 msgQ.bodyptr = pMsg;
12273 msgQ.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070012274 SysProcessMmhMsg(pMac, &msgQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012275 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012276 return( status );
12277}
12278#endif
12279
Jeff Johnson295189b2012-06-20 16:38:30 -070012280eHalStatus csrSendMBSetContextReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId ,
12281 tSirMacAddr peerMacAddr, tANI_U8 numKeys, tAniEdType edType,
12282 tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
12283 tANI_U8 keyId, tANI_U8 keyLength, tANI_U8 *pKey, tANI_U8 paeRole,
12284 tANI_U8 *pKeyRsc )
12285{
12286 tSirSmeSetContextReq *pMsg;
12287 tANI_U16 msgLen;
12288 eHalStatus status = eHAL_STATUS_FAILURE;
12289 tAniEdType tmpEdType;
12290 tAniKeyDirection tmpDirection;
12291 tANI_U8 *pBuf;
12292 tANI_U8 *p;
12293 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012294 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012295 if( ( 1 != numKeys ) && ( 0 != numKeys ) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012296 // all of these fields appear in every SET_CONTEXT message. Below we'll add in the size for each
12297 // key set. Since we only support upto one key, we always allocate memory for 1 key
12298 msgLen = sizeof( tANI_U16) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) +
12299 sizeof( tSirMacAddr ) + 1 + sizeof(tANI_U16) +
12300 sizeof( pMsg->keyMaterial.length ) + sizeof( pMsg->keyMaterial.edType ) + sizeof( pMsg->keyMaterial.numKeys ) +
12301 ( sizeof( pMsg->keyMaterial.key ) );
12302
12303 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12304 if ( !HAL_STATUS_SUCCESS(status) ) break;
12305 palZeroMemory(pMac->hHdd, pMsg, msgLen);
12306 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SETCONTEXT_REQ);
12307 pMsg->length = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012308 //sessionId
12309 pBuf = &pMsg->sessionId;
12310 *pBuf = (tANI_U8)sessionId;
12311 pBuf++;
12312 // transactionId
12313 *pBuf = 0;
12314 *(pBuf + 1) = 0;
12315 pBuf += sizeof(tANI_U16);
12316 // peerMacAddr
12317 palCopyMemory( pMac->hHdd, pBuf,
12318 (tANI_U8 *)peerMacAddr, sizeof(tSirMacAddr) );
12319
12320 pBuf += sizeof(tSirMacAddr);
12321
12322 // bssId
12323 palCopyMemory( pMac->hHdd, pBuf,
12324 (tANI_U8 *)&pSession->connectedProfile.bssid, sizeof(tSirMacAddr) );
12325
12326 pBuf += sizeof(tSirMacAddr);
12327
12328 p = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012329 // Set the pMsg->keyMaterial.length field (this length is defined as all data that follows the edType field
12330 // in the tSirKeyMaterial keyMaterial; field).
12331 //
12332 // !!NOTE: This keyMaterial.length contains the length of a MAX size key, though the keyLength can be
12333 // shorter than this max size. Is LIM interpreting this ok ?
12334 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 -070012335 // set pMsg->keyMaterial.edType
12336 tmpEdType = (tAniEdType)pal_cpu_to_be32(edType);
12337 palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpEdType, sizeof(tAniEdType) );
12338 p += sizeof( pMsg->keyMaterial.edType );
Jeff Johnson295189b2012-06-20 16:38:30 -070012339 // set the pMsg->keyMaterial.numKeys field
12340 *p = numKeys;
12341 p += sizeof( pMsg->keyMaterial.numKeys );
Jeff Johnson295189b2012-06-20 16:38:30 -070012342 // set pSirKey->keyId = keyId;
12343 *p = keyId;
12344 p += sizeof( pMsg->keyMaterial.key[ 0 ].keyId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012345 // set pSirKey->unicast = (tANI_U8)fUnicast;
12346 *p = (tANI_U8)fUnicast;
12347 p += sizeof( pMsg->keyMaterial.key[ 0 ].unicast );
Jeff Johnson295189b2012-06-20 16:38:30 -070012348 // set pSirKey->keyDirection = aniKeyDirection;
12349 tmpDirection = (tAniKeyDirection)pal_cpu_to_be32(aniKeyDirection);
12350 palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpDirection, sizeof(tAniKeyDirection) );
12351 p += sizeof(tAniKeyDirection);
12352 // pSirKey->keyRsc = ;;
12353 palCopyMemory( pMac->hHdd, p, pKeyRsc, CSR_MAX_RSC_LEN );
12354 p += sizeof( pMsg->keyMaterial.key[ 0 ].keyRsc );
Jeff Johnson295189b2012-06-20 16:38:30 -070012355 // set pSirKey->paeRole
12356 *p = paeRole; // 0 is Supplicant
12357 p++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012358 // set pSirKey->keyLength = keyLength;
12359 p = pal_set_U16( p, pal_cpu_to_be16(keyLength) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012360 if ( keyLength && pKey )
12361 {
12362 palCopyMemory( pMac->hHdd, p, pKey, keyLength );
12363 if(keyLength == 16)
12364 {
Madan Mohan Koyyalamudi8bdd3112012-09-24 13:55:14 -070012365 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 -070012366 keyId, edType, pKey[0], pKey[1], pKey[2], pKey[3], pKey[4],
12367 pKey[5], pKey[6], pKey[7], pKey[8],
12368 pKey[9], pKey[10], pKey[11], pKey[12], pKey[13], pKey[14], pKey[15]);
12369 }
12370 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012371 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012372 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012373 return( status );
12374}
12375
Jeff Johnson295189b2012-06-20 16:38:30 -070012376eHalStatus csrSendMBStartBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamBssType bssType,
12377 tCsrRoamStartBssParams *pParam, tSirBssDescription *pBssDesc )
12378{
12379 eHalStatus status;
12380 tSirSmeStartBssReq *pMsg;
12381 tANI_U8 *pBuf = NULL;
12382 tANI_U8 *wTmpBuf = NULL;
12383 tANI_U16 msgLen, wTmp;
12384 tANI_U32 dwTmp;
12385 tSirNwType nwType;
Jeff Johnsone7245742012-09-05 17:12:55 -070012386 ePhyChanBondState cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -070012387#ifdef WLAN_SOFTAP_FEATURE
12388 tANI_U32 authType;
12389#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070012390 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070012391
12392 if(!pSession)
12393 {
12394 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12395 return eHAL_STATUS_FAILURE;
12396 }
12397
Jeff Johnson295189b2012-06-20 16:38:30 -070012398 do {
12399 pSession->joinFailStatusCode.statusCode = eSIR_SME_SUCCESS;
12400 pSession->joinFailStatusCode.reasonCode = 0;
12401 msgLen = sizeof(tSirSmeStartBssReq);
12402 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12403 if ( !HAL_STATUS_SUCCESS(status) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012404 palZeroMemory(pMac->hHdd, pMsg, msgLen);
12405 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_START_BSS_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012406 pBuf = &pMsg->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070012407 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012408 //sessionId
12409 *pBuf = (tANI_U8)sessionId;
12410 pBuf++;
12411 // transactionId
12412 *pBuf = 0;
12413 *(pBuf + 1) = 0;
12414 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012415 // bssid
12416 palCopyMemory( pMac->hHdd, pBuf, pParam->bssid, sizeof(tSirMacAddr) );
12417 pBuf += sizeof(tSirMacAddr);
12418 // selfMacAddr
12419 palCopyMemory( pMac->hHdd, pBuf, pSession->selfMacAddr, sizeof(tSirMacAddr) );
12420 pBuf += sizeof(tSirMacAddr);
12421 // beaconInterval
12422 if( pBssDesc && pBssDesc->beaconInterval )
12423 {
12424 wTmp = pal_cpu_to_be16( pBssDesc->beaconInterval );
12425 }
12426#ifdef WLAN_SOFTAP_FEATURE
12427 else if(pParam->beaconInterval)
12428 {
12429 wTmp = pal_cpu_to_be16( pParam->beaconInterval );
12430 }
12431#endif
12432 else
12433 {
12434 wTmp = pal_cpu_to_be16( WNI_CFG_BEACON_INTERVAL_STADEF );
12435 }
Jeff Johnsone7245742012-09-05 17:12:55 -070012436 if(csrIsconcurrentsessionValid (pMac, sessionId,
12437 pParam->bssPersona)
12438 == eHAL_STATUS_SUCCESS )
12439 {
12440 csrValidateBeaconInterval(pMac, pParam->operationChn, &wTmp, sessionId,
12441 pParam->bssPersona);
12442 //Update the beacon Interval
12443 pParam->beaconInterval = wTmp;
12444 }
12445 else
12446 {
12447 smsLog( pMac,LOGE, FL("****Start BSS failed persona already exists***\n"));
12448 status = eHAL_STATUS_FAILURE;
12449 return status;
12450 }
12451
Jeff Johnson295189b2012-06-20 16:38:30 -070012452 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof( tANI_U16 ) );
12453 pBuf += sizeof(tANI_U16);
12454 // dot11mode
12455 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pParam->uCfgDot11Mode );
12456 pBuf += 1;
12457 // bssType
12458 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( bssType ) );
12459 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
12460 pBuf += sizeof(tSirBssType);
12461 // ssId
12462 if( pParam->ssId.length )
12463 {
12464 // ssId len
12465 *pBuf = pParam->ssId.length;
12466 pBuf++;
12467 palCopyMemory( pMac->hHdd, pBuf, pParam->ssId.ssId, pParam->ssId.length );
12468 pBuf += pParam->ssId.length;
12469 }
12470 else
12471 {
12472 *pBuf = 0;
12473 pBuf++;
12474 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012475 // set the channel Id
12476 *pBuf = pParam->operationChn;
12477 pBuf++;
12478 //What should we really do for the cbmode.
Jeff Johnsone7245742012-09-05 17:12:55 -070012479 cbMode = (ePhyChanBondState)pal_cpu_to_be32(pParam->cbMode);
12480 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&cbMode, sizeof(ePhyChanBondState) );
12481 pBuf += sizeof(ePhyChanBondState);
Jeff Johnson295189b2012-06-20 16:38:30 -070012482
12483#ifdef WLAN_SOFTAP_FEATURE
12484 // Set privacy
12485 *pBuf = pParam->privacy;
12486 pBuf++;
12487
12488 //Set Uapsd
12489 *pBuf = pParam->ApUapsdEnable;
12490 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012491 //Set SSID hidden
12492 *pBuf = pParam->ssidHidden;
12493 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012494 *pBuf = (tANI_U8)pParam->fwdWPSPBCProbeReq;
12495 pBuf++;
12496
12497 //Ht protection Enable/Disable
12498 *pBuf = (tANI_U8)pParam->protEnabled;
12499 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012500 //Enable Beacons to Receive for OBSS protection Enable/Disable
12501 *pBuf = (tANI_U8)pParam->obssProtEnabled;
12502 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012503 //set cfg related to protection
12504 wTmp = pal_cpu_to_be16( pParam->ht_protection );
12505 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof( tANI_U16 ) );
12506 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012507 // Set Auth type
12508 authType = pal_cpu_to_be32(pParam->authType);
12509 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&authType, sizeof(tANI_U32));
12510 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012511 // Set DTIM
12512 dwTmp = pal_cpu_to_be32(pParam->dtimPeriod);
12513 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
12514 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012515 // Set wps_state
12516 *pBuf = pParam->wps_state;
12517 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012518#endif
12519 //Persona
12520 *pBuf = (tANI_U8)pParam->bssPersona;
12521 pBuf++;
12522
Jeff Johnsone7245742012-09-05 17:12:55 -070012523
Jeff Johnson295189b2012-06-20 16:38:30 -070012524
12525 // set RSN IE
12526 if( pParam->nRSNIELength > sizeof(pMsg->rsnIE.rsnIEdata) )
12527 {
12528 status = eHAL_STATUS_INVALID_PARAMETER;
12529 palFreeMemory( pMac->hHdd, pMsg );
12530 break;
12531 }
12532 wTmp = pal_cpu_to_be16( pParam->nRSNIELength );
12533 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12534 pBuf += sizeof(tANI_U16);
12535 if( wTmp )
12536 {
12537 wTmp = pParam->nRSNIELength;
12538 palCopyMemory( pMac->hHdd, pBuf, pParam->pRSNIE, wTmp );
12539 pBuf += wTmp;
12540 }
12541 nwType = (tSirNwType)pal_cpu_to_be32(pParam->sirNwType);
12542 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&nwType, sizeof(tSirNwType) );
12543 pBuf += sizeof(tSirNwType);
Jeff Johnson295189b2012-06-20 16:38:30 -070012544 *pBuf = pParam->operationalRateSet.numRates; //tSirMacRateSet->numRates
12545 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012546 palCopyMemory( pMac->hHdd, pBuf, pParam->operationalRateSet.rate, pParam->operationalRateSet.numRates );
12547 pBuf += pParam->operationalRateSet.numRates ;
12548 *pBuf++ = pParam->extendedRateSet.numRates;
12549 if(0 != pParam->extendedRateSet.numRates)
12550 {
12551 palCopyMemory( pMac->hHdd, pBuf, pParam->extendedRateSet.rate, pParam->extendedRateSet.numRates );
12552 pBuf += pParam->extendedRateSet.numRates;
12553 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012554 msgLen = (tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)); //msg_header + msg
12555 pMsg->length = pal_cpu_to_be16(msgLen);
12556
12557 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012558 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012559 return( status );
12560}
12561
Jeff Johnson295189b2012-06-20 16:38:30 -070012562eHalStatus csrSendMBStopBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId )
12563{
12564 eHalStatus status = eHAL_STATUS_FAILURE;
12565 tSirSmeStopBssReq *pMsg;
12566 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
12567 tANI_U8 *pBuf;
12568 tANI_U16 msgLen;
Jeff Johnson32d95a32012-09-10 13:15:23 -070012569
12570 if(!pSession)
12571 {
12572 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12573 return eHAL_STATUS_FAILURE;
12574 }
12575
Jeff Johnson295189b2012-06-20 16:38:30 -070012576 do {
12577 status = palAllocateMemory(pMac, (void **)&pMsg, sizeof(tSirSmeStopBssReq));
12578 if ( !HAL_STATUS_SUCCESS(status) ) break;
12579 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeStopBssReq ));
12580 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_STOP_BSS_REQ);
12581 pBuf = &pMsg->sessionId;
12582 //sessionId
12583 *pBuf = (tANI_U8)sessionId;
12584 pBuf++;
12585 // transactionId
12586 *pBuf = 0;
12587 pBuf += sizeof(tANI_U16);
12588 //reason code
12589 *pBuf = 0;
12590 pBuf += sizeof(tSirResultCodes);
12591 // bssid
12592 // if BSSType is WDS sta, use selfmacAddr as bssid, else use bssid in connectedProfile
12593 if( CSR_IS_CONN_WDS_STA(&pSession->connectedProfile) )
12594 {
12595 palCopyMemory( pMac->hHdd, pBuf,(tANI_U8 *)&pSession->selfMacAddr, sizeof(tSirMacAddr) );
12596 }
12597 else
12598 {
12599 palCopyMemory( pMac->hHdd, pBuf,(tANI_U8 *)&pSession->connectedProfile.bssid, sizeof(tSirMacAddr) );
12600 }
12601 pBuf += sizeof(tSirMacAddr);
12602 msgLen = sizeof(tANI_U16) + sizeof(tANI_U16) + 1 + sizeof(tANI_U16) + sizeof(tSirResultCodes) + sizeof(tSirMacAddr);
12603 pMsg->length = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012604 status = palSendMBMessage( pMac->hHdd, pMsg );
12605#if 0
12606 status = palAllocateMemory(pMac, (void **)&pMsg, sizeof(tSirSmeStopBssReq));
12607 if ( !HAL_STATUS_SUCCESS(status) ) break;
12608 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeStopBssReq ));
12609 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_STOP_BSS_REQ);
12610 pMsg->reasonCode = 0;
12611 // bssid
12612 // if BSSType is WDS sta, use selfmacAddr as bssid, else use bssid in connectedProfile
12613 if( CSR_IS_CONN_WDS_STA(&pSession->connectedProfile) )
12614 {
12615 pbBssid = (tANI_U8 *)&pSession->selfMacAddr;
12616 }
12617 else
12618 {
12619 pbBssid = (tANI_U8 *)&pSession->connectedProfile.bssid;
12620 }
12621 palCopyMemory( pMac->hHdd, &pMsg->bssId, pbBssid, sizeof(tSirMacAddr) );
12622 pMsg->transactionId = 0;
12623 pMsg->sessionId = (tANI_U8)sessionId;
12624 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeStopBssReq ));
12625 status = palSendMBMessage( pMac->hHdd, pMsg );
12626#endif
12627 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012628 return( status );
12629}
12630
Jeff Johnson295189b2012-06-20 16:38:30 -070012631eHalStatus csrReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId,
12632 tCsrRoamModifyProfileFields *pModProfileFields,
12633 tANI_U32 *pRoamId, v_BOOL_t fForce)
12634{
Jeff Johnson295189b2012-06-20 16:38:30 -070012635 eHalStatus status = eHAL_STATUS_FAILURE;
12636 tANI_U32 roamId = 0;
12637 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012638 if((csrIsConnStateConnected(pMac, sessionId)) &&
12639 (fForce || (!palEqualMemory(pMac->hHdd, &pModProfileFields,
12640 &pSession->connectedProfile.modifyProfileFields,
12641 sizeof(tCsrRoamModifyProfileFields)))) )
12642 {
12643 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
12644 if(pRoamId)
12645 {
12646 *pRoamId = roamId;
12647 }
12648
Jeff Johnson295189b2012-06-20 16:38:30 -070012649 status = csrRoamIssueReassoc(pMac, sessionId, NULL, pModProfileFields,
12650 eCsrSmeIssuedReassocToSameAP, roamId,
12651 eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -070012652 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012653 return status;
12654}
Jeff Johnson295189b2012-06-20 16:38:30 -070012655static eHalStatus csrRoamSessionOpened(tpAniSirGlobal pMac, tANI_U32 sessionId)
12656{
12657 eHalStatus status = eHAL_STATUS_SUCCESS;
12658 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -070012659 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
12660 status = csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
12661 eCSR_ROAM_SESSION_OPENED, eCSR_ROAM_RESULT_NONE);
12662 return (status);
12663}
Jeff Johnson295189b2012-06-20 16:38:30 -070012664eHalStatus csrProcessAddStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg)
12665{
12666 eHalStatus status = eHAL_STATUS_SUCCESS;
12667 tListElem *pEntry = NULL;
12668 tSmeCmd *pCommand = NULL;
12669 tSirSmeAddStaSelfRsp *pRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012670 do
12671 {
12672 if(pMsg == NULL)
12673 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -070012674 smsLog(pMac, LOGE, "in %s msg ptr is NULL\n", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012675 status = eHAL_STATUS_FAILURE;
12676 break;
12677 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012678 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
12679 if(pEntry)
12680 {
12681 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12682 if(eSmeCommandAddStaSession == pCommand->command)
12683 {
12684 pRsp = (tSirSmeAddStaSelfRsp*)pMsg;
12685 smsLog( pMac, LOG1, "Add Sta rsp status = %d\n", pRsp->status );
12686 //Nothing to be done. May be indicate the self sta addition success by calling session callback (TODO).
Jeff Johnson295189b2012-06-20 16:38:30 -070012687 csrRoamSessionOpened(pMac, pCommand->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -070012688 //Remove this command out of the active list
12689 if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK))
12690 {
12691 //Now put this command back on the avilable command list
12692 csrReleaseCommand(pMac, pCommand);
12693 }
12694 smeProcessPendingQueue( pMac );
12695 }
12696 else
12697 {
12698 smsLog(pMac, LOGE, "in %s eWNI_SME_ADD_STA_SELF_RSP Received but NO Add sta session command are ACTIVE ...\n",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -070012699 __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012700 status = eHAL_STATUS_FAILURE;
12701 break;
12702 }
12703 }
12704 else
12705 {
12706 smsLog(pMac, LOGE, "in %s eWNI_SME_ADD_STA_SELF_RSP Received but NO commands are ACTIVE ...\n",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -070012707 __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012708 status = eHAL_STATUS_FAILURE;
12709 break;
12710 }
12711 } while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -070012712 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -070012713}
Jeff Johnson295189b2012-06-20 16:38:30 -070012714eHalStatus csrSendMBAddSelfStaReqMsg( tpAniSirGlobal pMac, tSirMacAddr macAddr )
12715{
12716 tSirSmeAddStaSelfReq *pMsg;
12717 tANI_U16 msgLen;
12718 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012719 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012720 msgLen = sizeof( tANI_U16 ) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) /*+
12721 sizeof( tSirBssType )*/;
Jeff Johnson295189b2012-06-20 16:38:30 -070012722 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12723 if ( !HAL_STATUS_SUCCESS(status) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012724 palZeroMemory(pMac->hHdd, pMsg, msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012725 pMsg->mesgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_ADD_STA_SELF_REQ);
12726 pMsg->mesgLen = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012727 // self station address
12728 palCopyMemory( pMac->hHdd, (tANI_U8 *)pMsg->selfMacAddr, (tANI_U8 *)macAddr, sizeof(tSirMacAddr) );
Madan Mohan Koyyalamudi8bdd3112012-09-24 13:55:14 -070012729 smsLog( pMac, LOG1, FL("selfMac=%02x, %02x, %02x, %02x, %02x, %02x"),
Jeff Johnson295189b2012-06-20 16:38:30 -070012730 pMsg->selfMacAddr[0],
12731 pMsg->selfMacAddr[1],
12732 pMsg->selfMacAddr[2],
12733 pMsg->selfMacAddr[3],
12734 pMsg->selfMacAddr[4],
12735 pMsg->selfMacAddr[5]);
12736 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012737 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012738 return( status );
12739}
Jeff Johnson295189b2012-06-20 16:38:30 -070012740eHalStatus csrIssueAddStaForSessionReq(tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr sessionMacAddr)
12741{
12742 eHalStatus status = eHAL_STATUS_SUCCESS;
12743 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -070012744 pCommand = csrGetCommandBuffer(pMac);
12745 if(NULL == pCommand)
12746 {
12747 status = eHAL_STATUS_RESOURCES;
12748 }
12749 else
12750 {
12751 pCommand->command = eSmeCommandAddStaSession;
12752 pCommand->sessionId = (tANI_U8)sessionId;
12753 palCopyMemory( pMac->hHdd, pCommand->u.addStaSessionCmd.selfMacAddr, sessionMacAddr, sizeof( tSirMacAddr ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012754 status = csrQueueSmeCommand(pMac, pCommand, TRUE);
12755 if( !HAL_STATUS_SUCCESS( status ) )
12756 {
12757 //Should be panic??
12758 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
12759 }
12760 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012761 return (status);
12762}
Jeff Johnson295189b2012-06-20 16:38:30 -070012763eHalStatus csrProcessAddStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
12764{
12765 return csrSendMBAddSelfStaReqMsg( pMac,
12766 pCommand->u.addStaSessionCmd.selfMacAddr );
12767}
Jeff Johnson295189b2012-06-20 16:38:30 -070012768eHalStatus csrRoamOpenSession( tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext,
12769 tANI_U8 *pSelfMacAddr, tANI_U8 *pbSessionId )
12770{
12771 eHalStatus status = eHAL_STATUS_SUCCESS;
12772 tANI_U32 i;
12773 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070012774 *pbSessionId = CSR_SESSION_ID_INVALID;
12775 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
12776 {
12777 if( !CSR_IS_SESSION_VALID( pMac, i ) )
12778 {
12779 pSession = CSR_GET_SESSION( pMac, i );
12780 status = eHAL_STATUS_SUCCESS;
12781 pSession->sessionActive = eANI_BOOLEAN_TRUE;
12782 pSession->sessionId = (tANI_U8)i;
12783 pSession->callback = callback;
12784 pSession->pContext = pContext;
12785 palCopyMemory( pMac->hHdd, &pSession->selfMacAddr, pSelfMacAddr, sizeof(tCsrBssid) );
12786 *pbSessionId = (tANI_U8)i;
Jeff Johnson295189b2012-06-20 16:38:30 -070012787 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerRoaming, csrRoamRoamingTimerHandler,
12788 &pSession->roamingTimerInfo);
12789 if(!HAL_STATUS_SUCCESS(status))
12790 {
12791 smsLog(pMac, LOGE, FL("cannot allocate memory for Roaming timer\n"));
12792 break;
12793 }
12794#ifdef FEATURE_WLAN_BTAMP_UT_RF
12795 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerJoinRetry, csrRoamJoinRetryTimerHandler,
12796 &pSession->joinRetryTimerInfo);
12797 if(!HAL_STATUS_SUCCESS(status))
12798 {
12799 smsLog(pMac, LOGE, FL("cannot allocate memory for joinretry timer\n"));
12800 break;
12801 }
12802#endif
12803 pSession->ibssJoinTimerInfo.pMac = pMac;
12804 pSession->ibssJoinTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
Jeff Johnson295189b2012-06-20 16:38:30 -070012805 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerIbssJoining, csrRoamIbssJoinTimerHandler,
12806 &pSession->ibssJoinTimerInfo);
12807 if(!HAL_STATUS_SUCCESS(status))
12808 {
12809 smsLog(pMac, LOGE, FL("cannot allocate memory for IbssJoining timer\n"));
12810 break;
12811 }
12812 status = csrIssueAddStaForSessionReq ( pMac, i, pSelfMacAddr );
12813 break;
12814 }
12815 }
12816 if( CSR_ROAM_SESSION_MAX == i )
12817 {
12818 //No session is available
12819 status = eHAL_STATUS_RESOURCES;
12820 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012821 return ( status );
12822}
Jeff Johnson295189b2012-06-20 16:38:30 -070012823eHalStatus csrProcessDelStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg)
12824{
12825 eHalStatus status = eHAL_STATUS_SUCCESS;
12826 tListElem *pEntry = NULL;
12827 tSmeCmd *pCommand = NULL;
12828 tSirSmeDelStaSelfRsp *pRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012829 do
12830 {
12831 if(pMsg == NULL)
12832 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -070012833 smsLog(pMac, LOGE, "in %s msg ptr is NULL\n", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012834 status = eHAL_STATUS_FAILURE;
12835 break;
12836 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012837 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
12838 if(pEntry)
12839 {
12840 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12841 if(eSmeCommandDelStaSession == pCommand->command)
12842 {
12843 tANI_U8 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070012844 pRsp = (tSirSmeDelStaSelfRsp*)pMsg;
12845 smsLog( pMac, LOG1, "Del Sta rsp status = %d\n", pRsp->status );
Jeff Johnson295189b2012-06-20 16:38:30 -070012846 //This session is done.
12847 csrCleanupSession(pMac, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -070012848 if(pCommand->u.delStaSessionCmd.callback)
12849 {
12850
12851 status = sme_ReleaseGlobalLock( &pMac->sme );
12852 if ( HAL_STATUS_SUCCESS( status ) )
12853 {
12854 pCommand->u.delStaSessionCmd.callback(
12855 pCommand->u.delStaSessionCmd.pContext);
12856 status = sme_AcquireGlobalLock( &pMac->sme );
12857 if (! HAL_STATUS_SUCCESS( status ) )
12858 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -070012859 smsLog(pMac, LOGP, "%s: Failed to Acquire Lock\n", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012860 return status;
12861 }
12862 }
12863 else {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -070012864 smsLog(pMac, LOGE, "%s: Failed to Release Lock\n", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012865 }
12866 }
12867
12868 //Remove this command out of the active list
12869 if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK))
12870 {
12871 //Now put this command back on the avilable command list
12872 csrReleaseCommand(pMac, pCommand);
12873 }
12874 smeProcessPendingQueue( pMac );
12875 }
12876 else
12877 {
12878 smsLog(pMac, LOGE, "in %s eWNI_SME_DEL_STA_SELF_RSP Received but NO Del sta session command are ACTIVE ...\n",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -070012879 __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012880 status = eHAL_STATUS_FAILURE;
12881 break;
12882 }
12883 }
12884 else
12885 {
12886 smsLog(pMac, LOGE, "in %s eWNI_SME_DEL_STA_SELF_RSP Received but NO commands are ACTIVE ...\n",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -070012887 __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012888 status = eHAL_STATUS_FAILURE;
12889 break;
12890 }
12891 } while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -070012892 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -070012893}
Jeff Johnson295189b2012-06-20 16:38:30 -070012894eHalStatus csrSendMBDelSelfStaReqMsg( tpAniSirGlobal pMac, tSirMacAddr macAddr )
12895{
12896 tSirSmeDelStaSelfReq *pMsg;
12897 tANI_U16 msgLen;
12898 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012899 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012900 msgLen = sizeof( tANI_U16 ) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) /*+
12901 sizeof( tSirBssType )*/;
Jeff Johnson295189b2012-06-20 16:38:30 -070012902 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12903 if ( !HAL_STATUS_SUCCESS(status) ) break;
12904
12905 palZeroMemory(pMac->hHdd, pMsg, msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012906 pMsg->mesgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEL_STA_SELF_REQ);
12907 pMsg->mesgLen = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012908 // self station address
12909 palCopyMemory( pMac->hHdd, (tANI_U8 *)pMsg->selfMacAddr, (tANI_U8 *)macAddr, sizeof(tSirMacAddr) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012910 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012911 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012912 return( status );
12913}
Jeff Johnson295189b2012-06-20 16:38:30 -070012914eHalStatus csrIssueDelStaForSessionReq(tpAniSirGlobal pMac, tANI_U32 sessionId,
12915 tSirMacAddr sessionMacAddr,
12916 csrRoamSessionCloseCallback callback,
12917 void *pContext)
12918{
12919 eHalStatus status = eHAL_STATUS_SUCCESS;
12920 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -070012921 pCommand = csrGetCommandBuffer(pMac);
12922 if(NULL == pCommand)
12923 {
12924 status = eHAL_STATUS_RESOURCES;
12925 }
12926 else
12927 {
12928 pCommand->command = eSmeCommandDelStaSession;
12929 pCommand->sessionId = (tANI_U8)sessionId;
12930 pCommand->u.delStaSessionCmd.callback = callback;
12931 pCommand->u.delStaSessionCmd.pContext = pContext;
12932 palCopyMemory( pMac->hHdd, pCommand->u.delStaSessionCmd.selfMacAddr, sessionMacAddr, sizeof( tSirMacAddr ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012933 status = csrQueueSmeCommand(pMac, pCommand, TRUE);
12934 if( !HAL_STATUS_SUCCESS( status ) )
12935 {
12936 //Should be panic??
12937 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
12938 }
12939 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012940 return (status);
12941}
Jeff Johnson295189b2012-06-20 16:38:30 -070012942eHalStatus csrProcessDelStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
12943{
12944 return csrSendMBDelSelfStaReqMsg( pMac,
12945 pCommand->u.delStaSessionCmd.selfMacAddr );
12946}
Jeff Johnson295189b2012-06-20 16:38:30 -070012947static void purgeCsrSessionCmdList(tpAniSirGlobal pMac, tANI_U32 sessionId)
12948{
12949 tDblLinkList *pList = &pMac->roam.roamCmdPendingList;
12950 tListElem *pEntry, *pNext;
12951 tSmeCmd *pCommand;
12952 tDblLinkList localList;
12953
12954 vos_mem_zero(&localList, sizeof(tDblLinkList));
12955 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &localList)))
12956 {
12957 smsLog(pMac, LOGE, FL(" failed to open list"));
12958 return;
12959 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012960 csrLLLock(pList);
12961 pEntry = csrLLPeekHead(pList, LL_ACCESS_NOLOCK);
12962 while(pEntry != NULL)
12963 {
12964 pNext = csrLLNext(pList, pEntry, LL_ACCESS_NOLOCK);
12965 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12966 if(pCommand->sessionId == sessionId)
12967 {
12968 if(csrLLRemoveEntry(pList, pEntry, LL_ACCESS_NOLOCK))
12969 {
12970 csrLLInsertTail(&localList, pEntry, LL_ACCESS_NOLOCK);
12971 }
12972 }
12973 pEntry = pNext;
12974 }
12975 csrLLUnlock(pList);
12976
12977 while( (pEntry = csrLLRemoveHead(&localList, LL_ACCESS_NOLOCK)) )
12978 {
12979 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12980 csrAbortCommand(pMac, pCommand, eANI_BOOLEAN_TRUE);
12981 }
12982 csrLLClose(&localList);
12983}
12984
Jeff Johnson295189b2012-06-20 16:38:30 -070012985void csrCleanupSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
12986{
12987 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
12988 {
12989 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012990 csrRoamStop(pMac, sessionId);
12991 csrFreeConnectBssDesc(pMac, sessionId);
12992 csrRoamFreeConnectProfile( pMac, &pSession->connectedProfile );
12993 csrRoamFreeConnectedInfo ( pMac, &pSession->connectedInfo);
12994 palTimerFree(pMac->hHdd, pSession->hTimerRoaming);
12995#ifdef FEATURE_WLAN_BTAMP_UT_RF
12996 palTimerFree(pMac->hHdd, pSession->hTimerJoinRetry);
12997#endif
12998 palTimerFree(pMac->hHdd, pSession->hTimerIbssJoining);
12999 purgeSmeSessionCmdList(pMac, sessionId);
13000 purgeCsrSessionCmdList(pMac, sessionId);
13001 csrInitSession(pMac, sessionId);
13002 }
13003}
13004
Jeff Johnson295189b2012-06-20 16:38:30 -070013005eHalStatus csrRoamCloseSession( tpAniSirGlobal pMac, tANI_U32 sessionId,
13006 tANI_BOOLEAN fSync,
13007 csrRoamSessionCloseCallback callback,
13008 void *pContext )
13009{
13010 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -070013011 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
13012 {
13013 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
13014 if(fSync)
13015 {
13016 csrCleanupSession(pMac, sessionId);
13017 }
13018 else
13019 {
13020 purgeSmeSessionCmdList(pMac, sessionId);
13021 purgeCsrSessionCmdList(pMac, sessionId);
13022 status = csrIssueDelStaForSessionReq( pMac, sessionId,
13023 pSession->selfMacAddr, callback, pContext);
13024 }
13025 }
13026 else
13027 {
13028 status = eHAL_STATUS_INVALID_PARAMETER;
13029 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013030 return ( status );
13031}
13032
Jeff Johnson295189b2012-06-20 16:38:30 -070013033static void csrInitSession( tpAniSirGlobal pMac, tANI_U32 sessionId )
13034{
13035 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070013036
13037 if(!pSession)
13038 {
13039 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
13040 return;
13041 }
13042
Jeff Johnson295189b2012-06-20 16:38:30 -070013043 pSession->sessionActive = eANI_BOOLEAN_FALSE;
13044 pSession->sessionId = CSR_SESSION_ID_INVALID;
13045 pSession->callback = NULL;
13046 pSession->pContext = NULL;
13047 pSession->ibss_join_pending = FALSE;
13048 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
13049 // TODO : Confirm pMac->roam.fReadyForPowerSave = eANI_BOOLEAN_FALSE;
13050 csrFreeRoamProfile( pMac, sessionId );
13051 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
13052 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
13053 csrFreeConnectBssDesc(pMac, sessionId);
13054 csrScanEnable(pMac);
13055 palZeroMemory( pMac->hHdd, &pSession->selfMacAddr, sizeof(tCsrBssid) );
13056 if(pSession->pWpaRsnReqIE)
13057 {
13058 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
13059 pSession->pWpaRsnReqIE = NULL;
13060 }
13061 pSession->nWpaRsnReqIeLength = 0;
13062 if(pSession->pWpaRsnRspIE)
13063 {
13064 palFreeMemory(pMac->hHdd, pSession->pWpaRsnRspIE);
13065 pSession->pWpaRsnRspIE = NULL;
13066 }
13067 pSession->nWpaRsnRspIeLength = 0;
13068#ifdef FEATURE_WLAN_WAPI
13069 if(pSession->pWapiReqIE)
13070 {
13071 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
13072 pSession->pWapiReqIE = NULL;
13073 }
13074 pSession->nWapiReqIeLength = 0;
13075 if(pSession->pWapiRspIE)
13076 {
13077 palFreeMemory(pMac->hHdd, pSession->pWapiRspIE);
13078 pSession->pWapiRspIE = NULL;
13079 }
13080 pSession->nWapiRspIeLength = 0;
13081#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070013082 if(pSession->pAddIEScan)
13083 {
13084 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
13085 pSession->pAddIEScan = NULL;
13086 }
13087 pSession->nAddIEScanLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013088 if(pSession->pAddIEAssoc)
13089 {
13090 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
13091 pSession->pAddIEAssoc = NULL;
13092}
13093 pSession->nAddIEAssocLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013094}
13095
Jeff Johnson295189b2012-06-20 16:38:30 -070013096eHalStatus csrRoamGetSessionIdFromBSSID( tpAniSirGlobal pMac, tCsrBssid *bssid, tANI_U32 *pSessionId )
13097{
13098 eHalStatus status = eHAL_STATUS_FAILURE;
13099 tANI_U32 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070013100 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
13101 {
13102 if( CSR_IS_SESSION_VALID( pMac, i ) )
13103 {
13104 if( csrIsMacAddressEqual( pMac, bssid, &pMac->roam.roamSession[i].connectedProfile.bssid ) )
13105 {
13106 //Found it
13107 status = eHAL_STATUS_SUCCESS;
13108 *pSessionId = i;
13109 break;
13110 }
13111 }
13112 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013113 return( status );
13114}
13115
Jeff Johnson295189b2012-06-20 16:38:30 -070013116//This function assumes that we only support one IBSS session. We cannot use BSSID to identify
13117//session because for IBSS, the bssid changes.
13118static tANI_U32 csrFindIbssSession( tpAniSirGlobal pMac )
13119{
13120 tANI_U32 i, nRet = CSR_SESSION_ID_INVALID;
13121 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070013122 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
13123 {
13124 if( CSR_IS_SESSION_VALID( pMac, i ) )
13125 {
13126 pSession = CSR_GET_SESSION( pMac, i );
13127 if( pSession->pCurRoamProfile && ( csrIsBssTypeIBSS( pSession->connectedProfile.BSSType ) ) )
13128 {
13129 //Found it
13130 nRet = i;
13131 break;
13132 }
13133 }
13134 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013135 return (nRet);
13136}
Jeff Johnson295189b2012-06-20 16:38:30 -070013137static void csrRoamLinkUp(tpAniSirGlobal pMac, tCsrBssid bssid)
13138{
13139 /* Update the current BSS info in ho control block based on connected
13140 profile info from pmac global structure */
13141
Jeff Johnson295189b2012-06-20 16:38:30 -070013142 smsLog(pMac, LOGW, " csrRoamLinkUp: WLAN link UP with AP= %02x-%02x-%02x-%02x-%02x-%02x\n",
13143 bssid[ 0 ], bssid[ 1 ], bssid[ 2 ],
13144 bssid[ 3 ], bssid[ 4 ], bssid[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -070013145 /* Check for user misconfig of RSSI trigger threshold */
13146 pMac->roam.configParam.vccRssiThreshold =
13147 ( 0 == pMac->roam.configParam.vccRssiThreshold ) ?
13148 CSR_VCC_RSSI_THRESHOLD : pMac->roam.configParam.vccRssiThreshold;
13149 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
Jeff Johnson295189b2012-06-20 16:38:30 -070013150 /* Check for user misconfig of UL MAC Loss trigger threshold */
13151 pMac->roam.configParam.vccUlMacLossThreshold =
13152 ( 0 == pMac->roam.configParam.vccUlMacLossThreshold ) ?
13153 CSR_VCC_UL_MAC_LOSS_THRESHOLD : pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013154#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
13155 {
13156 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013157 /* Indicate the neighbor roal algorithm about the connect indication */
13158 csrRoamGetSessionIdFromBSSID(pMac, (tCsrBssid *)bssid, &sessionId);
13159 csrNeighborRoamIndicateConnect(pMac, sessionId, VOS_STATUS_SUCCESS);
13160 }
13161#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070013162}
13163
Jeff Johnson295189b2012-06-20 16:38:30 -070013164static void csrRoamLinkDown(tpAniSirGlobal pMac, tANI_U32 sessionId)
13165{
13166 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070013167
13168 if(!pSession)
13169 {
13170 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
13171 return;
13172 }
13173
Jeff Johnson295189b2012-06-20 16:38:30 -070013174 //Only to handle the case for Handover on infra link
13175 if( eCSR_BSS_TYPE_INFRASTRUCTURE != pSession->connectedProfile.BSSType )
13176 {
13177 return;
13178 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013179 /* deregister the clients requesting stats from PE/TL & also stop the corresponding timers*/
13180 csrRoamDeregStatisticsReq(pMac);
13181 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13182#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
13183 /* Indicate the neighbor roal algorithm about the disconnect indication */
13184 csrNeighborRoamIndicateDisconnect(pMac, sessionId);
13185#endif
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070013186
13187 //Remove this code once SLM_Sessionization is supported
13188 //BMPS_WORKAROUND_NOT_NEEDED
13189 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) &&
Mohit Khanna349bc392012-09-11 17:24:52 -070013190 csrIsInfraApStarted( pMac ) &&
13191 pMac->roam.configParam.doBMPSWorkaround)
Jeff Johnsone7245742012-09-05 17:12:55 -070013192 {
13193 pMac->roam.configParam.doBMPSWorkaround = 0;
13194 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013195}
13196
Jeff Johnson295189b2012-06-20 16:38:30 -070013197void csrRoamTlStatsTimerHandler(void *pv)
13198{
13199 tpAniSirGlobal pMac = PMAC_STRUCT( pv );
13200 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013201 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
13202
Jeff Johnsone7245742012-09-05 17:12:55 -070013203 smsLog(pMac, LOG1, FL(" TL stat timer is no-op. It needs to support multiple stations"));
13204
Jeff Johnson295189b2012-06-20 16:38:30 -070013205#if 0
13206 // TODO Persession .???
13207 //req TL for stats
13208 if(WLANTL_GetStatistics(pMac->roam.gVosContext, &tlStats, pMac->roam.connectedInfo.staId))
13209 {
13210 smsLog(pMac, LOGE, FL("csrRoamTlStatsTimerHandler:couldn't get the stats from TL\n"));
13211 }
13212 else
13213 {
13214 //save in SME
13215 csrRoamSaveStatsFromTl(pMac, tlStats);
13216 }
13217#endif
13218 if(!pMac->roam.tlStatsReqInfo.timerRunning)
13219 {
13220 if(pMac->roam.tlStatsReqInfo.periodicity)
13221 {
13222 //start timer
13223 status = palTimerStart(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer,
13224 pMac->roam.tlStatsReqInfo.periodicity * PAL_TIMER_TO_MS_UNIT, eANI_BOOLEAN_FALSE);
13225 if(!HAL_STATUS_SUCCESS(status))
13226 {
13227 smsLog(pMac, LOGE, FL("csrRoamTlStatsTimerHandler:cannot start TlStatsTimer timer\n"));
13228 return;
13229 }
13230 pMac->roam.tlStatsReqInfo.timerRunning = TRUE;
13231 }
13232 }
13233}
Jeff Johnson295189b2012-06-20 16:38:30 -070013234void csrRoamPeStatsTimerHandler(void *pv)
13235{
13236 tCsrPeStatsReqInfo *pPeStatsReqListEntry = (tCsrPeStatsReqInfo *)pv;
13237 eHalStatus status;
13238 tpAniSirGlobal pMac = pPeStatsReqListEntry->pMac;
13239 VOS_STATUS vosStatus;
13240 tPmcPowerState powerState;
Jeff Johnson295189b2012-06-20 16:38:30 -070013241 pPeStatsReqListEntry->timerRunning = FALSE;
13242 if( pPeStatsReqListEntry->timerStopFailed == TRUE )
13243 {
13244 // If we entered here, meaning the timer could not be successfully
13245 // stopped in csrRoamRemoveEntryFromPeStatsReqList(). So do it here.
13246
13247 /* Destroy the timer */
13248 vosStatus = vos_timer_destroy( &pPeStatsReqListEntry->hPeStatsTimer );
13249 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13250 {
13251 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:failed to destroy hPeStatsTimer timer\n"));
13252 }
13253
13254 // Free the entry
13255 palFreeMemory(pMac->hHdd, pPeStatsReqListEntry);
13256 pPeStatsReqListEntry = NULL;
13257 }
13258 else
13259 {
13260 if(!pPeStatsReqListEntry->rspPending)
13261 {
13262 status = csrSendMBStatsReqMsg(pMac, pPeStatsReqListEntry->statsMask & ~(1 << eCsrGlobalClassDStats),
13263 pPeStatsReqListEntry->staId);
13264 if(!HAL_STATUS_SUCCESS(status))
13265 {
13266 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:failed to send down stats req to PE\n"));
13267 }
13268 else
13269 {
13270 pPeStatsReqListEntry->rspPending = TRUE;
13271 }
13272 }
13273
13274 //send down a req
13275 if(pPeStatsReqListEntry->periodicity &&
13276 (VOS_TIMER_STATE_STOPPED == vos_timer_getCurrentState(&pPeStatsReqListEntry->hPeStatsTimer)))
13277 {
13278 pmcQueryPowerState(pMac, &powerState, NULL, NULL);
13279 if(ePMC_FULL_POWER == powerState)
13280 {
13281 if(pPeStatsReqListEntry->periodicity < pMac->roam.configParam.statsReqPeriodicity)
13282 {
13283 pPeStatsReqListEntry->periodicity = pMac->roam.configParam.statsReqPeriodicity;
13284 }
13285 }
13286 else
13287 {
13288 if(pPeStatsReqListEntry->periodicity < pMac->roam.configParam.statsReqPeriodicityInPS)
13289 {
13290 pPeStatsReqListEntry->periodicity = pMac->roam.configParam.statsReqPeriodicityInPS;
13291 }
13292 }
13293 //start timer
13294 vosStatus = vos_timer_start( &pPeStatsReqListEntry->hPeStatsTimer, pPeStatsReqListEntry->periodicity );
13295 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13296 {
13297 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:cannot start hPeStatsTimer timer\n"));
13298 return;
13299 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013300 pPeStatsReqListEntry->timerRunning = TRUE;
13301
13302 }
13303
13304 }
13305}
Jeff Johnson295189b2012-06-20 16:38:30 -070013306void csrRoamStatsClientTimerHandler(void *pv)
13307{
13308 tCsrStatsClientReqInfo *pStaEntry = (tCsrStatsClientReqInfo *)pv;
Jeff Johnson295189b2012-06-20 16:38:30 -070013309 if(VOS_TIMER_STATE_STOPPED == vos_timer_getCurrentState(&pStaEntry->timer))
13310 {
13311#if 0
13312 // TODO Stats fix for multisession
13313 //start the timer
13314 vosStatus = vos_timer_start( &pStaEntry->timer, pStaEntry->periodicity );
13315
13316 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13317 {
13318 smsLog(pStaEntry->pMac, LOGE, FL("csrGetStatistics:cannot start StatsClient timer\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013319 }
13320#endif
13321 }
13322#if 0
13323 //send up the stats report
13324 csrRoamReportStatistics(pStaEntry->pMac, pStaEntry->statsMask, pStaEntry->callback,
13325 pStaEntry->staId, pStaEntry->pContext);
13326#endif
13327}
13328
13329
13330
Jeff Johnson295189b2012-06-20 16:38:30 -070013331eHalStatus csrSendMBStatsReqMsg( tpAniSirGlobal pMac, tANI_U32 statsMask, tANI_U8 staId)
13332{
13333 tAniGetPEStatsReq *pMsg;
13334 eHalStatus status = eHAL_STATUS_SUCCESS;
13335 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof(tAniGetPEStatsReq));
13336 if ( !HAL_STATUS_SUCCESS(status) )
13337 {
13338 smsLog(pMac, LOG1, " csrSendMBStatsReqMsg: failed to allocate mem for stats req \n");
13339 return status;
13340 }
13341 // need to initiate a stats request to PE
13342 pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_STATISTICS_REQ);
13343 pMsg->msgLen = (tANI_U16)sizeof(tAniGetPEStatsReq);
13344 pMsg->staId = staId;
13345 pMsg->statsMask = statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -070013346 status = palSendMBMessage(pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070013347 if(!HAL_STATUS_SUCCESS(status))
13348 {
13349 smsLog(pMac, LOG1, " csrSendMBStatsReqMsg: failed to send down the stats req \n");
13350 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013351 return status;
13352}
Jeff Johnson295189b2012-06-20 16:38:30 -070013353void csrRoamStatsRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg)
13354{
13355 tAniGetPEStatsRsp *pSmeStatsRsp;
13356 eHalStatus status = eHAL_STATUS_FAILURE;
13357 tListElem *pEntry = NULL;
13358 tCsrStatsClientReqInfo *pTempStaEntry = NULL;
13359 tCsrPeStatsReqInfo *pPeStaEntry = NULL;
13360 tANI_U32 tempMask = 0;
13361 tANI_U8 counter = 0;
13362 tANI_U8 *pStats = NULL;
13363 tANI_U32 length = 0;
13364 v_PVOID_t pvosGCtx;
13365 v_S7_t rssi = 0;
13366 tANI_U32 *pRssi = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013367 pSmeStatsRsp = (tAniGetPEStatsRsp *)pSirMsg;
13368 if(pSmeStatsRsp->rc)
13369 {
13370 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:stats rsp from PE shows failure\n"));
13371 goto post_update;
13372 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013373 tempMask = pSmeStatsRsp->statsMask;
13374 pStats = ((tANI_U8 *)&pSmeStatsRsp->statsMask) + sizeof(pSmeStatsRsp->statsMask);
Jeff Johnson295189b2012-06-20 16:38:30 -070013375 /* subtract all statistics from this length, and after processing the entire
13376 * 'stat' part of the message, if the length is not zero, then rssi is piggy packed
13377 * in this 'stats' message.
13378 */
13379 length = pSmeStatsRsp->msgLen - sizeof(tAniGetPEStatsRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -070013380 //new stats info from PE, fill up the stats strucutres in PMAC
13381 while(tempMask)
13382 {
13383 if(tempMask & 1)
13384 {
13385 switch(counter)
13386 {
13387 case eCsrSummaryStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013388 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:summary stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013389 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.summaryStatsInfo,
13390 pStats, sizeof(tCsrSummaryStatsInfo));
13391 if(!HAL_STATUS_SUCCESS(status))
13392 {
13393 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy summary stats\n"));
13394 }
13395 pStats += sizeof(tCsrSummaryStatsInfo);
13396 length -= sizeof(tCsrSummaryStatsInfo);
13397 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013398 case eCsrGlobalClassAStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013399 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassA stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013400 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classAStatsInfo,
13401 pStats, sizeof(tCsrGlobalClassAStatsInfo));
13402 if(!HAL_STATUS_SUCCESS(status))
13403 {
13404 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassA stats\n"));
13405 }
13406 pStats += sizeof(tCsrGlobalClassAStatsInfo);
13407 length -= sizeof(tCsrGlobalClassAStatsInfo);
13408 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013409 case eCsrGlobalClassBStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013410 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassB stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013411 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classBStatsInfo,
13412 pStats, sizeof(tCsrGlobalClassBStatsInfo));
13413 if(!HAL_STATUS_SUCCESS(status))
13414 {
13415 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassB stats\n"));
13416 }
13417 pStats += sizeof(tCsrGlobalClassBStatsInfo);
13418 length -= sizeof(tCsrGlobalClassBStatsInfo);
13419 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013420 case eCsrGlobalClassCStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013421 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassC stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013422 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classCStatsInfo,
13423 pStats, sizeof(tCsrGlobalClassCStatsInfo));
13424 if(!HAL_STATUS_SUCCESS(status))
13425 {
13426 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassC stats\n"));
13427 }
13428 pStats += sizeof(tCsrGlobalClassCStatsInfo);
13429 length -= sizeof(tCsrGlobalClassCStatsInfo);
13430 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013431 case eCsrPerStaStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013432 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:PerSta stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013433 if( CSR_MAX_STA > pSmeStatsRsp->staId )
13434 {
13435 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.perStaStatsInfo[pSmeStatsRsp->staId],
13436 pStats, sizeof(tCsrPerStaStatsInfo));
13437 }
13438 else
13439 {
13440 status = eHAL_STATUS_FAILURE;
13441 smsLog( pMac, LOGE, FL("csrRoamStatsRspProcessor:out bound staId:%d\n"), pSmeStatsRsp->staId);
13442 VOS_ASSERT( 0 );
13443 }
13444 if(!HAL_STATUS_SUCCESS(status))
13445 {
13446 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy PerSta stats\n"));
13447 }
13448 pStats += sizeof(tCsrPerStaStatsInfo);
13449 length -= sizeof(tCsrPerStaStatsInfo);
13450 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013451 default:
13452 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:unknown stats type\n"));
13453 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013454 }
13455 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013456 tempMask >>=1;
13457 counter++;
13458 }
13459 pvosGCtx = vos_get_global_context(VOS_MODULE_ID_SME, pMac);
13460 if (length != 0)
13461 {
13462 pRssi = (tANI_U32*)pStats;
13463 rssi = (v_S7_t)*pRssi;
13464 }
13465 else
13466 {
13467 /* If riva is not sending rssi, continue to use the hack */
13468 rssi = RSSI_HACK_BMPS;
13469 }
13470 WDA_UpdateRssiBmps(pvosGCtx, pSmeStatsRsp->staId, rssi);
Jeff Johnson295189b2012-06-20 16:38:30 -070013471post_update:
13472 //make sure to update the pe stats req list
13473 pEntry = csrRoamFindInPeStatsReqList(pMac, pSmeStatsRsp->statsMask);
13474 if(pEntry)
13475 {
13476 pPeStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
13477 pPeStaEntry->rspPending = FALSE;
13478
13479 }
13480 //check the one timer cases
13481 pEntry = csrRoamCheckClientReqList(pMac, pSmeStatsRsp->statsMask);
13482 if(pEntry)
13483 {
Jeff Johnson295189b2012-06-20 16:38:30 -070013484 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013485 if(pTempStaEntry->timerExpired)
13486 {
13487 //send up the stats report
13488 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
13489 pTempStaEntry->staId, pTempStaEntry->pContext);
13490 //also remove from the client list
13491 csrRoamRemoveStatListEntry(pMac, pEntry);
13492 pTempStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013493 }
13494 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013495}
Jeff Johnson295189b2012-06-20 16:38:30 -070013496tListElem * csrRoamFindInPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask)
13497{
13498 tListElem *pEntry = NULL;
13499 tCsrPeStatsReqInfo *pTempStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013500 pEntry = csrLLPeekHead( &pMac->roam.peStatsReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013501 if(!pEntry)
13502 {
13503 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013504 smsLog(pMac, LOG2, "csrRoamFindInPeStatsReqList: List empty, no request to PE\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013505 return NULL;
13506 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013507 while( pEntry )
13508 {
13509 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013510 if(pTempStaEntry->statsMask == statsMask)
13511 {
Mohit Khanna23863762012-09-11 17:40:09 -070013512 smsLog(pMac, LOG3, "csrRoamFindInPeStatsReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013513 break;
13514 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013515 pEntry = csrLLNext( &pMac->roam.peStatsReqList, pEntry, LL_ACCESS_NOLOCK );
13516 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013517 return pEntry;
13518}
13519
Jeff Johnson295189b2012-06-20 16:38:30 -070013520tListElem * csrRoamChecknUpdateClientReqList(tpAniSirGlobal pMac, tCsrStatsClientReqInfo *pStaEntry,
13521 tANI_BOOLEAN update)
13522{
13523 tListElem *pEntry;
13524 tCsrStatsClientReqInfo *pTempStaEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070013525 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013526 if(!pEntry)
13527 {
13528 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013529 smsLog(pMac, LOG2, "csrRoamChecknUpdateClientReqList: List empty, no request from "
Jeff Johnson295189b2012-06-20 16:38:30 -070013530 "upper layer client(s)\n");
13531 return NULL;
13532 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013533 while( pEntry )
13534 {
13535 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013536 if((pTempStaEntry->requesterId == pStaEntry->requesterId) &&
13537 (pTempStaEntry->statsMask == pStaEntry->statsMask))
13538 {
Mohit Khanna23863762012-09-11 17:40:09 -070013539 smsLog(pMac, LOG3, "csrRoamChecknUpdateClientReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013540 if(update)
13541 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013542 pTempStaEntry->periodicity = pStaEntry->periodicity;
13543 pTempStaEntry->callback = pStaEntry->callback;
13544 pTempStaEntry->pContext = pStaEntry->pContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070013545 }
13546 break;
13547 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013548 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
13549 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013550 return pEntry;
13551}
Jeff Johnson295189b2012-06-20 16:38:30 -070013552tListElem * csrRoamCheckClientReqList(tpAniSirGlobal pMac, tANI_U32 statsMask)
13553{
13554 tListElem *pEntry;
13555 tCsrStatsClientReqInfo *pTempStaEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070013556 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013557 if(!pEntry)
13558 {
13559 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013560 smsLog(pMac, LOG2, "csrRoamCheckClientReqList: List empty, no request from "
Jeff Johnson295189b2012-06-20 16:38:30 -070013561 "upper layer client(s)\n");
13562 return NULL;
13563 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013564 while( pEntry )
13565 {
13566 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013567 if((pTempStaEntry->statsMask & ~(1 << eCsrGlobalClassDStats)) == statsMask)
13568 {
Mohit Khanna23863762012-09-11 17:40:09 -070013569 smsLog(pMac, LOG3, "csrRoamCheckClientReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013570 break;
13571 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013572 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
13573 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013574 return pEntry;
13575}
Jeff Johnson295189b2012-06-20 16:38:30 -070013576eHalStatus csrRoamRegisterLinkQualityIndCallback(tpAniSirGlobal pMac,
13577 csrRoamLinkQualityIndCallback callback,
13578 void *pContext)
13579{
13580 pMac->roam.linkQualityIndInfo.callback = callback;
13581 pMac->roam.linkQualityIndInfo.context = pContext;
13582 if( NULL == callback )
13583 {
13584 smsLog(pMac, LOGW, "csrRoamRegisterLinkQualityIndCallback: indication callback being deregistered");
13585 }
13586 else
13587 {
13588 smsLog(pMac, LOGW, "csrRoamRegisterLinkQualityIndCallback: indication callback being registered");
Jeff Johnson295189b2012-06-20 16:38:30 -070013589 /* do we need to invoke the callback to notify client of initial value ?? */
13590 }
13591 return eHAL_STATUS_SUCCESS;
13592}
Jeff Johnson295189b2012-06-20 16:38:30 -070013593void csrRoamVccTrigger(tpAniSirGlobal pMac)
13594{
13595 eCsrRoamLinkQualityInd newVccLinkQuality;
13596 tANI_U32 ul_mac_loss = 0;
13597 tANI_U32 ul_mac_loss_trigger_threshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013598 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
13599 /*-------------------------------------------------------------------------
13600 Link quality is currently binary based on OBIWAN recommended triggers
Jeff Johnson295189b2012-06-20 16:38:30 -070013601 Check for a change in link quality and notify client if necessary
13602 -------------------------------------------------------------------------*/
13603 ul_mac_loss_trigger_threshold =
13604 pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013605 VOS_ASSERT( ul_mac_loss_trigger_threshold != 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070013606 smsLog(pMac, LOGW, "csrRoamVccTrigger: UL_MAC_LOSS_THRESHOLD is %d\n",
13607 ul_mac_loss_trigger_threshold );
Jeff Johnson295189b2012-06-20 16:38:30 -070013608 if(ul_mac_loss_trigger_threshold < ul_mac_loss)
13609 {
13610 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality is POOR \n");
13611 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13612 }
13613 else
13614 {
13615 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality is GOOD\n");
13616 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_GOOD_IND;
13617 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013618 smsLog(pMac, LOGW, "csrRoamVccTrigger: link qual : *** UL_MAC_LOSS %d *** ",
13619 ul_mac_loss);
Jeff Johnson295189b2012-06-20 16:38:30 -070013620 if(newVccLinkQuality != pMac->roam.vccLinkQuality)
13621 {
13622 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality changed: trigger necessary\n");
13623 if(NULL != pMac->roam.linkQualityIndInfo.callback)
13624 {
13625 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality indication %d\n",
13626 newVccLinkQuality );
13627
13628 /* we now invoke the callback once to notify client of initial value */
13629 pMac->roam.linkQualityIndInfo.callback( newVccLinkQuality,
13630 pMac->roam.linkQualityIndInfo.context );
13631 //event: EVENT_WLAN_VCC
13632 }
13633 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013634 pMac->roam.vccLinkQuality = newVccLinkQuality;
13635
Jeff Johnson295189b2012-06-20 16:38:30 -070013636}
Jeff Johnson295189b2012-06-20 16:38:30 -070013637VOS_STATUS csrRoamVccTriggerRssiIndCallback(tHalHandle hHal,
13638 v_U8_t rssiNotification,
13639 void * context)
13640{
13641 tpAniSirGlobal pMac = PMAC_STRUCT( context );
13642 eCsrRoamLinkQualityInd newVccLinkQuality;
13643 // TODO : Session info unavailable
13644 tANI_U32 sessionId = 0;
13645 VOS_STATUS status = VOS_STATUS_SUCCESS;
13646 /*-------------------------------------------------------------------------
13647 Link quality is currently binary based on OBIWAN recommended triggers
Jeff Johnson295189b2012-06-20 16:38:30 -070013648 Check for a change in link quality and notify client if necessary
13649 -------------------------------------------------------------------------*/
13650 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: RSSI trigger threshold is %d\n",
13651 pMac->roam.configParam.vccRssiThreshold);
13652 if(!csrIsConnStateConnectedInfra(pMac, sessionId))
13653 {
13654 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: ignoring the indication as we are not connected\n");
13655 return VOS_STATUS_SUCCESS;
13656 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013657 if(WLANTL_HO_THRESHOLD_DOWN == rssiNotification)
13658 {
13659 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality is POOR\n");
13660 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13661 }
13662 else if(WLANTL_HO_THRESHOLD_UP == rssiNotification)
13663 {
13664 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality is GOOD \n");
13665 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_GOOD_IND;
13666 }
13667 else
13668 {
13669 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: unknown rssi notification %d\n", rssiNotification);
13670 //Set to this so the code below won't do anything
13671 newVccLinkQuality = pMac->roam.vccLinkQuality;
Jeff Johnson295189b2012-06-20 16:38:30 -070013672 VOS_ASSERT(0);
13673 }
13674
Jeff Johnson295189b2012-06-20 16:38:30 -070013675 if(newVccLinkQuality != pMac->roam.vccLinkQuality)
13676 {
13677 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality changed: trigger necessary\n");
13678 if(NULL != pMac->roam.linkQualityIndInfo.callback)
13679 {
13680 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality indication %d\n",
13681 newVccLinkQuality);
Jeff Johnson295189b2012-06-20 16:38:30 -070013682 /* we now invoke the callback once to notify client of initial value */
13683 pMac->roam.linkQualityIndInfo.callback( newVccLinkQuality,
13684 pMac->roam.linkQualityIndInfo.context );
13685 //event: EVENT_WLAN_VCC
13686 }
13687 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013688 pMac->roam.vccLinkQuality = newVccLinkQuality;
Jeff Johnson295189b2012-06-20 16:38:30 -070013689 return status;
13690}
Jeff Johnson295189b2012-06-20 16:38:30 -070013691tCsrStatsClientReqInfo * csrRoamInsertEntryIntoList( tpAniSirGlobal pMac,
13692 tDblLinkList *pStaList,
13693 tCsrStatsClientReqInfo *pStaEntry)
13694{
13695 tCsrStatsClientReqInfo *pNewStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013696 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013697 //if same entity requested for same set of stats with different periodicity &
13698 // callback update it
13699 if(NULL == csrRoamChecknUpdateClientReqList(pMac, pStaEntry, TRUE))
13700 {
13701
13702 status = palAllocateMemory(pMac->hHdd, (void **)&pNewStaEntry, sizeof(tCsrStatsClientReqInfo));
13703 if (!HAL_STATUS_SUCCESS(status))
13704 {
13705 smsLog(pMac, LOGW, "csrRoamInsertEntryIntoList: couldn't allocate memory for the "
13706 "entry\n");
13707 return NULL;
13708 }
13709
Jeff Johnson295189b2012-06-20 16:38:30 -070013710 pNewStaEntry->callback = pStaEntry->callback;
13711 pNewStaEntry->pContext = pStaEntry->pContext;
13712 pNewStaEntry->periodicity = pStaEntry->periodicity;
13713 pNewStaEntry->requesterId = pStaEntry->requesterId;
13714 pNewStaEntry->statsMask = pStaEntry->statsMask;
13715 pNewStaEntry->pPeStaEntry = pStaEntry->pPeStaEntry;
13716 pNewStaEntry->pMac = pStaEntry->pMac;
13717 pNewStaEntry->staId = pStaEntry->staId;
13718 pNewStaEntry->timerExpired = pStaEntry->timerExpired;
13719
13720 csrLLInsertTail( pStaList, &pNewStaEntry->link, LL_ACCESS_LOCK );
13721 }
13722 return pNewStaEntry;
13723}
13724
Jeff Johnson295189b2012-06-20 16:38:30 -070013725tCsrPeStatsReqInfo * csrRoamInsertEntryIntoPeStatsReqList( tpAniSirGlobal pMac,
13726 tDblLinkList *pStaList,
13727 tCsrPeStatsReqInfo *pStaEntry)
13728{
13729 tCsrPeStatsReqInfo *pNewStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013730 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013731 status = palAllocateMemory(pMac->hHdd, (void **)&pNewStaEntry, sizeof(tCsrPeStatsReqInfo));
13732 if (!HAL_STATUS_SUCCESS(status))
13733 {
13734 smsLog(pMac, LOGW, "csrRoamInsertEntryIntoPeStatsReqList: couldn't allocate memory for the "
13735 "entry\n");
13736 return NULL;
13737 }
13738
Jeff Johnson295189b2012-06-20 16:38:30 -070013739 pNewStaEntry->hPeStatsTimer = pStaEntry->hPeStatsTimer;
13740 pNewStaEntry->numClient = pStaEntry->numClient;
13741 pNewStaEntry->periodicity = pStaEntry->periodicity;
13742 pNewStaEntry->statsMask = pStaEntry->statsMask;
13743 pNewStaEntry->pMac = pStaEntry->pMac;
13744 pNewStaEntry->staId = pStaEntry->staId;
13745 pNewStaEntry->timerRunning = pStaEntry->timerRunning;
13746 pNewStaEntry->rspPending = pStaEntry->rspPending;
13747
13748 csrLLInsertTail( pStaList, &pNewStaEntry->link, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013749 return pNewStaEntry;
13750}
Jeff Johnson295189b2012-06-20 16:38:30 -070013751eHalStatus csrGetRssi(tpAniSirGlobal pMac,
13752 tCsrRssiCallback callback,
13753 tANI_U8 staId, tCsrBssid bssId, void *pContext, void* pVosContext)
13754{
13755 eHalStatus status = eHAL_STATUS_SUCCESS;
13756 vos_msg_t msg;
13757 tANI_U32 sessionId;
13758
13759 tAniGetRssiReq *pMsg;
13760 smsLog(pMac, LOG2, FL("called"));
13761 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof(tAniGetRssiReq));
13762 if ( !HAL_STATUS_SUCCESS(status) )
13763 {
13764 smsLog(pMac, LOGE, " csrGetRssi: failed to allocate mem for req \n");
13765 return status;
13766 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013767 csrRoamGetSessionIdFromBSSID(pMac, (tCsrBssid *)bssId, &sessionId);
13768
13769 pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_RSSI_REQ);
13770 pMsg->msgLen = (tANI_U16)sizeof(tAniGetRssiReq);
13771 pMsg->sessionId = sessionId;
13772 pMsg->staId = staId;
13773 pMsg->rssiCallback = callback;
13774 pMsg->pDevContext = pContext;
13775 pMsg->pVosContext = pVosContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070013776 msg.type = eWNI_SME_GET_RSSI_REQ;
13777 msg.bodyptr = pMsg;
13778 msg.reserved = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013779 if(VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, &msg))
13780 {
13781 smsLog(pMac, LOGE, " csrGetRssi failed to post msg to self \n");
13782 palFreeMemory(pMac->hHdd, (void *)pMsg);
13783 status = eHAL_STATUS_FAILURE;
13784 }
13785 smsLog(pMac, LOG2, FL("returned"));
13786 return status;
13787}
Jeff Johnson295189b2012-06-20 16:38:30 -070013788eHalStatus csrGetStatistics(tpAniSirGlobal pMac, eCsrStatsRequesterType requesterId,
13789 tANI_U32 statsMask,
13790 tCsrStatsCallback callback,
13791 tANI_U32 periodicity, tANI_BOOLEAN cache,
13792 tANI_U8 staId, void *pContext)
13793{
13794 tCsrStatsClientReqInfo staEntry;
13795 tCsrStatsClientReqInfo *pStaEntry = NULL;
13796 tCsrPeStatsReqInfo *pPeStaEntry = NULL;
13797 tListElem *pEntry = NULL;
13798 tANI_BOOLEAN found = FALSE;
13799 eHalStatus status = eHAL_STATUS_SUCCESS;
13800 tANI_BOOLEAN insertInClientList = FALSE;
13801 VOS_STATUS vosStatus;
Jeff Johnsone7245742012-09-05 17:12:55 -070013802 WLANTL_TRANSFER_STA_TYPE *pTlStats;
Jeff Johnson295189b2012-06-20 16:38:30 -070013803
13804 if( csrIsAllSessionDisconnected(pMac) )
13805 {
13806 //smsLog(pMac, LOGW, "csrGetStatistics: wrong state curState(%d) not connected\n", pMac->roam.curState);
13807 return eHAL_STATUS_FAILURE;
13808 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013809 if((!statsMask) && (!callback))
13810 {
13811 //msg
13812 smsLog(pMac, LOGW, "csrGetStatistics: statsMask & callback empty in the request\n");
13813 return eHAL_STATUS_FAILURE;
13814 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013815 //for the search list method for deregister
13816 staEntry.requesterId = requesterId;
13817 staEntry.statsMask = statsMask;
13818 //requester wants to deregister or just an error
13819 if((statsMask) && (!callback))
13820 {
13821 pEntry = csrRoamChecknUpdateClientReqList(pMac, &staEntry, FALSE);
13822 if(!pEntry)
13823 {
13824 //msg
13825 smsLog(pMac, LOGW, "csrGetStatistics: callback is empty in the request & couldn't "
13826 "find any existing request in statsClientReqList\n");
13827 return eHAL_STATUS_FAILURE;
13828 }
13829 else
13830 {
13831 //clean up & return
13832 pStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnsond13512a2012-07-17 11:42:19 -070013833 if(NULL != pStaEntry->pPeStaEntry)
Jeff Johnson295189b2012-06-20 16:38:30 -070013834 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013835 pStaEntry->pPeStaEntry->numClient--;
13836 //check if we need to delete the entry from peStatsReqList too
13837 if(!pStaEntry->pPeStaEntry->numClient)
13838 {
13839 csrRoamRemoveEntryFromPeStatsReqList(pMac, pStaEntry->pPeStaEntry);
13840 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013841 }
Jeff Johnsond13512a2012-07-17 11:42:19 -070013842
Jeff Johnson295189b2012-06-20 16:38:30 -070013843 //check if we need to stop the tl stats timer too
13844 pMac->roam.tlStatsReqInfo.numClient--;
13845 if(!pMac->roam.tlStatsReqInfo.numClient)
13846 {
13847 if(pMac->roam.tlStatsReqInfo.timerRunning)
13848 {
13849 status = palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
13850 if(!HAL_STATUS_SUCCESS(status))
13851 {
13852 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot stop TlStatsTimer timer\n"));
13853 return eHAL_STATUS_FAILURE;
13854 }
13855 }
13856 pMac->roam.tlStatsReqInfo.periodicity = 0;
13857 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
13858 }
13859 vos_timer_stop( &pStaEntry->timer );
Jeff Johnson295189b2012-06-20 16:38:30 -070013860 // Destroy the vos timer...
13861 vosStatus = vos_timer_destroy( &pStaEntry->timer );
13862 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13863 {
13864 smsLog(pMac, LOGE, FL("csrGetStatistics:failed to destroy Client req timer\n"));
13865 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013866 csrRoamRemoveStatListEntry(pMac, pEntry);
13867 pStaEntry = NULL;
13868 return eHAL_STATUS_SUCCESS;
13869 }
13870 }
13871
13872 if(cache && !periodicity)
13873 {
13874 //return the cached stats
13875 csrRoamReportStatistics(pMac, statsMask, callback, staId, pContext);
13876 }
13877 else
13878 {
13879 //add the request in the client req list
13880 staEntry.callback = callback;
13881 staEntry.pContext = pContext;
13882 staEntry.periodicity = periodicity;
13883 staEntry.pPeStaEntry = NULL;
13884 staEntry.staId = staId;
13885 staEntry.pMac = pMac;
13886 staEntry.timerExpired = FALSE;
13887
13888
Jeff Johnson295189b2012-06-20 16:38:30 -070013889 //if periodic report requested with non cached result from PE/TL
13890 if(periodicity)
13891 {
13892
13893 //if looking for stats from PE
13894 if(statsMask & ~(1 << eCsrGlobalClassDStats))
13895 {
13896
13897 //check if same request made already & waiting for rsp
13898 pPeStaEntry = csrRoamCheckPeStatsReqList(pMac, statsMask & ~(1 << eCsrGlobalClassDStats),
13899 periodicity, &found, staId);
13900 if(!pPeStaEntry)
13901 {
13902 //bail out, maxed out on number of req for PE
13903 return eHAL_STATUS_FAILURE;
13904 }
13905 else
13906 {
13907 staEntry.pPeStaEntry = pPeStaEntry;
13908 }
13909
13910 }
13911 //request stats from TL rightaway if requested by client, update tlStatsReqInfo if needed
13912 if(statsMask & (1 << eCsrGlobalClassDStats))
13913 {
13914 if(cache && pMac->roam.tlStatsReqInfo.numClient)
13915 {
13916 smsLog(pMac, LOGE, FL("csrGetStatistics:Looking for cached stats from TL\n"));
13917 }
13918 else
13919 {
13920
13921 //update periodicity
13922 if(pMac->roam.tlStatsReqInfo.periodicity)
13923 {
13924 pMac->roam.tlStatsReqInfo.periodicity =
13925 CSR_ROAM_MIN(periodicity, pMac->roam.tlStatsReqInfo.periodicity);
13926 }
13927 else
13928 {
13929 pMac->roam.tlStatsReqInfo.periodicity = periodicity;
13930 }
13931 if(pMac->roam.tlStatsReqInfo.periodicity < CSR_MIN_TL_STAT_QUERY_PERIOD)
13932 {
13933 pMac->roam.tlStatsReqInfo.periodicity = CSR_MIN_TL_STAT_QUERY_PERIOD;
13934 }
13935
13936 if(!pMac->roam.tlStatsReqInfo.timerRunning)
13937 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013938 pTlStats = (WLANTL_TRANSFER_STA_TYPE *)vos_mem_malloc(sizeof(WLANTL_TRANSFER_STA_TYPE));
13939 if(NULL != pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070013940 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013941 //req TL for class D stats
13942 if(WLANTL_GetStatistics(pMac->roam.gVosContext, pTlStats, staId))
13943 {
13944 smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
13945 }
13946 else
13947 {
13948 //save in SME
13949 csrRoamSaveStatsFromTl(pMac, pTlStats);
13950 }
13951 vos_mem_free(pTlStats);
13952 pTlStats = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013953 }
13954 else
13955 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013956 smsLog(pMac, LOGE, FL("cannot allocate memory for TL stat"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013957 }
Jeff Johnsone7245742012-09-05 17:12:55 -070013958
Jeff Johnson295189b2012-06-20 16:38:30 -070013959 if(pMac->roam.tlStatsReqInfo.periodicity)
13960 {
13961 //start timer
13962 status = palTimerStart(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer,
13963 pMac->roam.tlStatsReqInfo.periodicity * PAL_TIMER_TO_MS_UNIT, eANI_BOOLEAN_FALSE);
13964 if(!HAL_STATUS_SUCCESS(status))
13965 {
13966 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot start TlStatsTimer timer\n"));
13967 return eHAL_STATUS_FAILURE;
13968 }
13969 pMac->roam.tlStatsReqInfo.timerRunning = TRUE;
13970 }
13971 }
13972 }
13973 pMac->roam.tlStatsReqInfo.numClient++;
13974 }
13975
13976 insertInClientList = TRUE;
13977 }
13978 //if one time report requested with non cached result from PE/TL
13979 else if(!cache && !periodicity)
13980 {
13981 if(statsMask & ~(1 << eCsrGlobalClassDStats))
13982 {
13983 //send down a req
13984 status = csrSendMBStatsReqMsg(pMac, statsMask & ~(1 << eCsrGlobalClassDStats), staId);
13985 if(!HAL_STATUS_SUCCESS(status))
13986 {
13987 smsLog(pMac, LOGE, FL("csrGetStatistics:failed to send down stats req to PE\n"));
13988 }
13989 //so that when the stats rsp comes back from PE we respond to upper layer
13990 //right away
13991 staEntry.timerExpired = TRUE;
13992 insertInClientList = TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -070013993 }
13994 if(statsMask & (1 << eCsrGlobalClassDStats))
13995 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013996 pTlStats = (WLANTL_TRANSFER_STA_TYPE *)vos_mem_malloc(sizeof(WLANTL_TRANSFER_STA_TYPE));
13997 if(NULL != pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070013998 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013999 //req TL for class D stats
14000 if(!VOS_IS_STATUS_SUCCESS(WLANTL_GetStatistics(pMac->roam.gVosContext, pTlStats, staId)))
14001 {
14002 smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
14003 }
14004 else
14005 {
14006 //save in SME
14007 csrRoamSaveStatsFromTl(pMac, pTlStats);
14008 }
14009 vos_mem_free(pTlStats);
14010 pTlStats = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070014011 }
14012 else
14013 {
Jeff Johnsone7245742012-09-05 17:12:55 -070014014 smsLog(pMac, LOGE, FL("cannot allocate memory for TL stat"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014015 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014016
14017 }
14018 //if looking for stats from TL only
14019 if(!insertInClientList)
14020 {
14021 //return the stats
14022 csrRoamReportStatistics(pMac, statsMask, callback, staId, pContext);
14023 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014024 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014025 if(insertInClientList)
14026 {
14027 pStaEntry = csrRoamInsertEntryIntoList(pMac, &pMac->roam.statsClientReqList, &staEntry);
14028 if(!pStaEntry)
14029 {
14030 //msg
14031 smsLog(pMac, LOGW, "csrGetStatistics: Failed to insert req in statsClientReqList\n");
14032 return eHAL_STATUS_FAILURE;
14033 }
Jeff Johnsone7245742012-09-05 17:12:55 -070014034 pStaEntry->periodicity = periodicity;
Jeff Johnson295189b2012-06-20 16:38:30 -070014035 //Init & start timer if needed
14036 if(periodicity)
14037 {
14038 vosStatus = vos_timer_init( &pStaEntry->timer, VOS_TIMER_TYPE_SW,
14039 csrRoamStatsClientTimerHandler, pStaEntry );
14040 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14041 {
14042 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot init StatsClient timer\n"));
14043 return eHAL_STATUS_FAILURE;
14044 }
14045 vosStatus = vos_timer_start( &pStaEntry->timer, periodicity );
14046 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14047 {
14048 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot start StatsClient timer\n"));
14049 return eHAL_STATUS_FAILURE;
14050 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014051 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014052 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014053 }
14054 return eHAL_STATUS_SUCCESS;
14055}
14056
Jeff Johnson295189b2012-06-20 16:38:30 -070014057tCsrPeStatsReqInfo * csrRoamCheckPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask,
14058 tANI_U32 periodicity, tANI_BOOLEAN *pFound, tANI_U8 staId)
14059{
14060 tANI_BOOLEAN found = FALSE;
14061 eHalStatus status = eHAL_STATUS_SUCCESS;
14062 tCsrPeStatsReqInfo staEntry;
14063 tCsrPeStatsReqInfo *pTempStaEntry = NULL;
14064 tListElem *pStaEntry = NULL;
14065 VOS_STATUS vosStatus;
14066 tPmcPowerState powerState;
14067 *pFound = FALSE;
14068
14069 pStaEntry = csrRoamFindInPeStatsReqList(pMac, statsMask);
14070 if(pStaEntry)
14071 {
14072 pTempStaEntry = GET_BASE_ADDR( pStaEntry, tCsrPeStatsReqInfo, link );
14073 if(pTempStaEntry->periodicity)
14074 {
14075 pTempStaEntry->periodicity =
14076 CSR_ROAM_MIN(periodicity, pTempStaEntry->periodicity);
14077 }
14078 else
14079 {
14080 pTempStaEntry->periodicity = periodicity;
14081 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014082 pTempStaEntry->numClient++;
14083 found = TRUE;
14084 }
14085 else
14086 {
14087 palZeroMemory(pMac->hHdd, &staEntry, sizeof(tCsrPeStatsReqInfo));
14088 staEntry.numClient = 1;
14089 staEntry.periodicity = periodicity;
14090 staEntry.pMac = pMac;
14091 staEntry.rspPending = FALSE;
14092 staEntry.staId = staId;
14093 staEntry.statsMask = statsMask;
14094 staEntry.timerRunning = FALSE;
14095 pTempStaEntry = csrRoamInsertEntryIntoPeStatsReqList(pMac, &pMac->roam.peStatsReqList, &staEntry);
14096 if(!pTempStaEntry)
14097 {
14098 //msg
14099 smsLog(pMac, LOGW, "csrRoamCheckPeStatsReqList: Failed to insert req in peStatsReqList\n");
14100 return NULL;
14101 }
14102 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014103 pmcQueryPowerState(pMac, &powerState, NULL, NULL);
14104 if(ePMC_FULL_POWER == powerState)
14105 {
14106 if(pTempStaEntry->periodicity < pMac->roam.configParam.statsReqPeriodicity)
14107 {
14108 pTempStaEntry->periodicity = pMac->roam.configParam.statsReqPeriodicity;
14109 }
14110 }
14111 else
14112 {
14113 if(pTempStaEntry->periodicity < pMac->roam.configParam.statsReqPeriodicityInPS)
14114 {
14115 pTempStaEntry->periodicity = pMac->roam.configParam.statsReqPeriodicityInPS;
14116 }
14117 }
14118 if(!pTempStaEntry->timerRunning)
14119 {
14120 //send down a req in case of one time req, for periodic ones wait for timer to expire
14121 if(!pTempStaEntry->rspPending &&
14122 !pTempStaEntry->periodicity)
14123 {
14124 status = csrSendMBStatsReqMsg(pMac, statsMask & ~(1 << eCsrGlobalClassDStats), staId);
14125 if(!HAL_STATUS_SUCCESS(status))
14126 {
14127 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:failed to send down stats req to PE\n"));
14128 }
14129 else
14130 {
14131 pTempStaEntry->rspPending = TRUE;
14132 }
14133 }
14134 if(pTempStaEntry->periodicity)
14135 {
14136 if(!found)
14137 {
14138
14139 vosStatus = vos_timer_init( &pTempStaEntry->hPeStatsTimer, VOS_TIMER_TYPE_SW,
14140 csrRoamPeStatsTimerHandler, pTempStaEntry );
14141 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14142 {
14143 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:cannot init hPeStatsTimer timer\n"));
14144 return NULL;
14145 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014146 }
14147 //start timer
14148 smsLog(pMac, LOG1, "csrRoamCheckPeStatsReqList:peStatsTimer period %d\n", pTempStaEntry->periodicity);
Jeff Johnson295189b2012-06-20 16:38:30 -070014149 vosStatus = vos_timer_start( &pTempStaEntry->hPeStatsTimer, pTempStaEntry->periodicity );
14150 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14151 {
14152 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:cannot start hPeStatsTimer timer\n"));
14153 return NULL;
14154 }
14155 pTempStaEntry->timerRunning = TRUE;
14156 }
14157 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014158 *pFound = found;
14159 return pTempStaEntry;
14160}
14161
Jeff Johnson295189b2012-06-20 16:38:30 -070014162/*
14163 pStaEntry is no longer invalid upon the return of this function.
14164*/
14165static void csrRoamRemoveStatListEntry(tpAniSirGlobal pMac, tListElem *pEntry)
14166{
14167 if(pEntry)
14168 {
14169 if(csrLLRemoveEntry(&pMac->roam.statsClientReqList, pEntry, LL_ACCESS_LOCK))
14170 {
14171 palFreeMemory(pMac->hHdd, GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link ));
Jeff Johnsone7245742012-09-05 17:12:55 -070014172 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014173 }
14174 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014175
14176void csrRoamRemoveEntryFromPeStatsReqList(tpAniSirGlobal pMac, tCsrPeStatsReqInfo *pPeStaEntry)
14177{
14178 tListElem *pEntry;
14179 tCsrPeStatsReqInfo *pTempStaEntry;
14180 VOS_STATUS vosStatus;
14181 pEntry = csrLLPeekHead( &pMac->roam.peStatsReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070014182 if(!pEntry)
14183 {
14184 //list empty
14185 smsLog(pMac, LOGW, "csrRoamRemoveEntryFromPeStatsReqList: List empty, no stats req for PE\n");
14186 return;
14187 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014188 while( pEntry )
14189 {
14190 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070014191 if( pTempStaEntry && pTempStaEntry->statsMask == pPeStaEntry->statsMask)
14192 {
14193 smsLog(pMac, LOGW, "csrRoamRemoveEntryFromPeStatsReqList: match found\n");
14194 if(pTempStaEntry->timerRunning)
14195 {
14196 vosStatus = vos_timer_stop( &pTempStaEntry->hPeStatsTimer );
14197 /* If we are not able to stop the timer here, just remove
14198 * the entry from the linked list. Destroy the timer object
14199 * and free the memory in the timer CB
14200 */
14201 if( vosStatus == VOS_STATUS_SUCCESS )
14202 {
14203 /* the timer is successfully stopped */
14204 pTempStaEntry->timerRunning = FALSE;
14205
14206 /* Destroy the timer */
14207 vosStatus = vos_timer_destroy( &pTempStaEntry->hPeStatsTimer );
14208 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14209 {
14210 smsLog(pMac, LOGE, FL("csrRoamRemoveEntryFromPeStatsReqList:failed to destroy hPeStatsTimer timer\n"));
14211 }
14212 }
14213 else
14214 {
14215 // the timer could not be stopped. Hence destroy and free the
14216 // memory for the PE stat entry in the timer CB.
14217 pTempStaEntry->timerStopFailed = TRUE;
14218 }
Jeff Johnsone7245742012-09-05 17:12:55 -070014219 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014220
14221 if(csrLLRemoveEntry(&pMac->roam.peStatsReqList, pEntry, LL_ACCESS_LOCK))
14222 {
14223 // Only free the memory if we could stop the timer successfully
14224 if(!pTempStaEntry->timerStopFailed)
14225 {
14226 palFreeMemory(pMac->hHdd, pTempStaEntry);
14227 pTempStaEntry = NULL;
14228 }
14229 break;
14230 }
14231
14232 pEntry = csrLLNext( &pMac->roam.peStatsReqList, pEntry, LL_ACCESS_NOLOCK );
14233 }
14234 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014235 return;
14236}
14237
14238
Jeff Johnsone7245742012-09-05 17:12:55 -070014239void csrRoamSaveStatsFromTl(tpAniSirGlobal pMac, WLANTL_TRANSFER_STA_TYPE *pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070014240{
14241
Jeff Johnsone7245742012-09-05 17:12:55 -070014242 pMac->roam.classDStatsInfo.num_rx_bytes_crc_ok = pTlStats->rxBcntCRCok;
14243 pMac->roam.classDStatsInfo.rx_bc_byte_cnt = pTlStats->rxBCBcnt;
14244 pMac->roam.classDStatsInfo.rx_bc_frm_cnt = pTlStats->rxBCFcnt;
14245 pMac->roam.classDStatsInfo.rx_byte_cnt = pTlStats->rxBcnt;
14246 pMac->roam.classDStatsInfo.rx_mc_byte_cnt = pTlStats->rxMCBcnt;
14247 pMac->roam.classDStatsInfo.rx_mc_frm_cnt = pTlStats->rxMCFcnt;
14248 pMac->roam.classDStatsInfo.rx_rate = pTlStats->rxRate;
Jeff Johnson295189b2012-06-20 16:38:30 -070014249 //?? need per AC
Jeff Johnsone7245742012-09-05 17:12:55 -070014250 pMac->roam.classDStatsInfo.rx_uc_byte_cnt[0] = pTlStats->rxUCBcnt;
14251 pMac->roam.classDStatsInfo.rx_uc_frm_cnt = pTlStats->rxUCFcnt;
14252 pMac->roam.classDStatsInfo.tx_bc_byte_cnt = pTlStats->txBCBcnt;
14253 pMac->roam.classDStatsInfo.tx_bc_frm_cnt = pTlStats->txBCFcnt;
14254 pMac->roam.classDStatsInfo.tx_mc_byte_cnt = pTlStats->txMCBcnt;
14255 pMac->roam.classDStatsInfo.tx_mc_frm_cnt = pTlStats->txMCFcnt;
Jeff Johnson295189b2012-06-20 16:38:30 -070014256 //?? need per AC
Jeff Johnsone7245742012-09-05 17:12:55 -070014257 pMac->roam.classDStatsInfo.tx_uc_byte_cnt[0] = pTlStats->txUCBcnt;
14258 pMac->roam.classDStatsInfo.tx_uc_frm_cnt = pTlStats->txUCFcnt;
Jeff Johnson295189b2012-06-20 16:38:30 -070014259
14260}
14261
Jeff Johnson295189b2012-06-20 16:38:30 -070014262void csrRoamReportStatistics(tpAniSirGlobal pMac, tANI_U32 statsMask,
14263 tCsrStatsCallback callback, tANI_U8 staId, void *pContext)
14264{
14265 tANI_U8 stats[500];
14266 tANI_U8 *pStats = NULL;
14267 tANI_U32 tempMask = 0;
14268 tANI_U8 counter = 0;
14269 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070014270 if(!callback)
14271 {
14272 smsLog(pMac, LOGE, FL("csrRoamReportStatistics:cannot report callback NULL\n"));
14273 return;
14274 }
14275 if(!statsMask)
14276 {
14277 smsLog(pMac, LOGE, FL("csrRoamReportStatistics:cannot report statsMask is 0\n"));
14278 return;
14279 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014280 pStats = stats;
Jeff Johnson295189b2012-06-20 16:38:30 -070014281 tempMask = statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -070014282 while(tempMask)
14283 {
14284 if(tempMask & 1)
14285 {
14286 //new stats info from PE, fill up the stats strucutres in PMAC
14287 switch(counter)
14288 {
14289 case eCsrSummaryStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014290 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:summary stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014291 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.summaryStatsInfo,
14292 sizeof(tCsrSummaryStatsInfo));
14293 if(!HAL_STATUS_SUCCESS(status))
14294 {
14295 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy summary stats\n"));
14296 }
14297 pStats += sizeof(tCsrSummaryStatsInfo);
14298 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014299 case eCsrGlobalClassAStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014300 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassA stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014301 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classAStatsInfo,
14302 sizeof(tCsrGlobalClassAStatsInfo));
14303 if(!HAL_STATUS_SUCCESS(status))
14304 {
14305 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassA stats\n"));
14306 }
14307 pStats += sizeof(tCsrGlobalClassAStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014308 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014309 case eCsrGlobalClassBStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014310 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassB stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014311 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classBStatsInfo,
14312 sizeof(tCsrGlobalClassBStatsInfo));
14313 if(!HAL_STATUS_SUCCESS(status))
14314 {
14315 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassB stats\n"));
14316 }
14317 pStats += sizeof(tCsrGlobalClassBStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014318 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014319 case eCsrGlobalClassCStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014320 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassC stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014321 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classCStatsInfo,
14322 sizeof(tCsrGlobalClassCStatsInfo));
14323 if(!HAL_STATUS_SUCCESS(status))
14324 {
14325 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassC stats\n"));
14326 }
14327 pStats += sizeof(tCsrGlobalClassCStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014328 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014329 case eCsrGlobalClassDStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014330 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassD stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014331 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classDStatsInfo,
14332 sizeof(tCsrGlobalClassDStatsInfo));
14333 if(!HAL_STATUS_SUCCESS(status))
14334 {
14335 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassD stats\n"));
14336 }
14337 pStats += sizeof(tCsrGlobalClassDStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014338 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014339 case eCsrPerStaStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014340 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:PerSta stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014341 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.perStaStatsInfo[staId],
14342 sizeof(tCsrPerStaStatsInfo));
14343 if(!HAL_STATUS_SUCCESS(status))
14344 {
14345 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy PerSta stats\n"));
14346 }
14347 pStats += sizeof(tCsrPerStaStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014348 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014349 default:
14350 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:unknown stats type\n"));
14351 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014352 }
14353 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014354 tempMask >>=1;
14355 counter++;
14356 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014357 callback(stats, pContext );
Jeff Johnson295189b2012-06-20 16:38:30 -070014358}
14359
Jeff Johnson295189b2012-06-20 16:38:30 -070014360eHalStatus csrRoamDeregStatisticsReq(tpAniSirGlobal pMac)
14361{
14362 tListElem *pEntry = NULL;
14363 tListElem *pPrevEntry = NULL;
14364 tCsrStatsClientReqInfo *pTempStaEntry = NULL;
14365 eHalStatus status = eHAL_STATUS_SUCCESS;
14366 VOS_STATUS vosStatus;
14367 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070014368 if(!pEntry)
14369 {
14370 //list empty
14371 smsLog(pMac, LOGW, "csrRoamDeregStatisticsReq: List empty, no request from "
14372 "upper layer client(s)\n");
14373 return status;
14374 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014375 while( pEntry )
14376 {
14377 if(pPrevEntry)
14378 {
14379 pTempStaEntry = GET_BASE_ADDR( pPrevEntry, tCsrStatsClientReqInfo, link );
14380 //send up the stats report
14381 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
14382 pTempStaEntry->staId, pTempStaEntry->pContext);
14383 csrRoamRemoveStatListEntry(pMac, pPrevEntry);
14384 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014385 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070014386 if (pTempStaEntry->pPeStaEntry) //pPeStaEntry can be NULL
14387 {
Jeff Johnsone7245742012-09-05 17:12:55 -070014388 pTempStaEntry->pPeStaEntry->numClient--;
14389 //check if we need to delete the entry from peStatsReqList too
14390 if(!pTempStaEntry->pPeStaEntry->numClient)
14391 {
14392 csrRoamRemoveEntryFromPeStatsReqList(pMac, pTempStaEntry->pPeStaEntry);
14393 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014394 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014395 //check if we need to stop the tl stats timer too
14396 pMac->roam.tlStatsReqInfo.numClient--;
14397 if(!pMac->roam.tlStatsReqInfo.numClient)
14398 {
14399 if(pMac->roam.tlStatsReqInfo.timerRunning)
14400 {
14401 status = palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
14402 if(!HAL_STATUS_SUCCESS(status))
14403 {
14404 smsLog(pMac, LOGE, FL("csrRoamDeregStatisticsReq:cannot stop TlStatsTimer timer\n"));
14405 //we will continue
14406 }
14407 }
14408 pMac->roam.tlStatsReqInfo.periodicity = 0;
14409 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
14410 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014411 if (pTempStaEntry->periodicity)
14412 {
14413 //While creating StaEntry in csrGetStatistics,
14414 //Initializing and starting timer only when periodicity is set.
14415 //So Stop and Destroy timer only when periodicity is set.
14416
Jeff Johnsone7245742012-09-05 17:12:55 -070014417 vos_timer_stop( &pTempStaEntry->timer );
14418 // Destroy the vos timer...
14419 vosStatus = vos_timer_destroy( &pTempStaEntry->timer );
14420 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14421 {
14422 smsLog(pMac, LOGE, FL("csrRoamDeregStatisticsReq:failed to destroy Client req timer\n"));
14423 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014424 }
Jeff Johnsone7245742012-09-05 17:12:55 -070014425
Jeff Johnson295189b2012-06-20 16:38:30 -070014426
14427 pPrevEntry = pEntry;
14428 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
14429 }
14430 //the last one
14431 if(pPrevEntry)
14432 {
14433 pTempStaEntry = GET_BASE_ADDR( pPrevEntry, tCsrStatsClientReqInfo, link );
14434 //send up the stats report
14435 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
14436 pTempStaEntry->staId, pTempStaEntry->pContext);
14437 csrRoamRemoveStatListEntry(pMac, pPrevEntry);
14438 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014439 return status;
14440
14441}
14442
Jeff Johnson295189b2012-06-20 16:38:30 -070014443eHalStatus csrIsFullPowerNeeded( tpAniSirGlobal pMac, tSmeCmd *pCommand,
14444 tRequestFullPowerReason *pReason,
14445 tANI_BOOLEAN *pfNeedPower )
14446{
14447 tANI_BOOLEAN fNeedFullPower = eANI_BOOLEAN_FALSE;
14448 tRequestFullPowerReason reason = eSME_REASON_OTHER;
14449 tPmcState pmcState;
14450 eHalStatus status = eHAL_STATUS_SUCCESS;
14451 // TODO : Session info unavailable
14452 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070014453 if( pfNeedPower )
14454 {
14455 *pfNeedPower = eANI_BOOLEAN_FALSE;
14456 }
14457 //We only handle CSR commands
14458 if( !(eSmeCsrCommandMask & pCommand->command) )
14459 {
14460 return eHAL_STATUS_SUCCESS;
14461 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014462 //Check PMC state first
14463 pmcState = pmcGetPmcState( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -070014464 switch( pmcState )
14465 {
14466 case REQUEST_IMPS:
14467 case IMPS:
14468 if( eSmeCommandScan == pCommand->command )
14469 {
14470 switch( pCommand->u.scanCmd.reason )
14471 {
14472 case eCsrScanGetResult:
14473 case eCsrScanBGScanAbort:
14474 case eCsrScanBGScanEnable:
14475 case eCsrScanGetScanChnInfo:
14476 //Internal process, no need for full power
14477 fNeedFullPower = eANI_BOOLEAN_FALSE;
14478 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014479 default:
14480 //Other scans are real scan, ask for power
14481 fNeedFullPower = eANI_BOOLEAN_TRUE;
14482 break;
14483 } //switch
14484 }
14485 else
14486 {
14487 //ask for power for roam and status change
14488 fNeedFullPower = eANI_BOOLEAN_TRUE;
14489 }
14490 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014491 case REQUEST_BMPS:
14492 case BMPS:
14493 case REQUEST_START_UAPSD:
14494 case UAPSD:
14495 //We treat WOWL same as BMPS
14496 case REQUEST_ENTER_WOWL:
14497 case WOWL:
14498 if( eSmeCommandRoam == pCommand->command )
14499 {
14500 tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
14501 tCsrScanResult *pScanResult;
14502 tListElem *pEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070014503 switch ( pCommand->u.roamCmd.roamReason )
14504 {
14505 case eCsrForcedDisassoc:
14506 case eCsrForcedDisassocMICFailure:
14507 reason = eSME_LINK_DISCONNECTED_BY_HDD;
14508 fNeedFullPower = eANI_BOOLEAN_TRUE;
14509 break;
14510 case eCsrSmeIssuedDisassocForHandoff:
14511 case eCsrForcedDeauth:
14512 case eCsrHddIssuedReassocToSameAP:
14513 case eCsrSmeIssuedReassocToSameAP:
14514 fNeedFullPower = eANI_BOOLEAN_TRUE;
14515 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014516 case eCsrCapsChange:
14517 fNeedFullPower = eANI_BOOLEAN_TRUE;
14518 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014519 default:
14520 //Check whether the profile is already connected. If so, no need for full power
14521 //Note: IBSS is ignored for now because we don't support powersave in IBSS
14522 if ( csrIsConnStateConnectedInfra(pMac, sessionId) && pBSSList )
14523 {
14524 //Only need to check the first one
14525 pEntry = csrLLPeekHead(&pBSSList->List, LL_ACCESS_LOCK);
14526 if( pEntry )
14527 {
14528 pScanResult = GET_BASE_ADDR(pEntry, tCsrScanResult, Link);
14529#if 0
14530 // TODO : Session Specific info pConnectBssDesc
14531 if( csrIsBssIdEqual( pMac, &pScanResult->Result.BssDescriptor, pMac->roam.pConnectBssDesc ) &&
14532 csrIsSsidEqual( pMac, pMac->roam.pConnectBssDesc,
14533 &pScanResult->Result.BssDescriptor, (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ) ) )
14534 {
14535 // Check to see if the Auth type has changed in the Profile. If so, we don't want to Reassociate
14536 // with Authenticating first. To force this, stop the current association (Disassociate) and
14537 // then re 'Join' the AP, wihch will force an Authentication (with the new Auth type) followed by
14538 // a new Association.
14539 if(csrIsSameProfile(pMac, &pMac->roam.connectedProfile, pProfile))
14540 {
14541 if(csrRoamIsSameProfileKeys(pMac, &pMac->roam.connectedProfile, pProfile))
14542 {
14543 //Done, eventually, the command reaches eCsrReassocToSelfNoCapChange;
14544 //No need for full power
14545 //Set the flag so the code later can avoid to do the above
14546 //check again.
14547 pCommand->u.roamCmd.fReassocToSelfNoCapChange = eANI_BOOLEAN_TRUE;
14548 break;
14549 }
14550 }
14551 }
14552#endif
14553 }
14554 }
14555 //If we are here, full power is needed
14556 fNeedFullPower = eANI_BOOLEAN_TRUE;
14557 break;
14558 }
14559 }
14560 else if( eSmeCommandWmStatusChange == pCommand->command )
14561 {
14562 //need full power for all
14563 fNeedFullPower = eANI_BOOLEAN_TRUE;
14564 reason = eSME_LINK_DISCONNECTED_BY_OTHER;
14565 }
14566 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014567 case REQUEST_STOP_UAPSD:
14568 case REQUEST_EXIT_WOWL:
14569 if( eSmeCommandRoam == pCommand->command )
14570 {
14571 fNeedFullPower = eANI_BOOLEAN_TRUE;
14572 switch ( pCommand->u.roamCmd.roamReason )
14573 {
14574 case eCsrForcedDisassoc:
14575 case eCsrForcedDisassocMICFailure:
14576 reason = eSME_LINK_DISCONNECTED_BY_HDD;
14577 break;
14578 default:
14579 break;
14580 }
14581 }
14582 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014583 case STOPPED:
14584 case REQUEST_STANDBY:
14585 case STANDBY:
14586 case LOW_POWER:
14587 //We are not supposed to do anything
14588 smsLog( pMac, LOGE, FL( " cannot process because PMC is in stopped/standby state %d\n" ), pmcState );
14589 status = eHAL_STATUS_FAILURE;
14590 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014591 case FULL_POWER:
14592 case REQUEST_FULL_POWER:
14593 default:
14594 //No need to ask for full power. This has to be FULL_POWER state
14595 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014596 } //switch
Jeff Johnson295189b2012-06-20 16:38:30 -070014597 if( pReason )
14598 {
14599 *pReason = reason;
14600 }
14601 if( pfNeedPower )
14602 {
14603 *pfNeedPower = fNeedFullPower;
14604 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014605 return ( status );
14606}
14607
Jeff Johnson295189b2012-06-20 16:38:30 -070014608static eHalStatus csrRequestFullPower( tpAniSirGlobal pMac, tSmeCmd *pCommand )
14609{
14610 eHalStatus status = eHAL_STATUS_SUCCESS;
14611 tANI_BOOLEAN fNeedFullPower = eANI_BOOLEAN_FALSE;
14612 tRequestFullPowerReason reason = eSME_REASON_OTHER;
Jeff Johnson295189b2012-06-20 16:38:30 -070014613 status = csrIsFullPowerNeeded( pMac, pCommand, &reason, &fNeedFullPower );
Jeff Johnson295189b2012-06-20 16:38:30 -070014614 if( fNeedFullPower && HAL_STATUS_SUCCESS( status ) )
14615 {
14616 status = pmcRequestFullPower(pMac, csrFullPowerCallback, pMac, reason);
14617 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014618 return ( status );
14619}
14620
Jeff Johnson295189b2012-06-20 16:38:30 -070014621tSmeCmd *csrGetCommandBuffer( tpAniSirGlobal pMac )
14622{
14623 tSmeCmd *pCmd = smeGetCommandBuffer( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -070014624 if( pCmd )
14625 {
14626 pMac->roam.sPendingCommands++;
14627 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014628 return ( pCmd );
14629}
14630
Jeff Johnson295189b2012-06-20 16:38:30 -070014631void csrReleaseCommand(tpAniSirGlobal pMac, tSmeCmd *pCommand)
14632{
14633 if (pMac->roam.sPendingCommands > 0)
14634 {
14635 //All command allocated through csrGetCommandBuffer need to
14636 //decrement the pending count when releasing.
14637 pMac->roam.sPendingCommands--;
14638 smeReleaseCommand( pMac, pCommand );
14639 }
14640 else
14641 {
14642 smsLog(pMac, LOGE, FL( "no pending commands"));
14643 VOS_ASSERT(0);
14644 }
14645}
14646
Jeff Johnson295189b2012-06-20 16:38:30 -070014647//Return SUCCESS is the command is queued, failed
14648eHalStatus csrQueueSmeCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fHighPriority )
14649{
14650 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070014651 if( (eSmeCommandScan == pCommand->command) && pMac->scan.fDropScanCmd )
14652 {
14653 smsLog(pMac, LOGW, FL(" drop scan (scan reason %d) command"),
14654 pCommand->u.scanCmd.reason);
14655 return eHAL_STATUS_CSR_WRONG_STATE;
14656 }
14657
14658 //We can call request full power first before putting the command into pending Q
14659 //because we are holding SME lock at this point.
14660 status = csrRequestFullPower( pMac, pCommand );
14661 if( HAL_STATUS_SUCCESS( status ) )
14662 {
14663 tANI_BOOLEAN fNoCmdPending;
Jeff Johnson295189b2012-06-20 16:38:30 -070014664 //make sure roamCmdPendingList is not empty first
14665 fNoCmdPending = csrLLIsListEmpty( &pMac->roam.roamCmdPendingList, eANI_BOOLEAN_FALSE );
14666 if( fNoCmdPending )
14667 {
14668 smePushCommand( pMac, pCommand, fHighPriority );
14669 }
14670 else
14671 {
14672 //Other commands are waiting for PMC callback, queue the new command to the pending Q
14673 //no list lock is needed since SME lock is held
14674 if( !fHighPriority )
14675 {
14676 csrLLInsertTail( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14677 }
14678 else {
14679 csrLLInsertHead( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14680 }
14681 }
14682 }
14683 else if( eHAL_STATUS_PMC_PENDING == status )
14684 {
14685 //no list lock is needed since SME lock is held
14686 if( !fHighPriority )
14687 {
14688 csrLLInsertTail( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14689 }
14690 else {
14691 csrLLInsertHead( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14692 }
14693 //Let caller know the command is queue
14694 status = eHAL_STATUS_SUCCESS;
14695 }
14696 else
14697 {
14698 //Not to decrease pMac->roam.sPendingCommands here. Caller will decrease it when it
14699 //release the command.
14700 smsLog( pMac, LOGE, FL( " cannot queue command %d\n" ), pCommand->command );
14701 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014702 return ( status );
Jeff Johnson295189b2012-06-20 16:38:30 -070014703}
Jeff Johnson295189b2012-06-20 16:38:30 -070014704#ifdef WLAN_SOFTAP_FEATURE
14705eHalStatus csrRoamUpdateAPWPSIE( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirAPWPSIEs* pAPWPSIES )
14706{
14707 eHalStatus status = eHAL_STATUS_SUCCESS;
14708 tSirUpdateAPWPSIEsReq *pMsg;
14709 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
14710
14711 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14712 if (NULL == pSession)
14713 {
14714 smsLog( pMac, LOGE, FL( " Session does not exist for session id %d" ), sessionId);
14715 return eHAL_STATUS_FAILURE;
14716 }
14717
Jeff Johnson295189b2012-06-20 16:38:30 -070014718 do
14719 {
14720 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirUpdateAPWPSIEsReq) );
14721 if (!HAL_STATUS_SUCCESS(status)) break;
14722 palZeroMemory( pMac->hHdd, pMsg, sizeof(tSirUpdateAPWPSIEsReq) );
14723 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_UPDATE_APWPSIE_REQ);
14724
14725 pBuf = (tANI_U8 *)&pMsg->transactionId;
14726 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070014727 // transactionId
14728 *pBuf = 0;
14729 *( pBuf + 1 ) = 0;
14730 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070014731 // bssId
14732 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
14733 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070014734 //sessionId
14735 *pBuf++ = (tANI_U8)sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070014736 // APWPSIEs
14737 palCopyMemory( pMac->hHdd, (tSirAPWPSIEs *)pBuf, pAPWPSIES, sizeof(tSirAPWPSIEs));
14738 pBuf += sizeof(tSirAPWPSIEs);
Jeff Johnson295189b2012-06-20 16:38:30 -070014739 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32) + (pBuf - wTmpBuf))); //msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070014740 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070014741 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070014742 return ( status );
14743}
Jeff Johnson295189b2012-06-20 16:38:30 -070014744eHalStatus csrRoamUpdateWPARSNIEs( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirRSNie * pAPSirRSNie)
14745{
14746 eHalStatus status = eHAL_STATUS_SUCCESS;
14747 tSirUpdateAPWPARSNIEsReq *pMsg;
14748 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070014749 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14750 if (NULL == pSession)
14751 {
14752 smsLog( pMac, LOGE, FL( " Session does not exist for session id %d" ), sessionId);
14753 return eHAL_STATUS_FAILURE;
14754 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014755 do
14756 {
14757 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirUpdateAPWPARSNIEsReq) );
14758 if (!HAL_STATUS_SUCCESS(status)) break;
14759 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirUpdateAPWPARSNIEsReq ) );
14760 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SET_APWPARSNIEs_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070014761 pBuf = (tANI_U8 *)&pMsg->transactionId;
14762 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070014763 // transactionId
14764 *pBuf = 0;
14765 *( pBuf + 1 ) = 0;
14766 pBuf += sizeof(tANI_U16);
14767
14768 // bssId
14769 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
14770 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070014771 // sessionId
14772 *pBuf++ = (tANI_U8)sessionId;
14773
14774 // APWPARSNIEs
14775 palCopyMemory( pMac->hHdd, (tSirRSNie *)pBuf, pAPSirRSNie, sizeof(tSirRSNie));
14776 pBuf += sizeof(tSirRSNie);
Jeff Johnson295189b2012-06-20 16:38:30 -070014777 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf))); //msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070014778 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070014779 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070014780 return ( status );
14781}
Jeff Johnson295189b2012-06-20 16:38:30 -070014782#endif //#ifdef WLAN_SOFTAP_FEATURE
14783
14784#ifdef WLAN_FEATURE_VOWIFI_11R
14785//eHalStatus csrRoamIssueFTPreauthReq(tHalHandle hHal, tANI_U32 sessionId, tCsrBssid preAuthBssid, tANI_U8 channelId)
14786eHalStatus csrRoamIssueFTPreauthReq(tHalHandle hHal, tANI_U32 sessionId, tpSirBssDescription pBssDescription)
14787{
14788 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
14789 tpSirFTPreAuthReq pftPreAuthReq;
14790 tANI_U16 auth_req_len = 0;
14791 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070014792 auth_req_len = sizeof(tSirFTPreAuthReq);
14793 pftPreAuthReq = (tpSirFTPreAuthReq)vos_mem_malloc(auth_req_len);
14794 if (pftPreAuthReq == NULL)
14795 {
14796 smsLog(pMac, LOGE, FL("Memory allocation for FT Preauth request failed"));
14797 return eHAL_STATUS_RESOURCES;
14798 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014799 // Save the SME Session ID here. We need it while processing the preauth response
14800 pMac->ft.ftSmeContext.smeSessionId = sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070014801 vos_mem_zero(pftPreAuthReq, auth_req_len);
14802
14803 pftPreAuthReq->pbssDescription = (tpSirBssDescription)vos_mem_malloc(
14804 sizeof(pBssDescription->length) + pBssDescription->length);
14805
14806 pftPreAuthReq->messageType = pal_cpu_to_be16(eWNI_SME_FT_PRE_AUTH_REQ);
14807
14808 pftPreAuthReq->preAuthchannelNum = pBssDescription->channelId;
14809
Jeff Johnson295189b2012-06-20 16:38:30 -070014810 palCopyMemory(pMac->hHdd, (void *)&pftPreAuthReq->currbssId, (void *)pSession->connectedProfile.bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070014811 palCopyMemory(pMac->hHdd, (void *)&pftPreAuthReq->preAuthbssId, (void *)pBssDescription->bssId, sizeof(tSirMacAddr));
14812
Jeff Johnson295189b2012-06-20 16:38:30 -070014813#ifdef WLAN_FEATURE_VOWIFI_11R
14814 if (csrRoamIs11rAssoc(pMac))
14815 {
14816 pftPreAuthReq->ft_ies_length = (tANI_U16)pMac->ft.ftSmeContext.auth_ft_ies_length;
14817 palCopyMemory(pMac->hHdd, pftPreAuthReq->ft_ies, pMac->ft.ftSmeContext.auth_ft_ies,
14818 pMac->ft.ftSmeContext.auth_ft_ies_length);
14819 }
14820 else
14821#endif
14822 {
14823 pftPreAuthReq->ft_ies_length = 0;
14824 }
Madan Mohan Koyyalamudi613b0a42012-10-31 15:55:53 -070014825 vos_mem_copy(pftPreAuthReq->pbssDescription, pBssDescription,
14826 sizeof(pBssDescription->length) + pBssDescription->length);
14827 pftPreAuthReq->length = pal_cpu_to_be16(auth_req_len);
Jeff Johnson295189b2012-06-20 16:38:30 -070014828 return palSendMBMessage(pMac->hHdd, pftPreAuthReq);
14829}
Jeff Johnson295189b2012-06-20 16:38:30 -070014830/*--------------------------------------------------------------------------
14831 * This will receive and process the FT Pre Auth Rsp from the current
14832 * associated ap.
14833 *
14834 * This will invoke the hdd call back. This is so that hdd can now
14835 * send the FTIEs from the Auth Rsp (Auth Seq 2) to the supplicant.
14836 ------------------------------------------------------------------------*/
14837void csrRoamFTPreAuthRspProcessor( tHalHandle hHal, tpSirFTPreAuthRsp pFTPreAuthRsp )
14838{
14839 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
14840 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson04dd8a82012-06-29 20:41:40 -070014841#ifdef FEATURE_WLAN_LFR
14842 tCsrRoamInfo roamInfo;
14843#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014844
14845#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
14846 smsLog( pMac, LOGE, FL("Preauth response status code %d"), pFTPreAuthRsp->status);
14847#endif
Madan Mohan Koyyalamudi7a579cc2012-10-21 11:25:39 -070014848#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
14849 status = csrNeighborRoamPreauthRspHandler(pMac, (VOS_STATUS)pFTPreAuthRsp->status);
14850 if (status != eHAL_STATUS_SUCCESS) {
14851 /*
14852 * Bail out if pre-auth was not even processed.
14853 */
14854 smsLog(pMac, LOGW, FL("Preauth was not processed: %d"), status);
14855 return;
14856 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014857#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014858 /* The below function calls/timers should be invoked only if the pre-auth is successful */
14859 if (VOS_STATUS_SUCCESS != (VOS_STATUS)pFTPreAuthRsp->status)
14860 return;
Jeff Johnson295189b2012-06-20 16:38:30 -070014861 // Implies a success
14862 pMac->ft.ftSmeContext.FTState = eFT_AUTH_COMPLETE;
Jeff Johnson295189b2012-06-20 16:38:30 -070014863 // Indicate SME QoS module the completion of Preauth success. This will trigger the creation of RIC IEs
14864 pMac->ft.ftSmeContext.psavedFTPreAuthRsp = pFTPreAuthRsp;
14865 sme_QosCsrEventInd(pMac, pMac->ft.ftSmeContext.smeSessionId, SME_QOS_CSR_PREAUTH_SUCCESS_IND, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070014866 /* Start the pre-auth reassoc interval timer with a period of 400ms. When this expires,
14867 * actual transition from the current to handoff AP is triggered */
14868 status = palTimerStart(pMac->hHdd, pMac->ft.ftSmeContext.preAuthReassocIntvlTimer,
14869 60 * PAL_TIMER_TO_MS_UNIT,
14870 eANI_BOOLEAN_FALSE);
14871 if (eHAL_STATUS_SUCCESS != status)
14872 {
14873 smsLog(pMac, LOGE, FL("Preauth reassoc interval timer start failed to start with status %d\n"), status);
14874 return;
14875 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014876 // Save the received response
14877 palCopyMemory(pMac->hHdd, (void *)&pMac->ft.ftSmeContext.preAuthbssId, (void *)pFTPreAuthRsp->preAuthbssId, sizeof(tCsrBssid));
14878 if (csrRoamIs11rAssoc(pMac))
14879 csrRoamCallCallback(pMac, pFTPreAuthRsp->smeSessionId, NULL, 0,
14880 eCSR_ROAM_FT_RESPONSE, eCSR_ROAM_RESULT_NONE);
14881
14882 // Currently we dont do anything special for CCX connection.
Jeff Johnson04dd8a82012-06-29 20:41:40 -070014883#ifdef FEATURE_WLAN_LFR
14884 // If Legacy Fast Roaming is enabled, signal the supplicant
14885 // So he can send us a PMK-ID for this candidate AP.
14886 if (csrRoamIsFastRoamEnabled(pMac))
14887 {
14888 // Save the bssid from the received response
14889 palCopyMemory(pMac->hHdd, (void *)&roamInfo.bssid, (void *)pFTPreAuthRsp->preAuthbssId, sizeof(tCsrBssid));
14890 csrRoamCallCallback(pMac, pFTPreAuthRsp->smeSessionId, &roamInfo, 0, eCSR_ROAM_PMK_NOTIFY, 0);
14891 }
14892
14893#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014894
14895 // Done with it, init it.
14896 pMac->ft.ftSmeContext.psavedFTPreAuthRsp = NULL;
14897}
14898#endif
14899#ifdef FEATURE_WLAN_BTAMP_UT_RF
14900void csrRoamJoinRetryTimerHandler(void *pv)
14901{
14902 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
14903 tpAniSirGlobal pMac = pInfo->pMac;
14904 tANI_U32 sessionId = pInfo->sessionId;
14905 tCsrRoamSession *pSession;
14906
14907 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
14908 {
14909 smsLog( pMac, LOGE, FL( " retrying the last roam profile on session %d\n" ), sessionId );
14910 pSession = CSR_GET_SESSION( pMac, sessionId );
14911 if(pSession->pCurRoamProfile && csrIsConnStateDisconnected(pMac, sessionId))
14912 {
14913 if( !HAL_STATUS_SUCCESS(csrRoamJoinLastProfile(pMac, sessionId)) )
14914 {
14915 smsLog( pMac, LOGE, FL( " fail to retry the last roam profile\n" ) );
14916 }
14917 }
14918 }
14919}
Jeff Johnson295189b2012-06-20 16:38:30 -070014920eHalStatus csrRoamStartJoinRetryTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
14921{
14922 eHalStatus status = eHAL_STATUS_FAILURE;
14923 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14924
14925 if(pSession->pCurRoamProfile && pSession->maxRetryCount)
14926 {
14927 smsLog(pMac, LOGE, FL(" call sessionId %d retry count %d left\n "), sessionId, pSession->maxRetryCount);
14928 pSession->maxRetryCount--;
14929 pSession->joinRetryTimerInfo.pMac = pMac;
14930 pSession->joinRetryTimerInfo.sessionId = (tANI_U8)sessionId;
14931 status = palTimerStart(pMac->hHdd, pSession->hTimerJoinRetry, interval, eANI_BOOLEAN_FALSE);
14932 if(!HAL_STATUS_SUCCESS(status))
14933 {
14934 smsLog(pMac, LOGE, FL(" fail to start timer status %s \n "), status);
14935 }
14936 }
14937 else
14938 {
14939 smsLog(pMac, LOGE, FL(" not to start timer due to no profile or reach mac ret (%d)\n "),
14940 pSession->maxRetryCount);
14941 }
14942
14943 return (status);
14944}
Jeff Johnson295189b2012-06-20 16:38:30 -070014945eHalStatus csrRoamStopJoinRetryTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
14946{
14947 smsLog(pMac, LOGE, " csrRoamStopJoinRetryTimer \n ");
14948 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
14949 {
14950 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerJoinRetry));
14951 }
14952
14953 return eHAL_STATUS_SUCCESS;
14954}
14955#endif
14956
14957
14958/*
14959 pBuf points to the beginning of the message
14960 LIM packs disassoc rsp as below,
14961 messageType - 2 bytes
14962 messageLength - 2 bytes
14963 sessionId - 1 byte
14964 transactionId - 2 bytes (tANI_U16)
14965 reasonCode - 4 bytes (sizeof(tSirResultCodes))
14966 peerMacAddr - 6 bytes
14967 The rest is conditionally defined of (WNI_POLARIS_FW_PRODUCT == AP) and not used
14968*/
14969static void csrSerDesUnpackDiassocRsp(tANI_U8 *pBuf, tSirSmeDisassocRsp *pRsp)
14970{
14971 if(pBuf && pRsp)
14972 {
14973 pBuf += 4; //skip type and length
14974 pRsp->sessionId = *pBuf++;
14975 pal_get_U16( pBuf, (tANI_U16 *)&pRsp->transactionId );
14976 pBuf += 2;
14977 pal_get_U32( pBuf, (tANI_U32 *)&pRsp->statusCode );
14978 pBuf += 4;
14979 vos_mem_copy(pRsp->peerMacAddr, pBuf, 6);
14980 }
14981}
14982
Jeff Johnsond13512a2012-07-17 11:42:19 -070014983eHalStatus csrGetDefaultCountryCodeFrmNv(tpAniSirGlobal pMac, tANI_U8 *pCountry)
14984{
14985 static uNvTables nvTables;
14986 eHalStatus status = eHAL_STATUS_SUCCESS;
14987 VOS_STATUS vosStatus = vos_nv_readDefaultCountryTable( &nvTables );
14988
14989 /* read the country code from NV and use it */
14990 if ( VOS_IS_STATUS_SUCCESS(vosStatus) )
14991 {
14992 palCopyMemory( pMac->hHdd, pCountry,
14993 nvTables.defaultCountryTable.countryCode,
14994 WNI_CFG_COUNTRY_CODE_LEN );
14995 return status;
14996 }
14997 else
14998 {
14999 palCopyMemory( pMac->hHdd, pCountry,
15000 "XXX",
15001 WNI_CFG_COUNTRY_CODE_LEN );
15002 status = eHAL_STATUS_FAILURE;
15003 return status;
15004 }
15005}
15006
15007eHalStatus csrGetCurrentCountryCode(tpAniSirGlobal pMac, tANI_U8 *pCountry)
15008{
15009 palCopyMemory( pMac->hHdd, pCountry,
15010 pMac->scan.countryCode11d,
15011 WNI_CFG_COUNTRY_CODE_LEN );
15012 return eHAL_STATUS_SUCCESS;
15013}