blob: 7530c42b9c2a8f0323730cdc49564fd164ae7771 [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 }
2359
2360 //auth type
2361 switch( pProfile->negotiatedAuthType )
2362 {
2363 default:
2364 case eCSR_AUTH_TYPE_WPA:
2365 case eCSR_AUTH_TYPE_WPA_PSK:
2366 case eCSR_AUTH_TYPE_WPA_NONE:
2367 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
2368 pBssConfig->authType = eSIR_OPEN_SYSTEM;
2369 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002370 case eCSR_AUTH_TYPE_SHARED_KEY:
2371 pBssConfig->authType = eSIR_SHARED_KEY;
2372 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002373 case eCSR_AUTH_TYPE_AUTOSWITCH:
2374 pBssConfig->authType = eSIR_AUTO_SWITCH;
2375 break;
2376 }
2377 //short slot time
2378 if( eCSR_CFG_DOT11_MODE_11B != cfgDot11Mode )
2379 {
2380 pBssConfig->uShortSlotTime = pMac->roam.configParam.shortSlotTime;
2381 }
2382 else
2383 {
2384 pBssConfig->uShortSlotTime = 0;
2385 }
2386 if(pBssConfig->BssCap.ibss)
2387 {
2388 //We don't support 11h on IBSS
2389 pBssConfig->f11hSupport = eANI_BOOLEAN_FALSE;
2390 }
2391 else
2392 {
2393 pBssConfig->f11hSupport = pMac->roam.configParam.Is11hSupportEnabled;
2394 }
2395 //power constraint
2396 pBssConfig->uPowerLimit = csrGet11hPowerConstraint(pMac, &pIes->PowerConstraints);
2397 //heartbeat
2398 if ( CSR_IS_11A_BSS( pBssDesc ) )
2399 {
2400 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh50;
2401 }
2402 else
2403 {
2404 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh24;
2405 }
2406 //Join timeout
2407 // if we find a BeaconInterval in the BssDescription, then set the Join Timeout to
Jeff Johnsone7245742012-09-05 17:12:55 -07002408 // be 10 x the BeaconInterval.
Jeff Johnson295189b2012-06-20 16:38:30 -07002409 if ( pBssDesc->beaconInterval )
2410 {
2411 //Make sure it is bigger than the minimal
Jeff Johnsone7245742012-09-05 17:12:55 -07002412 pBssConfig->uJoinTimeOut = CSR_ROAM_MAX(10 * pBssDesc->beaconInterval, CSR_JOIN_FAILURE_TIMEOUT_MIN);
Jeff Johnson295189b2012-06-20 16:38:30 -07002413 }
2414 else
2415 {
2416 pBssConfig->uJoinTimeOut = CSR_JOIN_FAILURE_TIMEOUT_DEFAULT;
2417 }
2418 //validate CB
2419 pBssConfig->cbMode = csrGetCBModeFromIes(pMac, pBssDesc->channelId, pIes);
2420 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002421 return (status);
2422}
2423
Jeff Johnson295189b2012-06-20 16:38:30 -07002424static eHalStatus csrRoamPrepareBssConfigFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
2425 tBssConfigParam *pBssConfig, tSirBssDescription *pBssDesc)
2426{
2427 eHalStatus status = eHAL_STATUS_SUCCESS;
2428 tANI_U8 operationChannel = 0;
2429 tANI_U8 qAPisEnabled = FALSE;
2430 //SSID
2431 pBssConfig->SSID.length = 0;
2432 if(pProfile->SSIDs.numOfSSIDs)
2433 {
2434 //only use the first one
2435 palCopyMemory(pMac->hHdd, &pBssConfig->SSID, &pProfile->SSIDs.SSIDList[0].SSID, sizeof(tSirMacSSid));
2436 }
2437 else
2438 {
2439 //SSID must present
2440 return eHAL_STATUS_FAILURE;
2441 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002442 //Settomg up the capabilities
2443 if( csrIsBssTypeIBSS(pProfile->BSSType) )
2444 {
2445 pBssConfig->BssCap.ibss = 1;
2446 }
2447 else
2448 {
2449 pBssConfig->BssCap.ess = 1;
2450 }
2451 if( eCSR_ENCRYPT_TYPE_NONE != pProfile->EncryptionType.encryptionType[0] )
2452 {
2453 pBssConfig->BssCap.privacy = 1;
2454 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002455 pBssConfig->eBand = pMac->roam.configParam.eBand;
2456 //phymode
2457 if(pProfile->ChannelInfo.ChannelList)
2458 {
2459 operationChannel = pProfile->ChannelInfo.ChannelList[0];
2460 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002461#ifdef WLAN_SOFTAP_FEATURE
2462 pBssConfig->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, operationChannel,
2463 &pBssConfig->eBand);
2464#else
Jeff Johnson295189b2012-06-20 16:38:30 -07002465 pBssConfig->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel,
2466 &pBssConfig->eBand);
2467#endif
2468 //QOS
2469 //Is this correct to always set to this //***
Jeff Johnson295189b2012-06-20 16:38:30 -07002470 if ( pBssConfig->BssCap.ess == 1 )
2471 {
2472#ifdef WLAN_SOFTAP_FEATURE
2473 /*For Softap case enable WMM*/
2474 if(CSR_IS_INFRA_AP(pProfile) && (eCsrRoamWmmNoQos != pMac->roam.configParam.WMMSupportMode )){
2475 qAPisEnabled = TRUE;
2476 }
2477 else
2478#endif
2479 if (csrRoamGetQosInfoFromBss(pMac, pBssDesc) == eHAL_STATUS_SUCCESS) {
2480 qAPisEnabled = TRUE;
2481 } else {
2482 qAPisEnabled = FALSE;
2483 }
2484 } else {
2485 qAPisEnabled = TRUE;
2486 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002487 if (( eCsrRoamWmmNoQos != pMac->roam.configParam.WMMSupportMode && qAPisEnabled) ||
2488 (( eCSR_CFG_DOT11_MODE_11N == pBssConfig->uCfgDot11Mode && qAPisEnabled) ||
2489 ( eCSR_CFG_DOT11_MODE_TAURUS == pBssConfig->uCfgDot11Mode ) ) //For 11n, need QoS
2490 )
2491 {
2492 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP;
2493 } else {
2494 pBssConfig->qosType = eCSR_MEDIUM_ACCESS_DCF;
2495 }
2496
2497 //auth type
2498 switch( pProfile->AuthType.authType[0] ) //Take the prefered Auth type.
2499 {
2500 default:
2501 case eCSR_AUTH_TYPE_WPA:
2502 case eCSR_AUTH_TYPE_WPA_PSK:
2503 case eCSR_AUTH_TYPE_WPA_NONE:
2504 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
2505 pBssConfig->authType = eSIR_OPEN_SYSTEM;
2506 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002507 case eCSR_AUTH_TYPE_SHARED_KEY:
2508 pBssConfig->authType = eSIR_SHARED_KEY;
2509 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002510 case eCSR_AUTH_TYPE_AUTOSWITCH:
2511 pBssConfig->authType = eSIR_AUTO_SWITCH;
2512 break;
2513 }
2514 //short slot time
2515 if( WNI_CFG_PHY_MODE_11B != pBssConfig->uCfgDot11Mode )
2516 {
2517 pBssConfig->uShortSlotTime = pMac->roam.configParam.shortSlotTime;
2518 }
2519 else
2520 {
2521 pBssConfig->uShortSlotTime = 0;
2522 }
2523 //power constraint. We don't support 11h on IBSS
2524 pBssConfig->f11hSupport = eANI_BOOLEAN_FALSE;
2525 pBssConfig->uPowerLimit = 0;
2526 //heartbeat
2527 if ( eCSR_BAND_5G == pBssConfig->eBand )
2528 {
2529 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh50;
2530 }
2531 else
2532 {
2533 pBssConfig->uHeartBeatThresh = pMac->roam.configParam.HeartbeatThresh24;
2534 }
2535 //Join timeout
2536 pBssConfig->uJoinTimeOut = CSR_JOIN_FAILURE_TIMEOUT_DEFAULT;
Jeff Johnsone7245742012-09-05 17:12:55 -07002537
Jeff Johnson295189b2012-06-20 16:38:30 -07002538 return (status);
2539}
Jeff Johnson295189b2012-06-20 16:38:30 -07002540static eHalStatus csrRoamGetQosInfoFromBss(tpAniSirGlobal pMac, tSirBssDescription *pBssDesc)
2541{
2542 eHalStatus status = eHAL_STATUS_FAILURE;
2543 tDot11fBeaconIEs *pIes = NULL;
2544
2545 do
2546 {
2547 if(!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIes)))
2548 {
2549 //err msg
2550 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
2551 "csrRoamGetQosInfoFromBss() failed\n");
Jeff Johnson295189b2012-06-20 16:38:30 -07002552 break;
2553 }
2554 //check if the AP is QAP & it supports APSD
2555 if( CSR_IS_QOS_BSS(pIes) )
2556 {
2557 return eHAL_STATUS_SUCCESS;
2558 }
2559 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07002560 return status;
2561}
2562
Jeff Johnson295189b2012-06-20 16:38:30 -07002563void csrSetCfgPrivacy( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, tANI_BOOLEAN fPrivacy )
2564{
Jeff Johnson295189b2012-06-20 16:38:30 -07002565 // !! Note: the only difference between this function and the csrSetCfgPrivacyFromProfile() is the
2566 // setting of the privacy CFG based on the advertised privacy setting from the AP for WPA associations.
2567 // See !!Note: below in this function...
2568 tANI_U32 PrivacyEnabled = 0;
2569 tANI_U32 RsnEnabled = 0;
2570 tANI_U32 WepDefaultKeyId = 0;
2571 tANI_U32 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_5; /* default 40 bits */
2572 tANI_U32 Key0Length = 0;
2573 tANI_U32 Key1Length = 0;
2574 tANI_U32 Key2Length = 0;
2575 tANI_U32 Key3Length = 0;
2576
2577 // Reserve for the biggest key
2578 tANI_U8 Key0[ WNI_CFG_WEP_DEFAULT_KEY_1_LEN ];
2579 tANI_U8 Key1[ WNI_CFG_WEP_DEFAULT_KEY_2_LEN ];
2580 tANI_U8 Key2[ WNI_CFG_WEP_DEFAULT_KEY_3_LEN ];
2581 tANI_U8 Key3[ WNI_CFG_WEP_DEFAULT_KEY_4_LEN ];
2582
2583 switch ( pProfile->negotiatedUCEncryptionType )
2584 {
2585 case eCSR_ENCRYPT_TYPE_NONE:
2586
2587 // for NO encryption, turn off Privacy and Rsn.
2588 PrivacyEnabled = 0;
2589 RsnEnabled = 0;
2590
2591 // WEP key length and Wep Default Key ID don't matter in this case....
2592
2593 // clear out the WEP keys that may be hanging around.
2594 Key0Length = 0;
2595 Key1Length = 0;
2596 Key2Length = 0;
2597 Key3Length = 0;
2598
2599 break;
2600
2601 case eCSR_ENCRYPT_TYPE_WEP40_STATICKEY:
2602
2603 // Privacy is ON. NO RSN for Wep40 static key.
2604 PrivacyEnabled = 1;
2605 RsnEnabled = 0;
2606
2607 // Set the Wep default key ID.
2608 WepDefaultKeyId = pProfile->Keys.defaultIndex;
Jeff Johnson295189b2012-06-20 16:38:30 -07002609 // Wep key size if 5 bytes (40 bits).
2610 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_5;
2611
2612 // set encryption keys in the CFG database or clear those that are not present in this profile.
2613 if ( pProfile->Keys.KeyLength[0] )
2614 {
2615 palCopyMemory( pMac->hHdd, Key0, pProfile->Keys.KeyMaterial[0], WNI_CFG_WEP_KEY_LENGTH_5 );
2616 Key0Length = WNI_CFG_WEP_KEY_LENGTH_5;
2617 }
2618 else
2619 {
2620 Key0Length = 0;
2621 }
2622
2623 if ( pProfile->Keys.KeyLength[1] )
2624 {
2625 palCopyMemory( pMac->hHdd, Key1, pProfile->Keys.KeyMaterial[1], WNI_CFG_WEP_KEY_LENGTH_5 );
2626 Key1Length = WNI_CFG_WEP_KEY_LENGTH_5;
2627 }
2628 else
2629 {
2630 Key1Length = 0;
2631 }
2632
2633 if ( pProfile->Keys.KeyLength[2] )
2634 {
2635 palCopyMemory( pMac->hHdd, Key2, pProfile->Keys.KeyMaterial[2], WNI_CFG_WEP_KEY_LENGTH_5 );
2636 Key2Length = WNI_CFG_WEP_KEY_LENGTH_5;
2637 }
2638 else
2639 {
2640 Key2Length = 0;
2641 }
2642
2643 if ( pProfile->Keys.KeyLength[3] )
2644 {
2645 palCopyMemory( pMac->hHdd, Key3, pProfile->Keys.KeyMaterial[3], WNI_CFG_WEP_KEY_LENGTH_5 );
2646 Key3Length = WNI_CFG_WEP_KEY_LENGTH_5;
2647 }
2648 else
2649 {
2650 Key3Length = 0;
2651 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002652 break;
2653
2654 case eCSR_ENCRYPT_TYPE_WEP104_STATICKEY:
2655
2656 // Privacy is ON. NO RSN for Wep40 static key.
2657 PrivacyEnabled = 1;
2658 RsnEnabled = 0;
2659
2660 // Set the Wep default key ID.
2661 WepDefaultKeyId = pProfile->Keys.defaultIndex;
2662
2663 // Wep key size if 13 bytes (104 bits).
2664 WepKeyLength = WNI_CFG_WEP_KEY_LENGTH_13;
2665
2666 // set encryption keys in the CFG database or clear those that are not present in this profile.
2667 if ( pProfile->Keys.KeyLength[0] )
2668 {
2669 palCopyMemory( pMac->hHdd, Key0, pProfile->Keys.KeyMaterial[ 0 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2670 Key0Length = WNI_CFG_WEP_KEY_LENGTH_13;
2671 }
2672 else
2673 {
2674 Key0Length = 0;
2675 }
2676
2677 if ( pProfile->Keys.KeyLength[1] )
2678 {
2679 palCopyMemory( pMac->hHdd, Key1, pProfile->Keys.KeyMaterial[ 1 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2680 Key1Length = WNI_CFG_WEP_KEY_LENGTH_13;
2681 }
2682 else
2683 {
2684 Key1Length = 0;
2685 }
2686
2687 if ( pProfile->Keys.KeyLength[2] )
2688 {
2689 palCopyMemory( pMac->hHdd, Key2, pProfile->Keys.KeyMaterial[ 2 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2690 Key2Length = WNI_CFG_WEP_KEY_LENGTH_13;
2691 }
2692 else
2693 {
2694 Key2Length = 0;
2695 }
2696
2697 if ( pProfile->Keys.KeyLength[3] )
2698 {
2699 palCopyMemory( pMac->hHdd, Key3, pProfile->Keys.KeyMaterial[ 3 ], WNI_CFG_WEP_KEY_LENGTH_13 );
2700 Key3Length = WNI_CFG_WEP_KEY_LENGTH_13;
2701 }
2702 else
2703 {
2704 Key3Length = 0;
2705 }
2706
2707 break;
2708
2709 case eCSR_ENCRYPT_TYPE_WEP40:
2710 case eCSR_ENCRYPT_TYPE_WEP104:
2711 case eCSR_ENCRYPT_TYPE_TKIP:
2712 case eCSR_ENCRYPT_TYPE_AES:
2713#ifdef FEATURE_WLAN_WAPI
2714 case eCSR_ENCRYPT_TYPE_WPI:
2715#endif /* FEATURE_WLAN_WAPI */
2716 // !! Note: this is the only difference between this function and the csrSetCfgPrivacyFromProfile()
2717 // (setting of the privacy CFG based on the advertised privacy setting from the AP for WPA/WAPI associations ).
2718 PrivacyEnabled = (0 != fPrivacy);
2719
2720 // turn on RSN enabled for WPA associations
2721 RsnEnabled = 1;
2722
2723 // WEP key length and Wep Default Key ID don't matter in this case....
2724
2725 // clear out the static WEP keys that may be hanging around.
2726 Key0Length = 0;
2727 Key1Length = 0;
2728 Key2Length = 0;
2729 Key3Length = 0;
2730
2731 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002732 default:
2733 PrivacyEnabled = 0;
2734 RsnEnabled = 0;
2735 break;
2736 }
2737
2738 ccmCfgSetInt(pMac, WNI_CFG_PRIVACY_ENABLED, PrivacyEnabled, NULL, eANI_BOOLEAN_FALSE);
2739 ccmCfgSetInt(pMac, WNI_CFG_RSN_ENABLED, RsnEnabled, NULL, eANI_BOOLEAN_FALSE);
2740 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_1, Key0, Key0Length, NULL, eANI_BOOLEAN_FALSE);
2741 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_2, Key1, Key1Length, NULL, eANI_BOOLEAN_FALSE);
2742 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_3, Key2, Key2Length, NULL, eANI_BOOLEAN_FALSE);
2743 ccmCfgSetStr(pMac, WNI_CFG_WEP_DEFAULT_KEY_4, Key3, Key3Length, NULL, eANI_BOOLEAN_FALSE);
2744 ccmCfgSetInt(pMac, WNI_CFG_WEP_KEY_LENGTH, WepKeyLength, NULL, eANI_BOOLEAN_FALSE);
2745 ccmCfgSetInt(pMac, WNI_CFG_WEP_DEFAULT_KEYID, WepDefaultKeyId, NULL, eANI_BOOLEAN_FALSE);
2746}
2747
Jeff Johnson295189b2012-06-20 16:38:30 -07002748static void csrSetCfgSsid( tpAniSirGlobal pMac, tSirMacSSid *pSSID )
2749{
2750 tANI_U32 len = 0;
2751 if(pSSID->length <= WNI_CFG_SSID_LEN)
2752 {
2753 len = pSSID->length;
2754 }
2755 ccmCfgSetStr(pMac, WNI_CFG_SSID, (tANI_U8 *)pSSID->ssId, len, NULL, eANI_BOOLEAN_FALSE);
2756}
2757
Jeff Johnson295189b2012-06-20 16:38:30 -07002758eHalStatus csrSetQosToCfg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrMediaAccessType qosType )
2759{
2760 eHalStatus status = eHAL_STATUS_SUCCESS;
2761 tANI_U32 QoSEnabled;
2762 tANI_U32 WmeEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07002763 // set the CFG enable/disable variables based on the qosType being configured...
2764 switch( qosType )
2765 {
Jeff Johnson295189b2012-06-20 16:38:30 -07002766 case eCSR_MEDIUM_ACCESS_WMM_eDCF_802dot1p:
2767 QoSEnabled = FALSE;
2768 WmeEnabled = TRUE;
2769 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002770 case eCSR_MEDIUM_ACCESS_WMM_eDCF_DSCP:
2771 QoSEnabled = FALSE;
2772 WmeEnabled = TRUE;
2773 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002774 case eCSR_MEDIUM_ACCESS_WMM_eDCF_NoClassify:
2775 QoSEnabled = FALSE;
2776 WmeEnabled = TRUE;
2777 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002778 case eCSR_MEDIUM_ACCESS_11e_eDCF:
2779 QoSEnabled = TRUE;
2780 WmeEnabled = FALSE;
2781 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002782 case eCSR_MEDIUM_ACCESS_11e_HCF:
2783 QoSEnabled = TRUE;
2784 WmeEnabled = FALSE;
2785 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002786 default:
2787 case eCSR_MEDIUM_ACCESS_DCF:
2788 QoSEnabled = FALSE;
2789 WmeEnabled = FALSE;
2790 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07002791 }
2792 //save the WMM setting for later use
2793 pMac->roam.roamSession[sessionId].fWMMConnection = (tANI_BOOLEAN)WmeEnabled;
Jeff Johnson295189b2012-06-20 16:38:30 -07002794 status = ccmCfgSetInt(pMac, WNI_CFG_QOS_ENABLED, QoSEnabled, NULL, eANI_BOOLEAN_FALSE);
2795 status = ccmCfgSetInt(pMac, WNI_CFG_WME_ENABLED, WmeEnabled, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07002796 return (status);
2797}
Jeff Johnson295189b2012-06-20 16:38:30 -07002798static eHalStatus csrGetRateSet( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, eCsrPhyMode phyMode, tSirBssDescription *pBssDesc,
2799 tDot11fBeaconIEs *pIes, tSirMacRateSet *pOpRateSet, tSirMacRateSet *pExRateSet)
2800{
2801 eHalStatus status = eHAL_STATUS_FAILURE;
2802 int i;
2803 eCsrCfgDot11Mode cfgDot11Mode;
2804 tANI_U8 *pDstRate;
Jeff Johnson295189b2012-06-20 16:38:30 -07002805 palZeroMemory(pMac->hHdd, pOpRateSet, sizeof(tSirMacRateSet));
2806 palZeroMemory(pMac->hHdd, pExRateSet, sizeof(tSirMacRateSet));
Jeff Johnson295189b2012-06-20 16:38:30 -07002807#if defined(VOSS_ENABLED)
2808 VOS_ASSERT( pIes != NULL );
2809#endif
2810
2811 if( NULL != pIes )
2812 {
2813 csrIsPhyModeMatch( pMac, phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07002814 // Originally, we thought that for 11a networks, the 11a rates are always
2815 // in the Operational Rate set & for 11b and 11g networks, the 11b rates
2816 // appear in the Operational Rate set. Consequently, in either case, we
2817 // would blindly put the rates we support into our Operational Rate set
2818 // (including the basic rates, which we have already verified are
2819 // supported earlier in the roaming decision).
Jeff Johnson295189b2012-06-20 16:38:30 -07002820 // However, it turns out that this is not always the case. Some AP's
2821 // (e.g. D-Link DI-784) ram 11g rates into the Operational Rate set,
2822 // too. Now, we're a little more careful:
2823 pDstRate = pOpRateSet->rate;
2824 if(pIes->SuppRates.present)
2825 {
2826 for ( i = 0; i < pIes->SuppRates.num_rates; i++ )
2827 {
2828 if ( csrRatesIsDot11RateSupported( pMac, pIes->SuppRates.rates[ i ] ) )
2829 {
2830 *pDstRate++ = pIes->SuppRates.rates[ i ];
Madan Mohan Koyyalamudi4e31b132012-11-02 13:13:52 -07002831 pOpRateSet->numRates++;
Jeff Johnson295189b2012-06-20 16:38:30 -07002832 }
2833 }
2834 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002835 if ( eCSR_CFG_DOT11_MODE_11G == cfgDot11Mode ||
2836 eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode ||
2837 eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode ||
2838 eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
2839 {
2840 // If there are Extended Rates in the beacon, we will reflect those
2841 // extended rates that we support in out Extended Operational Rate
2842 // set:
2843 pDstRate = pExRateSet->rate;
2844 if(pIes->ExtSuppRates.present)
2845 {
2846 for ( i = 0; i < pIes->ExtSuppRates.num_rates; i++ )
2847 {
2848 if ( csrRatesIsDot11RateSupported( pMac, pIes->ExtSuppRates.rates[ i ] ) )
2849 {
2850 *pDstRate++ = pIes->ExtSuppRates.rates[ i ];
2851 pExRateSet->numRates++;
2852 }
2853 }
2854 }
2855 }
2856 }//Parsing BSSDesc
2857 else
2858 {
2859 smsLog(pMac, LOGE, FL("failed to parse BssDesc\n"));
2860 }
2861 if (pOpRateSet->numRates > 0 || pExRateSet->numRates > 0) status = eHAL_STATUS_SUCCESS;
2862 return status;
2863}
2864
2865static void csrSetCfgRateSet( tpAniSirGlobal pMac, eCsrPhyMode phyMode, tCsrRoamProfile *pProfile,
2866 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
2867{
2868 int i;
2869 tANI_U8 *pDstRate;
2870 eCsrCfgDot11Mode cfgDot11Mode;
2871 tANI_U8 OperationalRates[ CSR_DOT11_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2872 tANI_U32 OperationalRatesLength = 0;
2873 tANI_U8 ExtendedOperationalRates[ CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
2874 tANI_U32 ExtendedOperationalRatesLength = 0;
2875 tANI_U8 ProprietaryOperationalRates[ 4 ]; // leave enough room for the max number of proprietary rates
2876 tANI_U32 ProprietaryOperationalRatesLength = 0;
2877 tANI_U32 PropRatesEnable = 0;
2878 tANI_U8 MCSRateIdxSet[ SIZE_OF_SUPPORTED_MCS_SET ];
2879 tANI_U32 MCSRateLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07002880#if defined(VOSS_ENABLED)
2881 VOS_ASSERT( pIes != NULL );
2882#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002883 if( NULL != pIes )
2884 {
2885 csrIsPhyModeMatch( pMac, phyMode, pBssDesc, pProfile, &cfgDot11Mode, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07002886 // Originally, we thought that for 11a networks, the 11a rates are always
2887 // in the Operational Rate set & for 11b and 11g networks, the 11b rates
2888 // appear in the Operational Rate set. Consequently, in either case, we
2889 // would blindly put the rates we support into our Operational Rate set
2890 // (including the basic rates, which we have already verified are
2891 // supported earlier in the roaming decision).
Jeff Johnson295189b2012-06-20 16:38:30 -07002892 // However, it turns out that this is not always the case. Some AP's
2893 // (e.g. D-Link DI-784) ram 11g rates into the Operational Rate set,
2894 // too. Now, we're a little more careful:
2895 pDstRate = OperationalRates;
2896 if(pIes->SuppRates.present)
2897 {
2898 for ( i = 0; i < pIes->SuppRates.num_rates; i++ )
2899 {
2900 if ( csrRatesIsDot11RateSupported( pMac, pIes->SuppRates.rates[ i ] ) &&
2901 ( OperationalRatesLength < CSR_DOT11_SUPPORTED_RATES_MAX ))
2902 {
2903 *pDstRate++ = pIes->SuppRates.rates[ i ];
2904 OperationalRatesLength++;
2905 }
2906 }
2907 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002908 if ( eCSR_CFG_DOT11_MODE_11G == cfgDot11Mode ||
2909 eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode ||
2910 eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode ||
2911 eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
2912 {
2913 // If there are Extended Rates in the beacon, we will reflect those
2914 // extended rates that we support in out Extended Operational Rate
2915 // set:
2916 pDstRate = ExtendedOperationalRates;
2917 if(pIes->ExtSuppRates.present)
2918 {
2919 for ( i = 0; i < pIes->ExtSuppRates.num_rates; i++ )
2920 {
2921 if ( csrRatesIsDot11RateSupported( pMac, pIes->ExtSuppRates.rates[ i ] ) &&
2922 ( ExtendedOperationalRatesLength < CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ))
2923 {
2924 *pDstRate++ = pIes->ExtSuppRates.rates[ i ];
2925 ExtendedOperationalRatesLength++;
2926 }
2927 }
2928 }
2929 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002930 // Enable proprietary MAC features if peer node is Airgo node and STA
2931 // user wants to use them
2932 if( pIes->Airgo.present && pMac->roam.configParam.ProprietaryRatesEnabled )
2933 {
2934 PropRatesEnable = 1;
2935 }
2936 else
2937 {
2938 PropRatesEnable = 0;
2939 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002940 // For ANI network companions, we need to populate the proprietary rate
2941 // set with any proprietary rates we found in the beacon, only if user
2942 // allows them...
2943 if ( PropRatesEnable && pIes->Airgo.PropSuppRates.present &&
2944 ( pIes->Airgo.PropSuppRates.num_rates > 0 ))
2945 {
2946 ProprietaryOperationalRatesLength = pIes->Airgo.PropSuppRates.num_rates;
2947 if ( ProprietaryOperationalRatesLength > sizeof(ProprietaryOperationalRates) )
2948 {
2949 ProprietaryOperationalRatesLength = sizeof (ProprietaryOperationalRates);
2950 }
2951 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates, pIes->Airgo.PropSuppRates.rates, ProprietaryOperationalRatesLength );
2952 }
2953 else {
2954 // No proprietary modes...
2955 ProprietaryOperationalRatesLength = 0;
2956 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002957 /* Get MCS Rate */
2958 pDstRate = MCSRateIdxSet;
2959 if ( pIes->HTCaps.present )
2960 {
2961 for ( i = 0; i < VALID_MAX_MCS_INDEX; i++ )
2962 {
2963 if ( (unsigned int)pIes->HTCaps.supportedMCSSet[0] & (1 << i) )
2964 {
2965 MCSRateLength++;
2966 *pDstRate++ = i;
2967 }
2968 }
2969 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002970 // Set the operational rate set CFG variables...
2971 ccmCfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET, OperationalRates,
2972 OperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2973 ccmCfgSetStr(pMac, WNI_CFG_EXTENDED_OPERATIONAL_RATE_SET, ExtendedOperationalRates,
2974 ExtendedOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2975 ccmCfgSetStr(pMac, WNI_CFG_PROPRIETARY_OPERATIONAL_RATE_SET,
2976 ProprietaryOperationalRates,
2977 ProprietaryOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
2978 ccmCfgSetInt(pMac, WNI_CFG_PROPRIETARY_ANI_FEATURES_ENABLED, PropRatesEnable, NULL, eANI_BOOLEAN_FALSE);
2979 ccmCfgSetStr(pMac, WNI_CFG_CURRENT_MCS_SET, MCSRateIdxSet,
2980 MCSRateLength, NULL, eANI_BOOLEAN_FALSE);
2981 }//Parsing BSSDesc
2982 else
2983 {
2984 smsLog(pMac, LOGE, FL("failed to parse BssDesc\n"));
2985 }
2986}
2987
Jeff Johnson295189b2012-06-20 16:38:30 -07002988static void csrSetCfgRateSetFromProfile( tpAniSirGlobal pMac,
2989 tCsrRoamProfile *pProfile )
2990{
2991 tSirMacRateSetIE DefaultSupportedRates11a = { SIR_MAC_RATESET_EID,
2992 { 8,
2993 { SIR_MAC_RATE_6,
2994 SIR_MAC_RATE_9,
2995 SIR_MAC_RATE_12,
2996 SIR_MAC_RATE_18,
2997 SIR_MAC_RATE_24,
2998 SIR_MAC_RATE_36,
2999 SIR_MAC_RATE_48,
3000 SIR_MAC_RATE_54 } } };
Jeff Johnson295189b2012-06-20 16:38:30 -07003001 tSirMacRateSetIE DefaultSupportedRates11b = { SIR_MAC_RATESET_EID,
3002 { 4,
3003 { SIR_MAC_RATE_1,
3004 SIR_MAC_RATE_2,
3005 SIR_MAC_RATE_5_5,
3006 SIR_MAC_RATE_11 } } };
3007
3008
3009 tSirMacPropRateSet DefaultSupportedPropRates = { 3,
3010 { SIR_MAC_RATE_72,
3011 SIR_MAC_RATE_96,
3012 SIR_MAC_RATE_108 } };
3013 eCsrCfgDot11Mode cfgDot11Mode;
3014 eCsrBand eBand;
3015 tANI_U8 OperationalRates[ CSR_DOT11_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
3016 tANI_U32 OperationalRatesLength = 0;
3017 tANI_U8 ExtendedOperationalRates[ CSR_DOT11_EXTENDED_SUPPORTED_RATES_MAX ]; // leave enough room for the max number of rates
3018 tANI_U32 ExtendedOperationalRatesLength = 0;
3019 tANI_U8 ProprietaryOperationalRates[ 4 ]; // leave enough room for the max number of proprietary rates
3020 tANI_U32 ProprietaryOperationalRatesLength = 0;
3021 tANI_U32 PropRatesEnable = 0;
3022 tANI_U8 operationChannel = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003023 if(pProfile->ChannelInfo.ChannelList)
3024 {
3025 operationChannel = pProfile->ChannelInfo.ChannelList[0];
3026 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003027#ifdef WLAN_SOFTAP_FEATURE
3028 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, pProfile, operationChannel, &eBand );
3029#else
3030 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel, &eBand );
3031#endif
3032 // For 11a networks, the 11a rates go into the Operational Rate set. For 11b and 11g
3033 // networks, the 11b rates appear in the Operational Rate set. In either case,
3034 // we can blindly put the rates we support into our Operational Rate set
3035 // (including the basic rates, which we have already verified are supported
3036 // earlier in the roaming decision).
3037 if ( eCSR_BAND_5G == eBand )
3038 {
3039 // 11a rates into the Operational Rate Set.
3040 OperationalRatesLength = DefaultSupportedRates11a.supportedRateSet.numRates *
3041 sizeof(*DefaultSupportedRates11a.supportedRateSet.rate);
3042 palCopyMemory( pMac->hHdd, OperationalRates,
3043 DefaultSupportedRates11a.supportedRateSet.rate,
3044 OperationalRatesLength );
3045
3046 // Nothing in the Extended rate set.
3047 ExtendedOperationalRatesLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003048 // populate proprietary rates if user allows them
3049 if ( pMac->roam.configParam.ProprietaryRatesEnabled )
3050 {
3051 ProprietaryOperationalRatesLength = DefaultSupportedPropRates.numPropRates *
3052 sizeof(*DefaultSupportedPropRates.propRate);
3053 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates,
3054 DefaultSupportedPropRates.propRate,
3055 ProprietaryOperationalRatesLength );
3056 }
3057 else
3058 {
3059 // No proprietary modes
3060 ProprietaryOperationalRatesLength = 0;
3061 }
3062 }
3063 else if ( eCSR_CFG_DOT11_MODE_11B == cfgDot11Mode )
3064 {
3065 // 11b rates into the Operational Rate Set.
3066 OperationalRatesLength = DefaultSupportedRates11b.supportedRateSet.numRates *
3067 sizeof(*DefaultSupportedRates11b.supportedRateSet.rate);
3068 palCopyMemory( pMac->hHdd, OperationalRates,
3069 DefaultSupportedRates11b.supportedRateSet.rate,
3070 OperationalRatesLength );
3071 // Nothing in the Extended rate set.
3072 ExtendedOperationalRatesLength = 0;
3073 // No proprietary modes
3074 ProprietaryOperationalRatesLength = 0;
3075 }
3076 else
3077 {
3078 // 11G
3079
3080 // 11b rates into the Operational Rate Set.
3081 OperationalRatesLength = DefaultSupportedRates11b.supportedRateSet.numRates *
3082 sizeof(*DefaultSupportedRates11b.supportedRateSet.rate);
3083 palCopyMemory( pMac->hHdd, OperationalRates,
3084 DefaultSupportedRates11b.supportedRateSet.rate,
3085 OperationalRatesLength );
3086
3087 // 11a rates go in the Extended rate set.
3088 ExtendedOperationalRatesLength = DefaultSupportedRates11a.supportedRateSet.numRates *
3089 sizeof(*DefaultSupportedRates11a.supportedRateSet.rate);
3090 palCopyMemory( pMac->hHdd, ExtendedOperationalRates,
3091 DefaultSupportedRates11a.supportedRateSet.rate,
3092 ExtendedOperationalRatesLength );
3093
3094 // populate proprietary rates if user allows them
3095 if ( pMac->roam.configParam.ProprietaryRatesEnabled )
3096 {
3097 ProprietaryOperationalRatesLength = DefaultSupportedPropRates.numPropRates *
3098 sizeof(*DefaultSupportedPropRates.propRate);
3099 palCopyMemory( pMac->hHdd, ProprietaryOperationalRates,
3100 DefaultSupportedPropRates.propRate,
3101 ProprietaryOperationalRatesLength );
3102 }
3103 else
3104 {
3105 // No proprietary modes
3106 ProprietaryOperationalRatesLength = 0;
3107 }
3108 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003109 // set this to 1 if prop. rates need to be advertised in to the IBSS beacon and user wants to use them
3110 if ( ProprietaryOperationalRatesLength && pMac->roam.configParam.ProprietaryRatesEnabled )
3111 {
3112 PropRatesEnable = 1;
3113 }
3114 else
3115 {
3116 PropRatesEnable = 0;
3117 }
3118
3119 // Set the operational rate set CFG variables...
3120 ccmCfgSetStr(pMac, WNI_CFG_OPERATIONAL_RATE_SET, OperationalRates,
3121 OperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3122 ccmCfgSetStr(pMac, WNI_CFG_EXTENDED_OPERATIONAL_RATE_SET, ExtendedOperationalRates,
3123 ExtendedOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3124 ccmCfgSetStr(pMac, WNI_CFG_PROPRIETARY_OPERATIONAL_RATE_SET,
3125 ProprietaryOperationalRates,
3126 ProprietaryOperationalRatesLength, NULL, eANI_BOOLEAN_FALSE);
3127 ccmCfgSetInt(pMac, WNI_CFG_PROPRIETARY_ANI_FEATURES_ENABLED, PropRatesEnable, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003128}
Jeff Johnson295189b2012-06-20 16:38:30 -07003129void csrRoamCcmCfgSetCallback(tHalHandle hHal, tANI_S32 result)
3130{
3131 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
Jeff Johnsone7245742012-09-05 17:12:55 -07003132
Jeff Johnson295189b2012-06-20 16:38:30 -07003133 tListElem *pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
3134 tANI_U32 sessionId;
3135 tSmeCmd *pCommand = NULL;
3136
3137 if(NULL == pEntry)
3138 {
3139 smsLog(pMac, LOGW, " CFG_CNF with active list empty\n");
3140 return;
3141 }
3142 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
3143 sessionId = pCommand->sessionId;
3144
3145 if(CSR_IS_ROAM_JOINING(pMac, sessionId) && CSR_IS_ROAM_SUBSTATE_CONFIG(pMac, sessionId))
3146 {
3147 csrRoamingStateConfigCnfProcessor(pMac, (tANI_U32)result);
3148 }
3149}
3150
Jeff Johnson295189b2012-06-20 16:38:30 -07003151//This function is very dump. It is here because PE still need WNI_CFG_PHY_MODE
3152tANI_U32 csrRoamGetPhyModeFromDot11Mode(eCsrCfgDot11Mode dot11Mode, eCsrBand band)
3153{
3154 if(eCSR_CFG_DOT11_MODE_11B == dot11Mode)
3155 {
3156 return (WNI_CFG_PHY_MODE_11B);
3157 }
3158 else
3159 {
3160 if(eCSR_BAND_24 == band)
3161 return (WNI_CFG_PHY_MODE_11G);
3162 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003163 return (WNI_CFG_PHY_MODE_11A);
3164}
Jeff Johnson295189b2012-06-20 16:38:30 -07003165
Jeff Johnsone7245742012-09-05 17:12:55 -07003166
3167#ifdef WLAN_FEATURE_11AC
3168ePhyChanBondState csrGetHTCBStateFromVHTCBState(ePhyChanBondState aniCBMode)
3169{
3170 switch ( aniCBMode )
3171 {
3172 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
3173 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
3174 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
3175 return PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
3176 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
3177 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
3178 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
3179 return PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
3180 case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
Madan Mohan Koyyalamudi2c112c52012-10-30 17:59:49 -07003181 default :
Jeff Johnsone7245742012-09-05 17:12:55 -07003182 return PHY_SINGLE_CHANNEL_CENTERED;
3183 }
3184}
3185#endif
3186
Jeff Johnson295189b2012-06-20 16:38:30 -07003187//pIes may be NULL
3188eHalStatus csrRoamSetBssConfigCfg(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
3189 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig,
3190 tDot11fBeaconIEs *pIes)
3191{
3192 eHalStatus status = eHAL_STATUS_SUCCESS;
3193 tANI_U32 cfgCb = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
3194 tANI_U8 channel = 0;
3195 //Make sure we have the domain info for the BSS we try to connect to.
3196 //Do we need to worry about sequence for OSs that are not Windows??
3197 if(pBssDesc)
3198 {
3199 if(csrLearnCountryInformation(pMac, pBssDesc, pIes, eANI_BOOLEAN_TRUE))
3200 {
3201 //Make sure the 11d info from this BSSDesc can be applied
3202 pMac->scan.fAmbiguous11dInfoFound = eANI_BOOLEAN_FALSE;
3203 csrApplyCountryInformation( pMac, TRUE );
3204 }
3205 }
3206
3207 //Qos
3208 csrSetQosToCfg( pMac, sessionId, pBssConfig->qosType );
3209 //SSID
3210 csrSetCfgSsid(pMac, &pBssConfig->SSID );
3211 //fragment threshold
3212 //ccmCfgSetInt(pMac, WNI_CFG_FRAGMENTATION_THRESHOLD, csrGetFragThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
3213 //RTS threshold
3214 //ccmCfgSetInt(pMac, WNI_CFG_RTS_THRESHOLD, csrGetRTSThresh(pMac), NULL, eANI_BOOLEAN_FALSE);
3215
3216 //ccmCfgSetInt(pMac, WNI_CFG_DOT11_MODE, csrTranslateToWNICfgDot11Mode(pMac, pBssConfig->uCfgDot11Mode), NULL, eANI_BOOLEAN_FALSE);
3217
3218 //Auth type
3219 ccmCfgSetInt(pMac, WNI_CFG_AUTHENTICATION_TYPE, pBssConfig->authType, NULL, eANI_BOOLEAN_FALSE);
3220 //encryption type
3221 csrSetCfgPrivacy(pMac, pProfile, (tANI_BOOLEAN)pBssConfig->BssCap.privacy );
3222 //short slot time
3223 ccmCfgSetInt(pMac, WNI_CFG_11G_SHORT_SLOT_TIME_ENABLED, pBssConfig->uShortSlotTime, NULL, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003224#ifdef WLAN_SOFTAP_FEATURE
3225 //11d
3226 ccmCfgSetInt(pMac, WNI_CFG_11D_ENABLED,
3227 ((pBssConfig->f11hSupport) ? pBssConfig->f11hSupport : pProfile->ieee80211d),
3228 NULL, eANI_BOOLEAN_FALSE);
3229#endif
3230 /*//11h
3231 ccmCfgSetInt(pMac, WNI_CFG_11H_ENABLED, pMac->roam.configParam.Is11hSupportEnabled, NULL, eANI_BOOLEAN_FALSE);
3232 */
3233 ccmCfgSetInt(pMac, WNI_CFG_LOCAL_POWER_CONSTRAINT, pBssConfig->uPowerLimit, NULL, eANI_BOOLEAN_FALSE);
3234 //CB
Jeff Johnsone7245742012-09-05 17:12:55 -07003235
Jeff Johnson295189b2012-06-20 16:38:30 -07003236 if(CSR_IS_INFRA_AP(pProfile) || CSR_IS_WDS_AP(pProfile))
3237 {
3238 channel = pProfile->operationChannel;
3239 }
3240 else
3241 {
3242 if(pBssDesc)
3243 {
3244 channel = pBssDesc->channelId;
3245 }
3246 }
3247 if(0 != channel)
3248 {
3249 if(CSR_IS_CHANNEL_24GHZ(channel))
3250 {//for now if we are on 2.4 Ghz, CB will be always disabled
3251 cfgCb = WNI_CFG_CHANNEL_BONDING_MODE_DISABLE;
3252 }
3253 else
3254 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003255 cfgCb = pBssConfig->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003256 }
3257 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003258#ifdef WLAN_FEATURE_11AC
3259 if(cfgCb > 2 )
3260 {
Madan Mohan Koyyalamudi2c112c52012-10-30 17:59:49 -07003261 if(!WDA_getFwWlanFeatCaps(DOT11AC)) {
Jeff Johnsone7245742012-09-05 17:12:55 -07003262 cfgCb = csrGetHTCBStateFromVHTCBState(cfgCb);
Madan Mohan Koyyalamudi2c112c52012-10-30 17:59:49 -07003263 }
3264 else
3265 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003266 ccmCfgSetInt(pMac, WNI_CFG_VHT_CHANNEL_WIDTH, pMac->roam.configParam.nVhtChannelWidth, NULL, eANI_BOOLEAN_FALSE);
Madan Mohan Koyyalamudi2c112c52012-10-30 17:59:49 -07003267 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003268 }
3269 else
3270#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07003271 ccmCfgSetInt(pMac, WNI_CFG_CHANNEL_BONDING_MODE, cfgCb, NULL, eANI_BOOLEAN_FALSE);
3272 //Rate
3273 //Fixed Rate
3274 if(pBssDesc)
3275 {
3276 csrSetCfgRateSet(pMac, (eCsrPhyMode)pProfile->phyMode, pProfile, pBssDesc, pIes);
3277 }
3278 else
3279 {
3280 csrSetCfgRateSetFromProfile(pMac, pProfile);
3281 }
3282 //Make this the last CFG to set. The callback will trigger a join_req
3283 //Join time out
3284 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_CONFIG, sessionId );
3285
3286 ccmCfgSetInt(pMac, WNI_CFG_JOIN_FAILURE_TIMEOUT, pBssConfig->uJoinTimeOut, (tCcmCfgSetCallback)csrRoamCcmCfgSetCallback, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07003287 return (status);
3288}
3289
Jeff Johnson295189b2012-06-20 16:38:30 -07003290eHalStatus csrRoamStopNetwork( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
3291 tSirBssDescription *pBssDesc, tDot11fBeaconIEs *pIes)
3292{
3293 eHalStatus status;
3294 tBssConfigParam *pBssConfig;
3295 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003296
3297 if(!pSession)
3298 {
3299 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3300 return eHAL_STATUS_FAILURE;
3301 }
3302
Jeff Johnson295189b2012-06-20 16:38:30 -07003303 status = palAllocateMemory(pMac->hHdd, (void **)&pBssConfig, sizeof(tBssConfigParam));
3304 if(HAL_STATUS_SUCCESS(status))
3305 {
3306 palZeroMemory(pMac->hHdd, pBssConfig, sizeof(tBssConfigParam));
3307 status = csrRoamPrepareBssConfig(pMac, pProfile, pBssDesc, pBssConfig, pIes);
3308 if(HAL_STATUS_SUCCESS(status))
3309 {
3310 pSession->bssParams.uCfgDot11Mode = pBssConfig->uCfgDot11Mode;
Jeff Johnsone7245742012-09-05 17:12:55 -07003311 /* This will allow to pass cbMode during join req */
3312 pSession->bssParams.cbMode= pBssConfig->cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003313 //For IBSS, we need to prepare some more information
3314 if( csrIsBssTypeIBSS(pProfile->BSSType) || CSR_IS_WDS( pProfile )
3315#ifdef WLAN_SOFTAP_FEATURE
3316 || CSR_IS_INFRA_AP(pProfile)
3317#endif
3318 )
3319 {
Jeff Johnsone7245742012-09-05 17:12:55 -07003320 csrRoamPrepareBssParams(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07003321 }
3322 // If we are in an IBSS, then stop the IBSS...
3323 ////Not worry about WDS connection for now
3324 if ( csrIsConnStateIbss( pMac, sessionId ) )
3325 {
3326 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
3327 }
3328 else
3329 {
3330 // if we are in an Infrastructure association....
3331 if ( csrIsConnStateInfra( pMac, sessionId ) )
3332 {
3333 // and the new Bss is an Ibss OR we are roaming from Infra to Infra
3334 // across SSIDs (roaming to a new SSID)... //
3335 //Not worry about WDS connection for now
3336 if ( pBssDesc && ( ( csrIsIbssBssDesc( pBssDesc ) ) ||
3337 !csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc, pIes ) ) )
3338 {
3339 // then we need to disassociate from the Infrastructure network...
3340 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
3341 }
3342 else
3343 {
3344 // In an Infrastucture and going to an Infrastructure network with the same SSID. This
3345 // calls for a Reassociation sequence. So issue the CFG sets for this new AP.
3346 if ( pBssDesc )
3347 {
3348 // Set parameters for this Bss.
3349 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
3350 }
3351 }
3352 }
3353 else
3354 {
3355 // Neiher in IBSS nor in Infra. We can go ahead and set the CFG for tne new network...
3356 // Nothing to stop.
3357 if ( pBssDesc || CSR_IS_WDS_AP( pProfile )
3358#ifdef WLAN_SOFTAP_FEATURE
3359 || CSR_IS_INFRA_AP(pProfile)
3360#endif
3361 )
3362 {
3363 // Set parameters for this Bss.
3364 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, pBssConfig, pIes);
3365 }
3366 }
3367 }
3368 }//Success getting BSS config info
3369 palFreeMemory(pMac->hHdd, pBssConfig);
3370 }//Allocate memory
3371
3372 return (status);
3373}
3374
Jeff Johnson295189b2012-06-20 16:38:30 -07003375eCsrJoinState csrRoamJoin( tpAniSirGlobal pMac, tANI_U32 sessionId,
3376 tCsrScanResultInfo *pScanResult, tCsrRoamProfile *pProfile )
3377{
3378 eCsrJoinState eRoamState = eCsrContinueRoaming;
3379 eHalStatus status;
3380 tSirBssDescription *pBssDesc = &pScanResult->BssDescriptor;
3381 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)( pScanResult->pvIes ); //This may be NULL
3382 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003383
3384 if(!pSession)
3385 {
3386 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3387 return (eCsrStopRoaming);
3388 }
3389
Jeff Johnson295189b2012-06-20 16:38:30 -07003390 if( CSR_IS_WDS_STA( pProfile ) )
3391 {
3392 status = csrRoamStartWds( pMac, sessionId, pProfile, pBssDesc );
3393 if( !HAL_STATUS_SUCCESS( status ) )
3394 {
3395 eRoamState = eCsrStopRoaming;
3396 }
3397 }
3398 else
3399 {
3400 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal))) )
3401 {
3402 smsLog(pMac, LOGE, FL(" fail to parse IEs"));
3403 return (eCsrStopRoaming);
3404 }
3405 if ( csrIsInfraBssDesc( pBssDesc ) )
3406 {
3407 // If we are connected in infrastructure mode and the Join Bss description is for the same BssID, then we are
3408 // attempting to join the AP we are already connected with. In that case, see if the Bss or Sta capabilities
3409 // have changed and handle the changes (without disturbing the current association).
3410
3411 if ( csrIsConnStateConnectedInfra(pMac, sessionId) &&
3412 csrIsBssIdEqual( pMac, pBssDesc, pSession->pConnectBssDesc ) &&
3413 csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc, pIesLocal )
3414 )
3415 {
3416 // Check to see if the Auth type has changed in the Profile. If so, we don't want to Reassociate
3417 // with Authenticating first. To force this, stop the current association (Disassociate) and
3418 // then re 'Join' the AP, wihch will force an Authentication (with the new Auth type) followed by
3419 // a new Association.
3420 if(csrIsSameProfile(pMac, &pSession->connectedProfile, pProfile))
3421 {
3422 smsLog(pMac, LOGW, FL(" detect same profile authType = %d encryType = %d\n"), pProfile->AuthType, pProfile->EncryptionType);
3423 if(csrRoamIsSameProfileKeys(pMac, &pSession->connectedProfile, pProfile))
3424 {
3425 eRoamState = eCsrReassocToSelfNoCapChange;
3426 }
3427 else
3428 {
3429 tBssConfigParam bssConfig;
Jeff Johnson295189b2012-06-20 16:38:30 -07003430 //The key changes
3431 palZeroMemory(pMac->hHdd, &bssConfig, sizeof(bssConfig));
3432 status = csrRoamPrepareBssConfig(pMac, pProfile, pBssDesc, &bssConfig, pIesLocal);
3433 if(HAL_STATUS_SUCCESS(status))
3434 {
3435 pSession->bssParams.uCfgDot11Mode = bssConfig.uCfgDot11Mode;
Jeff Johnsone7245742012-09-05 17:12:55 -07003436 pSession->bssParams.cbMode = bssConfig.cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07003437 //Reapply the config including Keys so reassoc is happening.
3438 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, pBssDesc, &bssConfig, pIesLocal);
3439 if(!HAL_STATUS_SUCCESS(status))
3440 {
3441 eRoamState = eCsrStopRoaming;
3442 }
3443 }
3444 else
3445 {
3446 eRoamState = eCsrStopRoaming;
3447 }
3448 }//same profile
3449 }
3450 else
3451 {
3452 if(!HAL_STATUS_SUCCESS(csrRoamIssueDisassociate( pMac, sessionId,
3453 eCSR_ROAM_SUBSTATE_DISASSOC_REQ, FALSE )))
3454 {
3455 smsLog(pMac, LOGW, FL(" fail to issue disassociate\n"));
3456 eRoamState = eCsrStopRoaming;
3457 }
3458 }
3459 }
3460 else
3461 {
3462 // note: we used to pre-auth here with open authentication networks but that was not working so well.
3463 // we had a lot of join timeouts when testing at Samsung. removing this step helped associations
3464 // work much better.
3465 //
3466 //
3467 // stop the existing network before attempting to join the new network...
3468 if(!HAL_STATUS_SUCCESS(csrRoamStopNetwork(pMac, sessionId, pProfile, pBssDesc, pIesLocal)))
3469 {
3470 eRoamState = eCsrStopRoaming;
3471 }
3472 }
3473 }//Infra
3474 else
3475 {
3476 if(!HAL_STATUS_SUCCESS(csrRoamStopNetwork(pMac, sessionId, pProfile, pBssDesc, pIesLocal)))
3477 {
3478 eRoamState = eCsrStopRoaming;
3479 }
3480 }
3481 if( pIesLocal && !pScanResult->pvIes )
3482 {
3483 palFreeMemory(pMac->hHdd, pIesLocal);
3484 }
3485 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003486 return( eRoamState );
3487}
3488
Jeff Johnson295189b2012-06-20 16:38:30 -07003489eHalStatus csrRoamShouldRoam(tpAniSirGlobal pMac, tANI_U32 sessionId,
3490 tSirBssDescription *pBssDesc, tANI_U32 roamId)
3491{
3492 eHalStatus status = eHAL_STATUS_SUCCESS;
3493 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07003494 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
3495 roamInfo.pBssDesc = pBssDesc;
3496 status = csrRoamCallCallback(pMac, sessionId, &roamInfo, roamId, eCSR_ROAM_SHOULD_ROAM, eCSR_ROAM_RESULT_NONE);
3497 return (status);
3498}
Jeff Johnson295189b2012-06-20 16:38:30 -07003499//In case no matching BSS is found, use whatever default we can find
3500static void csrRoamAssignDefaultParam( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3501{
3502 //Need to get all negotiated types in place first
3503 //auth type
3504 switch( pCommand->u.roamCmd.roamProfile.AuthType.authType[0] ) //Take the prefered Auth type.
3505 {
3506 default:
3507 case eCSR_AUTH_TYPE_WPA:
3508 case eCSR_AUTH_TYPE_WPA_PSK:
3509 case eCSR_AUTH_TYPE_WPA_NONE:
3510 case eCSR_AUTH_TYPE_OPEN_SYSTEM:
3511 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
3512 break;
3513
3514 case eCSR_AUTH_TYPE_SHARED_KEY:
3515 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_SHARED_KEY;
3516 break;
3517
3518 case eCSR_AUTH_TYPE_AUTOSWITCH:
3519 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = eCSR_AUTH_TYPE_AUTOSWITCH;
3520 break;
3521 }
3522 pCommand->u.roamCmd.roamProfile.negotiatedUCEncryptionType =
3523 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0];
3524 //In this case, the multicast encryption needs to follow the uncast ones.
3525 pCommand->u.roamCmd.roamProfile.negotiatedMCEncryptionType =
3526 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0];
3527}
3528
3529static eCsrJoinState csrRoamJoinNextBss( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fUseSameBss )
3530{
3531 eHalStatus status;
3532 tCsrScanResult *pScanResult = NULL;
3533 eCsrJoinState eRoamState = eCsrStopRoaming;
3534 tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
3535 tANI_BOOLEAN fDone = eANI_BOOLEAN_FALSE;
3536 tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
3537#ifndef WLAN_MDM_CODE_REDUCTION_OPT
3538 v_U8_t acm_mask = 0;
3539#endif
3540 tANI_U32 sessionId = pCommand->sessionId;
3541 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
3542 tCsrRoamProfile *pProfile = &pCommand->u.roamCmd.roamProfile;
3543 tANI_U8 concurrentChannel = 0;
Jeff Johnson32d95a32012-09-10 13:15:23 -07003544
3545 if(!pSession)
3546 {
3547 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3548 return (eCsrStopRoaming);
3549 }
3550
Jeff Johnson295189b2012-06-20 16:38:30 -07003551 do
3552 {
3553 // Check for Cardbus eject condition, before trying to Roam to any BSS
3554 //***if( !balIsCardPresent(pAdapter) ) break;
3555
3556 if(NULL != pBSSList)
3557 {
3558 // When handling AP's capability change, continue to associate to
3559 // same BSS and make sure pRoamBssEntry is not Null.
3560 if((eANI_BOOLEAN_FALSE == fUseSameBss) || (pCommand->u.roamCmd.pRoamBssEntry == NULL))
3561 {
3562 if(pCommand->u.roamCmd.pRoamBssEntry == NULL)
3563 {
3564 //Try the first BSS
3565 pCommand->u.roamCmd.pLastRoamBss = NULL;
3566 pCommand->u.roamCmd.pRoamBssEntry = csrLLPeekHead(&pBSSList->List, LL_ACCESS_LOCK);
3567 }
3568 else
3569 {
3570 pCommand->u.roamCmd.pRoamBssEntry = csrLLNext(&pBSSList->List, pCommand->u.roamCmd.pRoamBssEntry, LL_ACCESS_LOCK);
3571 if(NULL == pCommand->u.roamCmd.pRoamBssEntry)
3572 {
3573 //Done with all the BSSs
3574 //In this case, will tell HDD the completion
3575 break;
3576 }
3577 else
3578 {
3579 //We need to indicate to HDD that we are done with this one.
3580 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
3581 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss; //this shall not be NULL
3582 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
3583 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
3584 pRoamInfo = &roamInfo;
3585 }
3586 }
3587 while(pCommand->u.roamCmd.pRoamBssEntry)
3588 {
3589 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
Jeff Johnson295189b2012-06-20 16:38:30 -07003590 /*If concurrency enabled take the concurrent connected channel first. */
3591 /* Valid multichannel concurrent sessions exempted */
Jeff Johnsone7245742012-09-05 17:12:55 -07003592 if (vos_concurrent_sessions_running() &&
3593 !csrIsValidMcConcurrentSession(pMac, sessionId, &pScanResult->Result.BssDescriptor))
Jeff Johnson295189b2012-06-20 16:38:30 -07003594 {
3595 concurrentChannel =
3596 csrGetConcurrentOperationChannel(pMac);
3597 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO_HIGH, "%s: "
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07003598 " csr Concurrent Channel = %d", __func__, concurrentChannel);
Jeff Johnson295189b2012-06-20 16:38:30 -07003599 if ((concurrentChannel) &&
3600 (concurrentChannel ==
3601 pScanResult->Result.BssDescriptor.channelId))
3602 {
3603 //make this 0 because we do not want the
3604 //below check to pass as we don't want to
3605 //connect on other channel
3606 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
3607 FL("Concurrent channel match =%d"),
3608 concurrentChannel);
3609 concurrentChannel = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07003610 }
3611 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003612
3613 if (!concurrentChannel)
3614 {
3615
3616 if(HAL_STATUS_SUCCESS(csrRoamShouldRoam(pMac,
3617 sessionId, &pScanResult->Result.BssDescriptor,
3618 pCommand->u.roamCmd.roamId)))
3619 {
3620 //Ok to roam this
3621 break;
3622 }
3623 }
Jeff Johnsone7245742012-09-05 17:12:55 -07003624 else
3625 {
3626 eRoamState = eCsrStopRoamingDueToConcurrency;
3627 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003628 pCommand->u.roamCmd.pRoamBssEntry = csrLLNext(&pBSSList->List, pCommand->u.roamCmd.pRoamBssEntry, LL_ACCESS_LOCK);
3629 if(NULL == pCommand->u.roamCmd.pRoamBssEntry)
3630 {
3631 //Done with all the BSSs
3632 fDone = eANI_BOOLEAN_TRUE;
3633 break;
3634 }
3635 }
3636 if(fDone)
3637 {
3638 break;
3639 }
3640 }
3641 }
3642 //We have something to roam, tell HDD when it is infra.
3643 //For IBSS, the indication goes back to HDD via eCSR_ROAM_IBSS_IND
3644 //For WDS, the indication is eCSR_ROAM_WDS_IND
3645 if( CSR_IS_INFRASTRUCTURE( pProfile ) )
3646 {
3647 if(pRoamInfo)
3648 {
3649 pSession->bRefAssocStartCnt--;
3650 //Complete the last association attemp because a new one is about to be tried
3651 csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.roamCmd.roamId,
3652 eCSR_ROAM_ASSOCIATION_COMPLETION,
3653 eCSR_ROAM_RESULT_NOT_ASSOCIATED);
3654 }
3655 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
3656 if(pScanResult)
3657 {
3658 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
Jeff Johnson295189b2012-06-20 16:38:30 -07003659 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, &pScanResult->Result.BssDescriptor, &pIesLocal))) )
3660 {
3661 smsLog(pMac, LOGE, FL(" cannot parse IEs\n"));
3662 fDone = eANI_BOOLEAN_TRUE;
3663 eRoamState = eCsrStopRoaming;
3664 break;
3665 }
3666 roamInfo.pBssDesc = &pScanResult->Result.BssDescriptor;
3667 pCommand->u.roamCmd.pLastRoamBss = roamInfo.pBssDesc;
3668 //No need to put uapsd_mask in if the BSS doesn't support uAPSD
3669 if( pCommand->u.roamCmd.roamProfile.uapsd_mask &&
3670 CSR_IS_QOS_BSS(pIesLocal) &&
3671 CSR_IS_UAPSD_BSS(pIesLocal) )
3672 {
3673#ifndef WLAN_MDM_CODE_REDUCTION_OPT
Jeff Johnson295189b2012-06-20 16:38:30 -07003674 acm_mask = sme_QosGetACMMask(pMac, &pScanResult->Result.BssDescriptor,
3675 pIesLocal);
3676 pCommand->u.roamCmd.roamProfile.uapsd_mask &= ~(acm_mask);
3677#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
Jeff Johnson295189b2012-06-20 16:38:30 -07003678 }
3679 else
3680 {
3681 pCommand->u.roamCmd.roamProfile.uapsd_mask = 0;
3682 }
3683 if( pIesLocal && !pScanResult->Result.pvIes)
3684 {
3685 palFreeMemory(pMac->hHdd, pIesLocal);
3686 }
3687 }
3688 else
3689 {
3690 pCommand->u.roamCmd.roamProfile.uapsd_mask = 0;
3691 }
3692 roamInfo.pProfile = pProfile;
3693 pSession->bRefAssocStartCnt++;
3694 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
3695 eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
3696 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003697 if ( NULL == pCommand->u.roamCmd.pRoamBssEntry )
3698 {
3699 // If this is a start IBSS profile, then we need to start the IBSS.
3700 if ( CSR_IS_START_IBSS(pProfile) )
3701 {
3702 tANI_BOOLEAN fSameIbss = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003703 // Attempt to start this IBSS...
3704 csrRoamAssignDefaultParam( pMac, pCommand );
3705 status = csrRoamStartIbss( pMac, sessionId, pProfile, &fSameIbss );
3706 if(HAL_STATUS_SUCCESS(status))
3707 {
3708 if ( fSameIbss )
3709 {
3710 eRoamState = eCsrStartIbssSameIbss;
3711 }
3712 else
3713 {
3714 eRoamState = eCsrContinueRoaming;
3715 }
3716 }
3717 else
3718 {
3719 //it somehow fail need to stop
3720 eRoamState = eCsrStopRoaming;
3721 }
3722 break;
3723 }
3724 else if ( (CSR_IS_WDS_AP(pProfile))
3725#ifdef WLAN_SOFTAP_FEATURE
3726 || (CSR_IS_INFRA_AP(pProfile))
3727#endif
3728 )
3729 {
3730 // Attempt to start this WDS...
3731 csrRoamAssignDefaultParam( pMac, pCommand );
3732 /* For AP WDS, we dont have any BSSDescription */
3733 status = csrRoamStartWds( pMac, sessionId, pProfile, NULL );
3734 if(HAL_STATUS_SUCCESS(status))
3735 {
3736 eRoamState = eCsrContinueRoaming;
3737 }
3738 else
3739 {
3740 //it somehow fail need to stop
3741 eRoamState = eCsrStopRoaming;
3742 }
3743 }
3744 else
3745 {
3746 //Nothing we can do
3747 smsLog(pMac, LOGW, FL("cannot continue without BSS list\n"));
3748 eRoamState = eCsrStopRoaming;
3749 break;
3750 }
3751 }
3752 else //We have BSS
3753 {
3754 //Need to assign these value because they are used in csrIsSameProfile
3755 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
3756 pCommand->u.roamCmd.roamProfile.negotiatedUCEncryptionType = pScanResult->ucEncryptionType; //Negotiated while building scan result.
3757 pCommand->u.roamCmd.roamProfile.negotiatedMCEncryptionType = pScanResult->mcEncryptionType;
3758 pCommand->u.roamCmd.roamProfile.negotiatedAuthType = pScanResult->authType;
3759 if ( CSR_IS_START_IBSS(&pCommand->u.roamCmd.roamProfile) )
3760 {
3761 if(csrIsSameProfile(pMac, &pSession->connectedProfile, pProfile))
3762 {
3763 eRoamState = eCsrStartIbssSameIbss;
3764 break;
3765 }
3766 }
3767 if( pCommand->u.roamCmd.fReassocToSelfNoCapChange )
3768 {
3769 //trying to connect to the one already connected
3770 pCommand->u.roamCmd.fReassocToSelfNoCapChange = eANI_BOOLEAN_FALSE;
3771 eRoamState = eCsrReassocToSelfNoCapChange;
3772 break;
3773 }
3774 // Attempt to Join this Bss...
3775 eRoamState = csrRoamJoin( pMac, sessionId, &pScanResult->Result, pProfile );
3776 break;
3777 }
3778
3779 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07003780 if( (eCsrStopRoaming == eRoamState) && (CSR_IS_INFRASTRUCTURE( pProfile )) )
3781 {
3782 //Need to indicate association_completion if association_start has been done
3783 if(pSession->bRefAssocStartCnt > 0)
3784 {
3785 pSession->bRefAssocStartCnt--;
3786 //Complete the last association attemp because a new one is about to be tried
3787 csrRoamCallCallback(pMac, sessionId, pRoamInfo, pCommand->u.roamCmd.roamId,
3788 eCSR_ROAM_ASSOCIATION_COMPLETION,
3789 eCSR_ROAM_RESULT_NOT_ASSOCIATED);
3790 }
3791 }
3792
3793 return( eRoamState );
3794}
3795
Jeff Johnson295189b2012-06-20 16:38:30 -07003796static eHalStatus csrRoam( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3797{
3798 eHalStatus status = eHAL_STATUS_SUCCESS;
3799 eCsrJoinState RoamState;
3800 tANI_U32 sessionId = pCommand->sessionId;
3801
Jeff Johnson295189b2012-06-20 16:38:30 -07003802 //***if( hddIsRadioStateOn( pAdapter ) )
3803 {
3804 // Attept to join a Bss...
3805 RoamState = csrRoamJoinNextBss( pMac, pCommand, eANI_BOOLEAN_FALSE );
Jeff Johnsone7245742012-09-05 17:12:55 -07003806
Jeff Johnson295189b2012-06-20 16:38:30 -07003807 // if nothing to join..
Jeff Johnsone7245742012-09-05 17:12:55 -07003808 if (( eCsrStopRoaming == RoamState ) || ( eCsrStopRoamingDueToConcurrency == RoamState))
Jeff Johnson295189b2012-06-20 16:38:30 -07003809 {
3810 tANI_BOOLEAN fComplete = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07003811 // and if connected in Infrastructure mode...
3812 if ( csrIsConnStateInfra(pMac, sessionId) )
3813 {
3814 //... then we need to issue a disassociation
3815 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISASSOC_NOTHING_TO_JOIN, FALSE );
3816 if(!HAL_STATUS_SUCCESS(status))
3817 {
3818 smsLog(pMac, LOGW, FL(" failed to issue disassociate, status = %d\n"), status);
3819 //roam command is completed by caller in the failed case
3820 fComplete = eANI_BOOLEAN_TRUE;
3821 }
3822 }
3823 else if( csrIsConnStateIbss(pMac, sessionId) )
3824 {
3825 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3826 if(!HAL_STATUS_SUCCESS(status))
3827 {
3828 smsLog(pMac, LOGW, FL(" failed to issue stop bss, status = %d\n"), status);
3829 //roam command is completed by caller in the failed case
3830 fComplete = eANI_BOOLEAN_TRUE;
3831 }
3832 }
3833#ifdef WLAN_SOFTAP_FEATURE
3834 else if (csrIsConnStateConnectedInfraAp(pMac, sessionId))
3835 {
3836 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3837 if(!HAL_STATUS_SUCCESS(status))
3838 {
3839 smsLog(pMac, LOGW, FL(" failed to issue stop bss, status = %d\n"), status);
3840 //roam command is completed by caller in the failed case
3841 fComplete = eANI_BOOLEAN_TRUE;
3842 }
3843 }
3844#endif
3845 else
3846 {
3847 fComplete = eANI_BOOLEAN_TRUE;
3848 }
3849 if(fComplete)
3850 {
3851 // ... otherwise, we can complete the Roam command here.
Jeff Johnsone7245742012-09-05 17:12:55 -07003852 if(eCsrStopRoamingDueToConcurrency == RoamState)
3853 {
3854 csrRoamComplete( pMac, eCsrJoinFailureDueToConcurrency, NULL );
3855 }
3856 else
3857 {
3858 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
3859 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003860 }
3861 }
3862 else if ( eCsrReassocToSelfNoCapChange == RoamState )
3863 {
3864 csrRoamComplete( pMac, eCsrSilentlyStopRoamingSaveState, NULL );
3865 }
3866 else if ( eCsrStartIbssSameIbss == RoamState )
3867 {
3868 csrRoamComplete( pMac, eCsrSilentlyStopRoaming, NULL );
3869 }
3870 }//hddIsRadioStateOn
3871
3872 return status;
3873}
Jeff Johnson295189b2012-06-20 16:38:30 -07003874eHalStatus csrProcessFTReassocRoamCommand ( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3875{
3876 tANI_U32 sessionId;
3877 tCsrRoamSession *pSession;
3878 tCsrScanResult *pScanResult = NULL;
3879 tSirBssDescription *pBssDesc = NULL;
3880 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07003881 sessionId = pCommand->sessionId;
3882 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003883
3884 if(!pSession)
3885 {
3886 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3887 return eHAL_STATUS_FAILURE;
3888 }
3889
Jeff Johnson295189b2012-06-20 16:38:30 -07003890 if(CSR_IS_ROAMING(pSession) && pSession->fCancelRoaming)
3891 {
3892 //the roaming is cancelled. Simply complete the command
3893 smsLog(pMac, LOG1, FL(" Roam command cancelled\n"));
3894 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
3895 return eHAL_STATUS_FAILURE;
3896 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003897 if (pCommand->u.roamCmd.pRoamBssEntry)
3898 {
3899 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
3900 pBssDesc = &pScanResult->Result.BssDescriptor;
3901 }
3902 else
3903 {
3904 //the roaming is cancelled. Simply complete the command
3905 smsLog(pMac, LOG1, FL(" Roam command cancelled\n"));
3906 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
3907 return eHAL_STATUS_FAILURE;
3908 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003909 status = csrRoamIssueReassociate(pMac, sessionId, pBssDesc,
3910 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ), &pCommand->u.roamCmd.roamProfile);
3911 return status;
3912}
3913
Jeff Johnson295189b2012-06-20 16:38:30 -07003914eHalStatus csrRoamProcessCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
3915{
3916 eHalStatus status = eHAL_STATUS_SUCCESS;
3917 tCsrRoamInfo roamInfo;
3918 tANI_U32 sessionId = pCommand->sessionId;
3919 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07003920
3921 if(!pSession)
3922 {
3923 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
3924 return eHAL_STATUS_FAILURE;
3925 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003926
3927 switch ( pCommand->u.roamCmd.roamReason )
3928 {
3929 case eCsrForcedDisassoc:
3930 csrFreeRoamProfile(pMac, sessionId);
3931 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, FALSE );
3932 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003933 case eCsrSmeIssuedDisassocForHandoff:
3934 //Not to free pMac->roam.pCurRoamProfile (via csrFreeRoamProfile) because it is needed after disconnect
3935#if 0 // TODO : Confirm this change
3936 status = csrRoamProcessDisassociate( pMac, pCommand, FALSE );
3937#else
3938 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, FALSE );
3939#endif
3940
3941 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003942 case eCsrForcedDisassocMICFailure:
3943 csrFreeRoamProfile(pMac, sessionId);
3944 status = csrRoamProcessDisassocDeauth( pMac, pCommand, TRUE, TRUE );
3945 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003946 case eCsrForcedDeauth:
3947 csrFreeRoamProfile(pMac, sessionId);
3948 status = csrRoamProcessDisassocDeauth( pMac, pCommand, FALSE, FALSE );
3949 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003950 case eCsrHddIssuedReassocToSameAP:
3951 case eCsrSmeIssuedReassocToSameAP:
3952 {
3953 tDot11fBeaconIEs *pIes = NULL;
3954
Jeff Johnson295189b2012-06-20 16:38:30 -07003955 if( pSession->pConnectBssDesc )
3956 {
3957 status = csrGetParsedBssDescriptionIEs(pMac, pSession->pConnectBssDesc, &pIes);
3958 if(!HAL_STATUS_SUCCESS(status) )
3959 {
3960 smsLog(pMac, LOGE, FL(" fail to parse IEs\n"));
3961 }
3962 else
3963 {
3964 roamInfo.reasonCode = eCsrRoamReasonStaCapabilityChanged;
3965 csrRoamCallCallback(pMac, pSession->sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
3966 pSession->roamingReason = eCsrReassocRoaming;
Jeff Johnson295189b2012-06-20 16:38:30 -07003967 roamInfo.pBssDesc = pSession->pConnectBssDesc;
3968 roamInfo.pProfile = &pCommand->u.roamCmd.roamProfile;
3969 pSession->bRefAssocStartCnt++;
3970 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
3971 eCSR_ROAM_ASSOCIATION_START, eCSR_ROAM_RESULT_NONE );
3972
3973 smsLog(pMac, LOG1, FL(" calling csrRoamIssueReassociate\n"));
3974 csrRoamIssueReassociate( pMac, sessionId, pSession->pConnectBssDesc, pIes,
3975 &pCommand->u.roamCmd.roamProfile );
3976 palFreeMemory(pMac->hHdd, pIes);
3977 pIes = NULL;
3978 }
3979 }
3980 break;
3981 }
Jeff Johnson295189b2012-06-20 16:38:30 -07003982 case eCsrCapsChange:
3983 smsLog(pMac, LOGE, FL("received eCsrCapsChange \n"));
3984 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
3985 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE);
3986 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07003987 case eCsrSmeIssuedFTReassoc:
3988 smsLog(pMac, LOGE, FL("received FT Reassoc Req \n"));
3989 status = csrProcessFTReassocRoamCommand(pMac, pCommand);
3990 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07003991
Jeff Johnson295189b2012-06-20 16:38:30 -07003992 case eCsrStopBss:
3993 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
3994 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
3995 break;
3996
3997 case eCsrForcedDisassocSta:
3998 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
3999 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_DISASSOC_REQ, sessionId);
4000 status = csrSendMBDisassocReqMsg( pMac, sessionId, pCommand->u.roamCmd.peerMac,
4001 pCommand->u.roamCmd.reason);
4002 break;
4003
4004 case eCsrForcedDeauthSta:
4005 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
4006 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_DEAUTH_REQ, sessionId);
4007 status = csrSendMBDeauthReqMsg( pMac, sessionId, pCommand->u.roamCmd.peerMac,
4008 pCommand->u.roamCmd.reason);
4009 break;
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07004010#if 1
4011 /*Varun*/
4012 case eCsrPerformPreauth:
4013 smsLog(pMac, LOGE, FL("Attempting FT PreAuth Req \n"));
4014 status = csrRoamIssueFTPreauthReq(pMac, sessionId,
4015 pCommand->u.roamCmd.pLastRoamBss);
4016 break;
4017#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004018
4019 default:
4020 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
4021
4022 if( pCommand->u.roamCmd.fUpdateCurRoamProfile )
4023 {
4024 //Remember the roaming profile
4025 csrFreeRoamProfile(pMac, sessionId);
4026 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pSession->pCurRoamProfile, sizeof(tCsrRoamProfile))))
4027 {
4028 palZeroMemory(pMac->hHdd, pSession->pCurRoamProfile, sizeof(tCsrRoamProfile));
4029 csrRoamCopyProfile(pMac, pSession->pCurRoamProfile, &pCommand->u.roamCmd.roamProfile);
4030 }
4031 }
4032
4033 //At this point, original uapsd_mask is saved in pCurRoamProfile
4034 //uapsd_mask in the pCommand may change from this point on.
4035
4036 // Attempt to roam with the new scan results (if we need to..)
4037 status = csrRoam( pMac, pCommand );
4038 break;
4039 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004040 return (status);
4041}
4042
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07004043void csrReinitPreauthCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
4044{
4045 pCommand->u.roamCmd.pLastRoamBss = NULL;
4046 pCommand->u.roamCmd.pRoamBssEntry = NULL;
4047 //Because u.roamCmd is union and share with scanCmd and StatusChange
4048 palZeroMemory(pMac->hHdd, &pCommand->u.roamCmd, sizeof(tRoamCmd));
4049}
4050
Jeff Johnson295189b2012-06-20 16:38:30 -07004051void csrReinitRoamCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
4052{
4053 if(pCommand->u.roamCmd.fReleaseBssList)
4054 {
4055 csrScanResultPurge(pMac, pCommand->u.roamCmd.hBSSList);
4056 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_FALSE;
4057 pCommand->u.roamCmd.hBSSList = CSR_INVALID_SCANRESULT_HANDLE;
4058 }
4059 if(pCommand->u.roamCmd.fReleaseProfile)
4060 {
4061 csrReleaseProfile(pMac, &pCommand->u.roamCmd.roamProfile);
4062 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
4063 }
4064 pCommand->u.roamCmd.pRoamBssEntry = NULL;
4065 //Because u.roamCmd is union and share with scanCmd and StatusChange
4066 palZeroMemory(pMac->hHdd, &pCommand->u.roamCmd, sizeof(tRoamCmd));
4067}
4068
Jeff Johnson295189b2012-06-20 16:38:30 -07004069void csrReinitWmStatusChangeCmd(tpAniSirGlobal pMac, tSmeCmd *pCommand)
4070{
4071 palZeroMemory(pMac->hHdd, &pCommand->u.wmStatusChangeCmd, sizeof(tWmStatusChangeCmd));
4072}
Jeff Johnson295189b2012-06-20 16:38:30 -07004073void csrRoamComplete( tpAniSirGlobal pMac, eCsrRoamCompleteResult Result, void *Context )
4074{
4075 tListElem *pEntry;
4076 tSmeCmd *pCommand;
4077 tANI_BOOLEAN fReleaseCommand = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004078 smsLog( pMac, LOG2, "roamQ: Roam Completion ...\n" );
Jeff Johnson295189b2012-06-20 16:38:30 -07004079 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
4080 if ( pEntry )
4081 {
4082 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07004083 // If the head of the queue is Active and it is a ROAM command, remove
4084 // and put this on the Free queue.
4085 if ( eSmeCommandRoam == pCommand->command )
4086 {
4087 //we need to process the result first before removing it from active list because state changes
4088 //still happening insides roamQProcessRoamResults so no other roam command should be issued
4089 fReleaseCommand = csrRoamProcessResults( pMac, pCommand, Result, Context );
4090 if( fReleaseCommand )
4091 {
4092 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
4093 {
4094 csrReleaseCommandRoam( pMac, pCommand );
4095 }
4096 else
4097 {
4098 smsLog( pMac, LOGE, " **********csrRoamComplete fail to release command reason %d\n",
4099 pCommand->u.roamCmd.roamReason );
4100 }
4101 }
4102 else
4103 {
4104 smsLog( pMac, LOGE, " **********csrRoamComplete fail to release command reason %d\n",
4105 pCommand->u.roamCmd.roamReason );
4106 }
4107 }
4108 else
4109 {
4110 smsLog( pMac, LOGW, "CSR: Roam Completion called but ROAM command is not ACTIVE ...\n" );
4111 }
4112 }
4113 else
4114 {
4115 smsLog( pMac, LOGW, "CSR: Roam Completion called but NO commands are ACTIVE ...\n" );
4116 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004117 if( fReleaseCommand )
4118 {
4119 smeProcessPendingQueue( pMac );
4120 }
4121}
4122
Jeff Johnson295189b2012-06-20 16:38:30 -07004123void csrResetPMKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId )
4124{
4125 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07004126 if(!pSession)
4127 {
4128 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4129 return;
4130 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004131 palZeroMemory( pMac->hHdd, &(pSession->PmkidCandidateInfo[0]), sizeof(tPmkidCandidateInfo) * CSR_MAX_PMKID_ALLOWED );
4132 pSession->NumPmkidCandidate = 0;
4133}
Jeff Johnson295189b2012-06-20 16:38:30 -07004134#ifdef FEATURE_WLAN_WAPI
4135void csrResetBKIDCandidateList( tpAniSirGlobal pMac, tANI_U32 sessionId )
4136{
4137 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07004138 if(!pSession)
4139 {
4140 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4141 return;
4142 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004143 palZeroMemory( pMac->hHdd, &(pSession->BkidCandidateInfo[0]), sizeof(tBkidCandidateInfo) * CSR_MAX_BKID_ALLOWED );
4144 pSession->NumBkidCandidate = 0;
4145}
4146#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07004147extern tANI_U8 csrWpaOui[][ CSR_WPA_OUI_SIZE ];
4148
Jeff Johnson295189b2012-06-20 16:38:30 -07004149static eHalStatus csrRoamSaveSecurityRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrAuthType authType,
4150 tSirBssDescription *pSirBssDesc,
4151 tDot11fBeaconIEs *pIes)
4152{
4153 eHalStatus status = eHAL_STATUS_SUCCESS;
4154 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
4155 tDot11fBeaconIEs *pIesLocal = pIes;
Jeff Johnson32d95a32012-09-10 13:15:23 -07004156
4157 if(!pSession)
4158 {
4159 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4160 return eHAL_STATUS_FAILURE;
4161 }
4162
Jeff Johnson295189b2012-06-20 16:38:30 -07004163 if((eCSR_AUTH_TYPE_WPA == authType) ||
4164 (eCSR_AUTH_TYPE_WPA_PSK == authType) ||
4165 (eCSR_AUTH_TYPE_RSN == authType) ||
4166 (eCSR_AUTH_TYPE_RSN_PSK == authType)
4167#if defined WLAN_FEATURE_VOWIFI_11R
4168 ||
4169 (eCSR_AUTH_TYPE_FT_RSN == authType) ||
4170 (eCSR_AUTH_TYPE_FT_RSN_PSK == authType)
4171#endif /* FEATURE_WLAN_WAPI */
4172#ifdef FEATURE_WLAN_WAPI
4173 ||
4174 (eCSR_AUTH_TYPE_WAPI_WAI_PSK == authType) ||
4175 (eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE == authType)
4176#endif /* FEATURE_WLAN_WAPI */
4177 )
4178 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004179 if( !pIesLocal && (!HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesLocal))) )
4180 {
4181 smsLog(pMac, LOGE, FL(" cannot parse IEs\n"));
4182 }
4183 if( pIesLocal )
4184 {
4185 tANI_U32 nIeLen;
4186 tANI_U8 *pIeBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07004187 if((eCSR_AUTH_TYPE_RSN == authType) ||
4188#if defined WLAN_FEATURE_VOWIFI_11R
4189 (eCSR_AUTH_TYPE_FT_RSN == authType) ||
4190 (eCSR_AUTH_TYPE_FT_RSN_PSK == authType) ||
4191#endif /* WLAN_FEATURE_VOWIFI_11R */
4192 (eCSR_AUTH_TYPE_RSN_PSK == authType))
4193 {
4194 if(pIesLocal->RSN.present)
4195 {
4196 //Calculate the actual length
4197 nIeLen = 8 //version + gp_cipher_suite + pwise_cipher_suite_count
4198 + pIesLocal->RSN.pwise_cipher_suite_count * 4 //pwise_cipher_suites
4199 + 2 //akm_suite_count
4200 + pIesLocal->RSN.akm_suite_count * 4 //akm_suites
4201 + 2; //reserved
4202 if( pIesLocal->RSN.pmkid_count )
4203 {
4204 nIeLen += 2 + pIesLocal->RSN.pmkid_count * 4; //pmkid
4205 }
4206 //nIeLen doesn't count EID and length fields
4207 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnRspIE, nIeLen + 2))))
4208 {
4209 pSession->pWpaRsnRspIE[0] = DOT11F_EID_RSN;
4210 pSession->pWpaRsnRspIE[1] = (tANI_U8)nIeLen;
4211 //copy upto akm_suites
4212 pIeBuf = pSession->pWpaRsnRspIE + 2;
4213 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->RSN.version, 8);
4214 pIeBuf += 8;
4215 if( pIesLocal->RSN.pwise_cipher_suite_count )
4216 {
4217 //copy pwise_cipher_suites
4218 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.pwise_cipher_suites,
4219 pIesLocal->RSN.pwise_cipher_suite_count * 4);
4220 pIeBuf += pIesLocal->RSN.pwise_cipher_suite_count * 4;
4221 }
4222 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->RSN.akm_suite_count, 2);
4223 pIeBuf += 2;
4224 if( pIesLocal->RSN.akm_suite_count )
4225 {
4226 //copy akm_suites
4227 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.akm_suites,
4228 pIesLocal->RSN.akm_suite_count * 4);
4229 pIeBuf += pIesLocal->RSN.akm_suite_count * 4;
4230 }
4231 //copy the rest
4232 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->RSN.akm_suites +
4233 pIesLocal->RSN.akm_suite_count * 4,
4234 2 + pIesLocal->RSN.pmkid_count * 4);
4235 pSession->nWpaRsnRspIeLength = nIeLen + 2;
4236 }
4237 }
4238 }
4239 else if((eCSR_AUTH_TYPE_WPA == authType) ||
4240 (eCSR_AUTH_TYPE_WPA_PSK == authType))
4241 {
4242 if(pIesLocal->WPA.present)
4243 {
4244 //Calculate the actual length
4245 nIeLen = 12 //OUI + version + multicast_cipher + unicast_cipher_count
4246 + pIesLocal->WPA.unicast_cipher_count * 4 //unicast_ciphers
4247 + 2 //auth_suite_count
4248 + pIesLocal->WPA.auth_suite_count * 4; //auth_suites
4249 // The WPA capabilities follows the Auth Suite (two octects)--
4250 // this field is optional, and we always "send" zero, so just
4251 // remove it. This is consistent with our assumptions in the
4252 // frames compiler; c.f. bug 15234:
4253 //nIeLen doesn't count EID and length fields
4254 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnRspIE, nIeLen + 2))))
4255 {
4256 pSession->pWpaRsnRspIE[0] = DOT11F_EID_WPA;
4257 pSession->pWpaRsnRspIE[1] = (tANI_U8)nIeLen;
4258 pIeBuf = pSession->pWpaRsnRspIE + 2;
4259 //Copy WPA OUI
4260 palCopyMemory(pMac->hHdd, pIeBuf, &csrWpaOui[1], 4);
4261 pIeBuf += 4;
4262 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WPA.version, 8 +
4263 pIesLocal->WPA.unicast_cipher_count * 4);
4264 pIeBuf += 8 + pIesLocal->WPA.unicast_cipher_count * 4;
4265 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WPA.auth_suite_count, 2 +
4266 pIesLocal->WPA.auth_suite_count * 4);
4267 pIeBuf += pIesLocal->WPA.auth_suite_count * 4;
4268 pSession->nWpaRsnRspIeLength = nIeLen + 2;
4269 }
4270 }
4271 }
4272#ifdef FEATURE_WLAN_WAPI
4273 else if((eCSR_AUTH_TYPE_WAPI_WAI_PSK == authType) ||
4274 (eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE == authType))
4275 {
4276 if(pIesLocal->WAPI.present)
4277 {
4278 //Calculate the actual length
4279 nIeLen = 4 //version + akm_suite_count
4280 + pIesLocal->WAPI.akm_suite_count * 4 // akm_suites
4281 + 2 //pwise_cipher_suite_count
4282 + pIesLocal->WAPI.unicast_cipher_suite_count * 4 //pwise_cipher_suites
4283 + 6; //gp_cipher_suite + preauth + reserved
4284 if( pIesLocal->WAPI.bkid_count )
4285 {
4286 nIeLen += 2 + pIesLocal->WAPI.bkid_count * 4; //bkid
4287 }
4288
4289 //nIeLen doesn't count EID and length fields
4290 if(HAL_STATUS_SUCCESS((status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWapiRspIE, nIeLen + 2))))
4291 {
4292 pSession->pWapiRspIE[0] = DOT11F_EID_WAPI;
4293 pSession->pWapiRspIE[1] = (tANI_U8)nIeLen;
4294 pIeBuf = pSession->pWapiRspIE + 2;
4295 //copy upto akm_suite_count
4296 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.version, 4);
4297 pIeBuf += 4;
4298 if( pIesLocal->WAPI.akm_suite_count )
4299 {
4300 //copy akm_suites
4301 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.akm_suites,
4302 pIesLocal->WAPI.akm_suite_count * 4);
4303 pIeBuf += pIesLocal->WAPI.akm_suite_count * 4;
4304 }
4305 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.unicast_cipher_suite_count, 2);
4306 pIeBuf += 2;
Jeff Johnson295189b2012-06-20 16:38:30 -07004307 if( pIesLocal->WAPI.unicast_cipher_suite_count )
4308 {
4309 //copy pwise_cipher_suites
4310 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.unicast_cipher_suites,
4311 pIesLocal->WAPI.unicast_cipher_suite_count * 4);
4312 pIeBuf += pIesLocal->WAPI.unicast_cipher_suite_count * 4;
4313 }
4314 //gp_cipher_suite + preauth + reserved + bkid_count
4315 palCopyMemory(pMac->hHdd, pIeBuf, &pIesLocal->WAPI.multicast_cipher_suite, 8);
4316 pIeBuf += 8;
4317 if( pIesLocal->WAPI.bkid_count )
4318 {
4319 //copy akm_suites
4320 palCopyMemory(pMac->hHdd, pIeBuf, pIesLocal->WAPI.bkid, pIesLocal->WAPI.bkid_count * 4);
4321 pIeBuf += pIesLocal->WAPI.bkid_count * 4;
4322 }
4323 pSession->nWapiRspIeLength = nIeLen + 2;
4324 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004325 }
4326 }
4327#endif /* FEATURE_WLAN_WAPI */
4328 if( !pIes )
4329 {
4330 //locally allocated
4331 palFreeMemory(pMac->hHdd, pIesLocal);
4332 }
4333 }
4334 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004335 return (status);
4336}
4337
Jeff Johnson295189b2012-06-20 16:38:30 -07004338static void csrCheckAndUpdateACWeight( tpAniSirGlobal pMac, tDot11fBeaconIEs *pIEs )
4339{
4340 v_U8_t bACWeights[WLANTL_MAX_AC];
4341 v_U8_t paramBk, paramBe, paramVi, paramVo;
4342 v_BOOL_t fWeightChange = VOS_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004343 //Compare two ACs' EDCA parameters, from low to high (BK, BE, VI, VO)
4344 //The "formula" is, if lower AC's AIFSN+CWMin is bigger than a fixed amount
4345 //of the higher AC one, make the higher AC has the same weight as the lower AC.
4346 //This doesn't address the case where the lower AC needs a real higher weight
4347 if( pIEs->WMMParams.present )
4348 {
4349 //no change to the lowest ones
4350 bACWeights[WLANTL_AC_BK] = pMac->roam.ucACWeights[WLANTL_AC_BK];
4351 bACWeights[WLANTL_AC_BE] = pMac->roam.ucACWeights[WLANTL_AC_BE];
4352 bACWeights[WLANTL_AC_VI] = pMac->roam.ucACWeights[WLANTL_AC_VI];
4353 bACWeights[WLANTL_AC_VO] = pMac->roam.ucACWeights[WLANTL_AC_VO];
4354 paramBk = pIEs->WMMParams.acbk_aifsn + pIEs->WMMParams.acbk_acwmin;
4355 paramBe = pIEs->WMMParams.acbe_aifsn + pIEs->WMMParams.acbe_acwmin;
4356 paramVi = pIEs->WMMParams.acvi_aifsn + pIEs->WMMParams.acvi_acwmin;
4357 paramVo = pIEs->WMMParams.acvo_aifsn + pIEs->WMMParams.acvo_acwmin;
4358 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramBe) )
4359 {
4360 bACWeights[WLANTL_AC_BE] = bACWeights[WLANTL_AC_BK];
4361 fWeightChange = VOS_TRUE;
4362 }
4363 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramVi) )
4364 {
4365 bACWeights[WLANTL_AC_VI] = bACWeights[WLANTL_AC_BK];
4366 fWeightChange = VOS_TRUE;
4367 }
4368 else if( SME_DETECT_AC_WEIGHT_DIFF(paramBe, paramVi) )
4369 {
4370 bACWeights[WLANTL_AC_VI] = bACWeights[WLANTL_AC_BE];
4371 fWeightChange = VOS_TRUE;
4372 }
4373 if( SME_DETECT_AC_WEIGHT_DIFF(paramBk, paramVo) )
4374 {
4375 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_BK];
4376 fWeightChange = VOS_TRUE;
4377 }
4378 else if( SME_DETECT_AC_WEIGHT_DIFF(paramBe, paramVo) )
4379 {
4380 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_BE];
4381 fWeightChange = VOS_TRUE;
4382 }
4383 else if( SME_DETECT_AC_WEIGHT_DIFF(paramVi, paramVo) )
4384 {
4385 bACWeights[WLANTL_AC_VO] = bACWeights[WLANTL_AC_VI];
4386 fWeightChange = VOS_TRUE;
4387 }
4388 if(fWeightChange)
4389 {
4390 smsLog(pMac, LOGE, FL(" change AC weights (%d-%d-%d-%d)\n"), bACWeights[0], bACWeights[1],
4391 bACWeights[2], bACWeights[3]);
4392 WLANTL_SetACWeights(pMac->roam.gVosContext, bACWeights);
4393 }
4394 }
4395}
Jeff Johnson295189b2012-06-20 16:38:30 -07004396#ifdef WLAN_FEATURE_VOWIFI_11R
4397//Returns whether the current association is a 11r assoc or not
4398tANI_BOOLEAN csrRoamIs11rAssoc(tpAniSirGlobal pMac)
4399{
4400#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
4401 return csrNeighborRoamIs11rAssoc(pMac);
4402#else
4403 return eANI_BOOLEAN_FALSE;
4404#endif
4405}
4406#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004407#ifdef FEATURE_WLAN_CCX
4408//Returns whether the current association is a CCX assoc or not
4409tANI_BOOLEAN csrRoamIsCCXAssoc(tpAniSirGlobal pMac)
4410{
4411#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
4412 return csrNeighborRoamIsCCXAssoc(pMac);
4413#else
4414 return eANI_BOOLEAN_FALSE;
4415#endif
4416}
4417#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004418#ifdef FEATURE_WLAN_LFR
4419//Returns whether "Legacy Fast Roaming" is currently enabled...or not
4420tANI_BOOLEAN csrRoamIsFastRoamEnabled(tpAniSirGlobal pMac)
4421{
Madan Mohan Koyyalamudi9ce36ec2012-10-15 16:03:17 -07004422 return (pMac->roam.configParam.isFastRoamIniFeatureEnabled &&
Madan Mohan Koyyalamudi393a4342012-10-15 16:07:09 -07004423 (!csrIsConcurrentSessionRunning(pMac)));
Jeff Johnson04dd8a82012-06-29 20:41:40 -07004424}
4425#endif
4426
Jeff Johnson295189b2012-06-20 16:38:30 -07004427//Return true means the command can be release, else not
4428static tANI_BOOLEAN csrRoamProcessResults( tpAniSirGlobal pMac, tSmeCmd *pCommand,
4429 eCsrRoamCompleteResult Result, void *Context )
4430{
4431 tANI_BOOLEAN fReleaseCommand = eANI_BOOLEAN_TRUE;
4432 tSirBssDescription *pSirBssDesc = NULL;
4433 tSirMacAddr BroadcastMac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
4434 tCsrScanResult *pScanResult = NULL;
4435 tCsrRoamInfo roamInfo;
4436 sme_QosAssocInfo assocInfo;
4437 sme_QosCsrEventIndType ind_qos;//indication for QoS module in SME
4438 tANI_U8 acm_mask = 0; //HDD needs the ACM mask in the assoc rsp callback
4439 tDot11fBeaconIEs *pIes = NULL;
4440 tANI_U32 sessionId = pCommand->sessionId;
4441 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
4442 tCsrRoamProfile *pProfile = &pCommand->u.roamCmd.roamProfile;
4443 eRoamCmdStatus roamStatus;
4444 eCsrRoamResult roamResult;
4445 eHalStatus status;
4446 tANI_U32 key_timeout_interval = 0;
4447#ifdef WLAN_SOFTAP_FEATURE
4448 tSirSmeStartBssRsp *pSmeStartBssRsp = NULL;
4449#endif
4450
Jeff Johnson32d95a32012-09-10 13:15:23 -07004451 if(!pSession)
4452 {
4453 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
4454 return eANI_BOOLEAN_FALSE;
4455 }
4456
Jeff Johnson295189b2012-06-20 16:38:30 -07004457 smsLog( pMac, LOG1, FL("Processing ROAM results...\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07004458 switch( Result )
4459 {
4460 case eCsrJoinSuccess:
4461 // reset the IDLE timer
4462 // !!
4463 // !! fall through to the next CASE statement here is intentional !!
4464 // !!
4465 case eCsrReassocSuccess:
4466 if(eCsrReassocSuccess == Result)
4467 {
4468 ind_qos = SME_QOS_CSR_REASSOC_COMPLETE;
4469 }
4470 else
4471 {
4472 ind_qos = SME_QOS_CSR_ASSOC_COMPLETE;
4473 }
4474 // Success Join Response from LIM. Tell NDIS we are connected and save the
4475 // Connected state...
4476 smsLog(pMac, LOGW, FL("receives association indication\n"));
4477 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
4478 //always free the memory here
4479 if(pSession->pWpaRsnRspIE)
4480 {
4481 pSession->nWpaRsnRspIeLength = 0;
4482 palFreeMemory(pMac->hHdd, pSession->pWpaRsnRspIE);
4483 pSession->pWpaRsnRspIE = NULL;
4484 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004485#ifdef FEATURE_WLAN_WAPI
4486 if(pSession->pWapiRspIE)
4487 {
4488 pSession->nWapiRspIeLength = 0;
4489 palFreeMemory(pMac->hHdd, pSession->pWapiRspIE);
4490 pSession->pWapiRspIE = NULL;
4491 }
4492#endif /* FEATURE_WLAN_WAPI */
4493#ifdef FEATURE_WLAN_BTAMP_UT_RF
4494 //Reset counter so no join retry is needed.
4495 pSession->maxRetryCount = 0;
4496 csrRoamStopJoinRetryTimer(pMac, sessionId);
4497#endif
4498 /* This creates problem since we have not saved the connected profile.
4499 So moving this after saving the profile
4500 */
4501 //csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED );
4502 if( CSR_IS_INFRASTRUCTURE( pProfile ) )
4503 {
4504 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_ASSOCIATED;
4505 }
4506 else
4507 {
4508 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED;
4509 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004510 //Use the last connected bssdesc for reassoc-ing to the same AP.
4511 //NOTE: What to do when reassoc to a different AP???
4512 if( (eCsrHddIssuedReassocToSameAP == pCommand->u.roamCmd.roamReason) ||
4513 (eCsrSmeIssuedReassocToSameAP == pCommand->u.roamCmd.roamReason) )
4514 {
4515 pSirBssDesc = pSession->pConnectBssDesc;
4516 if(pSirBssDesc)
4517 {
4518 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4519 }
4520 }
4521 else
4522 {
4523
4524 if(pCommand->u.roamCmd.pRoamBssEntry)
4525 {
4526 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
4527 if(pScanResult != NULL)
4528 {
4529 pSirBssDesc = &pScanResult->Result.BssDescriptor;
4530 //this can be NULL
4531 pIes = (tDot11fBeaconIEs *)( pScanResult->Result.pvIes );
4532 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4533 }
4534 }
4535 }
4536 if( pSirBssDesc )
4537 {
Jeff Johnson295189b2012-06-20 16:38:30 -07004538 roamInfo.staId = HAL_STA_INVALID_IDX;
Jeff Johnson295189b2012-06-20 16:38:30 -07004539 csrRoamSaveConnectedInfomation(pMac, sessionId, pProfile, pSirBssDesc, pIes);
4540 //Save WPA/RSN IE
4541 csrRoamSaveSecurityRspIE(pMac, sessionId, pProfile->negotiatedAuthType, pSirBssDesc, pIes);
4542#ifdef FEATURE_WLAN_CCX
4543 roamInfo.isCCXAssoc = pSession->connectedProfile.isCCXAssoc;
4544#endif
4545
4546 // csrRoamStateChange also affects sub-state. Hence, csrRoamStateChange happens first and then
4547 // substate change.
4548 // Moving even save profile above so that below mentioned conditon is also met.
4549 // JEZ100225: Moved to after saving the profile. Fix needed in main/latest
4550 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07004551 // Make sure the Set Context is issued before link indication to NDIS. After link indication is
4552 // made to NDIS, frames could start flowing. If we have not set context with LIM, the frames
4553 // will be dropped for the security context may not be set properly.
4554 //
4555 // this was causing issues in the 2c_wlan_wep WHQL test when the SetContext was issued after the link
4556 // indication. (Link Indication happens in the profFSMSetConnectedInfra call).
4557 //
4558 // this reordering was done on titan_prod_usb branch and is being replicated here.
4559 //
4560
4561 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ) &&
4562 !pProfile->bWPSAssociation)
4563 {
4564 // Issue the set Context request to LIM to establish the Unicast STA context
4565 if( !HAL_STATUS_SUCCESS( csrRoamIssueSetContextReq( pMac, sessionId,
4566 pProfile->negotiatedUCEncryptionType,
4567 pSirBssDesc, &(pSirBssDesc->bssId),
4568 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ) ) ) // NO keys... these key parameters don't matter.
4569 {
4570 smsLog( pMac, LOGE, FL(" Set context for unicast fail\n") );
4571 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
4572 }
4573 // Issue the set Context request to LIM to establish the Broadcast STA context
4574 csrRoamIssueSetContextReq( pMac, sessionId, pProfile->negotiatedMCEncryptionType,
4575 pSirBssDesc, &BroadcastMac,
4576 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
4577 }
4578 else
4579 {
4580 //Need to wait for supplicant authtication
4581 roamInfo.fAuthRequired = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07004582 //Set the subestate to WaitForKey in case authentiation is needed
4583 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_WAIT_FOR_KEY, sessionId );
4584
Jeff Johnson295189b2012-06-20 16:38:30 -07004585 if(pProfile->bWPSAssociation)
4586 {
4587 key_timeout_interval = CSR_WAIT_FOR_WPS_KEY_TIMEOUT_PERIOD;
4588 }
4589 else
4590 {
4591 key_timeout_interval = CSR_WAIT_FOR_KEY_TIMEOUT_PERIOD;
4592 }
4593
4594 //Save sessionId in case of timeout
4595 pMac->roam.WaitForKeyTimerInfo.sessionId = (tANI_U8)sessionId;
4596 //This time should be long enough for the rest of the process plus setting key
4597 if(!HAL_STATUS_SUCCESS( csrRoamStartWaitForKeyTimer( pMac, key_timeout_interval ) ) )
4598 {
4599 //Reset our state so nothting is blocked.
4600 smsLog( pMac, LOGE, FL(" Failed to start pre-auth timer\n") );
4601 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
4602 }
4603 }
4604
4605 assocInfo.pBssDesc = pSirBssDesc; //could be NULL
4606 assocInfo.pProfile = pProfile;
Jeff Johnson295189b2012-06-20 16:38:30 -07004607 if(Context)
4608 {
4609 tSirSmeJoinRsp *pJoinRsp = (tSirSmeJoinRsp *)Context;
4610 tANI_U32 len;
Jeff Johnson295189b2012-06-20 16:38:30 -07004611 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4612 len = pJoinRsp->assocReqLength + pJoinRsp->assocRspLength + pJoinRsp->beaconLength;
4613#ifdef WLAN_FEATURE_VOWIFI_11R
4614 len += pJoinRsp->parsedRicRspLen;
4615#endif /* WLAN_FEATURE_VOWIFI_11R */
4616#ifdef FEATURE_WLAN_CCX
4617 len += pJoinRsp->tspecIeLen;
4618#endif
4619 if(len)
4620 {
4621 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd,
4622 (void **)&pSession->connectedInfo.pbFrames, len)))
4623 {
4624 if(HAL_STATUS_SUCCESS( palCopyMemory(pMac->hHdd,
4625 pSession->connectedInfo.pbFrames, pJoinRsp->frames, len) ))
4626 {
4627 pSession->connectedInfo.nAssocReqLength = pJoinRsp->assocReqLength;
4628 pSession->connectedInfo.nAssocRspLength = pJoinRsp->assocRspLength;
4629 pSession->connectedInfo.nBeaconLength = pJoinRsp->beaconLength;
4630#ifdef WLAN_FEATURE_VOWIFI_11R
4631 pSession->connectedInfo.nRICRspLength = pJoinRsp->parsedRicRspLen;
4632#endif /* WLAN_FEATURE_VOWIFI_11R */
4633#ifdef FEATURE_WLAN_CCX
4634 pSession->connectedInfo.nTspecIeLength = pJoinRsp->tspecIeLen;
4635#endif
4636 roamInfo.nAssocReqLength = pJoinRsp->assocReqLength;
4637 roamInfo.nAssocRspLength = pJoinRsp->assocRspLength;
4638 roamInfo.nBeaconLength = pJoinRsp->beaconLength;
4639 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4640 }
4641 else
4642 {
4643 smsLog(pMac, LOGE, "%s: Copying of memory failed for %d bytes !!!\n",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07004644 __func__, len);
Jeff Johnson295189b2012-06-20 16:38:30 -07004645 palFreeMemory( pMac->hHdd, pSession->connectedInfo.pbFrames );
4646 pSession->connectedInfo.pbFrames = NULL;
4647 }
4648 }
4649 }
4650 if(pCommand->u.roamCmd.fReassoc)
4651 {
4652 roamInfo.fReassocReq = roamInfo.fReassocRsp = eANI_BOOLEAN_TRUE;
4653 }
4654 pSession->connectedInfo.staId = ( tANI_U8 )pJoinRsp->staId;
4655 roamInfo.staId = ( tANI_U8 )pJoinRsp->staId;
4656 roamInfo.ucastSig = ( tANI_U8 )pJoinRsp->ucastSig;
4657 roamInfo.bcastSig = ( tANI_U8 )pJoinRsp->bcastSig;
4658 }
4659 else
4660 {
4661 if(pCommand->u.roamCmd.fReassoc)
4662 {
4663 roamInfo.fReassocReq = roamInfo.fReassocRsp = eANI_BOOLEAN_TRUE;
4664 roamInfo.nAssocReqLength = pSession->connectedInfo.nAssocReqLength;
4665 roamInfo.nAssocRspLength = pSession->connectedInfo.nAssocRspLength;
4666 roamInfo.nBeaconLength = pSession->connectedInfo.nBeaconLength;
4667 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
4668 }
4669 }
4670#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4671 // Indicate SME-QOS with reassoc success event, only after
4672 // copying the frames
4673 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, ind_qos, &assocInfo);
4674#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004675 roamInfo.pBssDesc = pSirBssDesc;
4676 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4677 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4678#ifndef WLAN_MDM_CODE_REDUCTION_OPT
4679 acm_mask = sme_QosGetACMMask(pMac, pSirBssDesc, NULL);
4680#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
4681 pSession->connectedProfile.acm_mask = acm_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07004682#ifdef FEATURE_WLAN_UAPSD_FW_TRG_FRAMES
4683 //start UAPSD if uapsd_mask is not 0 because HDD will configure for trigger frame
4684 //It may be better to let QoS do this????
4685 if( pSession->connectedProfile.modifyProfileFields.uapsd_mask )
4686 {
4687 smsLog(pMac, LOGE, " uapsd_mask (0x%X) set, request UAPSD now\n",
4688 pSession->connectedProfile.modifyProfileFields.uapsd_mask);
4689 pmcStartUapsd( pMac, NULL, NULL );
4690 }
4691#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07004692 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
4693 if( pSession->bRefAssocStartCnt > 0 )
4694 {
4695 pSession->bRefAssocStartCnt--;
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07004696 //Remove this code once SLM_Sessionization is supported
4697 //BMPS_WORKAROUND_NOT_NEEDED
4698 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) && ( csrIsConcurrentSessionRunning( pMac )))
Jeff Johnsone7245742012-09-05 17:12:55 -07004699 {
4700 pMac->roam.configParam.doBMPSWorkaround = 1;
4701 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004702 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_ASSOCIATED);
4703 }
4704
4705 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_NONE, eANI_BOOLEAN_TRUE);
Jeff Johnson295189b2012-06-20 16:38:30 -07004706 // reset the PMKID candidate list
4707 csrResetPMKIDCandidateList( pMac, sessionId );
4708 //Update TL's AC weight base on the current EDCA parameters
4709 //These parameters may change in the course of the connection, that sictuation
4710 //is not taken care here. This change is mainly to address a WIFI WMM test where
4711 //BE has a equal or higher TX priority than VI.
4712 //We only do this for infra link
4713 if( csrIsConnStateConnectedInfra(pMac, sessionId ) && pIes )
4714 {
4715 csrCheckAndUpdateACWeight(pMac, pIes);
4716 }
4717#ifdef FEATURE_WLAN_WAPI
4718 // reset the BKID candidate list
4719 csrResetBKIDCandidateList( pMac, sessionId );
4720#endif /* FEATURE_WLAN_WAPI */
4721 }
4722 else
4723 {
4724 smsLog(pMac, LOGW, " Roam command doesn't have a BSS desc\n");
4725 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004726 csrScanCancelIdleScan(pMac);
4727 //Not to signal link up because keys are yet to be set.
4728 //The linkup function will overwrite the sub-state that we need to keep at this point.
4729 if( !CSR_IS_WAIT_FOR_KEY(pMac, sessionId) )
4730 {
4731 csrRoamLinkUp(pMac, pSession->connectedProfile.bssid);
4732 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004733 //Check if BMPS is required and start the BMPS retry timer. Timer period is large
4734 //enough to let security and DHCP handshake succeed before entry into BMPS
4735 if (pmcShouldBmpsTimerRun(pMac))
4736 {
4737 if (pmcStartTrafficTimer(pMac, BMPS_TRAFFIC_TIMER_ALLOW_SECURITY_DHCP)
4738 != eHAL_STATUS_SUCCESS)
4739 {
4740 smsLog(pMac, LOGP, FL("Cannot start BMPS Retry timer"));
4741 }
4742 smsLog(pMac, LOG2, FL("BMPS Retry Timer already running or started"));
4743 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004744 break;
4745
Jeff Johnson295189b2012-06-20 16:38:30 -07004746 case eCsrStartBssSuccess:
4747 // on the StartBss Response, LIM is returning the Bss Description that we
4748 // are beaconing. Add this Bss Description to our scan results and
4749 // chain the Profile to this Bss Description. On a Start BSS, there was no
4750 // detected Bss description (no partner) so we issued the Start Bss to
4751 // start the Ibss without any Bss description. Lim was kind enough to return
4752 // the Bss Description that we start beaconing for the newly started Ibss.
4753 smsLog(pMac, LOG2, FL("receives start BSS ok indication\n"));
4754 status = eHAL_STATUS_FAILURE;
4755#ifdef WLAN_SOFTAP_FEATURE
4756 pSmeStartBssRsp = (tSirSmeStartBssRsp *)Context;
4757#endif
4758 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4759 if( CSR_IS_IBSS( pProfile ) )
4760 {
4761 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED;
4762 }
4763#ifdef WLAN_SOFTAP_FEATURE
4764 else if (CSR_IS_INFRA_AP(pProfile))
4765 {
4766 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED;
4767 }
4768#endif
4769 else
4770 {
4771 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED;
4772 }
4773 if( !CSR_IS_WDS_STA( pProfile ) )
4774 {
4775 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
4776#ifdef WLAN_SOFTAP_FEATURE
4777 pSirBssDesc = &pSmeStartBssRsp->bssDescription;
4778#else
4779 pSirBssDesc = (tSirBssDescription *)Context;
4780#endif
4781 if( !HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs( pMac, pSirBssDesc, &pIes )) )
4782 {
4783 smsLog(pMac, LOG2, FL("cannot parse IBSS IEs\n"));
4784 roamInfo.pBssDesc = pSirBssDesc;
4785 //We need to associate_complete it first, becasue Associate_start already indicated.
4786 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4787 eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_IBSS_START_FAILED );
4788 break;
4789 }
4790#ifdef WLAN_SOFTAP_FEATURE
4791 if (!CSR_IS_INFRA_AP(pProfile))
4792#endif
4793 {
4794 pScanResult = csrScanAppendBssDescription( pMac, pSirBssDesc, pIes );
4795 }
4796 csrRoamSaveConnectedBssDesc(pMac, sessionId, pSirBssDesc);
4797 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
4798 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
4799 if(pSirBssDesc)
4800 {
4801 csrRoamSaveConnectedInfomation(pMac, sessionId, pProfile, pSirBssDesc, pIes);
4802 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pSirBssDesc->bssId, sizeof(tCsrBssid));
4803 }
4804 //We are doen with the IEs so free it
4805 palFreeMemory(pMac->hHdd, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -07004806#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4807 {
4808 vos_log_ibss_pkt_type *pIbssLog;
4809 tANI_U32 bi;
4810
4811 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
4812 if(pIbssLog)
4813 {
4814 if(CSR_INVALID_SCANRESULT_HANDLE == pCommand->u.roamCmd.hBSSList)
4815 {
4816 //We start the IBSS (didn't find any matched IBSS out there)
4817 pIbssLog->eventId = WLAN_IBSS_EVENT_START_IBSS_RSP;
4818 }
4819 else
4820 {
4821 pIbssLog->eventId = WLAN_IBSS_EVENT_JOIN_IBSS_RSP;
4822 }
4823 if(pSirBssDesc)
4824 {
4825 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pSirBssDesc->bssId, 6);
4826 pIbssLog->operatingChannel = pSirBssDesc->channelId;
4827 }
4828 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &bi)))
4829 {
4830 //***U8 is not enough for beacon interval
4831 pIbssLog->beaconInterval = (v_U8_t)bi;
4832 }
4833 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
4834 }
4835 }
4836#endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4837 //Only set context for non-WDS_STA. We don't even need it for WDS_AP. But since the encryption
4838 //is WPA2-PSK so it won't matter.
Jeff Johnson295189b2012-06-20 16:38:30 -07004839#ifdef WLAN_SOFTAP_FEATURE
4840 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ) && !CSR_IS_INFRA_AP( pSession->pCurRoamProfile ))
4841 {
4842#else
4843 if( CSR_IS_ENC_TYPE_STATIC( pProfile->negotiatedUCEncryptionType ))
4844 {
4845#endif
4846 // Issue the set Context request to LIM to establish the Broadcast STA context for the Ibss.
4847 csrRoamIssueSetContextReq( pMac, sessionId,
4848 pProfile->negotiatedMCEncryptionType,
4849 pSirBssDesc, &BroadcastMac,
4850 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
4851 }
4852 }
4853 else
4854 {
4855 //Keep the state to eCSR_ROAMING_STATE_JOINING
4856 //Need to send join_req.
4857 if(pCommand->u.roamCmd.pRoamBssEntry)
4858 {
4859 if((pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link)))
4860 {
4861 pSirBssDesc = &pScanResult->Result.BssDescriptor;
4862 pIes = (tDot11fBeaconIEs *)( pScanResult->Result.pvIes );
4863 // Set the roaming substate to 'join attempt'...
4864 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_JOIN_REQ, sessionId);
4865 status = csrSendJoinReqMsg( pMac, sessionId, pSirBssDesc, pProfile, pIes );
4866 }
4867 }
4868 else
4869 {
4870 smsLog( pMac, LOGE, " StartBSS for WDS station with no BssDesc\n" );
4871 VOS_ASSERT( 0 );
4872 }
4873 }
4874 //Only tell upper layer is we start the BSS because Vista doesn't like multiple connection
4875 //indications. If we don't start the BSS ourself, handler of eSIR_SME_JOINED_NEW_BSS will
4876 //trigger the connection start indication in Vista
4877 if( !CSR_IS_JOIN_TO_IBSS( pProfile ) )
4878 {
4879 roamStatus = eCSR_ROAM_IBSS_IND;
4880 roamResult = eCSR_ROAM_RESULT_IBSS_STARTED;
4881 if( CSR_IS_WDS( pProfile ) )
4882 {
4883 roamStatus = eCSR_ROAM_WDS_IND;
4884 roamResult = eCSR_ROAM_RESULT_WDS_STARTED;
4885 }
4886#ifdef WLAN_SOFTAP_FEATURE
4887 if( CSR_IS_INFRA_AP( pProfile ) )
4888 {
4889 roamStatus = eCSR_ROAM_INFRA_IND;
4890 roamResult = eCSR_ROAM_RESULT_INFRA_STARTED;
4891 }
4892#endif
4893
4894 //Only tell upper layer is we start the BSS because Vista doesn't like multiple connection
4895 //indications. If we don't start the BSS ourself, handler of eSIR_SME_JOINED_NEW_BSS will
4896 //trigger the connection start indication in Vista
4897 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4898 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
4899 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
4900 if(CSR_INVALID_SCANRESULT_HANDLE == pCommand->u.roamCmd.hBSSList)
4901 {
4902 //We start the IBSS (didn't find any matched IBSS out there)
4903 roamInfo.pBssDesc = pSirBssDesc;
4904 }
4905#ifdef WLAN_SOFTAP_FEATURE
4906 roamInfo.staId = (tANI_U8)pSmeStartBssRsp->staId;
4907#endif
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -07004908 //Remove this code once SLM_Sessionization is supported
4909 //BMPS_WORKAROUND_NOT_NEEDED
4910 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) &&
Mohit Khanna349bc392012-09-11 17:24:52 -07004911 ( csrIsConcurrentSessionRunning( pMac )))
Jeff Johnsone7245742012-09-05 17:12:55 -07004912 {
4913 pMac->roam.configParam.doBMPSWorkaround = 1;
4914 }
Mohit Khanna349bc392012-09-11 17:24:52 -07004915
Jeff Johnson295189b2012-06-20 16:38:30 -07004916 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, roamStatus, roamResult );
4917 }
4918
4919 csrScanCancelIdleScan(pMac);
4920 //Only use this timer for ibss. BAP has its own timer for WDS
4921 if( CSR_IS_IBSS( pProfile) && CSR_INVALID_SCANRESULT_HANDLE != pCommand->u.roamCmd.hBSSList)
4922 {
4923 //start the join IBSS timer
4924 csrRoamStartIbssJoinTimer(pMac, sessionId, CSR_IBSS_JOIN_TIMEOUT_PERIOD); //interval
4925 pSession->ibss_join_pending = TRUE;
4926 }
4927 if( HAL_STATUS_SUCCESS( status ) )
4928 {
4929 //Already sent join_req for the WDS station
4930 fReleaseCommand = eANI_BOOLEAN_FALSE;
4931 }
4932 else if( CSR_IS_WDS_STA( pProfile ) )
4933 {
4934 //need to send stop BSS because we fail to send join_req
4935 csrRoamIssueDisassociateCmd( pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED );
4936 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4937 eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_STOPPED );
4938 }
Jeff Johnson295189b2012-06-20 16:38:30 -07004939 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004940 case eCsrStartBssFailure:
4941#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
4942 {
4943 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07004944 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
4945 if(pIbssLog)
4946 {
4947 pIbssLog->status = WLAN_IBSS_STATUS_FAILURE;
4948 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
4949 }
4950 }
4951#endif //#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07004952 roamStatus = eCSR_ROAM_IBSS_IND;
4953 roamResult = eCSR_ROAM_RESULT_IBSS_STARTED;
4954 if( CSR_IS_WDS( pProfile ) )
4955 {
4956 roamStatus = eCSR_ROAM_WDS_IND;
4957 roamResult = eCSR_ROAM_RESULT_WDS_STARTED;
4958 }
4959#ifdef WLAN_SOFTAP_FEATURE
4960 if( CSR_IS_INFRA_AP( pProfile ) )
4961 {
4962 roamStatus = eCSR_ROAM_INFRA_IND;
4963 roamResult = eCSR_ROAM_RESULT_INFRA_START_FAILED;
4964 }
4965#endif
4966 if(Context)
4967 {
4968 pSirBssDesc = (tSirBssDescription *)Context;
4969 }
4970 else
4971 {
4972 pSirBssDesc = NULL;
4973 }
4974 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4975 roamInfo.pBssDesc = pSirBssDesc;
4976 //We need to associate_complete it first, becasue Associate_start already indicated.
4977 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId, roamStatus, roamResult );
4978 csrSetDefaultDot11Mode( pMac );
4979 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004980 case eCsrSilentlyStopRoaming:
4981 // We are here because we try to start the same IBSS
4982 //No message to PE
4983 // return the roaming state to Joined.
4984 smsLog(pMac, LOGW, FL("receives silently roaming indication\n"));
4985 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId );
4986 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
4987 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
4988 roamInfo.pBssDesc = pSession->pConnectBssDesc;
4989 if( roamInfo.pBssDesc )
4990 {
4991 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &roamInfo.pBssDesc->bssId, sizeof(tCsrBssid));
4992 }
4993 //Since there is no change in the current state, simply pass back no result otherwise
4994 //HDD may be mistakenly mark to disconnected state.
4995 csrRoamCallCallback( pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
4996 eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_NONE );
Jeff Johnson295189b2012-06-20 16:38:30 -07004997 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07004998 case eCsrSilentlyStopRoamingSaveState:
4999 //We are here because we try to connect to the same AP
5000 //No message to PE
5001 smsLog(pMac, LOGW, FL("receives silently stop roaming indication\n"));
5002 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
5003
5004 //to aviod resetting the substate to NONE
5005 pMac->roam.curState[sessionId] = eCSR_ROAMING_STATE_JOINED;
5006 //No need to change substate to wai_for_key because there is no state change
5007 roamInfo.pBssDesc = pSession->pConnectBssDesc;
5008 if( roamInfo.pBssDesc )
5009 {
5010 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &roamInfo.pBssDesc->bssId, sizeof(tCsrBssid));
5011 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005012 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
5013 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
5014 roamInfo.nBeaconLength = pSession->connectedInfo.nBeaconLength;
5015 roamInfo.nAssocReqLength = pSession->connectedInfo.nAssocReqLength;
5016 roamInfo.nAssocRspLength = pSession->connectedInfo.nAssocRspLength;
5017 roamInfo.pbFrames = pSession->connectedInfo.pbFrames;
5018 roamInfo.staId = pSession->connectedInfo.staId;
5019 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
5020#if defined(VOSS_ENABLED)
5021 VOS_ASSERT( roamInfo.staId != 0 );
5022#endif
5023 pSession->bRefAssocStartCnt--;
5024 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
5025 eCSR_ROAM_ASSOCIATION_COMPLETION, eCSR_ROAM_RESULT_ASSOCIATED);
5026 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_ASSOCIATED, eANI_BOOLEAN_TRUE);
5027 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005028 case eCsrReassocFailure:
5029#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5030 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_REASSOC_FAILURE, NULL);
5031#endif
5032 case eCsrJoinWdsFailure:
5033 smsLog(pMac, LOGW, FL("failed to join WDS\n"));
5034 csrFreeConnectBssDesc(pMac, sessionId);
5035 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
5036 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
5037 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
5038 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
5039 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
5040 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
5041 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
5042 eCSR_ROAM_WDS_IND,
5043 eCSR_ROAM_RESULT_WDS_NOT_ASSOCIATED);
5044 //Need to issue stop_bss
5045 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005046 case eCsrJoinFailure:
5047 case eCsrNothingToJoin:
Jeff Johnsone7245742012-09-05 17:12:55 -07005048 case eCsrJoinFailureDueToConcurrency:
Jeff Johnson295189b2012-06-20 16:38:30 -07005049 default:
5050 {
5051 smsLog(pMac, LOGW, FL("receives no association indication\n"));
Madan Mohan Koyyalamudi85d140a2012-10-18 20:23:01 -07005052 smsLog(pMac, LOG1, FL("Assoc ref count %d\n"),
5053 pSession->bRefAssocStartCnt);
Jeff Johnson295189b2012-06-20 16:38:30 -07005054 if( CSR_IS_INFRASTRUCTURE( &pSession->connectedProfile ) ||
5055 CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ( pMac, sessionId ) )
5056 {
5057 //do not free for the other profiles as we need to send down stop BSS later
5058 csrFreeConnectBssDesc(pMac, sessionId);
5059 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
5060 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
5061 csrSetDefaultDot11Mode( pMac );
5062 }
5063
5064 switch( pCommand->u.roamCmd.roamReason )
5065 {
5066 // If this transition is because of an 802.11 OID, then we transition
5067 // back to INIT state so we sit waiting for more OIDs to be issued and
5068 // we don't start the IDLE timer.
Jeff Johnsone7245742012-09-05 17:12:55 -07005069 case eCsrSmeIssuedFTReassoc:
Jeff Johnson295189b2012-06-20 16:38:30 -07005070 case eCsrSmeIssuedAssocToSimilarAP:
5071 case eCsrHddIssued:
5072 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5073 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
5074 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
5075 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
5076 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07005077 /* Defeaturize this later if needed */
5078#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
5079 /* If Join fails while Handoff is in progress, indicate disassociated event to supplicant to reconnect */
5080 if (csrRoamIsHandoffInProgress(pMac))
5081 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005082 /* Should indicate neighbor roam algorithm about the connect failure here */
5083 csrNeighborRoamIndicateConnect(pMac, (tANI_U8)sessionId, VOS_STATUS_E_FAILURE);
5084 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005085#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005086 if(pSession->bRefAssocStartCnt > 0)
5087 {
5088 pSession->bRefAssocStartCnt--;
Jeff Johnsone7245742012-09-05 17:12:55 -07005089 if(eCsrJoinFailureDueToConcurrency == Result)
5090 {
5091 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
5092 eCSR_ROAM_ASSOCIATION_COMPLETION,
5093 eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL);
5094 }
5095 else
5096 {
5097 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
Jeff Johnson295189b2012-06-20 16:38:30 -07005098 eCSR_ROAM_ASSOCIATION_COMPLETION,
5099 eCSR_ROAM_RESULT_FAILURE);
Jeff Johnsone7245742012-09-05 17:12:55 -07005100 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005101 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005102 smsLog(pMac, LOG1, FL(" roam(reason %d) failed\n"), pCommand->u.roamCmd.roamReason);
5103#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5104 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5105#endif
5106 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5107 csrScanStartIdleScan(pMac);
5108#ifdef FEATURE_WLAN_BTAMP_UT_RF
5109 //For WDS STA. To fix the issue where the WDS AP side may be too busy by
5110 //BT activity and not able to recevie WLAN traffic. Retry the join
5111 if( CSR_IS_WDS_STA(pProfile) )
5112 {
5113 csrRoamStartJoinRetryTimer(pMac, sessionId, CSR_JOIN_RETRY_TIMEOUT_PERIOD);
5114 }
5115#endif
5116 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07005117 case eCsrHddIssuedReassocToSameAP:
5118 case eCsrSmeIssuedReassocToSameAP:
5119 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId);
5120
5121 csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.roamCmd.roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
5122#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5123 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5124#endif
5125 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5126 csrScanStartIdleScan(pMac);
5127 break;
5128 case eCsrForcedDisassoc:
5129 case eCsrForcedDeauth:
5130 case eCsrSmeIssuedIbssJoinFailure:
5131 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId);
5132
5133 if(eCsrSmeIssuedIbssJoinFailure == pCommand->u.roamCmd.roamReason)
5134 {
5135 // Notify HDD that IBSS join failed
5136 csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_IBSS_IND, eCSR_ROAM_RESULT_IBSS_JOIN_FAILED);
5137 }
5138 else
5139 {
5140 csrRoamCallCallback(pMac, sessionId, NULL,
5141 pCommand->u.roamCmd.roamId,
5142 eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
5143 }
5144#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5145 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
5146#endif
5147 csrRoamLinkDown(pMac, sessionId);
5148 csrScanStartIdleScan(pMac);
5149 break;
5150 case eCsrForcedIbssLeave:
5151 csrRoamCallCallback(pMac, sessionId, NULL,
5152 pCommand->u.roamCmd.roamId,
5153 eCSR_ROAM_IBSS_LEAVE,
5154 eCSR_ROAM_RESULT_IBSS_STOP);
5155 break;
5156 case eCsrForcedDisassocMICFailure:
5157 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5158
5159 csrRoamCallCallback(pMac, sessionId, NULL, pCommand->u.roamCmd.roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_MIC_FAILURE);
5160#ifndef WLAN_MDM_CODE_REDUCTION_OPT
5161 sme_QosCsrEventInd(pMac, (tANI_U8)sessionId, SME_QOS_CSR_DISCONNECT_REQ, NULL);
5162#endif
5163 csrScanStartIdleScan(pMac);
5164 break;
5165#ifdef WLAN_SOFTAP_FEATURE
5166 case eCsrStopBss:
5167 csrRoamCallCallback(pMac, sessionId, NULL,
5168 pCommand->u.roamCmd.roamId,
5169 eCSR_ROAM_INFRA_IND,
5170 eCSR_ROAM_RESULT_INFRA_STOPPED);
5171 break;
5172 case eCsrForcedDisassocSta:
5173 case eCsrForcedDeauthSta:
5174 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINED, sessionId);
5175 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
5176 {
5177 pSession = CSR_GET_SESSION(pMac, sessionId);
5178 if (!pSession)
5179 break;
5180
5181 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
5182 {
5183 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
5184 palCopyMemory(pMac->hHdd, roamInfo.peerMac,
5185 pCommand->u.roamCmd.peerMac, sizeof(tSirMacAddr));
5186 roamInfo.reasonCode = eCSR_ROAM_RESULT_FORCED;
5187 roamInfo.statusCode = eSIR_SME_SUCCESS;
5188 status = csrRoamCallCallback(pMac, sessionId,
5189 &roamInfo, pCommand->u.roamCmd.roamId,
5190 eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
5191 }
5192 }
5193 break;
5194#endif
5195 case eCsrLostLink1:
5196 // if lost link roam1 failed, then issue lost link Scan2 ...
5197 csrScanRequestLostLink2(pMac, sessionId);
5198 break;
5199 case eCsrLostLink2:
5200 // if lost link roam2 failed, then issue lost link scan3 ...
5201 csrScanRequestLostLink3(pMac, sessionId);
5202 break;
5203 case eCsrLostLink3:
5204 default:
5205 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_IDLE, sessionId );
5206
5207 //We are done with one round of lostlink roaming here
5208 csrScanHandleFailedLostlink3(pMac, sessionId);
5209 break;
5210 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005211 break;
5212 }
5213 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005214 return ( fReleaseCommand );
5215}
5216
Jeff Johnson295189b2012-06-20 16:38:30 -07005217eHalStatus csrRoamRegisterCallback(tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext)
5218{
5219 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -07005220 return (status);
5221}
5222
Jeff Johnson295189b2012-06-20 16:38:30 -07005223eHalStatus csrRoamCopyProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pDstProfile, tCsrRoamProfile *pSrcProfile)
5224{
5225 eHalStatus status = eHAL_STATUS_SUCCESS;
5226 tANI_U32 size = 0;
5227
5228 do
5229 {
5230 palZeroMemory(pMac->hHdd, pDstProfile, sizeof(tCsrRoamProfile));
5231 if(pSrcProfile->BSSIDs.numOfBSSIDs)
5232 {
5233 size = sizeof(tCsrBssid) * pSrcProfile->BSSIDs.numOfBSSIDs;
5234 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->BSSIDs.bssid, size);
5235 if(!HAL_STATUS_SUCCESS(status))
5236 {
5237 break;
5238 }
5239 pDstProfile->BSSIDs.numOfBSSIDs = pSrcProfile->BSSIDs.numOfBSSIDs;
5240 palCopyMemory(pMac->hHdd, pDstProfile->BSSIDs.bssid, pSrcProfile->BSSIDs.bssid, size);
5241 }
5242 if(pSrcProfile->SSIDs.numOfSSIDs)
5243 {
5244 size = sizeof(tCsrSSIDInfo) * pSrcProfile->SSIDs.numOfSSIDs;
5245 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->SSIDs.SSIDList, size);
5246 if(!HAL_STATUS_SUCCESS(status))
5247 {
5248 break;
5249 }
5250 pDstProfile->SSIDs.numOfSSIDs = pSrcProfile->SSIDs.numOfSSIDs;
5251 palCopyMemory(pMac->hHdd, pDstProfile->SSIDs.SSIDList, pSrcProfile->SSIDs.SSIDList, size);
5252 }
5253 if(pSrcProfile->nWPAReqIELength)
5254 {
5255 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pWPAReqIE, pSrcProfile->nWPAReqIELength);
5256 if(!HAL_STATUS_SUCCESS(status))
5257 {
5258 break;
5259 }
5260 pDstProfile->nWPAReqIELength = pSrcProfile->nWPAReqIELength;
5261 palCopyMemory(pMac->hHdd, pDstProfile->pWPAReqIE, pSrcProfile->pWPAReqIE, pSrcProfile->nWPAReqIELength);
5262 }
5263 if(pSrcProfile->nRSNReqIELength)
5264 {
5265 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pRSNReqIE, pSrcProfile->nRSNReqIELength);
5266 if(!HAL_STATUS_SUCCESS(status))
5267 {
5268 break;
5269 }
5270 pDstProfile->nRSNReqIELength = pSrcProfile->nRSNReqIELength;
5271 palCopyMemory(pMac->hHdd, pDstProfile->pRSNReqIE, pSrcProfile->pRSNReqIE, pSrcProfile->nRSNReqIELength);
5272 }
5273#ifdef FEATURE_WLAN_WAPI
5274 if(pSrcProfile->nWAPIReqIELength)
5275 {
5276 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pWAPIReqIE, pSrcProfile->nWAPIReqIELength);
5277 if(!HAL_STATUS_SUCCESS(status))
5278 {
5279 break;
5280 }
5281 pDstProfile->nWAPIReqIELength = pSrcProfile->nWAPIReqIELength;
5282 palCopyMemory(pMac->hHdd, pDstProfile->pWAPIReqIE, pSrcProfile->pWAPIReqIE, pSrcProfile->nWAPIReqIELength);
5283 }
5284#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07005285 if(pSrcProfile->nAddIEScanLength)
5286 {
5287 status = palAllocateMemory(pMac->hHdd,
5288 (void **)&pDstProfile->pAddIEScan, pSrcProfile->nAddIEScanLength);
5289 if(!HAL_STATUS_SUCCESS(status))
5290 {
5291 break;
5292 }
5293 pDstProfile->nAddIEScanLength = pSrcProfile->nAddIEScanLength;
5294 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEScan, pSrcProfile->pAddIEScan,
5295 pSrcProfile->nAddIEScanLength);
5296 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005297 if(pSrcProfile->nAddIEAssocLength)
5298 {
5299 status = palAllocateMemory(pMac->hHdd,
5300 (void **)&pDstProfile->pAddIEAssoc, pSrcProfile->nAddIEAssocLength);
5301 if(!HAL_STATUS_SUCCESS(status))
5302 {
5303 break;
5304 }
5305 pDstProfile->nAddIEAssocLength = pSrcProfile->nAddIEAssocLength;
5306 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEAssoc, pSrcProfile->pAddIEAssoc,
5307 pSrcProfile->nAddIEAssocLength);
5308 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005309 if(pSrcProfile->ChannelInfo.ChannelList)
5310 {
5311 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.numOfChannels);
5312 if(!HAL_STATUS_SUCCESS(status))
5313 {
5314 break;
5315 }
5316 pDstProfile->ChannelInfo.numOfChannels = pSrcProfile->ChannelInfo.numOfChannels;
5317 palCopyMemory(pMac->hHdd, pDstProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.ChannelList, pSrcProfile->ChannelInfo.numOfChannels);
5318 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005319 pDstProfile->AuthType = pSrcProfile->AuthType;
5320 pDstProfile->EncryptionType = pSrcProfile->EncryptionType;
5321 pDstProfile->mcEncryptionType = pSrcProfile->mcEncryptionType;
5322 pDstProfile->negotiatedUCEncryptionType = pSrcProfile->negotiatedUCEncryptionType;
5323 pDstProfile->negotiatedMCEncryptionType = pSrcProfile->negotiatedMCEncryptionType;
5324 pDstProfile->negotiatedAuthType = pSrcProfile->negotiatedAuthType;
5325 pDstProfile->BSSType = pSrcProfile->BSSType;
5326 pDstProfile->phyMode = pSrcProfile->phyMode;
5327 pDstProfile->csrPersona = pSrcProfile->csrPersona;
5328
5329#ifdef FEATURE_WLAN_WAPI
5330 if(csrIsProfileWapi(pSrcProfile))
5331 {
5332 if(pDstProfile->phyMode & eCSR_DOT11_MODE_11n)
5333 {
5334 pDstProfile->phyMode &= ~eCSR_DOT11_MODE_11n;
5335 }
5336 }
5337#endif /* FEATURE_WLAN_WAPI */
5338 pDstProfile->CBMode = pSrcProfile->CBMode;
5339 /*Save the WPS info*/
5340 pDstProfile->bWPSAssociation = pSrcProfile->bWPSAssociation;
5341 pDstProfile->uapsd_mask = pSrcProfile->uapsd_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07005342 pDstProfile->beaconInterval = pSrcProfile->beaconInterval;
5343#ifdef WLAN_SOFTAP_FEATURE
5344 pDstProfile->privacy = pSrcProfile->privacy;
5345 pDstProfile->fwdWPSPBCProbeReq = pSrcProfile->fwdWPSPBCProbeReq;
5346 pDstProfile->csr80211AuthType = pSrcProfile->csr80211AuthType;
5347 pDstProfile->dtimPeriod = pSrcProfile->dtimPeriod;
5348 pDstProfile->ApUapsdEnable = pSrcProfile->ApUapsdEnable;
5349 pDstProfile->SSIDs.SSIDList[0].ssidHidden = pSrcProfile->SSIDs.SSIDList[0].ssidHidden;
5350 pDstProfile->protEnabled = pSrcProfile->protEnabled;
5351 pDstProfile->obssProtEnabled = pSrcProfile->obssProtEnabled;
5352 pDstProfile->cfg_protection = pSrcProfile->cfg_protection;
5353 pDstProfile->wps_state = pSrcProfile->wps_state;
5354 pDstProfile->ieee80211d = pSrcProfile->ieee80211d;
5355#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005356 palCopyMemory(pMac->hHdd, &pDstProfile->Keys, &pSrcProfile->Keys, sizeof(pDstProfile->Keys));
Jeff Johnson295189b2012-06-20 16:38:30 -07005357#ifdef WLAN_FEATURE_VOWIFI_11R
5358 if (pSrcProfile->MDID.mdiePresent)
5359 {
5360 pDstProfile->MDID.mdiePresent = 1;
5361 pDstProfile->MDID.mobilityDomain = pSrcProfile->MDID.mobilityDomain;
5362 }
5363#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005364 }while(0);
5365
5366 if(!HAL_STATUS_SUCCESS(status))
5367 {
5368 csrReleaseProfile(pMac, pDstProfile);
5369 pDstProfile = NULL;
5370 }
5371
5372 return (status);
5373}
Jeff Johnson295189b2012-06-20 16:38:30 -07005374eHalStatus csrRoamCopyConnectedProfile(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pDstProfile )
5375{
5376 eHalStatus status = eHAL_STATUS_SUCCESS;
5377 tCsrRoamConnectedProfile *pSrcProfile = &pMac->roam.roamSession[sessionId].connectedProfile;
5378 do
5379 {
5380 palZeroMemory(pMac->hHdd, pDstProfile, sizeof(tCsrRoamProfile));
5381 if(pSrcProfile->bssid)
5382 {
5383 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->BSSIDs.bssid, sizeof(tCsrBssid));
5384 if(!HAL_STATUS_SUCCESS(status))
5385 {
5386 break;
5387 }
5388 pDstProfile->BSSIDs.numOfBSSIDs = 1;
5389 palCopyMemory(pMac->hHdd, pDstProfile->BSSIDs.bssid, pSrcProfile->bssid, sizeof(tCsrBssid));
5390 }
5391 if(pSrcProfile->SSID.ssId)
5392 {
5393 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->SSIDs.SSIDList, sizeof(tCsrSSIDInfo));
5394 if(!HAL_STATUS_SUCCESS(status))
5395 {
5396 break;
5397 }
5398 pDstProfile->SSIDs.numOfSSIDs = 1;
5399 pDstProfile->SSIDs.SSIDList[0].handoffPermitted = pSrcProfile->handoffPermitted;
5400 pDstProfile->SSIDs.SSIDList[0].ssidHidden = pSrcProfile->ssidHidden;
5401 palCopyMemory(pMac->hHdd, &pDstProfile->SSIDs.SSIDList[0].SSID, &pSrcProfile->SSID, sizeof(tSirMacSSid));
5402 }
Madan Mohan Koyyalamudiea22cdc2012-10-18 21:02:23 -07005403 if(pSrcProfile->nAddIEAssocLength)
5404 {
5405 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->pAddIEAssoc, pSrcProfile->nAddIEAssocLength);
5406 if(!HAL_STATUS_SUCCESS(status))
5407 {
5408 smsLog( pMac, LOGE, FL(" failed to allocate memory for additional IEs \n") );
5409 break;
5410 }
5411 pDstProfile->nAddIEAssocLength = pSrcProfile->nAddIEAssocLength;
5412 palCopyMemory(pMac->hHdd, pDstProfile->pAddIEAssoc, pSrcProfile->pAddIEAssoc,
5413 pSrcProfile->nAddIEAssocLength);
5414 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005415 status = palAllocateMemory(pMac->hHdd, (void **)&pDstProfile->ChannelInfo.ChannelList, 1);
5416 if(!HAL_STATUS_SUCCESS(status))
5417 {
5418 break;
5419 }
5420 pDstProfile->ChannelInfo.numOfChannels = 1;
5421 pDstProfile->ChannelInfo.ChannelList[0] = pSrcProfile->operationChannel;
Jeff Johnson295189b2012-06-20 16:38:30 -07005422 pDstProfile->AuthType.numEntries = 1;
5423 pDstProfile->AuthType.authType[0] = pSrcProfile->AuthType;
5424 pDstProfile->negotiatedAuthType = pSrcProfile->AuthType;
5425 pDstProfile->EncryptionType.numEntries = 1;
5426 pDstProfile->EncryptionType.encryptionType[0] = pSrcProfile->EncryptionType;
5427 pDstProfile->negotiatedUCEncryptionType = pSrcProfile->EncryptionType;
5428 pDstProfile->mcEncryptionType.numEntries = 1;
5429 pDstProfile->mcEncryptionType.encryptionType[0] = pSrcProfile->mcEncryptionType;
5430 pDstProfile->negotiatedMCEncryptionType = pSrcProfile->mcEncryptionType;
5431 pDstProfile->BSSType = pSrcProfile->BSSType;
5432 pDstProfile->CBMode = pSrcProfile->CBMode;
5433 palCopyMemory(pMac->hHdd, &pDstProfile->Keys, &pSrcProfile->Keys, sizeof(pDstProfile->Keys));
5434#ifdef WLAN_FEATURE_VOWIFI_11R
5435 if (pSrcProfile->MDID.mdiePresent)
5436 {
5437 pDstProfile->MDID.mdiePresent = 1;
5438 pDstProfile->MDID.mobilityDomain = pSrcProfile->MDID.mobilityDomain;
5439 }
5440#endif
5441
5442 }while(0);
5443
5444 if(!HAL_STATUS_SUCCESS(status))
5445 {
5446 csrReleaseProfile(pMac, pDstProfile);
5447 pDstProfile = NULL;
5448 }
5449
5450 return (status);
5451}
5452
Jeff Johnson295189b2012-06-20 16:38:30 -07005453eHalStatus csrRoamIssueConnect(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5454 tScanResultHandle hBSSList,
5455 eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate,
5456 tANI_BOOLEAN fClearScan)
5457{
5458 eHalStatus status = eHAL_STATUS_SUCCESS;
5459 tSmeCmd *pCommand;
5460
5461 pCommand = csrGetCommandBuffer(pMac);
5462 if(NULL == pCommand)
5463 {
5464 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5465 status = eHAL_STATUS_RESOURCES;
5466 }
5467 else
5468 {
5469 if( fClearScan )
5470 {
5471 csrScanCancelIdleScan(pMac);
5472 csrScanAbortMacScanNotForConnect(pMac);
5473 }
5474 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
5475 if(NULL == pProfile)
5476 {
5477 //We can roam now
5478 //Since pProfile is NULL, we need to build our own profile, set everything to default
5479 //We can only support open and no encryption
5480 pCommand->u.roamCmd.roamProfile.AuthType.numEntries = 1;
5481 pCommand->u.roamCmd.roamProfile.AuthType.authType[0] = eCSR_AUTH_TYPE_OPEN_SYSTEM;
5482 pCommand->u.roamCmd.roamProfile.EncryptionType.numEntries = 1;
5483 pCommand->u.roamCmd.roamProfile.EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_NONE;
5484 pCommand->u.roamCmd.roamProfile.csrPersona = VOS_STA_MODE;
5485 }
5486 else
5487 {
5488 //make a copy of the profile
5489 status = csrRoamCopyProfile(pMac, &pCommand->u.roamCmd.roamProfile, pProfile);
5490 if(HAL_STATUS_SUCCESS(status))
5491 {
5492 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_TRUE;
5493 }
5494 }
5495 pCommand->command = eSmeCommandRoam;
5496 pCommand->sessionId = (tANI_U8)sessionId;
5497 pCommand->u.roamCmd.hBSSList = hBSSList;
5498 pCommand->u.roamCmd.roamId = roamId;
5499 pCommand->u.roamCmd.roamReason = reason;
5500 //We need to free the BssList when the command is done
5501 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_TRUE;
5502 pCommand->u.roamCmd.fUpdateCurRoamProfile = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005503 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
5504 FL("CSR PERSONA=%d"),
5505 pCommand->u.roamCmd.roamProfile.csrPersona);
Jeff Johnson295189b2012-06-20 16:38:30 -07005506 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
5507 if( !HAL_STATUS_SUCCESS( status ) )
5508 {
5509 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
5510 csrReleaseCommandRoam( pMac, pCommand );
5511 }
5512 }
5513
5514 return (status);
5515}
Jeff Johnson295189b2012-06-20 16:38:30 -07005516eHalStatus csrRoamIssueReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5517 tCsrRoamModifyProfileFields *pMmodProfileFields,
5518 eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate)
5519{
5520 eHalStatus status = eHAL_STATUS_SUCCESS;
5521 tSmeCmd *pCommand;
5522
5523 pCommand = csrGetCommandBuffer(pMac);
5524 if(NULL == pCommand)
5525 {
5526 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5527 status = eHAL_STATUS_RESOURCES;
5528 }
5529 else
5530 {
5531 csrScanCancelIdleScan(pMac);
5532 csrScanAbortMacScanNotForConnect(pMac);
5533 if(pProfile)
5534 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005535 //This is likely trying to reassoc to different profile
5536 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
5537 //make a copy of the profile
5538 status = csrRoamCopyProfile(pMac, &pCommand->u.roamCmd.roamProfile, pProfile);
5539 pCommand->u.roamCmd.fUpdateCurRoamProfile = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005540 }
5541 else
5542 {
5543 status = csrRoamCopyConnectedProfile(pMac, sessionId, &pCommand->u.roamCmd.roamProfile);
5544 //how to update WPA/WPA2 info in roamProfile??
5545 pCommand->u.roamCmd.roamProfile.uapsd_mask = pMmodProfileFields->uapsd_mask;
Jeff Johnson295189b2012-06-20 16:38:30 -07005546 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005547 if(HAL_STATUS_SUCCESS(status))
5548 {
5549 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_TRUE;
5550 }
5551 pCommand->command = eSmeCommandRoam;
5552 pCommand->sessionId = (tANI_U8)sessionId;
5553 pCommand->u.roamCmd.roamId = roamId;
5554 pCommand->u.roamCmd.roamReason = reason;
5555 //We need to free the BssList when the command is done
5556 //For reassoc there is no BSS list, so the boolean set to false
5557 pCommand->u.roamCmd.hBSSList = CSR_INVALID_SCANRESULT_HANDLE;
5558 pCommand->u.roamCmd.fReleaseBssList = eANI_BOOLEAN_FALSE;
5559 pCommand->u.roamCmd.fReassoc = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005560 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
5561 if( !HAL_STATUS_SUCCESS( status ) )
5562 {
5563 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
5564 csrRoamCompletion(pMac, sessionId, NULL, pCommand, eCSR_ROAM_RESULT_FAILURE, eANI_BOOLEAN_FALSE);
5565 csrReleaseCommandRoam( pMac, pCommand );
5566 }
5567 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005568 return (status);
5569}
5570
Madan Mohan Koyyalamudi286b60e2012-10-11 12:59:07 -07005571eHalStatus csrRoamEnqueuePreauth(tpAniSirGlobal pMac, tANI_U32 sessionId, tpSirBssDescription pBssDescription,
5572 eCsrRoamReason reason, tANI_BOOLEAN fImmediate)
5573// , eCsrRoamReason reason, tANI_U32 roamId, tANI_BOOLEAN fImediate)
5574{
5575 eHalStatus status = eHAL_STATUS_SUCCESS;
5576 tSmeCmd *pCommand;
5577
5578 pCommand = csrGetCommandBuffer(pMac);
5579 if(NULL == pCommand)
5580 {
5581 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
5582 status = eHAL_STATUS_RESOURCES;
5583 }
5584 else
5585 {
5586 if(pBssDescription)
5587 {
5588 //copy over the parameters we need later
5589 pCommand->command = eSmeCommandRoam;
5590 pCommand->sessionId = (tANI_U8)sessionId;
5591 pCommand->u.roamCmd.roamReason = reason;
5592 //this is the important parameter
5593 //in this case we are using this field for the "next" BSS
5594 pCommand->u.roamCmd.pLastRoamBss = pBssDescription;
5595 status = csrQueueSmeCommand(pMac, pCommand, fImmediate);
5596 if( !HAL_STATUS_SUCCESS( status ) )
5597 {
5598 smsLog( pMac, LOGE, FL(" fail to enqueue preauth command, status = %d\n"), status );
5599 csrReleaseCommandPreauth( pMac, pCommand );
5600 }
5601 }
5602 else
5603 {
5604 //Return failure
5605 status = eHAL_STATUS_RESOURCES;
5606 }
5607 }
5608 return (status);
5609}
5610
5611eHalStatus csrRoamDequeuePreauth(tpAniSirGlobal pMac)
5612{
5613 tListElem *pEntry;
5614 tSmeCmd *pCommand;
5615 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
5616 if ( pEntry )
5617 {
5618 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
5619 if ( (eSmeCommandRoam == pCommand->command) &&
5620 (eCsrPerformPreauth == pCommand->u.roamCmd.roamReason))
5621 {
5622 smsLog( pMac, LOGE, FL("DQ-Command = %d, Reason = %d \n"),
5623 pCommand->command, pCommand->u.roamCmd.roamReason);
5624 if (csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK )) {
5625 csrReleaseCommandPreauth( pMac, pCommand );
5626 }
5627 } else {
5628 smsLog( pMac, LOGE, FL("Command = %d, Reason = %d \n"),
5629 pCommand->command, pCommand->u.roamCmd.roamReason);
5630 }
5631 }
5632 else {
5633 smsLog( pMac, LOGE, FL("pEntry NULL for eWNI_SME_FT_PRE_AUTH_RSP\n"));
5634 }
5635 smeProcessPendingQueue( pMac );
5636 return eHAL_STATUS_SUCCESS;
5637}
5638
Jeff Johnson295189b2012-06-20 16:38:30 -07005639eHalStatus csrRoamConnectWithBSSList(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5640 tScanResultHandle hBssListIn, tANI_U32 *pRoamId)
5641{
5642 eHalStatus status = eHAL_STATUS_FAILURE;
5643 tScanResultHandle hBSSList;
5644 tANI_U32 roamId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07005645 status = csrScanCopyResultList(pMac, hBssListIn, &hBSSList);
5646 if(HAL_STATUS_SUCCESS(status))
5647 {
5648 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5649 if(pRoamId)
5650 {
5651 *pRoamId = roamId;
5652 }
5653 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5654 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5655 if(!HAL_STATUS_SUCCESS(status))
5656 {
5657 smsLog(pMac, LOGE, FL("failed to start a join process\n"));
5658 csrScanResultPurge(pMac, hBSSList);
5659 }
5660 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005661 return (status);
5662}
5663
Jeff Johnson295189b2012-06-20 16:38:30 -07005664eHalStatus csrRoamConnect(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5665 tScanResultHandle hBssListIn, tANI_U32 *pRoamId)
5666{
5667 eHalStatus status = eHAL_STATUS_SUCCESS;
5668 tScanResultHandle hBSSList;
5669 tCsrScanResultFilter *pScanFilter;
5670 tANI_U32 roamId = 0;
5671 tANI_BOOLEAN fCallCallback = eANI_BOOLEAN_FALSE;
5672 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07005673 if (NULL == pProfile)
5674 {
5675 smsLog(pMac, LOGP, FL("No profile specified"));
5676 return eHAL_STATUS_FAILURE;
5677 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005678 smsLog(pMac, LOG1, FL("called BSSType = %d authtype = %d encryType = %d\n"),
5679 pProfile->BSSType, pProfile->AuthType.authType[0], pProfile->EncryptionType.encryptionType[0]);
Jeff Johnson295189b2012-06-20 16:38:30 -07005680 if( CSR_IS_WDS( pProfile ) &&
5681 !HAL_STATUS_SUCCESS( status = csrIsBTAMPAllowed( pMac, pProfile->operationChannel ) ) )
5682 {
5683 return status;
5684 }
5685 csrRoamCancelRoaming(pMac, sessionId);
5686 csrScanRemoveFreshScanCommand(pMac, sessionId);
5687 csrScanCancelIdleScan(pMac);
5688 //Only abort the scan if it is not used for other roam/connect purpose
5689 csrScanAbortMacScan(pMac);
Jeff Johnson295189b2012-06-20 16:38:30 -07005690#ifdef WLAN_SOFTAP_FEATURE
5691 if (!vos_concurrent_sessions_running() && (VOS_STA_SAP_MODE == pProfile->csrPersona))//In case of AP mode we do not want idle mode scan
5692 {
5693 csrScanDisable(pMac);
5694 }
5695#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07005696 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssued);
5697 //Check whether ssid changes
5698 if(csrIsConnStateConnected(pMac, sessionId))
5699 {
5700 if(pProfile->SSIDs.numOfSSIDs && !csrIsSsidInList(pMac, &pSession->connectedProfile.SSID, &pProfile->SSIDs))
5701 {
5702 csrRoamIssueDisassociateCmd(pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED);
5703 }
5704 }
5705#ifdef FEATURE_WLAN_BTAMP_UT_RF
5706 pSession->maxRetryCount = CSR_JOIN_MAX_RETRY_COUNT;
5707#endif
5708 if(CSR_INVALID_SCANRESULT_HANDLE != hBssListIn)
5709 {
5710 smsLog(pMac, LOGW, FL("is called with BSSList\n"));
5711 status = csrRoamConnectWithBSSList(pMac, sessionId, pProfile, hBssListIn, pRoamId);
5712 if(pRoamId)
5713 {
5714 roamId = *pRoamId;
5715 }
5716 if(!HAL_STATUS_SUCCESS(status))
5717 {
5718 fCallCallback = eANI_BOOLEAN_TRUE;
5719 }
5720 }
5721 else
5722 {
5723 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
5724 if(HAL_STATUS_SUCCESS(status))
5725 {
5726 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
5727 //Try to connect to any BSS
5728 if(NULL == pProfile)
5729 {
5730 //No encryption
5731 pScanFilter->EncryptionType.numEntries = 1;
5732 pScanFilter->EncryptionType.encryptionType[0] = eCSR_ENCRYPT_TYPE_NONE;
5733 }//we don't have a profile
5734 else
5735 {
5736 //Here is the profile we need to connect to
5737 status = csrRoamPrepareFilterFromProfile(pMac, pProfile, pScanFilter);
5738 }//We have a profile
5739 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5740 if(pRoamId)
5741 {
5742 *pRoamId = roamId;
5743 }
5744
5745 if(HAL_STATUS_SUCCESS(status))
5746 {
5747 /*Save the WPS info*/
5748 if(NULL != pProfile)
5749 {
5750 pScanFilter->bWPSAssociation = pProfile->bWPSAssociation;
5751 }
5752 else
5753 {
5754 pScanFilter->bWPSAssociation = 0;
5755 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005756 do
5757 {
5758 if( (pProfile && CSR_IS_WDS_AP( pProfile ) )
5759#ifdef WLAN_SOFTAP_FEATURE
5760 || (pProfile && CSR_IS_INFRA_AP ( pProfile ))
5761#endif
5762 )
5763 {
5764 //This can be start right away
5765 status = csrRoamIssueConnect(pMac, sessionId, pProfile, NULL, eCsrHddIssued,
5766 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5767 if(!HAL_STATUS_SUCCESS(status))
5768 {
5769 fCallCallback = eANI_BOOLEAN_TRUE;
5770 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005771 break;
5772 }
5773 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
Mohit Khanna23863762012-09-11 17:40:09 -07005774 smsLog(pMac, LOG1, "************ csrScanGetResult Status ********* %d\n", status);
Jeff Johnson295189b2012-06-20 16:38:30 -07005775 if(HAL_STATUS_SUCCESS(status))
5776 {
Jeff Johnson295189b2012-06-20 16:38:30 -07005777 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5778 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5779 if(!HAL_STATUS_SUCCESS(status))
5780 {
5781 csrScanResultPurge(pMac, hBSSList);
5782 fCallCallback = eANI_BOOLEAN_TRUE;
5783 }
5784 }//Have scan result
5785 else if(NULL != pProfile)
5786 {
5787 //Check whether it is for start ibss
5788 if(CSR_IS_START_IBSS(pProfile))
5789 {
5790 status = csrRoamIssueConnect(pMac, sessionId, pProfile, NULL, eCsrHddIssued,
5791 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5792 if(!HAL_STATUS_SUCCESS(status))
5793 {
5794 smsLog(pMac, LOGE, " CSR failed to issue startIBSS command with status = 0x%08X\n", status);
5795 fCallCallback = eANI_BOOLEAN_TRUE;
5796 }
5797 }
5798 else
5799 {
5800 //scan for this SSID
5801 status = csrScanForSSID(pMac, sessionId, pProfile, roamId);
5802 if(!HAL_STATUS_SUCCESS(status))
5803 {
5804 fCallCallback = eANI_BOOLEAN_TRUE;
5805 }
5806 }
5807 }
5808 else
5809 {
5810 fCallCallback = eANI_BOOLEAN_TRUE;
5811 }
5812 } while (0);
5813 if(NULL != pProfile)
5814 {
5815 //we need to free memory for filter if profile exists
5816 csrFreeScanFilter(pMac, pScanFilter);
5817 }
5818 }//Got the scan filter from profile
5819
5820 palFreeMemory(pMac->hHdd, pScanFilter);
5821 }//allocated memory for pScanFilter
5822 }//No Bsslist coming in
5823 //tell the caller if we fail to trigger a join request
5824 if( fCallCallback )
5825 {
5826 csrRoamCallCallback(pMac, sessionId, NULL, roamId, eCSR_ROAM_FAILED, eCSR_ROAM_RESULT_FAILURE);
5827 }
5828
5829 return (status);
5830}
Jeff Johnson295189b2012-06-20 16:38:30 -07005831eHalStatus csrRoamReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
5832 tCsrRoamModifyProfileFields modProfileFields,
5833 tANI_U32 *pRoamId)
5834{
5835 eHalStatus status = eHAL_STATUS_SUCCESS;
5836 tANI_BOOLEAN fCallCallback = eANI_BOOLEAN_TRUE;
5837 tANI_U32 roamId = 0;
5838 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -07005839 if (NULL == pProfile)
5840 {
5841 smsLog(pMac, LOGP, FL("No profile specified"));
5842 return eHAL_STATUS_FAILURE;
5843 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005844 smsLog(pMac, LOG1, FL("called BSSType = %d authtype = %d encryType = %d\n"), pProfile->BSSType, pProfile->AuthType.authType[0], pProfile->EncryptionType.encryptionType[0]);
5845 csrRoamCancelRoaming(pMac, sessionId);
5846 csrScanRemoveFreshScanCommand(pMac, sessionId);
5847 csrScanCancelIdleScan(pMac);
5848 csrScanAbortMacScanNotForConnect(pMac);
5849 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssuedReassocToSameAP);
Jeff Johnson295189b2012-06-20 16:38:30 -07005850 if(csrIsConnStateConnected(pMac, sessionId))
5851 {
5852 if(pProfile)
5853 {
5854 if(pProfile->SSIDs.numOfSSIDs &&
5855 csrIsSsidInList(pMac, &pSession->connectedProfile.SSID, &pProfile->SSIDs))
5856 {
5857 fCallCallback = eANI_BOOLEAN_FALSE;
5858 }
5859 else
5860 {
5861 smsLog(pMac, LOG1, FL("Not connected to the same SSID asked in the profile\n"));
5862 }
5863 }
5864 else if(!palEqualMemory(pMac->hHdd, &modProfileFields,
5865 &pSession->connectedProfile.modifyProfileFields,
5866 sizeof(tCsrRoamModifyProfileFields)))
5867 {
5868 fCallCallback = eANI_BOOLEAN_FALSE;
5869 }
5870 else
5871 {
5872 smsLog(pMac, LOG1, FL("Either the profile is NULL or none of the fields "
5873 "in tCsrRoamModifyProfileFields got modified\n"));
5874 }
5875 }
5876 else
5877 {
5878 smsLog(pMac, LOG1, FL("Not connected! No need to reassoc\n"));
5879 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005880 if(!fCallCallback)
5881 {
5882 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5883 if(pRoamId)
5884 {
5885 *pRoamId = roamId;
5886 }
5887
Jeff Johnson295189b2012-06-20 16:38:30 -07005888 status = csrRoamIssueReassoc(pMac, sessionId, pProfile, &modProfileFields,
5889 eCsrHddIssuedReassocToSameAP, roamId, eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -07005890 }
5891 else
5892 {
5893 status = csrRoamCallCallback(pMac, sessionId, NULL, roamId,
5894 eCSR_ROAM_FAILED, eCSR_ROAM_RESULT_FAILURE);
5895 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005896 return status;
5897}
Jeff Johnson295189b2012-06-20 16:38:30 -07005898eHalStatus csrRoamJoinLastProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
5899{
5900 eHalStatus status = eHAL_STATUS_FAILURE;
5901 tScanResultHandle hBSSList = NULL;
5902 tCsrScanResultFilter *pScanFilter = NULL;
5903 tANI_U32 roamId;
5904 tCsrRoamProfile *pProfile = NULL;
5905 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07005906
5907 if(!pSession)
5908 {
5909 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
5910 return eHAL_STATUS_FAILURE;
5911 }
5912
Jeff Johnson295189b2012-06-20 16:38:30 -07005913 do
5914 {
5915 if(pSession->pCurRoamProfile)
5916 {
5917 csrScanCancelIdleScan(pMac);
5918 csrScanAbortMacScanNotForConnect(pMac);
5919 //We have to make a copy of pCurRoamProfile because it will be free inside csrRoamIssueConnect
5920 status = palAllocateMemory(pMac->hHdd, (void **)&pProfile, sizeof(tCsrRoamProfile));
5921 if(!HAL_STATUS_SUCCESS(status))
5922 break;
5923 palZeroMemory(pMac->hHdd, pProfile, sizeof(tCsrRoamProfile));
5924 status = csrRoamCopyProfile(pMac, pProfile, pSession->pCurRoamProfile);
5925 if(!HAL_STATUS_SUCCESS(status))
5926 break;
5927 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
5928 if(!HAL_STATUS_SUCCESS(status))
5929 {
5930 break;
5931 }
5932 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
5933 status = csrRoamPrepareFilterFromProfile(pMac, pProfile, pScanFilter);
5934 if(!HAL_STATUS_SUCCESS(status))
5935 {
5936 break;
5937 }
5938 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
5939 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
5940 if(HAL_STATUS_SUCCESS(status))
5941 {
5942 //we want to put the last connected BSS to the very beginning, if possible
5943 csrMoveBssToHeadFromBSSID(pMac, &pSession->connectedProfile.bssid, hBSSList);
5944 status = csrRoamIssueConnect(pMac, sessionId, pProfile, hBSSList, eCsrHddIssued,
5945 roamId, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
5946 if(!HAL_STATUS_SUCCESS(status))
5947 {
5948 csrScanResultPurge(pMac, hBSSList);
5949 break;
5950 }
5951 }
5952 else
5953 {
5954 //Do a scan on this profile
5955 //scan for this SSID only in case the AP suppresses SSID
5956 status = csrScanForSSID(pMac, sessionId, pProfile, roamId);
5957 if(!HAL_STATUS_SUCCESS(status))
5958 {
5959 break;
5960 }
5961 }
5962 }//We have a profile
5963 else
5964 {
5965 smsLog(pMac, LOGW, FL("cannot find a roaming profile\n"));
5966 break;
5967 }
5968 }while(0);
5969 if(pScanFilter)
5970 {
5971 csrFreeScanFilter(pMac, pScanFilter);
5972 palFreeMemory(pMac->hHdd, pScanFilter);
5973 }
5974 if(NULL != pProfile)
5975 {
5976 csrReleaseProfile(pMac, pProfile);
5977 palFreeMemory(pMac->hHdd, pProfile);
5978 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005979 return (status);
5980}
Jeff Johnson295189b2012-06-20 16:38:30 -07005981eHalStatus csrRoamReconnect(tpAniSirGlobal pMac, tANI_U32 sessionId)
5982{
5983 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005984 if(csrIsConnStateConnected(pMac, sessionId))
5985 {
5986 status = csrRoamIssueDisassociateCmd(pMac, sessionId, eCSR_DISCONNECT_REASON_UNSPECIFIED);
5987 if(HAL_STATUS_SUCCESS(status))
5988 {
5989 status = csrRoamJoinLastProfile(pMac, sessionId);
5990 }
5991 }
Jeff Johnson295189b2012-06-20 16:38:30 -07005992 return (status);
5993}
5994
Jeff Johnson295189b2012-06-20 16:38:30 -07005995eHalStatus csrRoamConnectToLastProfile(tpAniSirGlobal pMac, tANI_U32 sessionId)
5996{
5997 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07005998 smsLog(pMac, LOGW, FL("is called\n"));
5999 csrRoamCancelRoaming(pMac, sessionId);
6000 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrHddIssued);
6001 if(csrIsConnStateDisconnected(pMac, sessionId))
6002 {
6003 status = csrRoamJoinLastProfile(pMac, sessionId);
6004 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006005 return (status);
6006}
6007
Jeff Johnson295189b2012-06-20 16:38:30 -07006008eHalStatus csrRoamProcessDisassocDeauth( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fDisassoc, tANI_BOOLEAN fMICFailure )
6009{
6010 eHalStatus status = eHAL_STATUS_SUCCESS;
6011 tANI_BOOLEAN fComplete = eANI_BOOLEAN_FALSE;
6012 eCsrRoamSubState NewSubstate;
6013 tANI_U32 sessionId = pCommand->sessionId;
6014
6015 // change state to 'Roaming'...
6016 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId );
6017
6018 if ( csrIsConnStateIbss( pMac, sessionId ) )
6019 {
6020 // If we are in an IBSS, then stop the IBSS...
6021 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
6022 fComplete = (!HAL_STATUS_SUCCESS(status));
6023 }
6024 else if ( csrIsConnStateInfra( pMac, sessionId ) )
6025 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07006026 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 -07006027 pMac->roam.ucACWeights[2], pMac->roam.ucACWeights[3]);
6028 //Restore AC weight in case we change it
6029 WLANTL_SetACWeights(pMac->roam.gVosContext, pMac->roam.ucACWeights);
6030 // in Infrasturcture, we need to disassociate from the Infrastructure network...
6031 NewSubstate = eCSR_ROAM_SUBSTATE_DISASSOC_FORCED;
6032 if(eCsrSmeIssuedDisassocForHandoff == pCommand->u.roamCmd.roamReason)
6033 {
6034 NewSubstate = eCSR_ROAM_SUBSTATE_DISASSOC_HANDOFF;
6035 }
6036 if( fDisassoc )
6037 {
6038 status = csrRoamIssueDisassociate( pMac, sessionId, NewSubstate, fMICFailure );
6039 }
6040 else
6041 {
6042 status = csrRoamIssueDeauth( pMac, sessionId, eCSR_ROAM_SUBSTATE_DEAUTH_REQ );
6043 }
6044 fComplete = (!HAL_STATUS_SUCCESS(status));
6045 }
6046 else if ( csrIsConnStateWds( pMac, sessionId ) )
6047 {
6048 if( CSR_IS_WDS_AP( &pMac->roam.roamSession[sessionId].connectedProfile ) )
6049 {
6050 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
6051 fComplete = (!HAL_STATUS_SUCCESS(status));
6052 }
6053 //This has to be WDS station
6054 else if( csrIsConnStateConnectedWds( pMac, sessionId ) ) //This has to be WDS station
6055 {
6056
6057 pCommand->u.roamCmd.fStopWds = eANI_BOOLEAN_TRUE;
6058 if( fDisassoc )
6059 {
6060 status = csrRoamIssueDisassociate( pMac, sessionId,
6061 eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, fMICFailure );
6062 fComplete = (!HAL_STATUS_SUCCESS(status));
6063 }
6064 }
6065 } else {
6066 // we got a dis-assoc request while not connected to any peer
6067 // just complete the command
6068 fComplete = eANI_BOOLEAN_TRUE;
6069 status = eHAL_STATUS_FAILURE;
6070 }
6071 if(fComplete)
6072 {
6073 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6074 }
6075
6076 if(HAL_STATUS_SUCCESS(status))
6077 {
6078 if ( csrIsConnStateInfra( pMac, sessionId ) )
6079 {
6080 //Set the state to disconnect here
6081 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
6082 }
6083 }
6084 return (status);
6085}
6086
Jeff Johnson295189b2012-06-20 16:38:30 -07006087/* This is been removed from latest code base */
6088/*
6089static eHalStatus csrRoamProcessStopBss( tpAniSirGlobal pMac, tSmeCmd *pCommand )
6090{
6091 eHalStatus status;
6092 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07006093 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING );
6094 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ );
Jeff Johnson295189b2012-06-20 16:38:30 -07006095 return ( status );
6096}
6097*/
6098
Jeff Johnson295189b2012-06-20 16:38:30 -07006099eHalStatus csrRoamIssueDisassociateCmd( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason )
6100{
6101 eHalStatus status = eHAL_STATUS_SUCCESS;
6102 tSmeCmd *pCommand;
6103 tANI_BOOLEAN fHighPriority = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006104 do
6105 {
6106 smsLog( pMac, LOGE, FL(" reason = %d\n"), reason );
6107 pCommand = csrGetCommandBuffer( pMac );
6108 if ( !pCommand )
6109 {
6110 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6111 status = eHAL_STATUS_RESOURCES;
6112 break;
6113 }
6114 //Change the substate in case it is wait-for-key
6115 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
6116 {
6117 csrRoamStopWaitForKeyTimer( pMac );
6118 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
6119 }
6120 pCommand->command = eSmeCommandRoam;
6121 pCommand->sessionId = (tANI_U8)sessionId;
6122 switch ( reason )
6123 {
6124 case eCSR_DISCONNECT_REASON_MIC_ERROR:
6125 pCommand->u.roamCmd.roamReason = eCsrForcedDisassocMICFailure;
6126 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006127 case eCSR_DISCONNECT_REASON_DEAUTH:
6128 pCommand->u.roamCmd.roamReason = eCsrForcedDeauth;
6129 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006130 case eCSR_DISCONNECT_REASON_HANDOFF:
6131 fHighPriority = eANI_BOOLEAN_TRUE;
6132 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedDisassocForHandoff;
6133 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006134 case eCSR_DISCONNECT_REASON_UNSPECIFIED:
6135 case eCSR_DISCONNECT_REASON_DISASSOC:
6136 pCommand->u.roamCmd.roamReason = eCsrForcedDisassoc;
6137 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006138 case eCSR_DISCONNECT_REASON_IBSS_JOIN_FAILURE:
6139 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedIbssJoinFailure;
6140 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006141 case eCSR_DISCONNECT_REASON_IBSS_LEAVE:
6142 pCommand->u.roamCmd.roamReason = eCsrForcedIbssLeave;
6143 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07006144 default:
6145 break;
6146 }
6147 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6148 if( !HAL_STATUS_SUCCESS( status ) )
6149 {
6150 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6151 csrReleaseCommandRoam( pMac, pCommand );
6152 }
6153 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07006154 return( status );
6155}
6156
Jeff Johnson295189b2012-06-20 16:38:30 -07006157eHalStatus csrRoamIssueStopBssCmd( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_BOOLEAN fHighPriority )
6158{
6159 eHalStatus status = eHAL_STATUS_SUCCESS;
6160 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07006161 pCommand = csrGetCommandBuffer( pMac );
6162 if ( NULL != pCommand )
6163 {
6164 //Change the substate in case it is wait-for-key
6165 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId) )
6166 {
6167 csrRoamStopWaitForKeyTimer( pMac );
6168 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
6169 }
6170 pCommand->command = eSmeCommandRoam;
6171 pCommand->sessionId = (tANI_U8)sessionId;
6172 pCommand->u.roamCmd.roamReason = eCsrStopBss;
6173 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6174 if( !HAL_STATUS_SUCCESS( status ) )
6175 {
6176 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6177 csrReleaseCommandRoam( pMac, pCommand );
6178 }
6179 }
6180 else
6181 {
6182 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6183 status = eHAL_STATUS_RESOURCES;
6184 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006185 return ( status );
6186}
6187
Jeff Johnson295189b2012-06-20 16:38:30 -07006188eHalStatus csrRoamDisconnectInternal(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason)
6189{
6190 eHalStatus status = eHAL_STATUS_SUCCESS;
6191 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006192
6193 if(!pSession)
6194 {
6195 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6196 return eHAL_STATUS_FAILURE;
6197 }
6198
Jeff Johnson295189b2012-06-20 16:38:30 -07006199#ifdef FEATURE_WLAN_BTAMP_UT_RF
6200 //Stop te retry
6201 pSession->maxRetryCount = 0;
6202 csrRoamStopJoinRetryTimer(pMac, sessionId);
6203#endif
6204 //Not to call cancel roaming here
6205 //Only issue disconnect when necessary
6206 if(csrIsConnStateConnected(pMac, sessionId) || csrIsBssTypeIBSS(pSession->connectedProfile.BSSType)
6207 || csrIsBssTypeWDS(pSession->connectedProfile.BSSType)
6208 || csrIsRoamCommandWaitingForSession(pMac, sessionId) )
6209
6210 {
6211 smsLog(pMac, LOG2, FL("called\n"));
6212 status = csrRoamIssueDisassociateCmd(pMac, sessionId, reason);
6213 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006214 return (status);
6215}
6216
Jeff Johnson295189b2012-06-20 16:38:30 -07006217eHalStatus csrRoamDisconnect(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamDisconnectReason reason)
6218{
6219 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006220
6221 if(!pSession)
6222 {
6223 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6224 return eHAL_STATUS_FAILURE;
6225 }
6226
Jeff Johnson295189b2012-06-20 16:38:30 -07006227 csrRoamCancelRoaming(pMac, sessionId);
6228 pSession->ibss_join_pending = FALSE;
6229 csrRoamStopIbssJoinTimer(pMac, sessionId);
6230 csrRoamRemoveDuplicateCommand(pMac, sessionId, NULL, eCsrForcedDisassoc);
6231
6232 return (csrRoamDisconnectInternal(pMac, sessionId, reason));
6233}
6234
Jeff Johnson295189b2012-06-20 16:38:30 -07006235eHalStatus csrRoamSaveConnectedInfomation(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
6236 tSirBssDescription *pSirBssDesc, tDot11fBeaconIEs *pIes)
6237{
6238 eHalStatus status = eHAL_STATUS_SUCCESS;
6239 tDot11fBeaconIEs *pIesTemp = pIes;
6240 tANI_U8 index;
6241 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
6242 tCsrRoamConnectedProfile *pConnectProfile = &pSession->connectedProfile;
Jeff Johnson32d95a32012-09-10 13:15:23 -07006243
6244 if(!pSession)
6245 {
6246 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6247 return eHAL_STATUS_FAILURE;
6248 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006249
6250 palZeroMemory(pMac->hHdd, &pSession->connectedProfile, sizeof(tCsrRoamConnectedProfile));
6251 pConnectProfile->AuthType = pProfile->negotiatedAuthType;
6252 pConnectProfile->AuthInfo = pProfile->AuthType;
6253 pConnectProfile->CBMode = pProfile->CBMode; //*** this may not be valid
6254 pConnectProfile->EncryptionType = pProfile->negotiatedUCEncryptionType;
6255 pConnectProfile->EncryptionInfo = pProfile->EncryptionType;
6256 pConnectProfile->mcEncryptionType = pProfile->negotiatedMCEncryptionType;
6257 pConnectProfile->mcEncryptionInfo = pProfile->mcEncryptionType;
6258 pConnectProfile->BSSType = pProfile->BSSType;
6259 pConnectProfile->modifyProfileFields.uapsd_mask = pProfile->uapsd_mask;
6260 pConnectProfile->operationChannel = pSirBssDesc->channelId;
Jeff Johnsone7245742012-09-05 17:12:55 -07006261 pConnectProfile->beaconInterval = pSirBssDesc->beaconInterval;
6262
Jeff Johnson295189b2012-06-20 16:38:30 -07006263 palCopyMemory(pMac->hHdd, &pConnectProfile->Keys, &pProfile->Keys, sizeof(tCsrKeys));
Madan Mohan Koyyalamudiea22cdc2012-10-18 21:02:23 -07006264 /* saving the addional IE`s like Hot spot indication element and extended capabilities */
6265 if(pProfile->nAddIEAssocLength)
6266 {
6267 status = palAllocateMemory(pMac->hHdd,
6268 (void **)&pConnectProfile->pAddIEAssoc, pProfile->nAddIEAssocLength);
6269 if(!HAL_STATUS_SUCCESS(status))
6270 {
6271 smsLog(pMac, LOGE, FL("Failed to allocate memory for additional IEs")) ;
6272 return eHAL_STATUS_FAILURE;
6273 }
6274 pConnectProfile->nAddIEAssocLength = pProfile->nAddIEAssocLength;
6275 palCopyMemory(pMac->hHdd, pConnectProfile->pAddIEAssoc, pProfile->pAddIEAssoc,
6276 pProfile->nAddIEAssocLength);
6277 }
6278
Jeff Johnson295189b2012-06-20 16:38:30 -07006279 //Save bssid
6280 csrGetBssIdBssDesc(pMac, pSirBssDesc, &pConnectProfile->bssid);
6281#ifdef WLAN_FEATURE_VOWIFI_11R
6282 if (pSirBssDesc->mdiePresent)
6283 {
6284 pConnectProfile->MDID.mdiePresent = 1;
6285 pConnectProfile->MDID.mobilityDomain = (pSirBssDesc->mdie[1] << 8) | (pSirBssDesc->mdie[0]);
6286 }
6287#endif
6288#ifdef FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -07006289 if ((csrIsProfileCCX(pProfile) ||
6290 ((pIesTemp->CCXVersion.present)
6291 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
6292 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
6293 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
6294 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
6295 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
6296 && (!(csrIsProfile11r( pProfile )))
6297 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -07006298 {
6299 pConnectProfile->isCCXAssoc = 1;
6300 }
6301#endif
6302 //save ssid
6303 if( NULL == pIesTemp )
6304 {
6305 status = csrGetParsedBssDescriptionIEs(pMac, pSirBssDesc, &pIesTemp);
6306 }
6307 if(HAL_STATUS_SUCCESS(status))
6308 {
6309 if(pIesTemp->SSID.present)
6310 {
6311 pConnectProfile->SSID.length = pIesTemp->SSID.num_ssid;
6312 palCopyMemory(pMac->hHdd, pConnectProfile->SSID.ssId,
6313 pIesTemp->SSID.ssid, pIesTemp->SSID.num_ssid);
6314 }
6315
6316 //Save the bss desc
6317 status = csrRoamSaveConnectedBssDesc(pMac, sessionId, pSirBssDesc);
Jeff Johnson295189b2012-06-20 16:38:30 -07006318 if( CSR_IS_QOS_BSS(pIesTemp) )
6319 {
6320 pConnectProfile->qap = TRUE;
6321 }
6322 else
6323 {
6324 pConnectProfile->qap = FALSE;
6325 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006326 if ( NULL == pIes )
6327 {
6328 //Free memory if it allocated locally
6329 palFreeMemory(pMac->hHdd, pIesTemp);
6330 }
6331 }
6332 //Save Qos connection
6333 pConnectProfile->qosConnection = pMac->roam.roamSession[sessionId].fWMMConnection;
6334
6335 if(!HAL_STATUS_SUCCESS(status))
6336 {
6337 csrFreeConnectBssDesc(pMac, sessionId);
6338 }
6339 for(index = 0; index < pProfile->SSIDs.numOfSSIDs; index++)
6340 {
6341 if((pProfile->SSIDs.SSIDList[index].SSID.length == pConnectProfile->SSID.length) &&
6342 palEqualMemory(pMac->hHdd, pProfile->SSIDs.SSIDList[index].SSID.ssId,
6343 pConnectProfile->SSID.ssId, pConnectProfile->SSID.length))
6344 {
6345 pConnectProfile->handoffPermitted = pProfile->SSIDs.SSIDList[index].handoffPermitted;
6346 break;
6347 }
6348 pConnectProfile->handoffPermitted = FALSE;
6349 }
6350
6351 return (status);
6352}
6353
Jeff Johnson295189b2012-06-20 16:38:30 -07006354static void csrRoamJoinRspProcessor( tpAniSirGlobal pMac, tSirSmeJoinRsp *pSmeJoinRsp )
6355{
6356 tListElem *pEntry = NULL;
6357 tSmeCmd *pCommand = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006358 //The head of the active list is the request we sent
6359 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6360 if(pEntry)
6361 {
6362 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6363 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006364 if ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode )
6365 {
6366 if(pCommand && eCsrSmeIssuedAssocToSimilarAP == pCommand->u.roamCmd.roamReason)
6367 {
6368#ifndef WLAN_MDM_CODE_REDUCTION_OPT
6369 sme_QosCsrEventInd(pMac, pSmeJoinRsp->sessionId, SME_QOS_CSR_HANDOFF_COMPLETE, NULL);
6370#endif
6371 }
6372 csrRoamComplete( pMac, eCsrJoinSuccess, (void *)pSmeJoinRsp );
6373 }
6374 else
6375 {
6376 tANI_U32 roamId = 0;
6377 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pSmeJoinRsp->sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006378 if(!pSession)
6379 {
6380 smsLog(pMac, LOGE, FL(" session %d not found "), pSmeJoinRsp->sessionId);
6381 return;
6382 }
6383
Jeff Johnson295189b2012-06-20 16:38:30 -07006384
6385 //The head of the active list is the request we sent
6386 //Try to get back the same profile and roam again
6387 if(pCommand)
6388 {
6389 roamId = pCommand->u.roamCmd.roamId;
6390 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006391 pSession->joinFailStatusCode.statusCode = pSmeJoinRsp->statusCode;
6392 pSession->joinFailStatusCode.reasonCode = pSmeJoinRsp->protStatusCode;
6393 smsLog( pMac, LOGW, "SmeJoinReq failed with statusCode= 0x%08lX [%d]\n", pSmeJoinRsp->statusCode, pSmeJoinRsp->statusCode );
6394#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
6395 /* If Join fails while Handoff is in progress, indicate disassociated event to supplicant to reconnect */
6396 if (csrRoamIsHandoffInProgress(pMac))
6397 {
6398 csrRoamCallCallback(pMac, pSmeJoinRsp->sessionId, NULL, roamId, eCSR_ROAM_DISASSOCIATED, eCSR_ROAM_RESULT_FORCED);
6399 /* Should indicate neighbor roam algorithm about the connect failure here */
6400 csrNeighborRoamIndicateConnect(pMac, pSmeJoinRsp->sessionId, VOS_STATUS_E_FAILURE);
6401 }
6402#endif
6403 if (pCommand)
6404 {
6405 if(CSR_IS_WDS_STA( &pCommand->u.roamCmd.roamProfile ))
6406 {
6407 pCommand->u.roamCmd.fStopWds = eANI_BOOLEAN_TRUE;
6408 pSession->connectedProfile.BSSType = eCSR_BSS_TYPE_WDS_STA;
6409 csrRoamReissueRoamCommand(pMac);
6410 }
6411 else if( CSR_IS_WDS( &pCommand->u.roamCmd.roamProfile ) )
6412 {
6413 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6414 }
6415 else
6416 {
6417 csrRoam(pMac, pCommand);
6418 }
6419 }
6420 else
6421 {
6422 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6423 }
6424 } /*else: ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode ) */
6425}
6426
Jeff Johnson295189b2012-06-20 16:38:30 -07006427eHalStatus csrRoamIssueJoin( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pSirBssDesc,
6428 tDot11fBeaconIEs *pIes,
6429 tCsrRoamProfile *pProfile, tANI_U32 roamId )
6430{
6431 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -07006432 smsLog( pMac, LOG1, "Attempting to Join Bssid= %02x-%02x-%02x-%02x-%02x-%02x\n",
6433 pSirBssDesc->bssId[ 0 ],pSirBssDesc->bssId[ 1 ],pSirBssDesc->bssId[ 2 ],
6434 pSirBssDesc->bssId[ 3 ],pSirBssDesc->bssId[ 4 ],pSirBssDesc->bssId[ 5 ] );
6435
6436 // Set the roaming substate to 'join attempt'...
6437 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_JOIN_REQ, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07006438 // attempt to Join this BSS...
6439 status = csrSendJoinReqMsg( pMac, sessionId, pSirBssDesc, pProfile, pIes );
Jeff Johnson295189b2012-06-20 16:38:30 -07006440 return (status);
6441}
6442
Jeff Johnson295189b2012-06-20 16:38:30 -07006443static eHalStatus csrRoamIssueReassociate( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pSirBssDesc,
6444 tDot11fBeaconIEs *pIes, tCsrRoamProfile *pProfile)
6445{
6446 csrRoamStateChange( pMac, eCSR_ROAMING_STATE_JOINING, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -07006447 // Set the roaming substate to 'join attempt'...
6448 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_REASSOC_REQ, sessionId );
6449
6450 smsLog(pMac, LOGE, FL(" calling csrSendSmeReassocReqMsg\n"));
6451
6452 // attempt to Join this BSS...
6453 return csrSendSmeReassocReqMsg( pMac, sessionId, pSirBssDesc, pIes, pProfile );
6454}
6455
Jeff Johnson295189b2012-06-20 16:38:30 -07006456void csrRoamReissueRoamCommand(tpAniSirGlobal pMac)
6457{
6458 tListElem *pEntry;
6459 tSmeCmd *pCommand;
6460 tCsrRoamInfo roamInfo;
6461 tANI_U32 sessionId;
6462 tCsrRoamSession *pSession;
6463
6464 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6465 if(pEntry)
6466 {
6467 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6468 if ( eSmeCommandRoam == pCommand->command )
6469 {
6470 sessionId = pCommand->sessionId;
6471 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006472
6473 if(!pSession)
6474 {
6475 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6476 return;
6477 }
6478
Jeff Johnson295189b2012-06-20 16:38:30 -07006479 if( pCommand->u.roamCmd.fStopWds )
6480 {
6481 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
6482 roamInfo.pBssDesc = pCommand->u.roamCmd.pLastRoamBss;
6483 roamInfo.statusCode = pSession->joinFailStatusCode.statusCode;
6484 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
6485#ifdef WLAN_SOFTAP_FEATURE
6486 if (CSR_IS_WDS(&pSession->connectedProfile)){
6487#endif
6488 pSession->connectState = eCSR_ASSOC_STATE_TYPE_WDS_DISCONNECTED;
6489 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
6490 eCSR_ROAM_WDS_IND,
6491 eCSR_ROAM_RESULT_WDS_DISASSOCIATED);
6492#ifdef WLAN_SOFTAP_FEATURE
6493 }else if (CSR_IS_INFRA_AP(&pSession->connectedProfile)){
6494 pSession->connectState = eCSR_ASSOC_STATE_TYPE_INFRA_DISCONNECTED;
6495 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.roamCmd.roamId,
6496 eCSR_ROAM_INFRA_IND,
6497 eCSR_ROAM_RESULT_INFRA_DISASSOCIATED);
6498 }
6499
6500#endif
6501
Jeff Johnson295189b2012-06-20 16:38:30 -07006502 if( !HAL_STATUS_SUCCESS( csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_STOP_BSS_REQ ) ) )
6503 {
6504 smsLog(pMac, LOGE, " Failed to reissue stop_bss command for WDS after disassociated\n");
6505 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6506 }
6507 }
6508 else if(eCsrStopRoaming == csrRoamJoinNextBss(pMac, pCommand, eANI_BOOLEAN_TRUE))
6509 {
6510 smsLog(pMac, LOGW, " Failed to reissue join command after disassociated\n");
6511 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6512 }
6513 }
6514 else
6515 {
6516 smsLog(pMac, LOGW, " Command is not roaming after disassociated\n");
6517 }
6518 }
6519 else
6520 {
6521 smsLog(pMac, LOGE, " Disassoc rsp cannot continue because no command is available\n");
6522 }
6523}
6524
Jeff Johnson295189b2012-06-20 16:38:30 -07006525tANI_BOOLEAN csrIsRoamCommandWaitingForSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
6526{
6527 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6528 tListElem *pEntry;
6529 tSmeCmd *pCommand = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -07006530 //alwasy lock active list before locking pending list
6531 csrLLLock( &pMac->sme.smeCmdActiveList );
6532 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6533 if(pEntry)
6534 {
6535 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6536 if( ( eSmeCommandRoam == pCommand->command ) && ( sessionId == pCommand->sessionId ) )
6537 {
6538 fRet = eANI_BOOLEAN_TRUE;
6539 }
6540 }
6541 if(eANI_BOOLEAN_FALSE == fRet)
6542 {
6543 csrLLLock(&pMac->sme.smeCmdPendingList);
6544 pEntry = csrLLPeekHead(&pMac->sme.smeCmdPendingList, LL_ACCESS_NOLOCK);
6545 while(pEntry)
6546 {
6547 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6548 if( ( eSmeCommandRoam == pCommand->command ) && ( sessionId == pCommand->sessionId ) )
6549 {
6550 fRet = eANI_BOOLEAN_TRUE;
6551 break;
6552 }
6553 pEntry = csrLLNext(&pMac->sme.smeCmdPendingList, pEntry, LL_ACCESS_NOLOCK);
6554 }
6555 csrLLUnlock(&pMac->sme.smeCmdPendingList);
6556 }
6557 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006558 return (fRet);
6559}
6560
Jeff Johnson295189b2012-06-20 16:38:30 -07006561tANI_BOOLEAN csrIsRoamCommandWaiting(tpAniSirGlobal pMac)
6562{
6563 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6564 tANI_U32 i;
Jeff Johnson295189b2012-06-20 16:38:30 -07006565 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
6566 {
6567 if( CSR_IS_SESSION_VALID( pMac, i ) && ( fRet = csrIsRoamCommandWaitingForSession( pMac, i ) ) )
6568 {
6569 break;
6570 }
6571 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006572 return ( fRet );
6573}
6574
Jeff Johnson295189b2012-06-20 16:38:30 -07006575tANI_BOOLEAN csrIsCommandWaiting(tpAniSirGlobal pMac)
6576{
6577 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07006578 //alwasy lock active list before locking pending list
6579 csrLLLock( &pMac->sme.smeCmdActiveList );
6580 fRet = csrLLIsListEmpty(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6581 if(eANI_BOOLEAN_FALSE == fRet)
6582 {
6583 fRet = csrLLIsListEmpty(&pMac->sme.smeCmdPendingList, LL_ACCESS_LOCK);
6584 }
6585 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006586 return (fRet);
6587}
6588
Jeff Johnson295189b2012-06-20 16:38:30 -07006589tANI_BOOLEAN csrIsScanForRoamCommandActive( tpAniSirGlobal pMac )
6590{
6591 tANI_BOOLEAN fRet = eANI_BOOLEAN_FALSE;
6592 tListElem *pEntry;
6593 tCsrCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07006594 //alwasy lock active list before locking pending list
6595 csrLLLock( &pMac->sme.smeCmdActiveList );
6596 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_NOLOCK);
6597 if( pEntry )
6598 {
6599 pCommand = GET_BASE_ADDR(pEntry, tCsrCmd, Link);
6600 if( ( eCsrRoamCommandScan == pCommand->command ) &&
6601 ( ( eCsrScanForSsid == pCommand->u.scanCmd.reason ) ||
6602 ( eCsrScanForCapsChange == pCommand->u.scanCmd.reason ) ||
6603 ( eCsrScanP2PFindPeer == pCommand->u.scanCmd.reason ) ) )
6604 {
6605 fRet = eANI_BOOLEAN_TRUE;
6606 }
6607 }
6608 csrLLUnlock( &pMac->sme.smeCmdActiveList );
Jeff Johnson295189b2012-06-20 16:38:30 -07006609 return (fRet);
6610}
Jeff Johnson295189b2012-06-20 16:38:30 -07006611eHalStatus csrRoamIssueReassociateCmd( tpAniSirGlobal pMac, tANI_U32 sessionId )
6612{
6613 eHalStatus status = eHAL_STATUS_SUCCESS;
6614 tSmeCmd *pCommand = NULL;
6615 tANI_BOOLEAN fHighPriority = eANI_BOOLEAN_TRUE;
6616 tANI_BOOLEAN fRemoveCmd = FALSE;
6617 tListElem *pEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -07006618 // Delete the old assoc command. All is setup for reassoc to be serialized
6619 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
6620 if ( pEntry )
6621 {
6622 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
6623 if ( !pCommand )
6624 {
6625 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
6626 return eHAL_STATUS_RESOURCES;
6627 }
6628 if ( eSmeCommandRoam == pCommand->command )
6629 {
6630 if (pCommand->u.roamCmd.roamReason == eCsrSmeIssuedAssocToSimilarAP)
6631 {
6632 fRemoveCmd = csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK );
6633 }
6634 else
6635 {
6636 smsLog( pMac, LOGE, FL(" Unexpected active roam command present \n") );
6637 }
6638 if (fRemoveCmd == FALSE)
6639 {
6640 // Implies we did not get the serialized assoc command we
6641 // were expecting
6642 pCommand = NULL;
6643 }
6644 }
6645 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006646 if(NULL == pCommand)
6647 {
6648 smsLog( pMac, LOGE, FL(" fail to get command buffer as expected based on previous connect roam command\n") );
6649 return eHAL_STATUS_RESOURCES;
6650 }
Jeff Johnson295189b2012-06-20 16:38:30 -07006651 do
6652 {
6653 //Change the substate in case it is wait-for-key
6654 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
6655 {
6656 csrRoamStopWaitForKeyTimer( pMac );
6657 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId );
6658 }
6659 pCommand->command = eSmeCommandRoam;
6660 pCommand->sessionId = (tANI_U8)sessionId;
6661 pCommand->u.roamCmd.roamReason = eCsrSmeIssuedFTReassoc;
Jeff Johnson295189b2012-06-20 16:38:30 -07006662 status = csrQueueSmeCommand(pMac, pCommand, fHighPriority);
6663 if( !HAL_STATUS_SUCCESS( status ) )
6664 {
6665 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
6666 csrReleaseCommandRoam( pMac, pCommand );
6667 }
6668 } while( 0 );
6669
Jeff Johnson295189b2012-06-20 16:38:30 -07006670 return( status );
6671}
6672static void csrRoamingStateConfigCnfProcessor( tpAniSirGlobal pMac, tANI_U32 result )
6673{
6674 tListElem *pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
6675 tCsrScanResult *pScanResult = NULL;
6676 tSirBssDescription *pBssDesc = NULL;
6677 tSmeCmd *pCommand = NULL;
6678 tANI_U32 sessionId;
6679 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -07006680 if(NULL == pEntry)
6681 {
6682 smsLog(pMac, LOGW, " CFG_CNF with active list empty\n");
6683 return;
6684 }
6685 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
6686 sessionId = pCommand->sessionId;
6687 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07006688
6689 if(!pSession)
6690 {
6691 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
6692 return;
6693 }
6694
Jeff Johnson295189b2012-06-20 16:38:30 -07006695 if(CSR_IS_ROAMING(pSession) && pSession->fCancelRoaming)
6696 {
6697 //the roaming is cancelled. Simply complete the command
6698 smsLog(pMac, LOGW, FL(" Roam command cancelled\n"));
6699 csrRoamComplete(pMac, eCsrNothingToJoin, NULL);
6700 }
6701 else
6702 {
6703 if ( CCM_IS_RESULT_SUCCESS(result) )
6704 {
6705 smsLog(pMac, LOG2, "Cfg sequence complete\n");
6706 // Successfully set the configuration parameters for the new Bss. Attempt to
6707 // join the roaming Bss.
6708 if(pCommand->u.roamCmd.pRoamBssEntry)
6709 {
6710 pScanResult = GET_BASE_ADDR(pCommand->u.roamCmd.pRoamBssEntry, tCsrScanResult, Link);
6711 pBssDesc = &pScanResult->Result.BssDescriptor;
6712 }
6713 if ( csrIsBssTypeIBSS( pCommand->u.roamCmd.roamProfile.BSSType ) ||
6714 CSR_IS_WDS( &pCommand->u.roamCmd.roamProfile )
6715#ifdef WLAN_SOFTAP_FEATURE
6716 || CSR_IS_INFRA_AP(&pCommand->u.roamCmd.roamProfile)
6717#endif
6718 )
6719 {
6720 if(!HAL_STATUS_SUCCESS(csrRoamIssueStartBss( pMac, sessionId,
6721 &pSession->bssParams, &pCommand->u.roamCmd.roamProfile,
6722 pBssDesc, pCommand->u.roamCmd.roamId )))
6723 {
6724 smsLog(pMac, LOGW, " CSR start BSS failed\n");
6725 //We need to complete the command
6726 csrRoamComplete(pMac, eCsrStartBssFailure, NULL);
6727 }
6728 }
6729 else
6730 {
6731 if (!pCommand->u.roamCmd.pRoamBssEntry)
6732 {
6733 smsLog(pMac, LOGW, " pRoamBssEntry is NULL\n");
6734 //We need to complete the command
6735 csrRoamComplete(pMac, eCsrJoinFailure, NULL);
6736 return;
6737 }
6738 // If we are roaming TO an Infrastructure BSS...
6739 VOS_ASSERT(pScanResult != NULL);
6740 if ( csrIsInfraBssDesc( pBssDesc ) )
6741 {
6742 tDot11fBeaconIEs *pIesLocal = (tDot11fBeaconIEs *)pScanResult->Result.pvIes;
Jeff Johnson295189b2012-06-20 16:38:30 -07006743 if(pIesLocal || (HAL_STATUS_SUCCESS(csrGetParsedBssDescriptionIEs(pMac, pBssDesc, &pIesLocal))) )
6744 {
6745 // ..and currently in an Infrastructure connection....
6746 if( csrIsConnStateConnectedInfra( pMac, sessionId ) )
6747 {
6748 // ...and the SSIDs are equal, then we Reassoc.
6749 if ( csrIsSsidEqual( pMac, pSession->pConnectBssDesc, pBssDesc,
6750 pIesLocal ) )
6751 // ..and currently in an infrastructure connection
6752 {
6753 // then issue a Reassoc.
6754 pCommand->u.roamCmd.fReassoc = eANI_BOOLEAN_TRUE;
6755 csrRoamIssueReassociate( pMac, sessionId, pBssDesc, pIesLocal,
6756 &pCommand->u.roamCmd.roamProfile );
6757 }
6758 else
6759 {
6760
6761 // otherwise, we have to issue a new Join request to LIM because we disassociated from the
6762 // previously associated AP.
6763 if(!HAL_STATUS_SUCCESS(csrRoamIssueJoin( pMac, sessionId, pBssDesc,
6764 pIesLocal,
6765 &pCommand->u.roamCmd.roamProfile, pCommand->u.roamCmd.roamId )))
6766 {
6767 //try something else
6768 csrRoam( pMac, pCommand );
6769 }
6770 }
6771 }
6772 else
6773 {
6774 eHalStatus status = eHAL_STATUS_SUCCESS;
6775
6776 /* We need to come with other way to figure out that this is because of HO in BMP
6777 The below API will be only available for Android as it uses a different HO algorithm */
6778 /* Reassoc request will be used only for CCX and 11r handoff whereas other legacy roaming should
6779 * use join request */
6780#ifdef WLAN_FEATURE_VOWIFI_11R
6781 if (csrRoamIsHandoffInProgress(pMac) &&
6782 csrRoamIs11rAssoc(pMac))
6783 {
6784 status = csrRoamIssueReassociate(pMac, sessionId, pBssDesc,
6785 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ), &pCommand->u.roamCmd.roamProfile);
6786 }
6787 else
6788#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006789#ifdef FEATURE_WLAN_CCX
6790 if (csrRoamIsHandoffInProgress(pMac) &&
6791 csrRoamIsCCXAssoc(pMac))
6792 {
6793 // Now serialize the reassoc command.
6794 status = csrRoamIssueReassociateCmd(pMac, sessionId);
6795 }
6796 else
6797#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07006798#ifdef FEATURE_WLAN_LFR
6799 if (csrRoamIsHandoffInProgress(pMac) &&
6800 csrRoamIsFastRoamEnabled(pMac))
6801 {
6802 // Now serialize the reassoc command.
6803 status = csrRoamIssueReassociateCmd(pMac, sessionId);
6804 }
6805 else
6806#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07006807 // else we are not connected and attempting to Join. Issue the
6808 // Join request.
6809 {
6810 status = csrRoamIssueJoin( pMac, sessionId, pBssDesc,
6811 (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ),
6812 &pCommand->u.roamCmd.roamProfile, pCommand->u.roamCmd.roamId );
6813 }
6814 if(!HAL_STATUS_SUCCESS(status))
6815 {
6816 //try something else
6817 csrRoam( pMac, pCommand );
6818 }
6819 }
6820 if( !pScanResult->Result.pvIes )
6821 {
6822 //Locally allocated
6823 palFreeMemory(pMac->hHdd, pIesLocal);
6824 }
6825 }
6826 }//if ( csrIsInfraBssDesc( pBssDesc ) )
6827 else
6828 {
6829 smsLog(pMac, LOGW, FL(" found BSSType mismatching the one in BSS description\n"));
6830 }
6831 }//else
6832 }//if ( WNI_CFG_SUCCESS == result )
6833 else
6834 {
6835 // In the event the configuration failed, for infra let the roam processor
6836 //attempt to join something else...
6837 if( pCommand->u.roamCmd.pRoamBssEntry && CSR_IS_INFRASTRUCTURE( &pCommand->u.roamCmd.roamProfile ) )
6838 {
6839 csrRoam(pMac, pCommand);
6840 }
6841 else
6842 {
6843 //We need to complete the command
6844 if ( csrIsBssTypeIBSS( pCommand->u.roamCmd.roamProfile.BSSType ) )
6845 {
6846 csrRoamComplete(pMac, eCsrStartBssFailure, NULL);
6847 }
6848 else
6849 {
6850 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6851 }
6852 }
6853 }
6854 }//we have active entry
6855}
6856
Jeff Johnson295189b2012-06-20 16:38:30 -07006857static void csrRoamRoamingStateAuthRspProcessor( tpAniSirGlobal pMac, tSirSmeAuthRsp *pSmeAuthRsp )
6858{
6859 //No one is sending eWNI_SME_AUTH_REQ to PE.
6860 smsLog(pMac, LOGW, FL("is no-op\n"));
6861 if ( eSIR_SME_SUCCESS == pSmeAuthRsp->statusCode )
6862 {
6863 smsLog( pMac, LOGW, "CSR SmeAuthReq Successful\n" );
6864 // Successfully authenticated with a new Bss. Attempt to stop the current Bss and
6865 // join the new one...
6866 /***pBssDesc = profGetRoamingBssDesc( pAdapter, &pHddProfile );
Jeff Johnson295189b2012-06-20 16:38:30 -07006867 roamStopNetwork( pAdapter, &pBssDesc->SirBssDescription );***/
6868 }
6869 else {
6870 smsLog( pMac, LOGW, "CSR SmeAuthReq failed with statusCode= 0x%08lX [%d]\n", pSmeAuthRsp->statusCode, pSmeAuthRsp->statusCode );
6871 /***profHandleLostLinkAfterReset(pAdapter);
6872 // In the event the authenticate fails, let the roam processor attempt to join something else...
6873 roamRoam( pAdapter );***/
6874 }
6875}
6876
Jeff Johnson295189b2012-06-20 16:38:30 -07006877static void csrRoamRoamingStateReassocRspProcessor( tpAniSirGlobal pMac, tpSirSmeJoinRsp pSmeJoinRsp )
6878{
6879 eCsrRoamCompleteResult result;
6880 tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
6881 tCsrRoamInfo roamInfo;
6882 tANI_U32 roamId = 0;
6883
6884 if ( eSIR_SME_SUCCESS == pSmeJoinRsp->statusCode )
6885 {
6886 smsLog( pMac, LOGW, "CSR SmeReassocReq Successful\n" );
6887 result = eCsrReassocSuccess;
Jeff Johnson295189b2012-06-20 16:38:30 -07006888 /* Defeaturize this part later if needed */
6889#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
6890 /* Since the neighbor roam algorithm uses reassoc req for handoff instead of join,
6891 * we need the response contents while processing the result in csrRoamProcessResults() */
6892 if (csrRoamIsHandoffInProgress(pMac))
6893 {
6894 /* Need to dig more on indicating events to SME QoS module */
6895 sme_QosCsrEventInd(pMac, pSmeJoinRsp->sessionId, SME_QOS_CSR_HANDOFF_COMPLETE, NULL);
6896 csrRoamComplete( pMac, result, pSmeJoinRsp);
6897 }
6898 else
6899#endif
6900 {
6901 csrRoamComplete( pMac, result, NULL );
6902 }
6903 }
6904 /* Should we handle this similar to handling the join failure? Is it ok
6905 * to call csrRoamComplete() with state as CsrJoinFailure */
6906 else
6907 {
6908 smsLog( pMac, LOGW, "CSR SmeReassocReq failed with statusCode= 0x%08lX [%d]\n", pSmeJoinRsp->statusCode, pSmeJoinRsp->statusCode );
6909 result = eCsrReassocFailure;
6910#ifdef WLAN_FEATURE_VOWIFI_11R
6911 if ((eSIR_SME_FT_REASSOC_TIMEOUT_FAILURE == pSmeJoinRsp->statusCode) ||
6912 (eSIR_SME_FT_REASSOC_FAILURE == pSmeJoinRsp->statusCode))
6913 {
6914 // Inform HDD to turn off FT flag in HDD
6915 if (pNeighborRoamInfo)
6916 {
6917 vos_mem_zero(&roamInfo, sizeof(tCsrRoamInfo));
6918 csrRoamCallCallback(pMac, pNeighborRoamInfo->csrSessionId,
6919 &roamInfo, roamId, eCSR_ROAM_FT_REASSOC_FAILED, eSIR_SME_SUCCESS);
Madan Mohan Koyyalamudi57772162012-10-18 19:46:14 -07006920 /*
6921 * Since the above callback sends a disconnect
6922 * to HDD, we should clean-up our state
6923 * machine as well to be in sync with the upper
6924 * layers. There is no need to send a disassoc
6925 * since: 1) we will never reassoc to the current
6926 * AP in LFR, and 2) there is no need to issue a
6927 * disassoc to the AP with which we were trying
6928 * to reassoc.
6929 */
6930 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
6931 return;
Jeff Johnson295189b2012-06-20 16:38:30 -07006932 }
6933 }
6934#endif
6935 // In the event that the Reassociation fails, then we need to Disassociate the current association and keep
6936 // roaming. Note that we will attempt to Join the AP instead of a Reassoc since we may have attempted a
6937 // 'Reassoc to self', which AP's that don't support Reassoc will force a Disassoc.
6938 //The disassoc rsp message will remove the command from active list
6939 if(!HAL_STATUS_SUCCESS(csrRoamIssueDisassociate( pMac, pSmeJoinRsp->sessionId,
6940 eCSR_ROAM_SUBSTATE_DISASSOC_REASSOC_FAILURE, FALSE )))
6941 {
6942 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
6943 }
6944 }
6945}
6946
Jeff Johnson295189b2012-06-20 16:38:30 -07006947static void csrRoamRoamingStateStopBssRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSmeRsp)
6948{
Jeff Johnson295189b2012-06-20 16:38:30 -07006949#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
6950 {
6951 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07006952 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
6953 if(pIbssLog)
6954 {
6955 pIbssLog->eventId = WLAN_IBSS_EVENT_STOP_RSP;
6956 if(eSIR_SME_SUCCESS != pSmeRsp->statusCode)
6957 {
6958 pIbssLog->status = WLAN_IBSS_STATUS_FAILURE;
6959 }
6960 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
6961 }
6962 }
6963#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07006964 pMac->roam.roamSession[pSmeRsp->sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
6965 if(CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ( pMac, pSmeRsp->sessionId))
6966 {
6967 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
6968 }
6969 else if(CSR_IS_ROAM_SUBSTATE_DISCONNECT_CONTINUE( pMac, pSmeRsp->sessionId))
6970 {
6971 csrRoamReissueRoamCommand(pMac);
6972 }
6973}
6974
Jeff Johnson295189b2012-06-20 16:38:30 -07006975void csrRoamRoamingStateDisassocRspProcessor( tpAniSirGlobal pMac, tSirSmeDisassocRsp *pSmeRsp )
6976{
6977 tSirResultCodes statusCode;
6978#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
6979 tScanResultHandle hBSSList;
6980 tANI_BOOLEAN fCallCallback, fRemoveCmd;
6981 eHalStatus status;
6982 tCsrRoamInfo roamInfo;
6983 tCsrScanResultFilter *pScanFilter = NULL;
6984 tANI_U32 roamId = 0;
6985 tCsrRoamProfile *pCurRoamProfile = NULL;
6986 tListElem *pEntry = NULL;
6987 tSmeCmd *pCommand = NULL;
6988#endif
6989 tANI_U32 sessionId;
6990 tCsrRoamSession *pSession;
Jeff Johnsone7245742012-09-05 17:12:55 -07006991
Jeff Johnson295189b2012-06-20 16:38:30 -07006992 tSirSmeDisassocRsp SmeDisassocRsp;
6993
6994 csrSerDesUnpackDiassocRsp((tANI_U8 *)pSmeRsp, &SmeDisassocRsp);
6995 sessionId = SmeDisassocRsp.sessionId;
6996 statusCode = SmeDisassocRsp.statusCode;
6997
6998 smsLog( pMac, LOG2, "csrRoamRoamingStateDisassocRspProcessor sessionId %d\n", sessionId);
6999
7000 if ( csrIsConnStateInfra( pMac, sessionId ) )
7001 {
7002 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
7003 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007004 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07007005
7006 if(!pSession)
7007 {
7008 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
7009 return;
7010 }
7011
Jeff Johnson295189b2012-06-20 16:38:30 -07007012 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_NO_JOIN( pMac, sessionId ) )
7013 {
7014 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
7015 }
7016 else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_FORCED( pMac, sessionId ) ||
7017 CSR_IS_ROAM_SUBSTATE_DISASSOC_REQ( pMac, sessionId ) )
7018 {
7019 if ( eSIR_SME_SUCCESS == statusCode )
7020 {
7021 smsLog( pMac, LOG2, "CSR SmeDisassocReq force disassociated Successfully\n" );
7022 //A callback to HDD will be issued from csrRoamComplete so no need to do anything here
7023 }
7024 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
7025 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007026 else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac, sessionId ) )
7027 {
7028 smsLog( pMac, LOGE, "CSR SmeDisassocReq due to HO\n" );
7029#if defined (WLAN_FEATURE_NEIGHBOR_ROAMING)
7030 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
7031 if ( pEntry )
7032 {
7033 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
Jeff Johnson295189b2012-06-20 16:38:30 -07007034 // If the head of the queue is Active and it is a ROAM command, remove
7035 // and put this on the Free queue.
7036 if ( eSmeCommandRoam == pCommand->command )
7037 {
Jeff Johnsone7245742012-09-05 17:12:55 -07007038
Jeff Johnson295189b2012-06-20 16:38:30 -07007039 //we need to process the result first before removing it from active list because state changes
7040 //still happening insides roamQProcessRoamResults so no other roam command should be issued
7041 fRemoveCmd = csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK );
7042 if(pCommand->u.roamCmd.fReleaseProfile)
7043 {
7044 csrReleaseProfile(pMac, &pCommand->u.roamCmd.roamProfile);
7045 pCommand->u.roamCmd.fReleaseProfile = eANI_BOOLEAN_FALSE;
7046 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007047 if( fRemoveCmd )
7048 {
7049 csrReleaseCommandRoam( pMac, pCommand );
7050 }
7051 else
7052 {
7053 smsLog( pMac, LOGE, " ********csrRoamRoamingStateDisassocRspProcessor fail to remove cmd reason %d\n",
7054 pCommand->u.roamCmd.roamReason );
7055 }
7056 }
7057 else
7058 {
7059 smsLog( pMac, LOGW, "CSR: Roam Completion called but ROAM command is not ACTIVE ...\n" );
7060 }
7061 }
7062 else
7063 {
7064 smsLog( pMac, LOGW, "CSR: Roam Completion called but NO commands are ACTIVE ...\n" );
7065 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007066 //notify HDD for handoff, providing the BSSID too
7067 roamInfo.reasonCode = eCsrRoamReasonBetterAP;
7068
7069 palCopyMemory(pMac->hHdd, roamInfo.bssid, pMac->roam.neighborRoamInfo.csrNeighborRoamProfile.BSSIDs.bssid, sizeof(tSirMacAddr));
7070
Jeff Johnsone7245742012-09-05 17:12:55 -07007071 csrRoamCallCallback(pMac,sessionId, &roamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_NONE);
Jeff Johnson295189b2012-06-20 16:38:30 -07007072
7073 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
7074 if(HAL_STATUS_SUCCESS(status))
7075 {
7076 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
7077 status = csrRoamPrepareFilterFromProfile(pMac, &pMac->roam.neighborRoamInfo.csrNeighborRoamProfile, pScanFilter);
7078 if(!HAL_STATUS_SUCCESS(status))
7079 {
7080 smsLog(pMac, LOGE, FL(" csrRoamPrepareFilterFromProfile fail to create scan filter\n"));
7081 }
7082
7083 status = csrScanGetResult(pMac, pScanFilter, &hBSSList);
7084 if(HAL_STATUS_SUCCESS(status))
7085 {
7086 //copy over the connected profile to apply the same for this connection as well
7087 if(HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd, (void **)&pCurRoamProfile, sizeof(tCsrRoamProfile))))
7088 {
7089 palZeroMemory(pMac->hHdd, pCurRoamProfile, sizeof(tCsrRoamProfile));
7090 csrRoamCopyProfile(pMac, pCurRoamProfile, pSession->pCurRoamProfile);
7091 }
7092 //make sure to put it at the head of the cmd queue
7093 status = csrRoamIssueConnect(pMac, sessionId, pCurRoamProfile,
7094 hBSSList, eCsrSmeIssuedAssocToSimilarAP,
7095 roamId, eANI_BOOLEAN_TRUE, eANI_BOOLEAN_FALSE);
7096 if(!HAL_STATUS_SUCCESS(status))
7097 {
7098 //msg
7099 fCallCallback = eANI_BOOLEAN_TRUE;
7100 }
7101 /* Notify sub-modules like QoS etc. that handoff happening */
7102 sme_QosCsrEventInd(pMac, sessionId, SME_QOS_CSR_HANDOFF_ASSOC_REQ, NULL);
7103 palFreeMemory(pMac->hHdd, pCurRoamProfile);
7104 }
7105 else
7106 {
7107 //msg
7108 smsLog( pMac, LOGE,"csrRoamRoamingStateDisassocRspProcessor: csrScanGetResult failed");
7109 // should have asserted, sending up roam complete instead. Let upper layer
7110 // decide what to do next
7111 csrCallRoamingCompletionCallback(pMac, pSession, &roamInfo, 0, eCSR_ROAM_RESULT_FAILURE);
7112 }
7113 }
7114 else
7115 {
7116 smsLog(pMac, LOGE, FL(" fail to allocate memory for scan filter\n"));
7117 csrCallRoamingCompletionCallback(pMac, pSession, &roamInfo, 0, eCSR_ROAM_RESULT_FAILURE);
7118 }
7119 if( pScanFilter )
7120 {
Jeff Johnsone7245742012-09-05 17:12:55 -07007121
Jeff Johnson295189b2012-06-20 16:38:30 -07007122 csrFreeScanFilter(pMac, pScanFilter);
7123 palFreeMemory( pMac->hHdd, pScanFilter );
7124 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007125#endif
Jeff Johnsone7245742012-09-05 17:12:55 -07007126
Jeff Johnson295189b2012-06-20 16:38:30 -07007127 } //else if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac ) )
7128 else if ( CSR_IS_ROAM_SUBSTATE_REASSOC_FAIL( pMac, sessionId ) )
7129 {
7130 // Disassoc due to Reassoc failure falls into this codepath....
7131 csrRoamComplete( pMac, eCsrJoinFailure, NULL );
7132 }
7133 else
7134 {
7135 if ( eSIR_SME_SUCCESS == statusCode )
7136 {
7137 // Successfully disassociated from the 'old' Bss...
7138 //
7139 // We get Disassociate response in three conditions.
7140 // - First is the case where we are disasociating from an Infra Bss to start an IBSS.
7141 // - Second is the when we are disassociating from an Infra Bss to join an IBSS or a new
7142 // Infrastructure network.
7143 // - Third is where we are doing an Infra to Infra roam between networks with different
7144 // SSIDs. In all cases, we set the new Bss configuration here and attempt to join
7145
7146 smsLog( pMac, LOG2, "CSR SmeDisassocReq disassociated Successfully\n" );
7147 }
7148 else
7149 {
7150 smsLog( pMac, LOGE, "SmeDisassocReq failed with statusCode= 0x%08lX\n", statusCode );
7151 }
7152 //We are not done yet. Get the data and continue roaming
7153 csrRoamReissueRoamCommand(pMac);
7154 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007155}
7156
Jeff Johnson295189b2012-06-20 16:38:30 -07007157static void csrRoamRoamingStateDeauthRspProcessor( tpAniSirGlobal pMac, tSirSmeDeauthRsp *pSmeRsp )
7158{
7159 tSirResultCodes statusCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07007160 //No one is sending eWNI_SME_DEAUTH_REQ to PE.
7161 smsLog(pMac, LOGW, FL("is no-op\n"));
7162 statusCode = csrGetDeAuthRspStatusCode( pSmeRsp );
7163 if ( CSR_IS_ROAM_SUBSTATE_DEAUTH_REQ( pMac, pSmeRsp->sessionId) )
7164 {
7165 csrRoamComplete( pMac, eCsrNothingToJoin, NULL );
7166 }
7167 else
7168 {
7169 if ( eSIR_SME_SUCCESS == statusCode )
7170 {
7171 // Successfully deauth from the 'old' Bss...
7172 //
7173 smsLog( pMac, LOG2, "CSR SmeDeauthReq disassociated Successfully\n" );
7174 }
7175 else
7176 {
7177 smsLog( pMac, LOGW, "SmeDeauthReq failed with statusCode= 0x%08lX\n", statusCode );
7178 }
7179 //We are not done yet. Get the data and continue roaming
7180 csrRoamReissueRoamCommand(pMac);
7181 }
7182}
7183
Jeff Johnson295189b2012-06-20 16:38:30 -07007184static void csrRoamRoamingStateStartBssRspProcessor( tpAniSirGlobal pMac, tSirSmeStartBssRsp *pSmeStartBssRsp )
7185{
7186 eCsrRoamCompleteResult result;
7187
7188 if ( eSIR_SME_SUCCESS == pSmeStartBssRsp->statusCode )
7189 {
7190 smsLog( pMac, LOGW, "SmeStartBssReq Successful\n" );
7191 result = eCsrStartBssSuccess;
7192 }
7193 else
7194 {
7195 smsLog( pMac, LOGW, "SmeStartBssReq failed with statusCode= 0x%08lX\n", pSmeStartBssRsp->statusCode );
7196 //Let csrRoamComplete decide what to do
7197 result = eCsrStartBssFailure;
7198 }
7199#ifdef WLAN_SOFTAP_FEATURE
7200 csrRoamComplete( pMac, result, pSmeStartBssRsp);
7201#else
7202 csrRoamComplete( pMac, result, &pSmeStartBssRsp->bssDescription );
7203#endif
7204}
7205
Jeff Johnson295189b2012-06-20 16:38:30 -07007206/*
7207 We need to be careful on whether to cast pMsgBuf (pSmeRsp) to other type of strucutres.
7208 It depends on how the message is constructed. If the message is sent by limSendSmeRsp,
7209 the pMsgBuf is only a generic response and can only be used as pointer to tSirSmeRsp.
7210 For the messages where sender allocates memory for specific structures, then it can be
7211 cast accordingly.
7212*/
7213void csrRoamingStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
7214{
7215 tSirSmeRsp *pSmeRsp;
7216 tSmeIbssPeerInd *pIbssPeerInd;
7217 tCsrRoamInfo roamInfo;
7218 // TODO Session Id need to be acquired in this function
7219 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -07007220 pSmeRsp = (tSirSmeRsp *)pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07007221 smsLog( pMac, LOG2, "Message %d[0x%04X] received in substate %d\n",
7222 pSmeRsp->messageType, pSmeRsp->messageType,
7223 pMac->roam.curSubState[pSmeRsp->sessionId] );
7224#if defined ANI_PRODUCT_TYPE_AP
7225 pSmeRsp->messageType = pal_be16_to_cpu(pSmeRsp->messageType);
7226 pSmeRsp->length = pal_be16_to_cpu(pSmeRsp->length);
7227 pSmeRsp->statusCode = pal_be32_to_cpu(pSmeRsp->statusCode);
7228#else
7229 pSmeRsp->messageType = (pSmeRsp->messageType);
7230 pSmeRsp->length = (pSmeRsp->length);
7231 pSmeRsp->statusCode = (pSmeRsp->statusCode);
7232#endif
7233 switch (pSmeRsp->messageType)
7234 {
7235
7236 case eWNI_SME_JOIN_RSP: // in Roaming state, process the Join response message...
7237 if (CSR_IS_ROAM_SUBSTATE_JOIN_REQ(pMac, pSmeRsp->sessionId))
7238 {
7239 //We sent a JOIN_REQ
7240 csrRoamJoinRspProcessor( pMac, (tSirSmeJoinRsp *)pSmeRsp );
7241 }
7242 break;
7243
7244 case eWNI_SME_AUTH_RSP: // or the Authenticate response message...
7245 if (CSR_IS_ROAM_SUBSTATE_AUTH_REQ( pMac, pSmeRsp->sessionId) )
7246 {
7247 //We sent a AUTH_REQ
7248 csrRoamRoamingStateAuthRspProcessor( pMac, (tSirSmeAuthRsp *)pSmeRsp );
7249 }
7250 break;
7251
7252 case eWNI_SME_REASSOC_RSP: // or the Reassociation response message...
7253 if (CSR_IS_ROAM_SUBSTATE_REASSOC_REQ( pMac, pSmeRsp->sessionId) )
7254 {
7255 csrRoamRoamingStateReassocRspProcessor( pMac, (tpSirSmeJoinRsp )pSmeRsp );
7256 }
7257 break;
7258
7259 case eWNI_SME_STOP_BSS_RSP: // or the Stop Bss response message...
7260 {
7261 csrRoamRoamingStateStopBssRspProcessor(pMac, pSmeRsp);
7262 }
7263 break;
7264
7265 case eWNI_SME_DISASSOC_RSP: // or the Disassociate response message...
7266 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_REQ( pMac, pSmeRsp->sessionId ) ||
7267 CSR_IS_ROAM_SUBSTATE_DISASSOC_NO_JOIN( pMac, pSmeRsp->sessionId ) ||
7268 CSR_IS_ROAM_SUBSTATE_REASSOC_FAIL( pMac, pSmeRsp->sessionId ) ||
7269 CSR_IS_ROAM_SUBSTATE_DISASSOC_FORCED( pMac, pSmeRsp->sessionId ) ||
7270 CSR_IS_ROAM_SUBSTATE_DISCONNECT_CONTINUE( pMac, pSmeRsp->sessionId ) ||
7271//HO
7272 CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac, pSmeRsp->sessionId ) )
7273 {
Madan Mohan Koyyalamudi5695b502012-09-24 14:21:12 -07007274 smsLog(pMac, LOG1, FL("eWNI_SME_DISASSOC_RSP subState = %d\n"), pMac->roam.curSubState[pSmeRsp->sessionId]);
Jeff Johnson295189b2012-06-20 16:38:30 -07007275 csrRoamRoamingStateDisassocRspProcessor( pMac, (tSirSmeDisassocRsp *)pSmeRsp );
7276 }
7277 break;
7278
7279 case eWNI_SME_DEAUTH_RSP: // or the Deauthentication response message...
7280 if ( CSR_IS_ROAM_SUBSTATE_DEAUTH_REQ( pMac, pSmeRsp->sessionId ) )
7281 {
7282 csrRoamRoamingStateDeauthRspProcessor( pMac, (tSirSmeDeauthRsp *)pSmeRsp );
7283 }
7284 break;
7285
7286 case eWNI_SME_START_BSS_RSP: // or the Start BSS response message...
7287 if (CSR_IS_ROAM_SUBSTATE_START_BSS_REQ( pMac, pSmeRsp->sessionId ) )
7288 {
7289 csrRoamRoamingStateStartBssRspProcessor( pMac, (tSirSmeStartBssRsp *)pSmeRsp );
7290 }
7291 break;
7292
7293 case WNI_CFG_SET_CNF: // process the Config Confirm messages when we are in 'Config' substate...
7294 if ( CSR_IS_ROAM_SUBSTATE_CONFIG( pMac, pSmeRsp->sessionId ) )
7295 {
7296 csrRoamingStateConfigCnfProcessor( pMac, ((tCsrCfgSetRsp *)pSmeRsp)->respStatus );
7297 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007298 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07007299 //In case CSR issues STOP_BSS, we need to tell HDD about peer departed becasue PE is removing them
7300 case eWNI_SME_IBSS_PEER_DEPARTED_IND:
7301 pIbssPeerInd = (tSmeIbssPeerInd*)pSmeRsp;
7302 smsLog(pMac, LOGE, "CSR: Peer departed notification from LIM in joining state\n");
7303 palZeroMemory( pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo) );
7304 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
7305 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
7306 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
7307 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
7308 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
7309 eCSR_ROAM_CONNECT_STATUS_UPDATE,
7310 eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
7311 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07007312 default:
7313 smsLog( pMac, LOG1, "Unexpected message type = %d[0x%X] received in substate %d\n",
7314 pSmeRsp->messageType, pSmeRsp->messageType,
7315 pMac->roam.curSubState[pSmeRsp->sessionId] );
7316
7317 //If we are connected, check the link status change
7318 if(!csrIsConnStateDisconnected(pMac, sessionId))
7319 {
7320 csrRoamCheckForLinkStatusChange( pMac, pSmeRsp );
7321 }
7322 break;
7323 }
7324}
7325
Jeff Johnson295189b2012-06-20 16:38:30 -07007326void csrRoamJoinedStateMsgProcessor( tpAniSirGlobal pMac, void *pMsgBuf )
7327{
7328 tSirSmeRsp *pSirMsg = (tSirSmeRsp *)pMsgBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -07007329 switch (pSirMsg->messageType)
7330 {
7331 case eWNI_SME_GET_STATISTICS_RSP:
Mohit Khanna23863762012-09-11 17:40:09 -07007332 smsLog( pMac, LOG2, FL("Stats rsp from PE\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07007333 csrRoamStatsRspProcessor( pMac, pSirMsg );
7334 break;
7335#ifdef WLAN_SOFTAP_FEATURE
7336 case eWNI_SME_UPPER_LAYER_ASSOC_CNF:
7337 {
7338 tCsrRoamSession *pSession;
7339 tSirSmeAssocIndToUpperLayerCnf *pUpperLayerAssocCnf;
7340 tCsrRoamInfo roamInfo;
7341 tCsrRoamInfo *pRoamInfo = NULL;
7342 tANI_U32 sessionId;
7343 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -07007344 smsLog( pMac, LOG1, FL("ASSOCIATION confirmation can be given to upper layer \n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07007345 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
7346 pRoamInfo = &roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07007347 pUpperLayerAssocCnf = (tSirSmeAssocIndToUpperLayerCnf *)pMsgBuf;
7348 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pUpperLayerAssocCnf->bssId, &sessionId );
7349 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07007350
7351 if(!pSession)
7352 {
7353 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
7354 return;
7355 }
7356
Jeff Johnson295189b2012-06-20 16:38:30 -07007357 pRoamInfo->statusCode = eSIR_SME_SUCCESS; //send the status code as Success
7358 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
Jeff Johnson295189b2012-06-20 16:38:30 -07007359 pRoamInfo->staId = (tANI_U8)pUpperLayerAssocCnf->aid;
7360 pRoamInfo->rsnIELen = (tANI_U8)pUpperLayerAssocCnf->rsnIE.length;
7361 pRoamInfo->prsnIE = pUpperLayerAssocCnf->rsnIE.rsnIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07007362 pRoamInfo->addIELen = (tANI_U8)pUpperLayerAssocCnf->addIE.length;
7363 pRoamInfo->paddIE = pUpperLayerAssocCnf->addIE.addIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07007364 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pUpperLayerAssocCnf->peerMacAddr, sizeof(tSirMacAddr));
7365 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pUpperLayerAssocCnf->bssId, sizeof(tCsrBssid));
Jeff Johnson295189b2012-06-20 16:38:30 -07007366 pRoamInfo->wmmEnabledSta = pUpperLayerAssocCnf->wmmEnabledSta;
Jeff Johnson295189b2012-06-20 16:38:30 -07007367 if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile) )
7368 {
7369 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED;
7370 pRoamInfo->fReassocReq = pUpperLayerAssocCnf->reassocReq;
7371 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_CNF);
7372 }
7373 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
7374 {
7375 vos_sleep( 100 );
7376 pMac->roam.roamSession[sessionId].connectState = eCSR_ASSOC_STATE_TYPE_WDS_CONNECTED;//Sta
7377 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND);//Sta
7378 }
7379
Jeff Johnson295189b2012-06-20 16:38:30 -07007380 }
7381 break;
7382#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07007383 default:
7384 csrRoamCheckForLinkStatusChange( pMac, pSirMsg );
7385 break;
7386 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007387}
7388
Jeff Johnson295189b2012-06-20 16:38:30 -07007389eHalStatus csrRoamIssueSetContextReq( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrEncryptionType EncryptType,
7390 tSirBssDescription *pBssDescription,
7391 tSirMacAddr *bssId, tANI_BOOLEAN addKey,
7392 tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
7393 tANI_U8 keyId, tANI_U16 keyLength,
7394 tANI_U8 *pKey, tANI_U8 paeRole )
7395{
7396 eHalStatus status = eHAL_STATUS_SUCCESS;
7397 tAniEdType edType;
7398
7399 if(eCSR_ENCRYPT_TYPE_UNKNOWN == EncryptType)
7400 {
7401 EncryptType = eCSR_ENCRYPT_TYPE_NONE; //***
7402 }
7403
7404 edType = csrTranslateEncryptTypeToEdType( EncryptType );
7405
7406 // Allow 0 keys to be set for the non-WPA encrypt types... For WPA encrypt types, the num keys must be non-zero
7407 // or LIM will reject the set context (assumes the SET_CONTEXT does not occur until the keys are distrubuted).
7408 if ( CSR_IS_ENC_TYPE_STATIC( EncryptType ) ||
7409 addKey )
7410 {
7411 tCsrRoamSetKey setKey;
Jeff Johnson295189b2012-06-20 16:38:30 -07007412 setKey.encType = EncryptType;
7413 setKey.keyDirection = aniKeyDirection; //Tx, Rx or Tx-and-Rx
7414 palCopyMemory( pMac->hHdd, &setKey.peerMac, bssId, sizeof(tCsrBssid) );
7415 setKey.paeRole = paeRole; //0 for supplicant
7416 setKey.keyId = keyId; // Kye index
7417 setKey.keyLength = keyLength;
7418 if( keyLength )
7419 {
7420 palCopyMemory( pMac->hHdd, setKey.Key, pKey, keyLength );
7421 }
7422 status = csrRoamIssueSetKeyCommand( pMac, sessionId, &setKey, 0 );
7423 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007424 return (status);
7425}
7426
Jeff Johnson295189b2012-06-20 16:38:30 -07007427static eHalStatus csrRoamIssueSetKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
7428 tCsrRoamSetKey *pSetKey, tANI_U32 roamId )
7429{
7430 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
7431 tSmeCmd *pCommand = NULL;
7432#ifdef FEATURE_WLAN_CCX
7433 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7434#endif /* FEATURE_WLAN_CCX */
7435
7436 do
7437 {
7438 pCommand = csrGetCommandBuffer(pMac);
7439 if(NULL == pCommand)
7440 {
7441 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7442 status = eHAL_STATUS_RESOURCES;
7443 break;
7444 }
7445 pCommand->command = eSmeCommandSetKey;
7446 pCommand->sessionId = (tANI_U8)sessionId;
7447 // validate the key length, Adjust if too long...
7448 // for static WEP the keys are not set thru' SetContextReq
7449 if ( ( eCSR_ENCRYPT_TYPE_WEP40 == pSetKey->encType ) ||
7450 ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pSetKey->encType ) )
7451 {
7452 //KeyLength maybe 0 for static WEP
7453 if( pSetKey->keyLength )
7454 {
7455 if ( pSetKey->keyLength < CSR_WEP40_KEY_LEN )
7456 {
7457 smsLog( pMac, LOGW, "Invalid WEP40 keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7458 break;
7459 }
7460
7461 pCommand->u.setKeyCmd.keyLength = CSR_WEP40_KEY_LEN;
7462 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WEP40_KEY_LEN );
7463 }
7464 }
7465 else if ( ( eCSR_ENCRYPT_TYPE_WEP104 == pSetKey->encType ) ||
7466 ( eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pSetKey->encType ) )
7467 {
7468 //KeyLength maybe 0 for static WEP
7469 if( pSetKey->keyLength )
7470 {
7471 if ( pSetKey->keyLength < CSR_WEP104_KEY_LEN )
7472 {
7473 smsLog( pMac, LOGW, "Invalid WEP104 keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7474 break;
7475 }
7476
7477 pCommand->u.setKeyCmd.keyLength = CSR_WEP104_KEY_LEN;
7478 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WEP104_KEY_LEN );
7479 }
7480 }
7481 else if ( eCSR_ENCRYPT_TYPE_TKIP == pSetKey->encType )
7482 {
7483 if ( pSetKey->keyLength < CSR_TKIP_KEY_LEN )
7484 {
7485 smsLog( pMac, LOGW, "Invalid TKIP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7486 break;
7487 }
7488 pCommand->u.setKeyCmd.keyLength = CSR_TKIP_KEY_LEN;
7489 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_TKIP_KEY_LEN );
7490 }
7491 else if ( eCSR_ENCRYPT_TYPE_AES == pSetKey->encType )
7492 {
7493 if ( pSetKey->keyLength < CSR_AES_KEY_LEN )
7494 {
7495 smsLog( pMac, LOGW, "Invalid AES/CCMP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7496 break;
7497 }
7498 pCommand->u.setKeyCmd.keyLength = CSR_AES_KEY_LEN;
7499 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_AES_KEY_LEN );
7500 }
7501#ifdef FEATURE_WLAN_WAPI
7502 else if ( eCSR_ENCRYPT_TYPE_WPI == pSetKey->encType )
7503 {
7504 if ( pSetKey->keyLength < CSR_WAPI_KEY_LEN )
7505 {
7506 smsLog( pMac, LOGW, "Invalid WAPI keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7507 break;
7508 }
7509 pCommand->u.setKeyCmd.keyLength = CSR_WAPI_KEY_LEN;
7510 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_WAPI_KEY_LEN );
7511 }
7512#endif /* FEATURE_WLAN_WAPI */
7513#ifdef FEATURE_WLAN_CCX
7514 else if ( eCSR_ENCRYPT_TYPE_KRK == pSetKey->encType )
7515 {
7516 if ( pSetKey->keyLength < CSR_KRK_KEY_LEN )
7517 {
7518 smsLog( pMac, LOGW, "Invalid KRK keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7519 break;
7520 }
7521 palCopyMemory( pMac->hHdd, pSession->ccxCckmInfo.krk, pSetKey->Key, CSR_KRK_KEY_LEN );
7522 pSession->ccxCckmInfo.reassoc_req_num=1;
7523 pSession->ccxCckmInfo.krk_plumbed = eANI_BOOLEAN_TRUE;
7524 status = eHAL_STATUS_SUCCESS;
7525 break;
7526 }
7527#endif /* FEATURE_WLAN_CCX */
Jeff Johnsone7245742012-09-05 17:12:55 -07007528
Jeff Johnson295189b2012-06-20 16:38:30 -07007529#ifdef WLAN_FEATURE_11W
7530 //Check for 11w BIP
7531 else if ( eCSR_ENCRYPT_TYPE_AES_CMAC == pSetKey->encType )
7532 {
7533 tANI_U16 count = 0;
7534 if ( pSetKey->keyLength < CSR_AES_KEY_LEN )
7535 {
7536 smsLog( pMac, LOGW, "Invalid AES/CCMP keylength [= %d] in SetContext call\n", pSetKey->keyLength );
7537 break;
7538 }
7539 pCommand->u.setKeyCmd.keyLength = CSR_AES_KEY_LEN;
7540 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.Key, pSetKey->Key, CSR_AES_KEY_LEN );
7541 }
7542#endif
7543 status = eHAL_STATUS_SUCCESS;
7544 pCommand->u.setKeyCmd.roamId = roamId;
7545 pCommand->u.setKeyCmd.encType = pSetKey->encType;
7546 pCommand->u.setKeyCmd.keyDirection = pSetKey->keyDirection; //Tx, Rx or Tx-and-Rx
7547 palCopyMemory( pMac->hHdd, &pCommand->u.setKeyCmd.peerMac, &pSetKey->peerMac, sizeof(tCsrBssid) );
7548 pCommand->u.setKeyCmd.paeRole = pSetKey->paeRole; //0 for supplicant
7549 pCommand->u.setKeyCmd.keyId = pSetKey->keyId;
7550 palCopyMemory( pMac->hHdd, pCommand->u.setKeyCmd.keyRsc, pSetKey->keyRsc, CSR_MAX_RSC_LEN );
7551 //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
7552
7553 status = csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_TRUE);
7554 if( !HAL_STATUS_SUCCESS( status ) )
7555 {
7556 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
7557 }
7558 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07007559 // Free the command if there has been a failure, or it is a
7560 // "local" operation like the set CCX CCKM KRK key.
7561 if( (!HAL_STATUS_SUCCESS( status ) && ( NULL != pCommand ))
7562#ifdef FEATURE_WLAN_CCX
7563 || ( eCSR_ENCRYPT_TYPE_KRK == pSetKey->encType )
7564#endif /* FEATURE_WLAN_CCX */
7565 )
7566 {
7567 csrReleaseCommandSetKey( pMac, pCommand );
7568 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007569 return( status );
7570}
7571
Jeff Johnson295189b2012-06-20 16:38:30 -07007572eHalStatus csrRoamIssueRemoveKeyCommand( tpAniSirGlobal pMac, tANI_U32 sessionId,
7573 tCsrRoamRemoveKey *pRemoveKey, tANI_U32 roamId )
7574{
7575 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
7576 tSmeCmd *pCommand = NULL;
7577 tANI_BOOLEAN fImediate = eANI_BOOLEAN_TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -07007578 do
7579 {
7580 if( !csrIsSetKeyAllowed(pMac, sessionId) )
7581 {
7582 smsLog( pMac, LOGW, FL(" wrong state not allowed to set key\n") );
7583 status = eHAL_STATUS_CSR_WRONG_STATE;
7584 break;
7585 }
7586 pCommand = csrGetCommandBuffer(pMac);
7587 if(NULL == pCommand)
7588 {
7589 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7590 status = eHAL_STATUS_RESOURCES;
7591 break;
7592 }
7593 pCommand->command = eSmeCommandRemoveKey;
7594 pCommand->sessionId = (tANI_U8)sessionId;
7595 pCommand->u.removeKeyCmd.roamId = roamId;
7596 pCommand->u.removeKeyCmd.encType = pRemoveKey->encType;
7597 palCopyMemory( pMac->hHdd, &pCommand->u.removeKeyCmd.peerMac, &pRemoveKey->peerMac, sizeof(tSirMacAddr) );
7598 pCommand->u.removeKeyCmd.keyId = pRemoveKey->keyId;
7599 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
7600 {
7601 //in this case, put it to the end of the Q incase there is a set key pending.
7602 fImediate = eANI_BOOLEAN_FALSE;
7603 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007604 smsLog( pMac, LOGE, FL("keyType=%d, keyId=%d, PeerMac=%02x, %02x, %02x, %02x, %02x, %02x\n"),
7605 pRemoveKey->encType, pRemoveKey->keyId,
7606 pCommand->u.removeKeyCmd.peerMac[0],
7607 pCommand->u.removeKeyCmd.peerMac[1],
7608 pCommand->u.removeKeyCmd.peerMac[2],
7609 pCommand->u.removeKeyCmd.peerMac[3],
7610 pCommand->u.removeKeyCmd.peerMac[4],
7611 pCommand->u.removeKeyCmd.peerMac[5]);
Jeff Johnson295189b2012-06-20 16:38:30 -07007612 status = csrQueueSmeCommand(pMac, pCommand, fImediate);
7613 if( !HAL_STATUS_SUCCESS( status ) )
7614 {
7615 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
7616 break;
7617 }
7618 } while (0);
Jeff Johnson295189b2012-06-20 16:38:30 -07007619 if( !HAL_STATUS_SUCCESS( status ) && ( NULL != pCommand ) )
7620 {
7621 csrReleaseCommandRemoveKey( pMac, pCommand );
7622 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007623 return (status );
7624}
7625
Jeff Johnson295189b2012-06-20 16:38:30 -07007626eHalStatus csrRoamProcessSetKeyCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
7627{
7628 eHalStatus status;
7629 tANI_U8 numKeys = ( pCommand->u.setKeyCmd.keyLength ) ? 1 : 0;
7630 tAniEdType edType = csrTranslateEncryptTypeToEdType( pCommand->u.setKeyCmd.encType );
7631 tANI_BOOLEAN fUnicast = ( pCommand->u.setKeyCmd.peerMac[0] == 0xFF ) ? eANI_BOOLEAN_FALSE : eANI_BOOLEAN_TRUE;
7632 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007633#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7634 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7635 WLAN_VOS_DIAG_EVENT_DEF(setKeyEvent, vos_event_wlan_security_payload_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07007636 if(eCSR_ENCRYPT_TYPE_NONE != edType)
7637 {
7638 palZeroMemory(pMac->hHdd, &setKeyEvent, sizeof(vos_event_wlan_security_payload_type));
7639 if( *(( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac) & 0x01 )
7640 {
7641 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_REQ;
7642 setKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pCommand->u.setKeyCmd.encType);
7643 setKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
7644 }
7645 else
7646 {
7647 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_REQ;
7648 setKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pCommand->u.setKeyCmd.encType);
7649 setKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
7650 }
7651 palCopyMemory( pMac->hHdd, setKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
7652 if(CSR_IS_ENC_TYPE_STATIC(edType))
7653 {
7654 tANI_U32 defKeyId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007655 //It has to be static WEP here
7656 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_WEP_DEFAULT_KEYID, &defKeyId)))
7657 {
7658 setKeyEvent.keyId = (v_U8_t)defKeyId;
7659 }
7660 }
7661 else
7662 {
7663 setKeyEvent.keyId = pCommand->u.setKeyCmd.keyId;
7664 }
7665 setKeyEvent.authMode = (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
7666 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
7667 }
7668#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007669 if( csrIsSetKeyAllowed(pMac, sessionId) )
7670 {
7671 status = csrSendMBSetContextReqMsg( pMac, sessionId,
7672 ( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac,
7673 numKeys, edType, fUnicast, pCommand->u.setKeyCmd.keyDirection,
7674 pCommand->u.setKeyCmd.keyId, pCommand->u.setKeyCmd.keyLength,
7675 pCommand->u.setKeyCmd.Key, pCommand->u.setKeyCmd.paeRole,
7676 pCommand->u.setKeyCmd.keyRsc);
7677 }
7678 else
7679 {
7680 smsLog( pMac, LOGW, FL(" cannot process not connected\n") );
7681 //Set this status so the error handling take care of the case.
7682 status = eHAL_STATUS_CSR_WRONG_STATE;
7683 }
7684 if( !HAL_STATUS_SUCCESS(status) )
7685 {
7686 smsLog( pMac, LOGE, FL(" error status %d\n"), status );
7687 csrRoamCallCallback( pMac, sessionId, NULL, pCommand->u.setKeyCmd.roamId, eCSR_ROAM_SET_KEY_COMPLETE, eCSR_ROAM_RESULT_FAILURE);
Jeff Johnson295189b2012-06-20 16:38:30 -07007688#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7689 if(eCSR_ENCRYPT_TYPE_NONE != edType)
7690 {
7691 if( *(( tANI_U8 *)&pCommand->u.setKeyCmd.peerMac) & 0x01 )
7692 {
7693 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_RSP;
7694 }
7695 else
7696 {
7697 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_RSP;
7698 }
7699 setKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
7700 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
7701 }
7702#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007703 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007704 return ( status );
7705}
7706
Jeff Johnson295189b2012-06-20 16:38:30 -07007707eHalStatus csrRoamProcessRemoveKeyCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
7708{
7709 eHalStatus status;
7710 tpSirSmeRemoveKeyReq pMsg = NULL;
7711 tANI_U16 wMsgLen = sizeof(tSirSmeRemoveKeyReq);
7712 tANI_U8 *p;
7713 tANI_U32 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -07007714#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7715 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
7716 WLAN_VOS_DIAG_EVENT_DEF(removeKeyEvent, vos_event_wlan_security_payload_type);
Jeff Johnson295189b2012-06-20 16:38:30 -07007717 palZeroMemory(pMac->hHdd, &removeKeyEvent, sizeof(vos_event_wlan_security_payload_type));
7718 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_REQ;
7719 removeKeyEvent.encryptionModeMulticast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
7720 removeKeyEvent.encryptionModeUnicast = (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
7721 palCopyMemory( pMac->hHdd, removeKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
7722 removeKeyEvent.keyId = pCommand->u.removeKeyCmd.keyId;
7723 removeKeyEvent.authMode = (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
7724 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
7725#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007726 if( csrIsSetKeyAllowed(pMac, sessionId) )
7727 {
7728 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, wMsgLen );
7729 }
7730 else
7731 {
7732 smsLog( pMac, LOGW, FL(" wrong state not allowed to set key\n") );
7733 //Set the error status so error handling kicks in below
7734 status = eHAL_STATUS_CSR_WRONG_STATE;
7735 }
7736 if( HAL_STATUS_SUCCESS( status ) )
7737 {
7738 palZeroMemory(pMac->hHdd, pMsg, wMsgLen);
7739 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_REMOVEKEY_REQ);
7740 pMsg->length = pal_cpu_to_be16(wMsgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -07007741 pMsg->sessionId = (tANI_U8)sessionId;
7742 pMsg->transactionId = 0;
7743 p = (tANI_U8 *)pMsg + sizeof(pMsg->messageType) + sizeof(pMsg->length) +
7744 sizeof(pMsg->sessionId) + sizeof(pMsg->transactionId);
7745 // bssId - copy from session Info
7746 palCopyMemory( pMac->hHdd, p, &pMac->roam.roamSession[sessionId].connectedProfile.bssid, sizeof(tSirMacAddr) );
7747 p += sizeof(tSirMacAddr);
7748 // peerMacAddr
7749 palCopyMemory( pMac->hHdd, p, pCommand->u.removeKeyCmd.peerMac, sizeof(tSirMacAddr) );
7750 p += sizeof(tSirMacAddr);
7751 // edType
7752 *p = (tANI_U8)csrTranslateEncryptTypeToEdType( pCommand->u.removeKeyCmd.encType );
7753 p++;
7754 // weptype
7755 if( ( eCSR_ENCRYPT_TYPE_WEP40_STATICKEY == pCommand->u.removeKeyCmd.encType ) ||
7756 ( eCSR_ENCRYPT_TYPE_WEP104_STATICKEY == pCommand->u.removeKeyCmd.encType ) )
7757 {
7758 *p = (tANI_U8)eSIR_WEP_STATIC;
7759 }
7760 else
7761 {
7762 *p = (tANI_U8)eSIR_WEP_DYNAMIC;
7763 }
7764 p++;
7765 //keyid
7766 *p = pCommand->u.removeKeyCmd.keyId;
7767 p++;
7768 *p = (pCommand->u.removeKeyCmd.peerMac[0] == 0xFF ) ? 0 : 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07007769 status = palSendMBMessage(pMac->hHdd, pMsg);
7770 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007771 if( !HAL_STATUS_SUCCESS( status ) )
7772 {
7773 smsLog( pMac, LOGE, FL(" error status \n"), status );
Jeff Johnson295189b2012-06-20 16:38:30 -07007774#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
7775 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_RSP;
Madan Mohan Koyyalamudi4e31b132012-11-02 13:13:52 -07007776 removeKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07007777 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
7778#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07007779 csrRoamCallCallback( pMac, sessionId, NULL, pCommand->u.removeKeyCmd.roamId, eCSR_ROAM_REMOVE_KEY_COMPLETE, eCSR_ROAM_RESULT_FAILURE);
7780 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007781 return ( status );
7782}
7783
Jeff Johnson295189b2012-06-20 16:38:30 -07007784eHalStatus csrRoamSetKey( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamSetKey *pSetKey, tANI_U32 roamId )
7785{
7786 eHalStatus status;
7787
7788 if( !csrIsSetKeyAllowed(pMac, sessionId) )
7789 {
7790 status = eHAL_STATUS_CSR_WRONG_STATE;
7791 }
7792 else
7793 {
7794 status = csrRoamIssueSetKeyCommand( pMac, sessionId, pSetKey, roamId );
7795 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007796 return ( status );
7797}
7798
Jeff Johnson295189b2012-06-20 16:38:30 -07007799/*
7800 Prepare a filter base on a profile for parsing the scan results.
7801 Upon successful return, caller MUST call csrFreeScanFilter on
7802 pScanFilter when it is done with the filter.
7803*/
7804eHalStatus csrRoamPrepareFilterFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
7805 tCsrScanResultFilter *pScanFilter)
7806{
7807 eHalStatus status = eHAL_STATUS_SUCCESS;
7808 tANI_U32 size = 0;
7809 tANI_U8 index = 0;
7810
7811 do
7812 {
7813 if(pProfile->BSSIDs.numOfBSSIDs)
7814 {
7815 size = sizeof(tCsrBssid) * pProfile->BSSIDs.numOfBSSIDs;
7816 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->BSSIDs.bssid, size);
7817 if(!HAL_STATUS_SUCCESS(status))
7818 {
7819 break;
7820 }
7821 pScanFilter->BSSIDs.numOfBSSIDs = pProfile->BSSIDs.numOfBSSIDs;
7822 palCopyMemory(pMac->hHdd, pScanFilter->BSSIDs.bssid, pProfile->BSSIDs.bssid, size);
7823 }
7824 if(pProfile->SSIDs.numOfSSIDs)
7825 {
7826 if( !CSR_IS_WDS_STA( pProfile ) )
7827 {
7828 pScanFilter->SSIDs.numOfSSIDs = pProfile->SSIDs.numOfSSIDs;
7829 }
7830 else
7831 {
7832 //For WDS station
7833 //We always use index 1 for self SSID. Index 0 for peer's SSID that we want to join
7834 pScanFilter->SSIDs.numOfSSIDs = 1;
7835 }
7836 size = sizeof(tCsrSSIDInfo) * pProfile->SSIDs.numOfSSIDs;
7837 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->SSIDs.SSIDList, size);
7838 if(!HAL_STATUS_SUCCESS(status))
7839 {
7840 break;
7841 }
7842 palCopyMemory(pMac->hHdd, pScanFilter->SSIDs.SSIDList, pProfile->SSIDs.SSIDList, size);
7843 }
7844 if(!pProfile->ChannelInfo.ChannelList || (pProfile->ChannelInfo.ChannelList[0] == 0) )
7845 {
7846 pScanFilter->ChannelInfo.numOfChannels = 0;
7847 pScanFilter->ChannelInfo.ChannelList = NULL;
7848 }
7849 else if(pProfile->ChannelInfo.numOfChannels)
7850 {
7851 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->ChannelInfo.ChannelList, sizeof(*pScanFilter->ChannelInfo.ChannelList) * pProfile->ChannelInfo.numOfChannels);
7852 pScanFilter->ChannelInfo.numOfChannels = 0;
7853 if(HAL_STATUS_SUCCESS(status))
7854 {
7855 for(index = 0; index < pProfile->ChannelInfo.numOfChannels; index++)
7856 {
7857 if(csrRoamIsChannelValid(pMac, pProfile->ChannelInfo.ChannelList[index]))
7858 {
7859 pScanFilter->ChannelInfo.ChannelList[pScanFilter->ChannelInfo.numOfChannels]
7860 = pProfile->ChannelInfo.ChannelList[index];
7861 pScanFilter->ChannelInfo.numOfChannels++;
7862 }
7863 else
7864 {
7865 smsLog(pMac, LOG1, FL("process a channel (%d) that is invalid\n"), pProfile->ChannelInfo.ChannelList[index]);
7866 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007867 }
7868 }
7869 else
7870 {
7871 break;
7872 }
Jeff Johnson295189b2012-06-20 16:38:30 -07007873 }
7874 else
7875 {
7876 smsLog(pMac, LOGW, FL("Channel list empty\n"));
7877 status = eHAL_STATUS_FAILURE;
7878 break;
7879 }
7880 pScanFilter->uapsd_mask = pProfile->uapsd_mask;
7881 pScanFilter->authType = pProfile->AuthType;
7882 pScanFilter->EncryptionType = pProfile->EncryptionType;
7883 pScanFilter->mcEncryptionType = pProfile->mcEncryptionType;
7884 pScanFilter->BSSType = pProfile->BSSType;
7885 pScanFilter->phyMode = pProfile->phyMode;
7886#ifdef FEATURE_WLAN_WAPI
7887 //check if user asked for WAPI with 11n or auto mode, in that case modify
7888 //the phymode to 11g
7889 if(csrIsProfileWapi(pProfile))
7890 {
7891 if(pScanFilter->phyMode & eCSR_DOT11_MODE_11n)
7892 {
7893 pScanFilter->phyMode &= ~eCSR_DOT11_MODE_11n;
7894 }
7895 if(pScanFilter->phyMode & eCSR_DOT11_MODE_AUTO)
7896 {
7897 pScanFilter->phyMode &= ~eCSR_DOT11_MODE_AUTO;
7898 }
7899 if(!pScanFilter->phyMode)
7900 {
7901 pScanFilter->phyMode = eCSR_DOT11_MODE_11g;
7902 }
7903 }
7904#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -07007905 /*Save the WPS info*/
7906 pScanFilter->bWPSAssociation = pProfile->bWPSAssociation;
Jeff Johnson295189b2012-06-20 16:38:30 -07007907 if( pProfile->countryCode[0] )
7908 {
7909 //This causes the matching function to use countryCode as one of the criteria.
7910 palCopyMemory( pMac->hHdd, pScanFilter->countryCode, pProfile->countryCode,
7911 WNI_CFG_COUNTRY_CODE_LEN );
7912 }
7913#ifdef WLAN_FEATURE_VOWIFI_11R
7914 if (pProfile->MDID.mdiePresent)
7915 {
7916 pScanFilter->MDID.mdiePresent = 1;
7917 pScanFilter->MDID.mobilityDomain = pProfile->MDID.mobilityDomain;
7918 }
7919#endif
7920
7921 }while(0);
7922
7923 if(!HAL_STATUS_SUCCESS(status))
7924 {
7925 csrFreeScanFilter(pMac, pScanFilter);
7926 }
7927
7928 return(status);
7929}
7930
Jeff Johnson295189b2012-06-20 16:38:30 -07007931tANI_BOOLEAN csrRoamIssueWmStatusChange( tpAniSirGlobal pMac, tANI_U32 sessionId,
7932 eCsrRoamWmStatusChangeTypes Type, tSirSmeRsp *pSmeRsp )
7933{
7934 tANI_BOOLEAN fCommandQueued = eANI_BOOLEAN_FALSE;
7935 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07007936 do
7937 {
7938 // Validate the type is ok...
7939 if ( ( eCsrDisassociated != Type ) && ( eCsrDeauthenticated != Type ) ) break;
7940 pCommand = csrGetCommandBuffer( pMac );
7941 if ( !pCommand )
7942 {
7943 smsLog( pMac, LOGE, FL(" fail to get command buffer\n") );
7944 break;
7945 }
7946 //Change the substate in case it is waiting for key
7947 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId ) )
7948 {
7949 csrRoamStopWaitForKeyTimer( pMac );
7950 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
7951 }
7952 pCommand->command = eSmeCommandWmStatusChange;
7953 pCommand->sessionId = (tANI_U8)sessionId;
7954 pCommand->u.wmStatusChangeCmd.Type = Type;
7955 if ( eCsrDisassociated == Type )
7956 {
7957 palCopyMemory( pMac->hHdd, &pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg, pSmeRsp,
7958 sizeof( pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg ) );
7959 }
7960 else
7961 {
7962 palCopyMemory( pMac->hHdd, &pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg, pSmeRsp,
7963 sizeof( pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg ) );
7964 }
7965 if( HAL_STATUS_SUCCESS( csrQueueSmeCommand(pMac, pCommand, eANI_BOOLEAN_TRUE) ) )
7966 {
7967 fCommandQueued = eANI_BOOLEAN_TRUE;
7968 }
7969 else
7970 {
7971 smsLog( pMac, LOGE, FL(" fail to send message \n") );
7972 csrReleaseCommandWmStatusChange( pMac, pCommand );
7973 }
7974
Jeff Johnson295189b2012-06-20 16:38:30 -07007975 /* AP has issued Dissac/Deauth, Set the operating mode value to configured value */
7976 csrSetDefaultDot11Mode( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -07007977 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -07007978 return( fCommandQueued );
7979}
7980
Jeff Johnson295189b2012-06-20 16:38:30 -07007981static void csrUpdateRssi(tpAniSirGlobal pMac, void* pMsg)
7982{
7983 v_S7_t rssi = 0;
7984 tAniGetRssiReq *pGetRssiReq = (tAniGetRssiReq*)pMsg;
7985 if(pGetRssiReq)
7986 {
7987 if(NULL != pGetRssiReq->pVosContext)
7988 {
7989 WLANTL_GetRssi(pGetRssiReq->pVosContext, pGetRssiReq->staId, &rssi);
7990 }
7991 else
7992 {
7993 smsLog( pMac, LOGE, FL("pGetRssiReq->pVosContext is NULL\n"));
7994 return;
7995 }
7996
7997 if(NULL != pGetRssiReq->rssiCallback)
7998 {
7999 ((tCsrRssiCallback)(pGetRssiReq->rssiCallback))(rssi, pGetRssiReq->staId, pGetRssiReq->pDevContext);
8000 }
8001 else
8002 {
8003 smsLog( pMac, LOGE, FL("pGetRssiReq->rssiCallback is NULL\n"));
8004 return;
8005 }
8006 }
8007 else
8008 {
8009 smsLog( pMac, LOGE, FL("pGetRssiReq is NULL\n"));
8010 }
8011 return;
8012}
Jeff Johnsone7245742012-09-05 17:12:55 -07008013static void csrRoamRssiIndHdlr(tpAniSirGlobal pMac, void* pMsg)
8014{
8015 WLANTL_TlIndicationReq *pTlRssiInd = (WLANTL_TlIndicationReq*)pMsg;
8016 if(pTlRssiInd)
8017 {
8018 if(NULL != pTlRssiInd->tlCallback)
8019 {
8020 ((WLANTL_RSSICrossThresholdCBType)(pTlRssiInd->tlCallback))
8021 (pTlRssiInd->pAdapter, pTlRssiInd->rssiNotification, pTlRssiInd->pUserCtxt);
8022 }
8023 else
8024 {
8025 smsLog( pMac, LOGE, FL("pTlRssiInd->tlCallback is NULL\n"));
8026 }
8027 }
8028 else
8029 {
8030 smsLog( pMac, LOGE, FL("pTlRssiInd is NULL\n"));
8031 }
8032 return;
8033}
Jeff Johnson295189b2012-06-20 16:38:30 -07008034
8035void csrRoamCheckForLinkStatusChange( tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg )
8036{
8037 tSirSmeAssocInd *pAssocInd;
8038 tSirSmeDisassocInd *pDisassocInd;
8039 tSirSmeDeauthInd *pDeauthInd;
8040 tSirSmeWmStatusChangeNtf *pStatusChangeMsg;
8041 tSirSmeNewBssInfo *pNewBss;
8042 tSmeIbssPeerInd *pIbssPeerInd;
8043 tSirMacAddr Broadcastaddr = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
8044 tSirSmeApNewCaps *pApNewCaps;
8045 eCsrRoamResult result = eCSR_ROAM_RESULT_NONE;
8046 eRoamCmdStatus roamStatus = eCSR_ROAM_FAILED;
8047 tCsrRoamInfo *pRoamInfo = NULL;
8048 tCsrRoamInfo roamInfo;
8049 eHalStatus status;
8050 tANI_U32 sessionId = CSR_SESSION_ID_INVALID;
8051 tCsrRoamSession *pSession = NULL;
8052 tpSirSmeSwitchChannelInd pSwitchChnInd;
8053 tSmeMaxAssocInd *pSmeMaxAssocInd;
Jeff Johnson295189b2012-06-20 16:38:30 -07008054#if defined ANI_PRODUCT_TYPE_AP
8055 pSirMsg->messageType = pal_be16_to_cpu(pSirMsg->messageType);
8056 pSirMsg->length = pal_be16_to_cpu(pSirMsg->length);
8057 pSirMsg->statusCode = pal_be32_to_cpu(pSirMsg->statusCode);
8058#else
8059 pSirMsg->messageType = (pSirMsg->messageType);
8060 pSirMsg->length = (pSirMsg->length);
8061 pSirMsg->statusCode = (pSirMsg->statusCode);
8062#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008063 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(roamInfo));
Jeff Johnson295189b2012-06-20 16:38:30 -07008064 switch( pSirMsg->messageType )
8065 {
8066 case eWNI_SME_ASSOC_IND:
8067 {
8068 tCsrRoamSession *pSession;
8069 smsLog( pMac, LOG1, FL("ASSOCIATION Indication from SME\n"));
8070 pAssocInd = (tSirSmeAssocInd *)pSirMsg;
8071 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pAssocInd->bssId, &sessionId );
8072 if( HAL_STATUS_SUCCESS( status ) )
8073 {
8074 pSession = CSR_GET_SESSION(pMac, sessionId);
8075
Jeff Johnson32d95a32012-09-10 13:15:23 -07008076 if(!pSession)
8077 {
8078 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8079 return;
8080 }
8081
Jeff Johnson295189b2012-06-20 16:38:30 -07008082 pRoamInfo = &roamInfo;
8083
8084 // Required for indicating the frames to upper layer
8085 pRoamInfo->assocReqLength = pAssocInd->assocReqLength;
8086 pRoamInfo->assocReqPtr = pAssocInd->assocReqPtr;
8087
8088 pRoamInfo->beaconPtr = pAssocInd->beaconPtr;
8089 pRoamInfo->beaconLength = pAssocInd->beaconLength;
8090 pRoamInfo->statusCode = eSIR_SME_SUCCESS; //send the status code as Success
8091 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8092
8093 pRoamInfo->staId = (tANI_U8)pAssocInd->staId;
8094 pRoamInfo->rsnIELen = (tANI_U8)pAssocInd->rsnIE.length;
8095 pRoamInfo->prsnIE = pAssocInd->rsnIE.rsnIEdata;
8096
8097 pRoamInfo->addIELen = (tANI_U8)pAssocInd->addIE.length;
8098 pRoamInfo->paddIE = pAssocInd->addIE.addIEdata;
Jeff Johnson295189b2012-06-20 16:38:30 -07008099 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
8100 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pAssocInd->bssId, sizeof(tCsrBssid));
8101#ifdef WLAN_SOFTAP_FEATURE
8102 pRoamInfo->wmmEnabledSta = pAssocInd->wmmEnabledSta;
8103 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
8104#endif
8105 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_WDS_IND, eCSR_ROAM_RESULT_WDS_ASSOCIATION_IND);//Sta
8106#ifdef WLAN_SOFTAP_FEATURE
8107 if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile))
8108 {
8109 if( CSR_IS_ENC_TYPE_STATIC( pSession->pCurRoamProfile->negotiatedUCEncryptionType ))
8110 {
8111 csrRoamIssueSetContextReq( pMac, sessionId, pSession->pCurRoamProfile->negotiatedUCEncryptionType,
8112 pSession->pConnectBssDesc,
8113 &(pRoamInfo->peerMac),
8114 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
8115 pRoamInfo->fAuthRequired = FALSE;
8116 }
8117 else
8118 {
8119 pRoamInfo->fAuthRequired = TRUE;
8120 }
8121 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_IND);
8122 if (!HAL_STATUS_SUCCESS(status))
8123 pRoamInfo->statusCode = eSIR_SME_ASSOC_REFUSED;// Refused due to Mac filtering
8124 }
8125#endif
8126 /* Send Association completion message to PE */
8127 status = csrSendAssocCnfMsg( pMac, pAssocInd, status );//Sta
8128
8129 /* send a message to CSR itself just to avoid the EAPOL frames going
8130 * OTA before association response */
Jeff Johnson295189b2012-06-20 16:38:30 -07008131 if(CSR_IS_WDS_AP( pRoamInfo->u.pConnectedProfile))
8132 {
8133 status = csrSendAssocIndToUpperLayerCnfMsg(pMac, pAssocInd, status, sessionId);
8134 }
8135#ifdef WLAN_SOFTAP_FEATURE
8136 else if(CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile) && (pRoamInfo->statusCode != eSIR_SME_ASSOC_REFUSED))
8137 {
8138 pRoamInfo->fReassocReq = pAssocInd->reassocReq;
8139 //status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_INFRA_ASSOCIATION_CNF);
8140 status = csrSendAssocIndToUpperLayerCnfMsg(pMac, pAssocInd, status, sessionId);
8141 }
8142#endif
8143 }
8144 }
8145 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008146 case eWNI_SME_DISASSOC_IND:
8147 smsLog( pMac, LOGE, FL("DISASSOCIATION Indication from MAC\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008148 // Check if AP dis-associated us because of MIC failure. If so,
8149 // then we need to take action immediately and not wait till the
8150 // the WmStatusChange requests is pushed and processed
8151 pDisassocInd = (tSirSmeDisassocInd *)pSirMsg;
8152 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pDisassocInd->bssId, &sessionId );
8153 if( HAL_STATUS_SUCCESS( status ) )
8154 {
8155 // If we are in neighbor preauth done state then on receiving
8156 // disassoc or deauth we dont roam instead we just disassoc
8157 // from current ap and then go to disconnected state
8158 // This happens for CCX and 11r FT connections ONLY.
8159#ifdef WLAN_FEATURE_VOWIFI_11R
8160 if (csrRoamIs11rAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8161 {
8162 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8163 }
8164#endif
8165#ifdef FEATURE_WLAN_CCX
8166 if (csrRoamIsCCXAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8167 {
8168 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8169 }
8170#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07008171#ifdef FEATURE_WLAN_LFR
8172 if (csrRoamIsFastRoamEnabled(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8173 {
8174 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8175 }
8176#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008177 pSession = CSR_GET_SESSION( pMac, sessionId );
8178
Jeff Johnson32d95a32012-09-10 13:15:23 -07008179 if(!pSession)
8180 {
8181 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8182 return;
8183 }
8184
Jeff Johnson295189b2012-06-20 16:38:30 -07008185 if ( csrIsConnStateInfra( pMac, sessionId ) )
8186 {
8187 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
8188 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008189#ifndef WLAN_MDM_CODE_REDUCTION_OPT
8190 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
8191#endif
8192 csrRoamLinkDown(pMac, sessionId);
8193 csrRoamIssueWmStatusChange( pMac, sessionId, eCsrDisassociated, pSirMsg );
8194#ifdef WLAN_SOFTAP_FEATURE
8195 if(CSR_IS_INFRA_AP(&pSession->connectedProfile))
8196 {
8197
8198 pRoamInfo = &roamInfo;
8199
8200 pRoamInfo->statusCode = pDisassocInd->statusCode;
8201 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8202
8203 pRoamInfo->staId = (tANI_U8)pDisassocInd->staId;
8204
8205 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDisassocInd->peerMacAddr, sizeof(tSirMacAddr));
8206 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pDisassocInd->bssId, sizeof(tCsrBssid));
8207
8208 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_DISASSOC_IND);
8209 }
8210#endif
8211 }
8212 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008213 case eWNI_SME_DEAUTH_IND:
8214 smsLog( pMac, LOG1, FL("DEAUTHENTICATION Indication from MAC\n"));
8215 pDeauthInd = (tpSirSmeDeauthInd)pSirMsg;
8216 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pDeauthInd->bssId, &sessionId );
8217 if( HAL_STATUS_SUCCESS( status ) )
8218 {
8219 // If we are in neighbor preauth done state then on receiving
8220 // disassoc or deauth we dont roam instead we just disassoc
8221 // from current ap and then go to disconnected state
8222 // This happens for CCX and 11r FT connections ONLY.
8223#ifdef WLAN_FEATURE_VOWIFI_11R
8224 if (csrRoamIs11rAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8225 {
8226 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8227 }
8228#endif
8229#ifdef FEATURE_WLAN_CCX
8230 if (csrRoamIsCCXAssoc(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8231 {
8232 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8233 }
8234#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -07008235#ifdef FEATURE_WLAN_LFR
8236 if (csrRoamIsFastRoamEnabled(pMac) && (csrNeighborRoamStatePreauthDone(pMac)))
8237 {
8238 csrNeighborRoamTranistionPreauthDoneToDisconnected(pMac);
8239 }
8240#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008241 pSession = CSR_GET_SESSION( pMac, sessionId );
8242
Jeff Johnson32d95a32012-09-10 13:15:23 -07008243 if(!pSession)
8244 {
8245 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8246 return;
8247 }
8248
Jeff Johnson295189b2012-06-20 16:38:30 -07008249 if ( csrIsConnStateInfra( pMac, sessionId ) )
8250 {
8251 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
8252 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008253#ifndef WLAN_MDM_CODE_REDUCTION_OPT
8254 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_DISCONNECT_IND, NULL);
8255#endif
8256 csrRoamLinkDown(pMac, sessionId);
8257 csrRoamIssueWmStatusChange( pMac, sessionId, eCsrDeauthenticated, pSirMsg );
8258#ifdef WLAN_SOFTAP_FEATURE
8259 if(CSR_IS_INFRA_AP(&pSession->connectedProfile))
8260 {
8261
8262 pRoamInfo = &roamInfo;
8263
8264 pRoamInfo->statusCode = pDeauthInd->statusCode;
8265 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8266
8267 pRoamInfo->staId = (tANI_U8)pDeauthInd->staId;
8268
8269 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDeauthInd->peerMacAddr, sizeof(tSirMacAddr));
8270 palCopyMemory(pMac->hHdd, &pRoamInfo->bssid, pDeauthInd->bssId, sizeof(tCsrBssid));
8271
8272 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_DEAUTH_IND);
8273 }
8274#endif
8275 }
8276 break;
8277
8278 case eWNI_SME_SWITCH_CHL_REQ: // in case of STA, the SWITCH_CHANNEL originates from its AP
8279 smsLog( pMac, LOGW, FL("eWNI_SME_SWITCH_CHL_REQ from SME\n"));
8280 pSwitchChnInd = (tpSirSmeSwitchChannelInd)pSirMsg;
8281 //Update with the new channel id.
8282 //The channel id is hidden in the statusCode.
8283 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pSwitchChnInd->bssId, &sessionId );
8284 if( HAL_STATUS_SUCCESS( status ) )
8285 {
8286 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008287 if(!pSession)
8288 {
8289 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8290 return;
8291 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008292 pSession->connectedProfile.operationChannel = (tANI_U8)pSwitchChnInd->newChannelId;
8293 if(pSession->pConnectBssDesc)
8294 {
8295 pSession->pConnectBssDesc->channelId = (tANI_U8)pSwitchChnInd->newChannelId;
8296 }
8297 }
8298 break;
8299
8300 case eWNI_SME_DEAUTH_RSP:
8301 smsLog( pMac, LOGW, FL("eWNI_SME_DEAUTH_RSP from SME\n"));
8302#ifdef WLAN_SOFTAP_FEATURE
8303 {
8304 tSirSmeDeauthRsp* pDeauthRsp = (tSirSmeDeauthRsp *)pSirMsg;
8305 sessionId = pDeauthRsp->sessionId;
8306 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
8307 {
8308 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07008309 if(!pSession)
8310 {
8311 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8312 return;
8313 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008314 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
8315 {
8316 pRoamInfo = &roamInfo;
8317 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8318 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDeauthRsp->peerMacAddr, sizeof(tSirMacAddr));
8319 pRoamInfo->reasonCode = eCSR_ROAM_RESULT_FORCED;
8320 pRoamInfo->statusCode = pDeauthRsp->statusCode;
8321 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
8322 }
8323 }
8324 }
8325#endif
8326 break;
8327
8328 case eWNI_SME_DISASSOC_RSP:
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07008329 /* session id is invalid here so cant use it to access the array curSubstate as index */
8330 smsLog( pMac, LOGW, FL("eWNI_SME_DISASSOC_RSP from SME \n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008331#ifdef WLAN_SOFTAP_FEATURE
8332 {
8333 tSirSmeDisassocRsp *pDisassocRsp = (tSirSmeDisassocRsp *)pSirMsg;
8334 sessionId = pDisassocRsp->sessionId;
8335 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
8336 {
8337 pSession = CSR_GET_SESSION(pMac, sessionId);
Jeff Johnson32d95a32012-09-10 13:15:23 -07008338 if(!pSession)
8339 {
8340 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8341 return;
8342 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008343 if ( CSR_IS_INFRA_AP(&pSession->connectedProfile) )
8344 {
8345 pRoamInfo = &roamInfo;
8346 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8347 palCopyMemory(pMac->hHdd, pRoamInfo->peerMac, pDisassocRsp->peerMacAddr, sizeof(tSirMacAddr));
8348 pRoamInfo->reasonCode = eCSR_ROAM_RESULT_FORCED;
8349 pRoamInfo->statusCode = pDisassocRsp->statusCode;
8350 status = csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_LOSTLINK, eCSR_ROAM_RESULT_FORCED);
8351 }
8352 }
8353 }
8354#endif
8355 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008356 case eWNI_SME_MIC_FAILURE_IND:
8357 {
8358 tpSirSmeMicFailureInd pMicInd = (tpSirSmeMicFailureInd)pSirMsg;
8359 tCsrRoamInfo roamInfo, *pRoamInfo = NULL;
8360 eCsrRoamResult result = eCSR_ROAM_RESULT_MIC_ERROR_UNICAST;
Jeff Johnson295189b2012-06-20 16:38:30 -07008361#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8362 {
8363 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008364 if(!pSession)
8365 {
8366 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8367 return;
8368 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008369 WLAN_VOS_DIAG_EVENT_DEF(secEvent, vos_event_wlan_security_payload_type);
8370 palZeroMemory(pMac->hHdd, &secEvent, sizeof(vos_event_wlan_security_payload_type));
8371 secEvent.eventId = WLAN_SECURITY_EVENT_MIC_ERROR;
8372 secEvent.encryptionModeMulticast =
8373 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8374 secEvent.encryptionModeUnicast =
8375 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8376 secEvent.authMode =
8377 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8378 palCopyMemory( pMac->hHdd, secEvent.bssid, pSession->connectedProfile.bssid, 6 );
8379 WLAN_VOS_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
8380 }
8381#endif//FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008382 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pMicInd->bssId, &sessionId );
8383 if( HAL_STATUS_SUCCESS( status ) )
8384 {
8385 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
8386 roamInfo.u.pMICFailureInfo = &pMicInd->info;
8387 pRoamInfo = &roamInfo;
8388 if(pMicInd->info.multicast)
8389 {
8390 result = eCSR_ROAM_RESULT_MIC_ERROR_GROUP;
8391 }
8392 else
8393 {
8394 result = eCSR_ROAM_RESULT_MIC_ERROR_UNICAST;
8395 }
8396 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_MIC_ERROR_IND, result);
8397 }
8398 }
8399 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008400#ifdef WLAN_SOFTAP_FEATURE
8401 case eWNI_SME_WPS_PBC_PROBE_REQ_IND:
8402 {
8403 tpSirSmeProbeReqInd pProbeReqInd = (tpSirSmeProbeReqInd)pSirMsg;
8404 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07008405 smsLog( pMac, LOG1, FL("WPS PBC Probe request Indication from SME\n"));
8406
8407 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pProbeReqInd->bssId, &sessionId );
8408 if( HAL_STATUS_SUCCESS( status ) )
8409 {
8410 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
8411 roamInfo.u.pWPSPBCProbeReq = &pProbeReqInd->WPSPBCProbeReq;
8412 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_WPS_PBC_PROBE_REQ_IND,
8413 eCSR_ROAM_RESULT_WPS_PBC_PROBE_REQ_IND);
8414 }
8415 }
8416 break;
8417#endif
8418
Jeff Johnson295189b2012-06-20 16:38:30 -07008419 case eWNI_SME_WM_STATUS_CHANGE_NTF:
8420 pStatusChangeMsg = (tSirSmeWmStatusChangeNtf *)pSirMsg;
8421 switch( pStatusChangeMsg->statusChangeCode )
8422 {
8423 case eSIR_SME_IBSS_ACTIVE:
8424 sessionId = csrFindIbssSession( pMac );
8425 if( CSR_SESSION_ID_INVALID != sessionId )
8426 {
8427 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008428 if(!pSession)
8429 {
8430 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8431 return;
8432 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008433 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_CONNECTED;
8434 if(pSession->pConnectBssDesc)
8435 {
8436 palCopyMemory(pMac->hHdd, &roamInfo.bssid, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
8437 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
8438 pRoamInfo = &roamInfo;
8439 }
8440 else
8441 {
8442 smsLog(pMac, LOGE, " CSR eSIR_SME_IBSS_NEW_PEER connected BSS is empty\n");
8443 }
8444 result = eCSR_ROAM_RESULT_IBSS_CONNECT;
8445 roamStatus = eCSR_ROAM_CONNECT_STATUS_UPDATE;
8446 }
8447 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008448 case eSIR_SME_IBSS_INACTIVE:
8449 sessionId = csrFindIbssSession( pMac );
8450 if( CSR_SESSION_ID_INVALID != sessionId )
8451 {
8452 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008453 if(!pSession)
8454 {
8455 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8456 return;
8457 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008458 pSession->connectState = eCSR_ASSOC_STATE_TYPE_IBSS_DISCONNECTED;
8459 result = eCSR_ROAM_RESULT_IBSS_INACTIVE;
8460 roamStatus = eCSR_ROAM_CONNECT_STATUS_UPDATE;
8461 }
8462 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008463 case eSIR_SME_JOINED_NEW_BSS: // IBSS coalescing.
8464 sessionId = csrFindIbssSession( pMac );
8465 if( CSR_SESSION_ID_INVALID != sessionId )
8466 {
8467 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008468 if(!pSession)
8469 {
8470 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8471 return;
8472 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008473 // update the connection state information
8474 pNewBss = &pStatusChangeMsg->statusChangeInfo.newBssInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07008475#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8476 {
8477 vos_log_ibss_pkt_type *pIbssLog;
8478 tANI_U32 bi;
Jeff Johnson295189b2012-06-20 16:38:30 -07008479 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8480 if(pIbssLog)
8481 {
8482 pIbssLog->eventId = WLAN_IBSS_EVENT_COALESCING;
8483 if(pNewBss)
8484 {
8485 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pNewBss->bssId, 6);
8486 if(pNewBss->ssId.length)
8487 {
8488 palCopyMemory(pMac->hHdd, pIbssLog->ssid, pNewBss->ssId.ssId, pNewBss->ssId.length);
8489 }
8490 pIbssLog->operatingChannel = pNewBss->channelNumber;
8491 }
8492 if(HAL_STATUS_SUCCESS(ccmCfgGetInt(pMac, WNI_CFG_BEACON_INTERVAL, &bi)))
8493 {
8494 //***U8 is not enough for beacon interval
8495 pIbssLog->beaconInterval = (v_U8_t)bi;
8496 }
8497 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8498 }
8499 }
8500#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008501 csrRoamUpdateConnectedProfileFromNewBss( pMac, sessionId, pNewBss );
8502 csrRoamIssueSetContextReq( pMac, sessionId, pSession->connectedProfile.EncryptionType,
8503 pSession->pConnectBssDesc,
8504 &Broadcastaddr,
8505 FALSE, FALSE, eSIR_TX_RX, 0, 0, NULL, 0 );
8506 result = eCSR_ROAM_RESULT_IBSS_COALESCED;
8507 roamStatus = eCSR_ROAM_IBSS_IND;
8508 palCopyMemory(pMac->hHdd, &roamInfo.bssid, &pNewBss->bssId, sizeof(tCsrBssid));
8509 pRoamInfo = &roamInfo;
8510 //This BSSID is th ereal BSSID, let's save it
8511 if(pSession->pConnectBssDesc)
8512 {
8513 palCopyMemory(pMac->hHdd, pSession->pConnectBssDesc->bssId, &pNewBss->bssId, sizeof(tCsrBssid));
8514 }
8515 // Stop the join IBSS timer in case of join, for
8516 // genuine merge do nothing
8517 if(pSession->ibss_join_pending)
8518 {
8519 pSession->ibss_join_pending = FALSE;
8520 csrRoamStopIbssJoinTimer(pMac, sessionId);
8521 result = eCSR_ROAM_RESULT_IBSS_JOIN_SUCCESS;
8522 }
8523 }
8524 smsLog(pMac, LOGW, "CSR: eSIR_SME_JOINED_NEW_BSS received from PE\n");
8525 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008526 // detection by LIM that the capabilities of the associated AP have changed.
8527 case eSIR_SME_AP_CAPS_CHANGED:
8528 pApNewCaps = &pStatusChangeMsg->statusChangeInfo.apNewCaps;
8529 smsLog(pMac, LOGW, "CSR handling eSIR_SME_AP_CAPS_CHANGED\n");
8530 status = csrRoamGetSessionIdFromBSSID( pMac, (tCsrBssid *)pApNewCaps->bssId, &sessionId );
8531 if( HAL_STATUS_SUCCESS( status ) )
8532 {
8533 csrScanForCapabilityChange( pMac, pApNewCaps );
8534 result = eCSR_ROAM_RESULT_CAP_CHANGED;
8535 roamStatus = eCSR_ROAM_GEN_INFO;
8536 }
8537 break;
8538
8539 default:
8540 roamStatus = eCSR_ROAM_FAILED;
8541 result = eCSR_ROAM_RESULT_NONE;
8542 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008543 } // end switch on statusChangeCode
8544 if(eCSR_ROAM_RESULT_NONE != result)
8545 {
8546 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, roamStatus, result);
8547 }
8548 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008549 case eWNI_SME_IBSS_NEW_PEER_IND:
8550 pIbssPeerInd = (tSmeIbssPeerInd *)pSirMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -07008551#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8552 {
8553 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07008554 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8555 if(pIbssLog)
8556 {
8557 pIbssLog->eventId = WLAN_IBSS_EVENT_PEER_JOIN;
8558 palCopyMemory(pMac->hHdd, pIbssLog->peerMacAddr, &pIbssPeerInd->peerAddr, 6);
8559 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8560 }
8561 }
8562#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008563 sessionId = csrFindIbssSession( pMac );
8564 if( CSR_SESSION_ID_INVALID != sessionId )
8565 {
8566 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008567
8568 if(!pSession)
8569 {
8570 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8571 return;
8572 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008573 // Issue the set Context request to LIM to establish the Unicast STA context for the new peer...
8574 if(pSession->pConnectBssDesc)
8575 {
8576 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
8577 palCopyMemory(pMac->hHdd, &roamInfo.bssid, pSession->pConnectBssDesc->bssId, sizeof(tCsrBssid));
8578 if(pIbssPeerInd->mesgLen > sizeof(tSmeIbssPeerInd))
8579 {
8580 status = palAllocateMemory(pMac->hHdd, (void **)&roamInfo.pbFrames,
8581 (pIbssPeerInd->mesgLen - sizeof(tSmeIbssPeerInd)));
8582 if(HAL_STATUS_SUCCESS(status))
8583 {
8584 roamInfo.nBeaconLength = (pIbssPeerInd->mesgLen - sizeof(tSmeIbssPeerInd));
8585 palCopyMemory(pMac->hHdd, roamInfo.pbFrames, ((tANI_U8 *)pIbssPeerInd) + sizeof(tSmeIbssPeerInd),
8586 roamInfo.nBeaconLength);
8587 }
8588 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
8589 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
8590 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
8591 status = palAllocateMemory(pMac->hHdd, (void **)&roamInfo.pBssDesc,
8592 pSession->pConnectBssDesc->length);
8593 if(HAL_STATUS_SUCCESS(status))
8594 {
8595 palCopyMemory(pMac->hHdd, roamInfo.pBssDesc, pSession->pConnectBssDesc,
8596 pSession->pConnectBssDesc->length);
8597 }
8598 if(HAL_STATUS_SUCCESS(status))
8599 {
8600 pRoamInfo = &roamInfo;
8601 }
8602 else
8603 {
8604 if(roamInfo.pbFrames)
8605 {
8606 palFreeMemory(pMac->hHdd, roamInfo.pbFrames);
8607 }
8608 if(roamInfo.pBssDesc)
8609 {
8610 palFreeMemory(pMac->hHdd, roamInfo.pBssDesc);
8611 }
8612 }
8613 }
8614 else
8615 {
8616 pRoamInfo = &roamInfo;
8617 }
8618 csrRoamIssueSetContextReq( pMac, sessionId, pSession->connectedProfile.EncryptionType,
8619 pSession->pConnectBssDesc,
8620 &(pIbssPeerInd->peerAddr),
8621 FALSE, TRUE, eSIR_TX_RX, 0, 0, NULL, 0 ); // NO keys... these key parameters don't matter.
8622 }
8623 else
8624 {
8625 smsLog(pMac, LOGW, " CSR eSIR_SME_IBSS_NEW_PEER connected BSS is empty\n");
8626 }
8627 //send up the sec type for the new peer
8628 if (pRoamInfo)
8629 {
8630 pRoamInfo->u.pConnectedProfile = &pSession->connectedProfile;
8631 }
8632 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0,
8633 eCSR_ROAM_CONNECT_STATUS_UPDATE, eCSR_ROAM_RESULT_IBSS_NEW_PEER);
8634 if(pRoamInfo)
8635 {
8636 if(roamInfo.pbFrames)
8637 {
8638 palFreeMemory(pMac->hHdd, roamInfo.pbFrames);
8639 }
8640 if(roamInfo.pBssDesc)
8641 {
8642 palFreeMemory(pMac->hHdd, roamInfo.pBssDesc);
8643 }
8644 }
8645 }
8646 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008647 case eWNI_SME_IBSS_PEER_DEPARTED_IND:
8648 pIbssPeerInd = (tSmeIbssPeerInd*)pSirMsg;
8649 sessionId = csrFindIbssSession( pMac );
8650 if( CSR_SESSION_ID_INVALID != sessionId )
8651 {
Jeff Johnson295189b2012-06-20 16:38:30 -07008652#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8653 {
8654 vos_log_ibss_pkt_type *pIbssLog;
8655
8656 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
8657 if(pIbssLog)
8658 {
8659 pIbssLog->eventId = WLAN_IBSS_EVENT_PEER_LEAVE;
8660 if(pIbssPeerInd)
8661 {
8662 palCopyMemory(pMac->hHdd, pIbssLog->peerMacAddr, &pIbssPeerInd->peerAddr, 6);
8663 }
8664 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
8665 }
8666 }
8667#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07008668 smsLog(pMac, LOGW, "CSR: Peer departed notification from LIM\n");
8669 roamInfo.staId = (tANI_U8)pIbssPeerInd->staId;
8670 roamInfo.ucastSig = (tANI_U8)pIbssPeerInd->ucastSig;
8671 roamInfo.bcastSig = (tANI_U8)pIbssPeerInd->bcastSig;
8672 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pIbssPeerInd->peerAddr, sizeof(tCsrBssid));
8673 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
8674 eCSR_ROAM_CONNECT_STATUS_UPDATE, eCSR_ROAM_RESULT_IBSS_PEER_DEPARTED);
8675 }
8676 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008677 case eWNI_SME_SETCONTEXT_RSP:
8678 {
8679 tSirSmeSetContextRsp *pRsp = (tSirSmeSetContextRsp *)pSirMsg;
8680 tListElem *pEntry;
8681 tSmeCmd *pCommand;
8682
8683 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
8684 if ( pEntry )
8685 {
8686 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
8687 if ( eSmeCommandSetKey == pCommand->command )
8688 {
8689 sessionId = pCommand->sessionId;
8690 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008691
8692 if(!pSession)
8693 {
8694 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8695 return;
8696 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008697
8698#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8699 if(eCSR_ENCRYPT_TYPE_NONE != pSession->connectedProfile.EncryptionType)
8700 {
8701 WLAN_VOS_DIAG_EVENT_DEF(setKeyEvent, vos_event_wlan_security_payload_type);
8702 palZeroMemory(pMac->hHdd, &setKeyEvent, sizeof(vos_event_wlan_security_payload_type));
8703 if( pRsp->peerMacAddr[0] & 0x01 )
8704 {
8705 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_GTK_RSP;
8706 }
8707 else
8708 {
8709 setKeyEvent.eventId = WLAN_SECURITY_EVENT_SET_PTK_RSP;
8710 }
8711 setKeyEvent.encryptionModeMulticast =
8712 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8713 setKeyEvent.encryptionModeUnicast =
8714 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8715 palCopyMemory( pMac->hHdd, setKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
8716 setKeyEvent.authMode =
8717 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8718 if( eSIR_SUCCESS != pRsp->statusCode )
8719 {
8720 setKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
8721 }
8722 WLAN_VOS_DIAG_EVENT_REPORT(&setKeyEvent, EVENT_WLAN_SECURITY);
8723 }
8724#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
8725 if( CSR_IS_WAIT_FOR_KEY( pMac, sessionId) )
8726 {
8727 //We are done with authentication, whethere succeed or not
8728 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, sessionId);
8729
8730 csrRoamStopWaitForKeyTimer( pMac );
8731 //We do it here because this linkup function is not called after association
8732 //when a key needs to be set.
8733 if( csrIsConnStateConnectedInfra(pMac, sessionId) )
8734 {
8735 csrRoamLinkUp(pMac, pSession->connectedProfile.bssid);
8736 }
8737 }
Jeff Johnson43971f52012-07-17 12:26:56 -07008738 if( eSIR_SME_SUCCESS == pRsp->statusCode )
Jeff Johnson295189b2012-06-20 16:38:30 -07008739 {
8740 palCopyMemory( pMac, &roamInfo.peerMac, &pRsp->peerMacAddr, sizeof(tCsrBssid) );
Jeff Johnsone7245742012-09-05 17:12:55 -07008741 //Make sure we install the GTK before indicating to HDD as authenticated
8742 //This is to prevent broadcast packets go out after PTK and before GTK.
8743 if( palEqualMemory( pMac->hHdd, &Broadcastaddr, pRsp->peerMacAddr,
8744 sizeof(tSirMacAddr) ) )
8745 {
8746 result = eCSR_ROAM_RESULT_AUTHENTICATED;
8747 }
8748 else
8749 {
8750 result = eCSR_ROAM_RESULT_NONE;
8751 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008752 pRoamInfo = &roamInfo;
8753 }
8754 else
8755 {
8756 result = eCSR_ROAM_RESULT_FAILURE;
8757 smsLog( pMac, LOGE, "CSR: Roam Completion setkey command failed(%d) PeerMac %02X-%02X-%02X-%02X-%02X-%02X...\n",
8758 pRsp->statusCode, pRsp->peerMacAddr[0], pRsp->peerMacAddr[1], pRsp->peerMacAddr[2],
8759 pRsp->peerMacAddr[3], pRsp->peerMacAddr[4], pRsp->peerMacAddr[5] );
8760 }
8761 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.setKeyCmd.roamId,
8762 eCSR_ROAM_SET_KEY_COMPLETE, result);
Jeff Johnson295189b2012-06-20 16:38:30 -07008763 // Indicate SME_QOS that the SET_KEY is completed, so that SME_QOS
8764 // can go ahead and initiate the TSPEC if any are pending
8765 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_SET_KEY_SUCCESS_IND, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -07008766#ifdef FEATURE_WLAN_CCX
8767 //Send Adjacent AP repot to new AP.
8768 if (result == eCSR_ROAM_RESULT_AUTHENTICATED &&
8769 pSession->isPrevApInfoValid &&
8770 pSession->connectedProfile.isCCXAssoc)
8771 {
8772#ifdef WLAN_FEATURE_VOWIFI
8773 csrCcxSendAdjacentApRepMsg(pMac, pSession);
8774#endif
8775 pSession->isPrevApInfoValid = FALSE;
8776 }
8777#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008778 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
8779 {
8780 csrReleaseCommandSetKey( pMac, pCommand );
8781 }
8782 }
8783 else
8784 {
8785 smsLog( pMac, LOGE, "CSR: Roam Completion called but setkey command is not ACTIVE ...\n" );
8786 }
8787 }
8788 else
8789 {
8790 smsLog( pMac, LOGE, "CSR: SetKey Completion called but NO commands are ACTIVE ...\n" );
8791 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008792 smeProcessPendingQueue( pMac );
8793 }
8794 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008795 case eWNI_SME_REMOVEKEY_RSP:
8796 {
8797 tSirSmeRemoveKeyRsp *pRsp = (tSirSmeRemoveKeyRsp *)pSirMsg;
8798 tListElem *pEntry;
8799 tSmeCmd *pCommand;
8800
8801 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
8802 if ( pEntry )
8803 {
8804 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
8805 if ( eSmeCommandRemoveKey == pCommand->command )
8806 {
8807 sessionId = pCommand->sessionId;
8808 pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07008809
8810 if(!pSession)
8811 {
8812 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8813 return;
8814 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008815#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
8816 {
8817 WLAN_VOS_DIAG_EVENT_DEF(removeKeyEvent, vos_event_wlan_security_payload_type);
8818 palZeroMemory(pMac->hHdd, &removeKeyEvent, sizeof(vos_event_wlan_security_payload_type));
8819 removeKeyEvent.eventId = WLAN_SECURITY_EVENT_REMOVE_KEY_RSP;
8820 removeKeyEvent.encryptionModeMulticast =
8821 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
8822 removeKeyEvent.encryptionModeUnicast =
8823 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
8824 palCopyMemory( pMac->hHdd, removeKeyEvent.bssid, pSession->connectedProfile.bssid, 6 );
8825 removeKeyEvent.authMode =
8826 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
8827 if( eSIR_SUCCESS != pRsp->statusCode )
8828 {
8829 removeKeyEvent.status = WLAN_SECURITY_STATUS_FAILURE;
8830 }
8831 WLAN_VOS_DIAG_EVENT_REPORT(&removeKeyEvent, EVENT_WLAN_SECURITY);
8832 }
8833#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson43971f52012-07-17 12:26:56 -07008834 if( eSIR_SME_SUCCESS == pRsp->statusCode )
Jeff Johnson295189b2012-06-20 16:38:30 -07008835 {
8836 palCopyMemory( pMac, &roamInfo.peerMac, &pRsp->peerMacAddr, sizeof(tCsrBssid) );
8837 result = eCSR_ROAM_RESULT_NONE;
8838 pRoamInfo = &roamInfo;
8839 }
8840 else
8841 {
8842 result = eCSR_ROAM_RESULT_FAILURE;
8843 }
8844 csrRoamCallCallback(pMac, sessionId, &roamInfo, pCommand->u.setKeyCmd.roamId,
8845 eCSR_ROAM_REMOVE_KEY_COMPLETE, result);
8846 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
8847 {
8848 csrReleaseCommandRemoveKey( pMac, pCommand );
8849 }
8850 }
8851 else
8852 {
8853 smsLog( pMac, LOGW, "CSR: Roam Completion called but setkey command is not ACTIVE ...\n" );
8854 }
8855 }
8856 else
8857 {
8858 smsLog( pMac, LOGW, "CSR: SetKey Completion called but NO commands are ACTIVE ...\n" );
8859 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008860 smeProcessPendingQueue( pMac );
8861 }
8862 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008863 case eWNI_SME_GET_STATISTICS_RSP:
Mohit Khanna23863762012-09-11 17:40:09 -07008864 smsLog( pMac, LOG2, FL("Stats rsp from PE\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008865 csrRoamStatsRspProcessor( pMac, pSirMsg );
8866 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008867 case eWNI_SME_GET_RSSI_REQ:
Mohit Khanna23863762012-09-11 17:40:09 -07008868 smsLog( pMac, LOG2, FL("GetRssiReq from self\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -07008869 csrUpdateRssi( pMac, pSirMsg );
8870 break;
8871
Jeff Johnson295189b2012-06-20 16:38:30 -07008872#ifdef WLAN_FEATURE_VOWIFI_11R
8873 case eWNI_SME_FT_PRE_AUTH_RSP:
8874 csrRoamFTPreAuthRspProcessor( pMac, (tpSirFTPreAuthRsp)pSirMsg );
8875 break;
8876#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07008877 case eWNI_SME_MAX_ASSOC_EXCEEDED:
8878 pSmeMaxAssocInd = (tSmeMaxAssocInd*)pSirMsg;
8879 smsLog( pMac, LOG1, FL("send indication that max assoc have been reached and the new peer cannot be accepted\n"));
8880 sessionId = pSmeMaxAssocInd->sessionId;
8881 roamInfo.sessionId = sessionId;
8882 palCopyMemory(pMac->hHdd, &roamInfo.peerMac, pSmeMaxAssocInd->peerMac, sizeof(tCsrBssid));
8883 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
8884 eCSR_ROAM_INFRA_IND, eCSR_ROAM_RESULT_MAX_ASSOC_EXCEEDED);
8885 break;
8886
8887 case eWNI_SME_BTAMP_LOG_LINK_IND:
8888 smsLog( pMac, LOG1, FL("Establish logical link req from HCI serialized through MC thread\n"));
8889 btampEstablishLogLinkHdlr( pSirMsg );
8890 break;
Jeff Johnsone7245742012-09-05 17:12:55 -07008891 case eWNI_SME_RSSI_IND:
8892 smsLog( pMac, LOG1, FL("RSSI indication from TL serialized through MC thread\n"));
8893 csrRoamRssiIndHdlr( pMac, pSirMsg );
8894 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008895
8896 default:
8897 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07008898 } // end switch on message type
Jeff Johnson295189b2012-06-20 16:38:30 -07008899}
8900
Jeff Johnson295189b2012-06-20 16:38:30 -07008901void csrCallRoamingCompletionCallback(tpAniSirGlobal pMac, tCsrRoamSession *pSession,
8902 tCsrRoamInfo *pRoamInfo, tANI_U32 roamId, eCsrRoamResult roamResult)
8903{
8904 if(pSession)
8905 {
8906 if(pSession->bRefAssocStartCnt)
8907 {
8908 pSession->bRefAssocStartCnt--;
8909 VOS_ASSERT( pSession->bRefAssocStartCnt == 0);
8910 //Need to call association_completion because there is an assoc_start pending.
8911 csrRoamCallCallback(pMac, pSession->sessionId, NULL, roamId,
8912 eCSR_ROAM_ASSOCIATION_COMPLETION,
8913 eCSR_ROAM_RESULT_FAILURE);
8914 }
8915 csrRoamCallCallback(pMac, pSession->sessionId, pRoamInfo, roamId, eCSR_ROAM_ROAMING_COMPLETION, roamResult);
8916 }
8917 else
8918 {
8919 smsLog(pMac, LOGW, FL(" pSession is NULL"));
8920 }
8921}
8922
8923
8924eHalStatus csrRoamStartRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamingReason roamingReason)
8925{
8926 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -07008927 if(CSR_IS_LOSTLINK_ROAMING(roamingReason) &&
8928 (eANI_BOOLEAN_FALSE == pMac->roam.roamSession[sessionId].fCancelRoaming))
8929 {
8930 status = csrScanRequestLostLink1( pMac, sessionId );
8931 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008932 return(status);
8933}
8934
Jeff Johnson295189b2012-06-20 16:38:30 -07008935//return a boolean to indicate whether roaming completed or continue.
8936tANI_BOOLEAN csrRoamCompleteRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId,
8937 tANI_BOOLEAN fForce, eCsrRoamResult roamResult)
8938{
8939 tANI_BOOLEAN fCompleted = eANI_BOOLEAN_TRUE;
8940 tANI_TIMESTAMP roamTime = (tANI_TIMESTAMP)(pMac->roam.configParam.nRoamingTime * PAL_TICKS_PER_SECOND);
8941 tANI_TIMESTAMP curTime = (tANI_TIMESTAMP)palGetTickCount(pMac->hHdd);
8942 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07008943 if(!pSession)
8944 {
8945 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
8946 return eANI_BOOLEAN_FALSE;
8947 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008948 //Check whether time is up
8949 if(pSession->fCancelRoaming || fForce ||
8950 ((curTime - pSession->roamingStartTime) > roamTime) ||
8951 eCsrReassocRoaming == pSession->roamingReason ||
8952 eCsrDynamicRoaming == pSession->roamingReason)
8953 {
8954 smsLog(pMac, LOGW, FL(" indicates roaming completion\n"));
8955 if(pSession->fCancelRoaming && CSR_IS_LOSTLINK_ROAMING(pSession->roamingReason))
8956 {
8957 //roaming is cancelled, tell HDD to indicate disconnect
8958 //Because LIM overload deauth_ind for both deauth frame and missed beacon
8959 //we need to use this logic to detinguish it. For missed beacon, LIM set reason
8960 //to be eSIR_BEACON_MISSED
8961 if(eSIR_BEACON_MISSED == pSession->roamingStatusCode)
8962 {
8963 roamResult = eCSR_ROAM_RESULT_LOSTLINK;
8964 }
8965 else if(eCsrLostlinkRoamingDisassoc == pSession->roamingReason)
8966 {
8967 roamResult = eCSR_ROAM_RESULT_DISASSOC_IND;
8968 }
8969 else if(eCsrLostlinkRoamingDeauth == pSession->roamingReason)
8970 {
8971 roamResult = eCSR_ROAM_RESULT_DEAUTH_IND;
8972 }
8973 else
8974 {
8975 roamResult = eCSR_ROAM_RESULT_LOSTLINK;
8976 }
8977 }
8978 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, roamResult);
8979 pSession->roamingReason = eCsrNotRoaming;
8980 }
8981 else
8982 {
8983 pSession->roamResult = roamResult;
8984 if(!HAL_STATUS_SUCCESS(csrRoamStartRoamingTimer(pMac, sessionId, PAL_TIMER_TO_SEC_UNIT)))
8985 {
8986 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, roamResult);
8987 pSession->roamingReason = eCsrNotRoaming;
8988 }
8989 else
8990 {
8991 fCompleted = eANI_BOOLEAN_FALSE;
8992 }
8993 }
Jeff Johnson295189b2012-06-20 16:38:30 -07008994 return(fCompleted);
8995}
8996
Jeff Johnson295189b2012-06-20 16:38:30 -07008997void csrRoamCancelRoaming(tpAniSirGlobal pMac, tANI_U32 sessionId)
8998{
8999 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009000
9001 if(!pSession)
9002 {
9003 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9004 return;
9005 }
9006
Jeff Johnson295189b2012-06-20 16:38:30 -07009007 if(CSR_IS_ROAMING(pSession))
9008 {
9009 smsLog(pMac, LOGW, " Cancelling roaming\n");
9010 pSession->fCancelRoaming = eANI_BOOLEAN_TRUE;
9011 if(CSR_IS_ROAM_JOINING(pMac, sessionId) && CSR_IS_ROAM_SUBSTATE_CONFIG(pMac, sessionId))
9012 {
9013 //No need to do anything in here because the handler takes care of it
9014 }
9015 else
9016 {
9017 eCsrRoamResult roamResult = CSR_IS_LOSTLINK_ROAMING(pSession->roamingReason) ?
9018 eCSR_ROAM_RESULT_LOSTLINK : eCSR_ROAM_RESULT_NONE;
9019 //Roaming is stopped after here
9020 csrRoamCompleteRoaming(pMac, sessionId, eANI_BOOLEAN_TRUE, roamResult);
9021 //Since CSR may be in lostlink roaming situation, abort all roaming related activities
9022 csrScanAbortMacScan(pMac);
9023 csrRoamStopRoamingTimer(pMac, sessionId);
9024 }
9025 }
9026}
9027
Jeff Johnson295189b2012-06-20 16:38:30 -07009028void csrRoamRoamingTimerHandler(void *pv)
9029{
9030 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
9031 tpAniSirGlobal pMac = pInfo->pMac;
9032 tANI_U32 sessionId = pInfo->sessionId;
9033 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009034
9035 if(!pSession)
9036 {
9037 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9038 return;
9039 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009040
9041 if(eANI_BOOLEAN_FALSE == pSession->fCancelRoaming)
9042 {
9043 if(!HAL_STATUS_SUCCESS(csrRoamStartRoaming(pMac, sessionId, pSession->roamingReason)))
9044 {
9045 csrCallRoamingCompletionCallback(pMac, pSession, NULL, 0, pSession->roamResult);
9046 pSession->roamingReason = eCsrNotRoaming;
9047 }
9048 }
9049}
9050
Jeff Johnson295189b2012-06-20 16:38:30 -07009051eHalStatus csrRoamStartRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
9052{
9053 eHalStatus status;
9054 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009055
9056 if(!pSession)
9057 {
9058 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9059 return eHAL_STATUS_FAILURE;
9060 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009061
9062 smsLog(pMac, LOG1, " csrScanStartRoamingTimer \n ");
9063 pSession->roamingTimerInfo.sessionId = (tANI_U8)sessionId;
9064 status = palTimerStart(pMac->hHdd, pSession->hTimerRoaming, interval, eANI_BOOLEAN_FALSE);
9065
9066 return (status);
9067}
9068
Jeff Johnson295189b2012-06-20 16:38:30 -07009069eHalStatus csrRoamStopRoamingTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
9070{
9071 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerRoaming));
9072}
9073
Jeff Johnson295189b2012-06-20 16:38:30 -07009074void csrRoamWaitForKeyTimeOutHandler(void *pv)
9075{
9076 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
9077 tpAniSirGlobal pMac = pInfo->pMac;
Jeff Johnson295189b2012-06-20 16:38:30 -07009078 if( CSR_IS_WAIT_FOR_KEY( pMac, pInfo->sessionId ) )
9079 {
9080 smsLog(pMac, LOGW, " SME pre-auth state timeout. \n ");
9081 //Change the substate so command queue is unblocked.
9082 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_NONE, pInfo->sessionId);
9083 }
9084
9085}
9086
Jeff Johnson295189b2012-06-20 16:38:30 -07009087eHalStatus csrRoamStartWaitForKeyTimer(tpAniSirGlobal pMac, tANI_U32 interval)
9088{
9089 eHalStatus status;
9090
9091 smsLog(pMac, LOG1, " csrScanStartWaitForKeyTimer \n ");
9092 status = palTimerStart(pMac->hHdd, pMac->roam.hTimerWaitForKey, interval, eANI_BOOLEAN_FALSE);
9093
9094 return (status);
9095}
9096
Jeff Johnson295189b2012-06-20 16:38:30 -07009097eHalStatus csrRoamStopWaitForKeyTimer(tpAniSirGlobal pMac)
9098{
9099 return (palTimerStop(pMac->hHdd, pMac->roam.hTimerWaitForKey));
9100}
9101
Jeff Johnson295189b2012-06-20 16:38:30 -07009102void csrRoamIbssJoinTimerHandler(void *pv)
9103{
9104 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
9105 tpAniSirGlobal pMac = pInfo->pMac;
9106 eCsrRoamDisconnectReason reason = eCSR_DISCONNECT_REASON_IBSS_JOIN_FAILURE;
9107 tANI_U32 sessionId = pInfo->sessionId;
9108 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009109
9110 if(!pSession)
9111 {
9112 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9113 return;
9114 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009115
9116 pSession->ibss_join_pending = FALSE;
9117 // JEZ100225: As of main/latest "tip", we are no longer doing this. Check on this.
9118 //csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_IBS_IND, eCSR_ROAM_RESULT_IBSS_JOIN_FAILED);
9119 // Send an IBSS stop request to PE
9120 csrRoamDisconnectInternal(pMac, sessionId, reason);
Jeff Johnson295189b2012-06-20 16:38:30 -07009121}
Jeff Johnson295189b2012-06-20 16:38:30 -07009122eHalStatus csrRoamStartIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
9123{
9124 eHalStatus status;
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 eHAL_STATUS_FAILURE;
9131 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009132
9133 smsLog(pMac, LOG1, " csrRoamStartIbssJoinTimer \n ");
9134 pSession->ibssJoinTimerInfo.sessionId = (tANI_U8)sessionId;
9135 status = palTimerStart(pMac->hHdd, pSession->hTimerIbssJoining, interval, eANI_BOOLEAN_FALSE);
9136
9137 return (status);
9138}
Jeff Johnson295189b2012-06-20 16:38:30 -07009139eHalStatus csrRoamStopIbssJoinTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
9140{
9141 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerIbssJoining));
9142}
Jeff Johnson295189b2012-06-20 16:38:30 -07009143void csrRoamCompletion(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamInfo *pRoamInfo, tSmeCmd *pCommand,
9144 eCsrRoamResult roamResult, tANI_BOOLEAN fSuccess)
9145{
9146 eRoamCmdStatus roamStatus = csrGetRoamCompleteStatus(pMac, sessionId);
9147 tANI_U32 roamId = 0;
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009148 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
9149 /* To silence the KW tool Null chaeck is added */
9150 if(!pSession)
9151 {
9152 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9153 return;
9154 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009155
9156 if(pCommand)
9157 {
9158 roamId = pCommand->u.roamCmd.roamId;
9159#if defined(VOSS_ENABLED)
9160 VOS_ASSERT( sessionId == pCommand->sessionId );
9161#endif
9162 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009163 if(eCSR_ROAM_ROAMING_COMPLETION == roamStatus)
9164 {
9165 //if success, force roaming completion
9166 csrRoamCompleteRoaming(pMac, sessionId, fSuccess, roamResult);
9167 }
9168 else
9169 {
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009170 VOS_ASSERT(pSession->bRefAssocStartCnt == 0);
Jeff Johnson295189b2012-06-20 16:38:30 -07009171 smsLog(pMac, LOGW, FL(" indicates association completion. roamResult = %d\n"), roamResult);
9172 csrRoamCallCallback(pMac, sessionId, pRoamInfo, roamId, roamStatus, roamResult);
9173 }
9174}
9175
Jeff Johnson295189b2012-06-20 16:38:30 -07009176eHalStatus csrRoamLostLink( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 type, tSirSmeRsp *pSirMsg)
9177{
9178 eHalStatus status = eHAL_STATUS_SUCCESS;
9179 tSirSmeDeauthInd *pDeauthIndMsg = NULL;
9180 tSirSmeDisassocInd *pDisassocIndMsg = NULL;
9181 eCsrRoamResult result = eCSR_ROAM_RESULT_LOSTLINK;
9182 tCsrRoamInfo *pRoamInfo = NULL;
9183 tCsrRoamInfo roamInfo;
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009184 tANI_BOOLEAN fToRoam;
Jeff Johnson295189b2012-06-20 16:38:30 -07009185 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009186 /* To silence the KW tool Null chaeck is added */
9187 if(!pSession)
9188 {
9189 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9190 return eHAL_STATUS_FAILURE;
9191 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009192 //Only need to roam for infra station. In this case P2P client will roam as well
Madan Mohan Koyyalamudi33ef6a22012-10-30 17:44:43 -07009193 fToRoam = CSR_IS_INFRASTRUCTURE(&pSession->connectedProfile);
Jeff Johnson295189b2012-06-20 16:38:30 -07009194 pSession->fCancelRoaming = eANI_BOOLEAN_FALSE;
9195 if ( eWNI_SME_DISASSOC_IND == type )
9196 {
9197 result = eCSR_ROAM_RESULT_DISASSOC_IND;
9198 pDisassocIndMsg = (tSirSmeDisassocInd *)pSirMsg;
9199 pSession->roamingStatusCode = pDisassocIndMsg->statusCode;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009200 pSession->joinFailStatusCode.reasonCode = pDisassocIndMsg->reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009201 }
9202 else if ( eWNI_SME_DEAUTH_IND == type )
9203 {
9204 result = eCSR_ROAM_RESULT_DEAUTH_IND;
9205 pDeauthIndMsg = (tSirSmeDeauthInd *)pSirMsg;
9206 pSession->roamingStatusCode = pDeauthIndMsg->statusCode;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009207 pSession->joinFailStatusCode.reasonCode = pDeauthIndMsg->reasonCode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009208 }
9209 else
9210 {
9211 smsLog(pMac, LOGW, FL("gets an unknown type (%d)\n"), type);
9212 result = eCSR_ROAM_RESULT_NONE;
Mohit Khanna99d5fd02012-09-11 14:51:20 -07009213 pSession->joinFailStatusCode.reasonCode = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -07009214 }
9215
9216 // call profile lost link routine here
9217#ifdef WLAN_SOFTAP_FEATURE
9218 if(!CSR_IS_INFRA_AP(&pSession->connectedProfile))
9219#endif
9220 {
9221 csrRoamCallCallback(pMac, sessionId, NULL, 0, eCSR_ROAM_LOSTLINK_DETECTED, result);
9222 }
9223
9224 if ( eWNI_SME_DISASSOC_IND == type )
9225 {
9226 status = csrSendMBDisassocCnfMsg(pMac, pDisassocIndMsg);
9227 }
9228 else if ( eWNI_SME_DEAUTH_IND == type )
9229 {
9230 status = csrSendMBDeauthCnfMsg(pMac, pDeauthIndMsg);
9231 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009232 if(!HAL_STATUS_SUCCESS(status))
9233 {
9234 //If fail to send confirmation to PE, not to trigger roaming
9235 fToRoam = eANI_BOOLEAN_FALSE;
9236 }
9237
9238 //tell HDD to disconnect
9239 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
9240 roamInfo.statusCode = (tSirResultCodes)pSession->roamingStatusCode;
9241 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
9242#ifdef WLAN_SOFTAP_FEATURE
9243 if( eWNI_SME_DISASSOC_IND == type)
9244 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009245 //staMacAddr
9246 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDisassocIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9247 roamInfo.staId = (tANI_U8)pDisassocIndMsg->staId;
9248 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009249 else if( eWNI_SME_DEAUTH_IND == type )
9250 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009251 //staMacAddr
9252 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDeauthIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9253 roamInfo.staId = (tANI_U8)pDeauthIndMsg->staId;
9254 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009255#endif
9256 smsLog(pMac, LOGW, FL("roamInfo.staId (%d)\n"), roamInfo.staId);
Jeff Johnson295189b2012-06-20 16:38:30 -07009257 if(fToRoam)
9258 {
Madan Mohan Koyyalamudiaf854cf2012-10-30 17:56:25 -07009259 //Tell HDD about the lost link
9260 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_LOSTLINK, result);
Jeff Johnson295189b2012-06-20 16:38:30 -07009261 //Only remove the connected BSS in infrastructure mode
9262 csrRoamRemoveConnectedBssFromScanCache(pMac, &pSession->connectedProfile);
9263 //Not to do anying for lostlink with WDS
9264 if( pMac->roam.configParam.nRoamingTime )
9265 {
9266 if(HAL_STATUS_SUCCESS(status = csrRoamStartRoaming(pMac, sessionId,
9267 ( eWNI_SME_DEAUTH_IND == type ) ?
9268 eCsrLostlinkRoamingDeauth : eCsrLostlinkRoamingDisassoc)))
9269 {
9270 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
9271 //For IBSS, we need to give some more info to HDD
9272 if(csrIsBssTypeIBSS(pSession->connectedProfile.BSSType))
9273 {
9274 roamInfo.u.pConnectedProfile = &pSession->connectedProfile;
9275 roamInfo.statusCode = (tSirResultCodes)pSession->roamingStatusCode;
9276 roamInfo.reasonCode = pSession->joinFailStatusCode.reasonCode;
9277 }
9278 else
9279 {
9280 roamInfo.reasonCode = eCsrRoamReasonSmeIssuedForLostLink;
9281 }
Jeff Johnsone7245742012-09-05 17:12:55 -07009282 pRoamInfo = &roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -07009283 pSession->roamingReason = ( eWNI_SME_DEAUTH_IND == type ) ?
9284 eCsrLostlinkRoamingDeauth : eCsrLostlinkRoamingDisassoc;
9285 pSession->roamingStartTime = (tANI_TIMESTAMP)palGetTickCount(pMac->hHdd);
9286 csrRoamCallCallback(pMac, sessionId, pRoamInfo, 0, eCSR_ROAM_ROAMING_START, eCSR_ROAM_RESULT_LOSTLINK);
9287 }
9288 else
9289 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07009290 smsLog(pMac, LOGW, " %s Fail to start roaming, status = %d", __func__, status);
Jeff Johnson295189b2012-06-20 16:38:30 -07009291 fToRoam = eANI_BOOLEAN_FALSE;
9292 }
9293 }
9294 else
9295 {
9296 //We are told not to roam, indicate lostlink
9297 fToRoam = eANI_BOOLEAN_FALSE;
9298 }
9299 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009300 if(!fToRoam)
9301 {
9302 if( eWNI_SME_DISASSOC_IND == type)
9303 {
9304 //staMacAddr
9305 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDisassocIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9306 roamInfo.staId = (tANI_U8)pDisassocIndMsg->staId;
9307 }
9308 else if( eWNI_SME_DEAUTH_IND == type )
9309 {
9310 //staMacAddr
9311 palCopyMemory(pMac->hHdd, roamInfo.peerMac, pDeauthIndMsg->peerMacAddr, sizeof(tSirMacAddr));
9312 roamInfo.staId = (tANI_U8)pDeauthIndMsg->staId;
9313 }
Madan Mohan Koyyalamudiaf854cf2012-10-30 17:56:25 -07009314 //Tell HDD about the lost link
Jeff Johnson295189b2012-06-20 16:38:30 -07009315 csrRoamCallCallback(pMac, sessionId, &roamInfo, 0, eCSR_ROAM_LOSTLINK, result);
9316
9317 /*No need to start idle scan in case of IBSS/SAP
9318 Still enable idle scan for polling in case concurrent sessions are running */
9319 if(CSR_IS_INFRASTRUCTURE(&pSession->connectedProfile))
9320 {
9321 csrScanStartIdleScan(pMac);
9322 }
9323 }
9324
9325 return (status);
9326}
9327
Jeff Johnson295189b2012-06-20 16:38:30 -07009328eHalStatus csrRoamLostLinkAfterhandoffFailure( tpAniSirGlobal pMac,tANI_U32 sessionId)
9329{
9330 eHalStatus status = eHAL_STATUS_SUCCESS;
9331 tListElem *pEntry = NULL;
9332 tSmeCmd *pCommand = NULL;
9333 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009334
9335 if(!pSession)
9336 {
9337 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9338 return eHAL_STATUS_FAILURE;
9339 }
9340
Jeff Johnson295189b2012-06-20 16:38:30 -07009341 pSession->fCancelRoaming = eANI_BOOLEAN_FALSE;
Jeff Johnson295189b2012-06-20 16:38:30 -07009342 //Only remove the connected BSS in infrastructure mode
9343 csrRoamRemoveConnectedBssFromScanCache(pMac, &pSession->connectedProfile);
9344 if(pMac->roam.configParam.nRoamingTime)
9345 {
9346 if(HAL_STATUS_SUCCESS(status = csrRoamStartRoaming(pMac,sessionId, pSession->roamingReason)))
9347 {
9348 //before starting the lost link logic release the roam command for handoff
9349 pEntry = csrLLPeekHead(&pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK);
9350 if(pEntry)
9351 {
9352 pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
9353 }
9354 if(pCommand)
9355 {
9356 if (( eSmeCommandRoam == pCommand->command ) &&
9357 ( eCsrSmeIssuedAssocToSimilarAP == pCommand->u.roamCmd.roamReason))
9358 {
9359 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
9360 {
9361 csrReleaseCommandRoam( pMac, pCommand );
9362 }
9363 }
9364 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009365 smsLog( pMac, LOGW, "Lost link roaming started ...\n");
9366 }
9367 }
9368 else
9369 {
9370 //We are told not to roam, indicate lostlink
9371 status = eHAL_STATUS_FAILURE;
9372 }
9373
9374 return (status);
9375}
Jeff Johnson295189b2012-06-20 16:38:30 -07009376void csrRoamWmStatusChangeComplete( tpAniSirGlobal pMac )
9377{
9378 tListElem *pEntry;
9379 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -07009380 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
9381 if ( pEntry )
9382 {
9383 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
9384 if ( eSmeCommandWmStatusChange == pCommand->command )
9385 {
9386 // Nothing to process in a Lost Link completion.... It just kicks off a
9387 // roaming sequence.
9388 if( csrLLRemoveEntry( &pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK ) )
9389 {
9390 csrReleaseCommandWmStatusChange( pMac, pCommand );
9391 }
9392 else
9393 {
9394 smsLog( pMac, LOGE, " ******csrRoamWmStatusChangeComplete fail to release command\n");
9395 }
9396
9397 }
9398 else
9399 {
9400 smsLog( pMac, LOGW, "CSR: WmStatusChange Completion called but LOST LINK command is not ACTIVE ...\n" );
9401 }
9402 }
9403 else
9404 {
9405 smsLog( pMac, LOGW, "CSR: WmStatusChange Completion called but NO commands are ACTIVE ...\n" );
9406 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009407 smeProcessPendingQueue( pMac );
9408}
9409
Jeff Johnson295189b2012-06-20 16:38:30 -07009410void csrRoamProcessWmStatusChangeCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
9411{
9412 eHalStatus status = eHAL_STATUS_FAILURE;
9413 tSirSmeRsp *pSirSmeMsg;
9414 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pCommand->sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009415
9416 if(!pSession)
9417 {
9418 smsLog(pMac, LOGE, FL(" session %d not found "), pCommand->sessionId);
9419 return;
9420 }
9421
Jeff Johnson295189b2012-06-20 16:38:30 -07009422 switch ( pCommand->u.wmStatusChangeCmd.Type )
9423 {
9424 case eCsrDisassociated:
9425 pSirSmeMsg = (tSirSmeRsp *)&pCommand->u.wmStatusChangeCmd.u.DisassocIndMsg;
9426 status = csrRoamLostLink(pMac, pCommand->sessionId, eWNI_SME_DISASSOC_IND, pSirSmeMsg);
9427 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009428 case eCsrDeauthenticated:
9429 pSirSmeMsg = (tSirSmeRsp *)&pCommand->u.wmStatusChangeCmd.u.DeauthIndMsg;
9430 status = csrRoamLostLink(pMac, pCommand->sessionId, eWNI_SME_DEAUTH_IND, pSirSmeMsg);
9431 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009432 default:
9433 smsLog(pMac, LOGW, FL("gets an unknown command %d\n"), pCommand->u.wmStatusChangeCmd.Type);
9434 break;
9435 }
9436 //For WDS, we want to stop BSS as well when it is indicated that it is disconnected.
9437 if( CSR_IS_CONN_WDS(&pSession->connectedProfile) )
9438 {
9439 if( !HAL_STATUS_SUCCESS(csrRoamIssueStopBssCmd( pMac, pCommand->sessionId, eANI_BOOLEAN_TRUE )) )
9440 {
9441 //This is not good
9442 smsLog(pMac, LOGE, FL(" failed to issue stopBSS command\n"));
9443 }
9444 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009445 // Lost Link just triggers a roaming sequence. We can complte the Lost Link
9446 // command here since there is nothing else to do.
9447 csrRoamWmStatusChangeComplete( pMac );
9448}
9449
Jeff Johnson295189b2012-06-20 16:38:30 -07009450//This function returns band and mode information.
9451//The only tricky part is that if phyMode is set to 11abg, this function may return eCSR_CFG_DOT11_MODE_11B
9452//instead of eCSR_CFG_DOT11_MODE_11G if everything is set to auto-pick.
9453#ifdef WLAN_SOFTAP_FEATURE
9454static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
9455 tANI_U8 operationChn, eCsrBand *pBand )
9456#else
9457static eCsrCfgDot11Mode csrRoamGetPhyModeBandForBss( tpAniSirGlobal pMac, eCsrPhyMode phyModeIn,
9458 tANI_U8 operationChn, eCsrBand *pBand )
9459#endif
9460{
Jeff Johnson295189b2012-06-20 16:38:30 -07009461#ifdef WLAN_SOFTAP_FEATURE
9462 eCsrPhyMode phyModeIn = (eCsrPhyMode)pProfile->phyMode;
9463 eCsrCfgDot11Mode cfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(pProfile, phyModeIn,
9464 pMac->roam.configParam.ProprietaryRatesEnabled);
9465#else
9466 eCsrCfgDot11Mode cfgDot11Mode = csrGetCfgDot11ModeFromCsrPhyMode(phyModeIn,
9467 pMac->roam.configParam.ProprietaryRatesEnabled);
9468#endif
9469 eCsrBand eBand;
Madan Mohan Koyyalamudi4ff9cd62012-10-30 17:48:57 -07009470
Jeff Johnson295189b2012-06-20 16:38:30 -07009471 //If the global setting for dot11Mode is set to auto/abg, we overwrite the setting in the profile.
9472#ifdef WLAN_SOFTAP_FEATURE
9473 if( ((!CSR_IS_INFRA_AP(pProfile )&& !CSR_IS_WDS(pProfile )) &&
9474 ((eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode) ||
9475 (eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode))) ||
9476 (eCSR_CFG_DOT11_MODE_AUTO == cfgDot11Mode) || (eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode) )
9477#else
9478 if( (eCSR_CFG_DOT11_MODE_AUTO == pMac->roam.configParam.uCfgDot11Mode) ||
9479 (eCSR_CFG_DOT11_MODE_ABG == pMac->roam.configParam.uCfgDot11Mode) ||
9480 (eCSR_CFG_DOT11_MODE_AUTO == cfgDot11Mode) || (eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode) )
Jeff Johnson295189b2012-06-20 16:38:30 -07009481#endif
9482 {
9483 switch( pMac->roam.configParam.uCfgDot11Mode )
9484 {
9485 case eCSR_CFG_DOT11_MODE_11A:
9486 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9487 eBand = eCSR_BAND_5G;
9488 break;
9489 case eCSR_CFG_DOT11_MODE_11B:
9490 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9491 eBand = eCSR_BAND_24;
9492 break;
9493 case eCSR_CFG_DOT11_MODE_11G:
9494 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
9495 eBand = eCSR_BAND_24;
9496 break;
9497 case eCSR_CFG_DOT11_MODE_11N:
9498 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
9499 eBand = eCSR_BAND_24;
9500 break;
9501 //case eCSR_CFG_DOT11_MODE_BEST:
9502 // cfgDot11Mode = eCSR_CFG_DOT11_MODE_BEST;
9503 // eBand = eCSR_BAND_24;
9504 // break;
9505 default:
9506 // Global dot11 Mode setting is 11a/b/g.
9507 // use the channel number to determine the Mode setting.
9508 if ( eCSR_OPERATING_CHANNEL_AUTO == operationChn )
9509 {
9510 eBand = pMac->roam.configParam.eBand;
9511 if(eCSR_BAND_24 == eBand)
9512 {
9513 //See reason in else if ( CSR_IS_CHANNEL_24GHZ(operationChn) ) to pick 11B
9514 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9515 }
9516 else
9517 {
9518 //prefer 5GHz
9519 eBand = eCSR_BAND_5G;
9520 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9521 }
9522 }
9523 else if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9524 {
9525 // channel is a 2.4GHz channel. Set mode to 11g.
9526 //
9527 // !!LAC - WiFi tests require IBSS networks to start in 11b mode without any change to the
9528 // default parameter settings on the adapter. We use ACU to start an IBSS through creation
9529 // of a startIBSS profile. this startIBSS profile has Auto MACProtocol and the
9530 // adapter property setting for dot11Mode is also AUTO. So in this case, let's start
9531 // the IBSS network in 11b mode instead of 11g mode.
9532 //
9533 // so this is for Auto=profile->MacProtocol && Auto=Global.dot11Mode && profile->channel is < 14,
9534 // then start the IBSS in b mode.
9535 //
9536 // Note: we used to have this start as an 11g IBSS for best performance... now to specify that
9537 // the user will have to set the do11Mode in the property page to 11g to force it.
9538 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9539 eBand = eCSR_BAND_24;
9540 }
9541 else
9542 {
9543 // else, it's a 5.0GHz channel. Set mode to 11a.
9544 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9545 eBand = eCSR_BAND_5G;
9546 }
9547 break;
9548 }//switch
9549 }//if( eCSR_CFG_DOT11_MODE_ABG == cfgDot11Mode )
9550 else
9551 {
9552 //dot11 mode is set, lets pick the band
9553 if ( eCSR_OPERATING_CHANNEL_AUTO == operationChn )
9554 {
9555 // channel is Auto also.
9556 eBand = pMac->roam.configParam.eBand;
9557 if(eCSR_BAND_ALL == eBand)
9558 {
9559 //prefer 5GHz
9560 eBand = eCSR_BAND_5G;
9561 }
9562 }
9563 else if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9564 {
9565 eBand = eCSR_BAND_24;
9566 }
9567 else
9568 {
9569 eBand = eCSR_BAND_5G;
9570 }
9571 }
9572 if(pBand)
9573 {
9574 *pBand = eBand;
9575 }
9576
9577 if (operationChn == 14){
9578 smsLog(pMac, LOGE, FL(" Switching to Dot11B mode \n"));
9579 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
9580 }
Madan Mohan Koyyalamudi91f8e9f2012-10-22 15:11:56 -07009581
Madan Mohan Koyyalamudi84a8b2e2012-10-22 15:15:14 -07009582 if( (!CSR_IS_11n_ALLOWED(pProfile->EncryptionType.encryptionType[0] )) &&
9583 ((eCSR_CFG_DOT11_MODE_11N == cfgDot11Mode) ||
Madan Mohan Koyyalamudi91f8e9f2012-10-22 15:11:56 -07009584#ifdef WLAN_FEATURE_11AC
Madan Mohan Koyyalamudi84a8b2e2012-10-22 15:15:14 -07009585 (eCSR_CFG_DOT11_MODE_11AC == cfgDot11Mode) ||
Madan Mohan Koyyalamudi91f8e9f2012-10-22 15:11:56 -07009586#endif
Madan Mohan Koyyalamudi84a8b2e2012-10-22 15:15:14 -07009587 (eCSR_CFG_DOT11_MODE_TAURUS == cfgDot11Mode)) )
9588 {
9589 //We cannot do 11n here
9590 if ( CSR_IS_CHANNEL_24GHZ(operationChn) )
9591 {
9592 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
9593 }
9594 else
9595 {
9596 cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
9597 }
9598 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009599 return( cfgDot11Mode );
9600}
9601
Jeff Johnson295189b2012-06-20 16:38:30 -07009602eHalStatus csrRoamIssueStopBss( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamSubState NewSubstate )
9603{
9604 eHalStatus status;
9605 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -07009606
9607 if(!pSession)
9608 {
9609 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
9610 return eHAL_STATUS_FAILURE;
9611 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009612
9613#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
9614 {
9615 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -07009616 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
9617 if(pIbssLog)
9618 {
9619 pIbssLog->eventId = WLAN_IBSS_EVENT_STOP_REQ;
9620 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
9621 }
9622 }
9623#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -07009624 pSession->ibss_join_pending = FALSE;
9625 csrRoamStopIbssJoinTimer(pMac, sessionId );
9626 // Set the roaming substate to 'stop Bss request'...
9627 csrRoamSubstateChange( pMac, NewSubstate, sessionId );
9628
9629 // attempt to stop the Bss (reason code is ignored...)
9630 status = csrSendMBStopBssReqMsg( pMac, sessionId );
9631
9632 return (status);
9633}
9634
Jeff Johnson295189b2012-06-20 16:38:30 -07009635//pNumChan is a caller allocated space with the sizeof pChannels
9636eHalStatus csrGetCfgValidChannels(tpAniSirGlobal pMac, tANI_U8 *pChannels, tANI_U32 *pNumChan)
9637{
9638
9639 return (ccmCfgGetStr(pMac, WNI_CFG_VALID_CHANNEL_LIST,
9640 (tANI_U8 *)pChannels,
9641 pNumChan));
9642}
9643
Jeff Johnson295189b2012-06-20 16:38:30 -07009644tANI_BOOLEAN csrRoamIsChannelValid( tpAniSirGlobal pMac, tANI_U8 channel )
9645{
9646 tANI_BOOLEAN fValid = FALSE;
9647 tANI_U32 idxValidChannels;
9648 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9649
9650 if (HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, pMac->roam.validChannelList, &len)))
9651 {
9652 for ( idxValidChannels = 0; ( idxValidChannels < len ); idxValidChannels++ )
9653 {
9654 if ( channel == pMac->roam.validChannelList[ idxValidChannels ] )
9655 {
9656 fValid = TRUE;
9657 break;
9658 }
9659 }
9660 }
9661 pMac->roam.numValidChannels = len;
9662 return fValid;
9663}
9664
Jeff Johnson295189b2012-06-20 16:38:30 -07009665tANI_BOOLEAN csrRoamIsValid40MhzChannel(tpAniSirGlobal pMac, tANI_U8 channel)
9666{
9667 tANI_BOOLEAN fValid = eANI_BOOLEAN_FALSE;
9668 tANI_U8 i;
Jeff Johnson295189b2012-06-20 16:38:30 -07009669 for(i = 0; i < pMac->scan.base40MHzChannels.numChannels; i++)
9670 {
9671 if(channel == pMac->scan.base40MHzChannels.channelList[i])
9672 {
9673 fValid = eANI_BOOLEAN_TRUE;
9674 break;
9675 }
9676 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009677 return (fValid);
9678}
9679
Jeff Johnson295189b2012-06-20 16:38:30 -07009680//This function check and validate whether the NIC can do CB (40MHz)
Jeff Johnsone7245742012-09-05 17:12:55 -07009681 static ePhyChanBondState csrGetCBModeFromIes(tpAniSirGlobal pMac, tANI_U8 primaryChn, tDot11fBeaconIEs *pIes)
Jeff Johnson295189b2012-06-20 16:38:30 -07009682{
Jeff Johnsone7245742012-09-05 17:12:55 -07009683 ePhyChanBondState eRet = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -07009684 tANI_U8 centerChn;
9685 tANI_U32 ChannelBondingMode;
Jeff Johnson295189b2012-06-20 16:38:30 -07009686 if(CSR_IS_CHANNEL_24GHZ(primaryChn))
9687 {
9688 ChannelBondingMode = pMac->roam.configParam.channelBondingMode24GHz;
9689 }
9690 else
9691 {
9692 ChannelBondingMode = pMac->roam.configParam.channelBondingMode5GHz;
9693 }
9694 //Figure what the other side's CB mode
9695 if(WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != ChannelBondingMode)
9696 {
9697 if(pIes->HTCaps.present && (eHT_CHANNEL_WIDTH_40MHZ == pIes->HTCaps.supportedChannelWidthSet))
9698 {
9699 if(pIes->HTInfo.present)
9700 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009701 /* This is called during INFRA STA/CLIENT and should use the merged value of
9702 * supported channel width and recommended tx width as per standard
9703 */
9704 smsLog(pMac, LOG1, "scws %u rtws %u sco %u\n",
9705 pIes->HTCaps.supportedChannelWidthSet,
9706 pIes->HTInfo.recommendedTxWidthSet,
9707 pIes->HTInfo.secondaryChannelOffset);
9708
9709 if (pIes->HTInfo.recommendedTxWidthSet == eHT_CHANNEL_WIDTH_40MHZ)
9710 eRet = (ePhyChanBondState)pIes->HTInfo.secondaryChannelOffset;
Jeff Johnson295189b2012-06-20 16:38:30 -07009711 else
Jeff Johnsone7245742012-09-05 17:12:55 -07009712 eRet = PHY_SINGLE_CHANNEL_CENTERED;
9713 switch (eRet) {
9714 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
9715 centerChn = primaryChn + CSR_CB_CENTER_CHANNEL_OFFSET;
9716 break;
9717 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
9718 centerChn = primaryChn - CSR_CB_CENTER_CHANNEL_OFFSET;
9719 break;
9720 case PHY_SINGLE_CHANNEL_CENTERED:
9721 default:
9722 centerChn = primaryChn;
9723 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009724 }
Jeff Johnsone7245742012-09-05 17:12:55 -07009725 if((PHY_SINGLE_CHANNEL_CENTERED != eRet) && !csrRoamIsValid40MhzChannel(pMac, centerChn))
Jeff Johnson295189b2012-06-20 16:38:30 -07009726 {
Jeff Johnsone7245742012-09-05 17:12:55 -07009727 smsLog(pMac, LOGE, " Invalid center channel (%d), disable 40MHz mode\n", centerChn);
9728 //eRet = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -07009729 }
9730 }
9731 }
9732 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009733 return eRet;
9734}
Jeff Johnson295189b2012-06-20 16:38:30 -07009735tANI_BOOLEAN csrIsEncryptionInList( tpAniSirGlobal pMac, tCsrEncryptionList *pCipherList, eCsrEncryptionType encryptionType )
9736{
9737 tANI_BOOLEAN fFound = FALSE;
9738 tANI_U32 idx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009739 for( idx = 0; idx < pCipherList->numEntries; idx++ )
9740 {
9741 if( pCipherList->encryptionType[idx] == encryptionType )
9742 {
9743 fFound = TRUE;
9744 break;
9745 }
9746 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009747 return fFound;
9748}
Jeff Johnson295189b2012-06-20 16:38:30 -07009749tANI_BOOLEAN csrIsAuthInList( tpAniSirGlobal pMac, tCsrAuthList *pAuthList, eCsrAuthType authType )
9750{
9751 tANI_BOOLEAN fFound = FALSE;
9752 tANI_U32 idx;
Jeff Johnson295189b2012-06-20 16:38:30 -07009753 for( idx = 0; idx < pAuthList->numEntries; idx++ )
9754 {
9755 if( pAuthList->authType[idx] == authType )
9756 {
9757 fFound = TRUE;
9758 break;
9759 }
9760 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009761 return fFound;
9762}
Jeff Johnson295189b2012-06-20 16:38:30 -07009763tANI_BOOLEAN csrIsSameProfile(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pProfile1, tCsrRoamProfile *pProfile2)
9764{
9765 tANI_BOOLEAN fCheck = eANI_BOOLEAN_FALSE;
9766 tCsrScanResultFilter *pScanFilter = NULL;
9767 eHalStatus status = eHAL_STATUS_SUCCESS;
9768
9769 if(pProfile1 && pProfile2)
9770 {
9771 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
9772 if(HAL_STATUS_SUCCESS(status))
9773 {
9774 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
9775 status = csrRoamPrepareFilterFromProfile(pMac, pProfile2, pScanFilter);
9776 if(HAL_STATUS_SUCCESS(status))
9777 {
9778 fCheck = eANI_BOOLEAN_FALSE;
9779 do
9780 {
9781 tANI_U32 i;
9782 for(i = 0; i < pScanFilter->SSIDs.numOfSSIDs; i++)
9783 {
9784 fCheck = csrIsSsidMatch( pMac, pScanFilter->SSIDs.SSIDList[i].SSID.ssId,
9785 pScanFilter->SSIDs.SSIDList[i].SSID.length,
9786 pProfile1->SSID.ssId, pProfile1->SSID.length, eANI_BOOLEAN_FALSE );
9787 if ( fCheck ) break;
9788 }
9789 if(!fCheck)
9790 {
9791 break;
9792 }
9793 if( !csrIsAuthInList( pMac, &pProfile2->AuthType, pProfile1->AuthType)
9794 || pProfile2->BSSType != pProfile1->BSSType
9795 || !csrIsEncryptionInList( pMac, &pProfile2->EncryptionType, pProfile1->EncryptionType )
9796 )
9797 {
9798 fCheck = eANI_BOOLEAN_FALSE;
9799 break;
9800 }
9801#ifdef WLAN_FEATURE_VOWIFI_11R
9802 if (pProfile1->MDID.mdiePresent || pProfile2->MDID.mdiePresent)
9803 {
9804 if (pProfile1->MDID.mobilityDomain != pProfile2->MDID.mobilityDomain)
9805 {
9806 fCheck = eANI_BOOLEAN_FALSE;
9807 break;
9808 }
9809 }
9810#endif
9811 //Match found
9812 fCheck = eANI_BOOLEAN_TRUE;
9813 }while(0);
9814 csrFreeScanFilter(pMac, pScanFilter);
9815 }
9816 palFreeMemory(pMac->hHdd, pScanFilter);
9817 }
9818 }
9819
9820 return (fCheck);
9821}
9822
Jeff Johnson295189b2012-06-20 16:38:30 -07009823tANI_BOOLEAN csrRoamIsSameProfileKeys(tpAniSirGlobal pMac, tCsrRoamConnectedProfile *pConnProfile, tCsrRoamProfile *pProfile2)
9824{
9825 tANI_BOOLEAN fCheck = eANI_BOOLEAN_FALSE;
9826 int i;
Jeff Johnson295189b2012-06-20 16:38:30 -07009827 do
9828 {
9829 //Only check for static WEP
9830 if(!csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, eCSR_ENCRYPT_TYPE_WEP40_STATICKEY) &&
9831 !csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, eCSR_ENCRYPT_TYPE_WEP104_STATICKEY))
9832 {
9833 fCheck = eANI_BOOLEAN_TRUE;
9834 break;
9835 }
9836 if(!csrIsEncryptionInList(pMac, &pProfile2->EncryptionType, pConnProfile->EncryptionType)) break;
9837 if(pConnProfile->Keys.defaultIndex != pProfile2->Keys.defaultIndex) break;
9838 for(i = 0; i < CSR_MAX_NUM_KEY; i++)
9839 {
9840 if(pConnProfile->Keys.KeyLength[i] != pProfile2->Keys.KeyLength[i]) break;
9841 if(!palEqualMemory(pMac->hHdd, &pConnProfile->Keys.KeyMaterial[i],
9842 &pProfile2->Keys.KeyMaterial[i], pProfile2->Keys.KeyLength[i]))
9843 {
9844 break;
9845 }
9846 }
9847 if( i == CSR_MAX_NUM_KEY)
9848 {
9849 fCheck = eANI_BOOLEAN_TRUE;
9850 }
9851 }while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -07009852 return (fCheck);
9853}
9854
Jeff Johnson295189b2012-06-20 16:38:30 -07009855//IBSS
9856
Jeff Johnson295189b2012-06-20 16:38:30 -07009857tANI_U8 csrRoamGetIbssStartChannelNumber50( tpAniSirGlobal pMac )
9858{
9859 tANI_U8 channel = 0;
9860 tANI_U32 idx;
9861 tANI_U32 idxValidChannels;
9862 tANI_BOOLEAN fFound = FALSE;
9863 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9864
9865 if(eCSR_OPERATING_CHANNEL_ANY != pMac->roam.configParam.AdHocChannel5G)
9866 {
9867 channel = pMac->roam.configParam.AdHocChannel5G;
9868 if(!csrRoamIsChannelValid(pMac, channel))
9869 {
9870 channel = 0;
9871 }
9872 }
9873 if (0 == channel && HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &len)))
9874 {
9875 for ( idx = 0; ( idx < CSR_NUM_IBSS_START_CHANNELS_50 ) && !fFound; idx++ )
9876 {
9877 for ( idxValidChannels = 0; ( idxValidChannels < len ) && !fFound; idxValidChannels++ )
9878 {
9879 if ( csrStartIbssChannels50[ idx ] == pMac->roam.validChannelList[ idxValidChannels ] )
9880 {
9881 fFound = TRUE;
9882 channel = csrStartIbssChannels50[ idx ];
9883 }
9884 }
9885 }
Jeff Johnson295189b2012-06-20 16:38:30 -07009886 // this is rare, but if it does happen, we find anyone in 11a bandwidth and return the first 11a channel found!
9887 if (!fFound)
9888 {
9889 for ( idxValidChannels = 0; idxValidChannels < len ; idxValidChannels++ )
9890 {
9891 if ( CSR_IS_CHANNEL_5GHZ(pMac->roam.validChannelList[ idx ]) ) // the max channel# in 11g is 14
9892 {
9893 channel = csrStartIbssChannels50[ idx ];
9894 break;
9895 }
9896 }
9897 }
9898 }//if
9899
9900 return( channel );
9901}
9902
Jeff Johnson295189b2012-06-20 16:38:30 -07009903tANI_U8 csrRoamGetIbssStartChannelNumber24( tpAniSirGlobal pMac )
9904{
9905 tANI_U8 channel = 1;
9906 tANI_U32 idx;
9907 tANI_U32 idxValidChannels;
9908 tANI_BOOLEAN fFound = FALSE;
9909 tANI_U32 len = sizeof(pMac->roam.validChannelList);
9910
9911 if(eCSR_OPERATING_CHANNEL_ANY != pMac->roam.configParam.AdHocChannel24)
9912 {
9913 channel = pMac->roam.configParam.AdHocChannel24;
9914 if(!csrRoamIsChannelValid(pMac, channel))
9915 {
9916 channel = 0;
9917 }
9918 }
9919
9920 if (0 == channel && HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &len)))
9921 {
9922 for ( idx = 0; ( idx < CSR_NUM_IBSS_START_CHANNELS_24 ) && !fFound; idx++ )
9923 {
9924 for ( idxValidChannels = 0; ( idxValidChannels < len ) && !fFound; idxValidChannels++ )
9925 {
9926 if ( csrStartIbssChannels24[ idx ] == pMac->roam.validChannelList[ idxValidChannels ] )
9927 {
9928 fFound = TRUE;
9929 channel = csrStartIbssChannels24[ idx ];
9930 }
9931 }
9932 }
9933 }
9934
9935 return( channel );
9936}
9937
Jeff Johnson295189b2012-06-20 16:38:30 -07009938static void csrRoamGetBssStartParms( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile,
9939 tCsrRoamStartBssParams *pParam )
9940{
9941 eCsrCfgDot11Mode cfgDot11Mode;
9942 eCsrBand eBand;
9943 tANI_U8 channel = 0;
9944 tSirNwType nwType;
9945 tANI_U8 operationChannel = 0;
9946
9947 if(pProfile->ChannelInfo.numOfChannels && pProfile->ChannelInfo.ChannelList)
9948 {
9949 operationChannel = pProfile->ChannelInfo.ChannelList[0];
9950 }
9951
9952#ifdef WLAN_SOFTAP_FEATURE
9953 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, pProfile, operationChannel, &eBand );
9954#else
9955 cfgDot11Mode = csrRoamGetPhyModeBandForBss( pMac, (eCsrPhyMode)pProfile->phyMode, operationChannel, &eBand );
9956#endif
9957
9958#ifdef WLAN_FEATURE_P2P
9959 if( ( (pProfile->csrPersona == VOS_P2P_CLIENT_MODE) ||
9960 (pProfile->csrPersona == VOS_P2P_GO_MODE) )
9961 && ( cfgDot11Mode == eCSR_CFG_DOT11_MODE_11B)
9962 )
9963 {
9964 /* This should never happen */
9965 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_FATAL,
9966 FL("For P2PClient/P2P-GO (persona %d) cfgDot11Mode is 11B\n"),
9967 pProfile->csrPersona);
9968 VOS_ASSERT(0);
9969 }
9970#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07009971 switch( cfgDot11Mode )
9972 {
9973 case eCSR_CFG_DOT11_MODE_11G:
9974 nwType = eSIR_11G_NW_TYPE;
9975 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009976 case eCSR_CFG_DOT11_MODE_11B:
9977 nwType = eSIR_11B_NW_TYPE;
9978 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009979 case eCSR_CFG_DOT11_MODE_11A:
9980 nwType = eSIR_11A_NW_TYPE;
9981 break;
Jeff Johnson295189b2012-06-20 16:38:30 -07009982 default:
9983 case eCSR_CFG_DOT11_MODE_11N:
9984 case eCSR_CFG_DOT11_MODE_TAURUS:
9985 //Because LIM only verifies it against 11a, 11b or 11g, set only 11g or 11a here
9986 if(eCSR_BAND_24 == eBand)
9987 {
9988 nwType = eSIR_11G_NW_TYPE;
9989 }
9990 else
9991 {
9992 nwType = eSIR_11A_NW_TYPE;
9993 }
9994 break;
9995 }
9996
9997 pParam->extendedRateSet.numRates = 0;
9998
9999 switch ( nwType )
10000 {
10001 default:
10002 smsLog(pMac, LOGE, FL("sees an unknown pSirNwType (%d)\n"), nwType);
10003 case eSIR_11A_NW_TYPE:
10004
10005 pParam->operationalRateSet.numRates = 8;
10006
10007 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_6 | CSR_DOT11_BASIC_RATE_MASK;
10008 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_9;
10009 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_12 | CSR_DOT11_BASIC_RATE_MASK;
10010 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_18;
10011 pParam->operationalRateSet.rate[4] = SIR_MAC_RATE_24 | CSR_DOT11_BASIC_RATE_MASK;
10012 pParam->operationalRateSet.rate[5] = SIR_MAC_RATE_36;
10013 pParam->operationalRateSet.rate[6] = SIR_MAC_RATE_48;
10014 pParam->operationalRateSet.rate[7] = SIR_MAC_RATE_54;
10015
10016 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
10017 {
10018 channel = csrRoamGetIbssStartChannelNumber50( pMac );
10019 if( 0 == channel &&
10020 CSR_IS_PHY_MODE_DUAL_BAND(pProfile->phyMode) &&
10021 CSR_IS_PHY_MODE_DUAL_BAND(pMac->roam.configParam.phyMode)
10022 )
10023 {
10024 //We could not find a 5G channel by auto pick, let's try 2.4G channels
10025 //We only do this here because csrRoamGetPhyModeBandForBss always picks 11a for AUTO
10026 nwType = eSIR_11B_NW_TYPE;
10027 channel = csrRoamGetIbssStartChannelNumber24( pMac );
10028 pParam->operationalRateSet.numRates = 4;
10029 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
10030 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
10031 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
10032 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
10033 }
10034 }
10035 else
10036 {
10037 channel = operationChannel;
10038 }
10039 break;
10040
10041 case eSIR_11B_NW_TYPE:
10042 pParam->operationalRateSet.numRates = 4;
10043 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
10044 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
10045 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
10046 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
Jeff Johnson295189b2012-06-20 16:38:30 -070010047 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
10048 {
10049 channel = csrRoamGetIbssStartChannelNumber24( pMac );
10050 }
10051 else
10052 {
10053 channel = operationChannel;
10054 }
10055
10056 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070010057 case eSIR_11G_NW_TYPE:
10058#ifdef WLAN_FEATURE_P2P
10059 /* For P2P Client and P2P GO, disable 11b rates */
10060 if( (pProfile->csrPersona == VOS_P2P_CLIENT_MODE) ||
10061 (pProfile->csrPersona == VOS_P2P_GO_MODE)
10062 )
10063 {
10064 pParam->operationalRateSet.numRates = 8;
10065
10066 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_6 | CSR_DOT11_BASIC_RATE_MASK;
10067 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_9;
10068 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_12 | CSR_DOT11_BASIC_RATE_MASK;
10069 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_18;
10070 pParam->operationalRateSet.rate[4] = SIR_MAC_RATE_24 | CSR_DOT11_BASIC_RATE_MASK;
10071 pParam->operationalRateSet.rate[5] = SIR_MAC_RATE_36;
10072 pParam->operationalRateSet.rate[6] = SIR_MAC_RATE_48;
10073 pParam->operationalRateSet.rate[7] = SIR_MAC_RATE_54;
10074 }
10075 else
10076#endif
10077 {
10078 pParam->operationalRateSet.numRates = 4;
Jeff Johnson295189b2012-06-20 16:38:30 -070010079 pParam->operationalRateSet.rate[0] = SIR_MAC_RATE_1 | CSR_DOT11_BASIC_RATE_MASK;
10080 pParam->operationalRateSet.rate[1] = SIR_MAC_RATE_2 | CSR_DOT11_BASIC_RATE_MASK;
10081 pParam->operationalRateSet.rate[2] = SIR_MAC_RATE_5_5 | CSR_DOT11_BASIC_RATE_MASK;
10082 pParam->operationalRateSet.rate[3] = SIR_MAC_RATE_11 | CSR_DOT11_BASIC_RATE_MASK;
10083
10084 pParam->extendedRateSet.numRates = 8;
Jeff Johnson295189b2012-06-20 16:38:30 -070010085 pParam->extendedRateSet.rate[0] = SIR_MAC_RATE_6;
10086 pParam->extendedRateSet.rate[1] = SIR_MAC_RATE_9;
10087 pParam->extendedRateSet.rate[2] = SIR_MAC_RATE_12;
10088 pParam->extendedRateSet.rate[3] = SIR_MAC_RATE_18;
10089 pParam->extendedRateSet.rate[4] = SIR_MAC_RATE_24;
10090 pParam->extendedRateSet.rate[5] = SIR_MAC_RATE_36;
10091 pParam->extendedRateSet.rate[6] = SIR_MAC_RATE_48;
10092 pParam->extendedRateSet.rate[7] = SIR_MAC_RATE_54;
10093 }
10094
10095 if ( eCSR_OPERATING_CHANNEL_ANY == operationChannel )
10096 {
10097 channel = csrRoamGetIbssStartChannelNumber24( pMac );
10098 }
10099 else
10100 {
10101 channel = operationChannel;
10102 }
10103
10104 break;
10105 }
10106 pParam->operationChn = channel;
10107 pParam->sirNwType = nwType;
10108}
10109
Jeff Johnson295189b2012-06-20 16:38:30 -070010110static void csrRoamGetBssStartParmsFromBssDesc( tpAniSirGlobal pMac, tSirBssDescription *pBssDesc,
10111 tDot11fBeaconIEs *pIes, tCsrRoamStartBssParams *pParam )
10112{
10113
10114 if( pParam )
10115 {
10116 pParam->sirNwType = pBssDesc->nwType;
Jeff Johnsone7245742012-09-05 17:12:55 -070010117 pParam->cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010118 pParam->operationChn = pBssDesc->channelId;
10119 palCopyMemory( pMac->hHdd, &pParam->bssid, pBssDesc->bssId, sizeof(tCsrBssid) );
10120
10121 if( pIes )
10122 {
10123 if(pIes->SuppRates.present)
10124 {
10125 pParam->operationalRateSet.numRates = pIes->SuppRates.num_rates;
10126 if(pIes->SuppRates.num_rates > SIR_MAC_RATESET_EID_MAX)
10127 {
10128 smsLog(pMac, LOGE, FL("num_rates :%d is more than SIR_MAC_RATESET_EID_MAX, resetting to SIR_MAC_RATESET_EID_MAX\n"),
10129 pIes->SuppRates.num_rates);
10130 pIes->SuppRates.num_rates = SIR_MAC_RATESET_EID_MAX;
10131 }
10132 palCopyMemory(pMac->hHdd, pParam->operationalRateSet.rate, pIes->SuppRates.rates,
10133 sizeof(*pIes->SuppRates.rates) * pIes->SuppRates.num_rates);
10134 }
10135 if( pIes->SSID.present )
10136 {
10137 pParam->ssId.length = pIes->SSID.num_ssid;
10138 palCopyMemory(pMac->hHdd, pParam->ssId.ssId, pIes->SSID.ssid, pParam->ssId.length);
10139 }
10140 pParam->cbMode = csrGetCBModeFromIes(pMac, pParam->operationChn, pIes);
Jeff Johnson295189b2012-06-20 16:38:30 -070010141 }
10142 else
10143 {
10144 pParam->ssId.length = 0;
10145 pParam->operationalRateSet.numRates = 0;
10146 }
10147 }
10148}
10149
Jeff Johnson295189b2012-06-20 16:38:30 -070010150static void csrRoamDetermineMaxRateForAdHoc( tpAniSirGlobal pMac, tSirMacRateSet *pSirRateSet )
10151{
10152 tANI_U8 MaxRate = 0;
10153 tANI_U32 i;
10154 tANI_U8 *pRate;
10155
10156 pRate = pSirRateSet->rate;
10157 for ( i = 0; i < pSirRateSet->numRates; i++ )
10158 {
10159 MaxRate = CSR_MAX( MaxRate, ( pRate[ i ] & (~CSR_DOT11_BASIC_RATE_MASK) ) );
10160 }
10161
10162 // Save the max rate in the connected state information...
10163
10164 // modify LastRates variable as well
10165
10166 return;
10167}
10168
Jeff Johnson295189b2012-06-20 16:38:30 -070010169//this function finds a valid secondary channel for channel bonding with "channel".
10170//Param: channel -- primary channel, caller must validate it
10171// cbChoice -- CB directory
10172//Return: if 0, no secondary channel is found. Otherwise a valid secondary channel.
10173static tANI_U8 csrRoamGetSecondaryChannel(tpAniSirGlobal pMac, tANI_U8 channel, eCsrCBChoice cbChoice)
10174{
10175 tANI_U8 chnUp = 0, chnDown = 0, chnRet = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070010176 switch (cbChoice)
10177 {
10178 case eCSR_CB_OFF:
10179 chnUp = 0;
10180 chnDown = 0;
10181 break;
10182 case eCSR_CB_DOWN:
10183 chnUp = 0;
10184 chnDown = channel - CSR_CB_CHANNEL_GAP;
10185 break;
10186 case eCSR_CB_UP:
10187 chnUp = channel + CSR_CB_CHANNEL_GAP;
10188 chnDown = 0;
10189 break;
10190 case eCSR_CB_AUTO:
10191 //consider every other value means auto
10192 default:
10193 chnUp = channel + CSR_CB_CHANNEL_GAP;
10194 chnDown = channel - CSR_CB_CHANNEL_GAP;
10195 break;
10196 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010197 //if CB_UP or auto, try channel up first
10198 if(chnUp && CSR_IS_SAME_BAND_CHANNELS(chnUp, channel) && csrRoamIsChannelValid(pMac, chnUp))
10199 {
10200 //found a valid up channel for channel bonding
10201 //check whether the center channel is valid
10202 if(csrRoamIsValid40MhzChannel(pMac, channel + CSR_CB_CENTER_CHANNEL_OFFSET))
10203 {
10204 chnRet = chnUp;
10205 }
10206 }
10207 if(chnRet == 0 && chnDown && CSR_IS_SAME_BAND_CHANNELS(chnDown, channel) && csrRoamIsChannelValid(pMac, chnDown))
10208 {
10209 //found a valid down channel for channel bonding
10210 if(csrRoamIsValid40MhzChannel(pMac, channel - CSR_CB_CENTER_CHANNEL_OFFSET))
10211 {
10212 chnRet = chnDown;
10213 }
10214 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010215 return chnRet;
10216}
10217
Jeff Johnson295189b2012-06-20 16:38:30 -070010218eHalStatus csrRoamIssueStartBss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamStartBssParams *pParam,
10219 tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc, tANI_U32 roamId )
10220{
10221 eHalStatus status = eHAL_STATUS_SUCCESS;
10222 eCsrBand eBand;
Jeff Johnson295189b2012-06-20 16:38:30 -070010223 // Set the roaming substate to 'Start BSS attempt'...
10224 csrRoamSubstateChange( pMac, eCSR_ROAM_SUBSTATE_START_BSS_REQ, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070010225#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
10226 //Need to figure out whether we need to log WDS???
10227 if( CSR_IS_IBSS( pProfile ) )
10228 {
10229 vos_log_ibss_pkt_type *pIbssLog;
Jeff Johnson295189b2012-06-20 16:38:30 -070010230 WLAN_VOS_DIAG_LOG_ALLOC(pIbssLog, vos_log_ibss_pkt_type, LOG_WLAN_IBSS_C);
10231 if(pIbssLog)
10232 {
10233 if(pBssDesc)
10234 {
10235 pIbssLog->eventId = WLAN_IBSS_EVENT_JOIN_IBSS_REQ;
10236 palCopyMemory(pMac->hHdd, pIbssLog->bssid, pBssDesc->bssId, 6);
10237 }
10238 else
10239 {
10240 pIbssLog->eventId = WLAN_IBSS_EVENT_START_IBSS_REQ;
10241 }
10242 palCopyMemory(pMac->hHdd, pIbssLog->ssid, pParam->ssId.ssId,
10243 pParam->ssId.length);
10244 if(pProfile->ChannelInfo.numOfChannels == 0)
10245 {
10246 pIbssLog->channelSetting = AUTO_PICK;
10247 }
10248 else
10249 {
10250 pIbssLog->channelSetting = SPECIFIED;
10251 }
10252 pIbssLog->operatingChannel = pParam->operationChn;
10253 WLAN_VOS_DIAG_LOG_REPORT(pIbssLog);
10254 }
10255 }
10256#endif //FEATURE_WLAN_DIAG_SUPPORT_CSR
10257 //Put RSN information in for Starting BSS
10258 pParam->nRSNIELength = (tANI_U16)pProfile->nRSNReqIELength;
10259 pParam->pRSNIE = pProfile->pRSNReqIE;
10260
Jeff Johnson295189b2012-06-20 16:38:30 -070010261#ifdef WLAN_SOFTAP_FEATURE
10262 pParam->privacy = pProfile->privacy;
10263 pParam->fwdWPSPBCProbeReq = pProfile->fwdWPSPBCProbeReq;
10264 pParam->authType = pProfile->csr80211AuthType;
10265 pParam->beaconInterval = pProfile->beaconInterval;
10266 pParam->dtimPeriod = pProfile->dtimPeriod;
10267 pParam->ApUapsdEnable = pProfile->ApUapsdEnable;
10268 pParam->ssidHidden = pProfile->SSIDs.SSIDList[0].ssidHidden;
10269 if (CSR_IS_INFRA_AP(pProfile)&& (pParam->operationChn != 0))
10270 {
10271 if (csrIsValidChannel(pMac, pParam->operationChn) != eHAL_STATUS_SUCCESS)
10272 {
10273 pParam->operationChn = INFRA_AP_DEFAULT_CHANNEL;
10274 }
10275 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010276 pParam->protEnabled = pProfile->protEnabled;
10277 pParam->obssProtEnabled = pProfile->obssProtEnabled;
10278 pParam->ht_protection = pProfile->cfg_protection;
10279 pParam->wps_state = pProfile->wps_state;
10280#endif
10281
Jeff Johnson295189b2012-06-20 16:38:30 -070010282#ifdef WLAN_SOFTAP_FEATURE
10283 pParam->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, pProfile, pParam->operationChn /* pProfile->operationChannel*/,
10284 &eBand);
10285#else
10286 pParam->uCfgDot11Mode = csrRoamGetPhyModeBandForBss(pMac, (eCsrPhyMode)pProfile->phyMode, pProfile->operationChannel,
10287 &eBand);
10288#endif
10289 pParam->bssPersona = pProfile->csrPersona;
10290 // When starting an IBSS, start on the channel from the Profile.
10291 status = csrSendMBStartBssReqMsg( pMac, sessionId, pProfile->BSSType, pParam, pBssDesc );
Jeff Johnson295189b2012-06-20 16:38:30 -070010292 return (status);
10293}
10294
Jeff Johnson295189b2012-06-20 16:38:30 -070010295static void csrRoamPrepareBssParams(tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
Jeff Johnsone7245742012-09-05 17:12:55 -070010296 tSirBssDescription *pBssDesc, tBssConfigParam *pBssConfig, tDot11fBeaconIEs *pIes)
Jeff Johnson295189b2012-06-20 16:38:30 -070010297{
10298 tANI_U8 Channel, SecondChn;
Jeff Johnsone7245742012-09-05 17:12:55 -070010299 ePhyChanBondState cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010300 eCsrCBChoice cbChoice;
10301 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010302
10303 if(!pSession)
10304 {
10305 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10306 return;
10307 }
10308
Jeff Johnson295189b2012-06-20 16:38:30 -070010309 if( pBssDesc )
10310 {
10311 csrRoamGetBssStartParmsFromBssDesc( pMac, pBssDesc, pIes, &pSession->bssParams );
10312 //Since csrRoamGetBssStartParmsFromBssDesc fills in the bssid for pSession->bssParams
10313 //The following code has to be do after that.
10314 //For WDS station, use selfMac as the self BSSID
10315 if( CSR_IS_WDS_STA( pProfile ) )
10316 {
10317 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, &pSession->selfMacAddr, sizeof(tCsrBssid));
10318 }
10319 }
10320 else
10321 {
10322 csrRoamGetBssStartParms(pMac, pProfile, &pSession->bssParams);
Jeff Johnson295189b2012-06-20 16:38:30 -070010323 //Use the first SSID
10324 if(pProfile->SSIDs.numOfSSIDs)
10325 {
10326 palCopyMemory(pMac->hHdd, &pSession->bssParams.ssId, pProfile->SSIDs.SSIDList, sizeof(tSirMacSSid));
10327 }
10328 //For WDS station, use selfMac as the self BSSID
10329 if( CSR_IS_WDS_STA( pProfile ) )
10330 {
10331 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, &pSession->selfMacAddr, sizeof(tCsrBssid));
10332 }
10333 //Use the first BSSID
10334 else if( pProfile->BSSIDs.numOfBSSIDs )
10335 {
10336 palCopyMemory(pMac->hHdd, &pSession->bssParams.bssid, pProfile->BSSIDs.bssid, sizeof(tCsrBssid));
10337 }
10338 else
10339 {
10340 palZeroMemory( pMac->hHdd, &pSession->bssParams.bssid, sizeof(tCsrBssid) );
10341 }
10342 }
10343 Channel = pSession->bssParams.operationChn;
Jeff Johnson295189b2012-06-20 16:38:30 -070010344 //Set operating channel in pProfile which will be used
10345 //in csrRoamSetBssConfigCfg() to determine channel bonding
10346 //mode and will be configured in CFG later
10347 pProfile->operationChannel = Channel;
10348
10349 if(Channel == 0)
10350 {
10351 smsLog(pMac, LOGW, " CSR cannot find a channel to start IBSS\n");
10352 }
10353 else
10354 {
10355
10356 csrRoamDetermineMaxRateForAdHoc( pMac, &pSession->bssParams.operationalRateSet );
Jeff Johnsone7245742012-09-05 17:12:55 -070010357 if (CSR_IS_INFRA_AP(pProfile))
10358 {
10359 if(CSR_IS_CHANNEL_24GHZ(Channel))
10360 {
10361 cbMode = pMac->roam.configParam.channelBondingMode24GHz;
10362 }
10363 else
10364 {
10365 cbMode = pMac->roam.configParam.channelBondingMode5GHz;
10366 }
10367 smsLog(pMac, LOG1, "##softap cbMode %d\n", cbMode);
10368 pBssConfig->cbMode = cbMode;
10369 pSession->bssParams.cbMode = cbMode;
10370 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010371
10372 if( CSR_IS_START_IBSS( pProfile ) )
10373 {
10374 //TBH: channel bonding is not supported for Libra
10375 if( pProfile->ChannelInfo.ChannelList && eCSR_OPERATING_CHANNEL_AUTO != pProfile->ChannelInfo.ChannelList[0] )
10376 {
10377 Channel = pProfile->ChannelInfo.ChannelList[0];
10378 cbChoice = pProfile->CBMode;
10379 }
10380 else {
10381 cbChoice = pMac->roam.configParam.cbChoice;
10382 }
10383 pSession->bssParams.operationChn = Channel;
10384 //make sure channel is valid
10385 if(!csrRoamIsChannelValid(pMac, Channel))
10386 {
10387 //set Channel to 0 to let lim know this is invalid
10388 //We still send this request down to lim even though we know the channel is wrong because
10389 //lim will response with error and hdd's eWNI_SME_START_BSS_RSP handler will roam other profile (if any)
10390 Channel = 0;
10391 pSession->bssParams.operationChn = 0;
10392 }
10393 else {
10394 tANI_U32 ChannelBondingMode;
Jeff Johnson295189b2012-06-20 16:38:30 -070010395 if(CSR_IS_CHANNEL_24GHZ(Channel))
10396 {
10397 ChannelBondingMode = pMac->roam.configParam.channelBondingMode24GHz;
10398 }
10399 else
10400 {
10401 ChannelBondingMode = pMac->roam.configParam.channelBondingMode5GHz;
10402 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010403 //now we have a valid channel
10404 if(WNI_CFG_CHANNEL_BONDING_MODE_DISABLE != ChannelBondingMode)
10405 {
10406 //let's pick a secondard channel
10407 SecondChn = csrRoamGetSecondaryChannel(pMac, Channel, cbChoice);
Jeff Johnson295189b2012-06-20 16:38:30 -070010408 if(SecondChn > Channel)
10409 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010410 cbMode = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
Jeff Johnson295189b2012-06-20 16:38:30 -070010411 }
10412 else if(SecondChn && SecondChn < Channel)
10413 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010414 cbMode = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
Jeff Johnson295189b2012-06-20 16:38:30 -070010415 }
10416 else
10417 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010418 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010419 }
10420 pSession->bssParams.cbMode = cbMode;
10421 }
10422 else
10423 {
Jeff Johnsone7245742012-09-05 17:12:55 -070010424 pSession->bssParams.cbMode = PHY_SINGLE_CHANNEL_CENTERED;
Jeff Johnson295189b2012-06-20 16:38:30 -070010425 }
10426 }
10427 }
10428 }
10429}
10430
Jeff Johnson295189b2012-06-20 16:38:30 -070010431static eHalStatus csrRoamStartIbss( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile,
10432 tANI_BOOLEAN *pfSameIbss )
10433{
10434 eHalStatus status = eHAL_STATUS_SUCCESS;
10435 tANI_BOOLEAN fSameIbss = FALSE;
10436
10437 if ( csrIsConnStateIbss( pMac, sessionId ) )
10438 {
10439 // Check if any profile parameter has changed ? If any profile parameter
10440 // has changed then stop old BSS and start a new one with new parameters
10441 if ( csrIsSameProfile( pMac, &pMac->roam.roamSession[sessionId].connectedProfile, pProfile ) )
10442 {
10443 fSameIbss = TRUE;
10444 }
10445 else
10446 {
10447 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
10448 }
10449 }
10450 else if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
10451 {
10452 // Disassociate from the connected Infrastructure network...
10453 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
10454 }
10455 else
10456 {
10457 tBssConfigParam *pBssConfig;
10458
10459 status = palAllocateMemory(pMac->hHdd, (void **)&pBssConfig, sizeof(tBssConfigParam));
10460 if(HAL_STATUS_SUCCESS(status))
10461 {
10462 palZeroMemory(pMac->hHdd, pBssConfig, sizeof(tBssConfigParam));
10463 // there is no Bss description before we start an IBSS so we need to adopt
10464 // all Bss configuration parameters from the Profile.
10465 status = csrRoamPrepareBssConfigFromProfile(pMac, pProfile, pBssConfig, NULL);
10466 if(HAL_STATUS_SUCCESS(status))
10467 {
10468 //save dotMode
10469 pMac->roam.roamSession[sessionId].bssParams.uCfgDot11Mode = pBssConfig->uCfgDot11Mode;
10470 //Prepare some more parameters for this IBSS
Jeff Johnsone7245742012-09-05 17:12:55 -070010471 csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, pBssConfig, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070010472 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, NULL, pBssConfig, NULL);
10473 }
10474
10475 palFreeMemory(pMac->hHdd, pBssConfig);
10476 }//Allocate memory
10477 }
10478
10479 if(pfSameIbss)
10480 {
10481 *pfSameIbss = fSameIbss;
10482 }
10483 return( status );
10484}
10485
Jeff Johnson295189b2012-06-20 16:38:30 -070010486static void csrRoamUpdateConnectedProfileFromNewBss( tpAniSirGlobal pMac, tANI_U32 sessionId,
10487 tSirSmeNewBssInfo *pNewBss )
10488{
10489 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010490
10491 if(!pSession)
10492 {
10493 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10494 return;
10495 }
10496
Jeff Johnson295189b2012-06-20 16:38:30 -070010497 if( pNewBss )
10498 {
10499 // Set the operating channel.
10500 pSession->connectedProfile.operationChannel = pNewBss->channelNumber;
10501 // move the BSSId from the BSS description into the connected state information.
10502 palCopyMemory( pMac->hHdd, &pSession->connectedProfile.bssid,
10503 &(pNewBss->bssId), sizeof( tCsrBssid ) );
10504 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010505 return;
10506}
10507
Jeff Johnson295189b2012-06-20 16:38:30 -070010508#ifdef FEATURE_WLAN_WAPI
10509eHalStatus csrRoamSetBKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId, tBkidCacheInfo *pBKIDCache,
10510 tANI_U32 numItems )
10511{
10512 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10513 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070010514 if(!CSR_IS_SESSION_VALID( pMac, sessionId ))
10515 {
10516 smsLog(pMac, LOGE, FL(" Invalid session ID\n"));
10517 return status;
10518 }
10519 smsLog(pMac, LOGW, "csrRoamSetBKIDCache called, numItems = %d\n", numItems);
10520 pSession = CSR_GET_SESSION( pMac, sessionId );
10521 if(numItems <= CSR_MAX_BKID_ALLOWED)
10522 {
10523 status = eHAL_STATUS_SUCCESS;
10524 //numItems may be 0 to clear the cache
10525 pSession->NumBkidCache = (tANI_U16)numItems;
10526 if(numItems && pBKIDCache)
10527 {
10528 status = palCopyMemory( pMac->hHdd, pSession->BkidCacheInfo, pBKIDCache,
10529 sizeof(tBkidCacheInfo) * numItems );
10530 }
10531 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010532 return (status);
10533}
Jeff Johnson295189b2012-06-20 16:38:30 -070010534eHalStatus csrRoamGetBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pNum,
10535 tBkidCacheInfo *pBkidCache)
10536{
10537 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10538 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070010539 if(!CSR_IS_SESSION_VALID( pMac, sessionId ))
10540 {
10541 smsLog(pMac, LOGE, FL(" Invalid session ID\n"));
10542 return status;
10543 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010544 pSession = CSR_GET_SESSION( pMac, sessionId );
10545 if(pNum && pBkidCache)
10546 {
10547 if(pSession->NumBkidCache == 0)
10548 {
10549 *pNum = 0;
10550 status = eHAL_STATUS_SUCCESS;
10551 }
10552 else if(*pNum >= pSession->NumBkidCache)
10553 {
10554 if(pSession->NumBkidCache > CSR_MAX_PMKID_ALLOWED)
10555 {
10556 smsLog(pMac, LOGE, FL("NumPmkidCache :%d is more than CSR_MAX_PMKID_ALLOWED, resetting to CSR_MAX_PMKID_ALLOWED\n"),
10557 pSession->NumBkidCache);
10558 pSession->NumBkidCache = CSR_MAX_PMKID_ALLOWED;
10559 }
10560 palCopyMemory( pMac->hHdd, pBkidCache, pSession->BkidCacheInfo,
10561 sizeof(tBkidCacheInfo) * pSession->NumBkidCache );
10562 *pNum = pSession->NumBkidCache;
10563 status = eHAL_STATUS_SUCCESS;
10564 }
10565 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010566 return (status);
Jeff Johnson295189b2012-06-20 16:38:30 -070010567}
Jeff Johnson295189b2012-06-20 16:38:30 -070010568tANI_U32 csrRoamGetNumBKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId)
10569{
10570 return (pMac->roam.roamSession[sessionId].NumBkidCache);
Jeff Johnson295189b2012-06-20 16:38:30 -070010571}
10572#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070010573eHalStatus csrRoamSetPMKIDCache( tpAniSirGlobal pMac, tANI_U32 sessionId,
10574 tPmkidCacheInfo *pPMKIDCache, tANI_U32 numItems )
10575{
10576 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10577 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010578
10579 if(!pSession)
10580 {
10581 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10582 return eHAL_STATUS_FAILURE;
10583 }
10584
Jeff Johnson295189b2012-06-20 16:38:30 -070010585 smsLog(pMac, LOGW, "csrRoamSetPMKIDCache called, numItems = %d\n", numItems);
10586 if(numItems <= CSR_MAX_PMKID_ALLOWED)
10587 {
10588#ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
10589 {
10590 WLAN_VOS_DIAG_EVENT_DEF(secEvent, vos_event_wlan_security_payload_type);
10591 palZeroMemory(pMac->hHdd, &secEvent, sizeof(vos_event_wlan_security_payload_type));
10592 secEvent.eventId = WLAN_SECURITY_EVENT_PMKID_UPDATE;
10593 secEvent.encryptionModeMulticast =
10594 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.mcEncryptionType);
10595 secEvent.encryptionModeUnicast =
10596 (v_U8_t)diagEncTypeFromCSRType(pSession->connectedProfile.EncryptionType);
10597 palCopyMemory( pMac->hHdd, secEvent.bssid, pSession->connectedProfile.bssid, 6 );
10598 secEvent.authMode =
10599 (v_U8_t)diagAuthTypeFromCSRType(pSession->connectedProfile.AuthType);
10600 WLAN_VOS_DIAG_EVENT_REPORT(&secEvent, EVENT_WLAN_SECURITY);
10601 }
10602#endif//FEATURE_WLAN_DIAG_SUPPORT_CSR
Jeff Johnson295189b2012-06-20 16:38:30 -070010603 status = eHAL_STATUS_SUCCESS;
10604 //numItems may be 0 to clear the cache
10605 pSession->NumPmkidCache = (tANI_U16)numItems;
10606 if(numItems && pPMKIDCache)
10607 {
10608 status = palCopyMemory( pMac->hHdd, pSession->PmkidCacheInfo, pPMKIDCache,
10609 sizeof(tPmkidCacheInfo) * numItems );
10610 }
10611 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010612 return (status);
10613}
10614
Jeff Johnson295189b2012-06-20 16:38:30 -070010615tANI_U32 csrRoamGetNumPMKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId)
10616{
10617 return (pMac->roam.roamSession[sessionId].NumPmkidCache);
10618}
10619
Jeff Johnson295189b2012-06-20 16:38:30 -070010620eHalStatus csrRoamGetPMKIDCache(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pNum, tPmkidCacheInfo *pPmkidCache)
10621{
10622 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10623 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010624
10625 if(!pSession)
10626 {
10627 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10628 return eHAL_STATUS_FAILURE;
10629 }
10630
Jeff Johnson295189b2012-06-20 16:38:30 -070010631 if(pNum && pPmkidCache)
10632 {
10633 if(pSession->NumPmkidCache == 0)
10634 {
10635 *pNum = 0;
10636 status = eHAL_STATUS_SUCCESS;
10637 }
10638 else if(*pNum >= pSession->NumPmkidCache)
10639 {
10640 if(pSession->NumPmkidCache > CSR_MAX_PMKID_ALLOWED)
10641 {
10642 smsLog(pMac, LOGE, FL("NumPmkidCache :%d is more than CSR_MAX_PMKID_ALLOWED, resetting to CSR_MAX_PMKID_ALLOWED\n"),
10643 pSession->NumPmkidCache);
10644 pSession->NumPmkidCache = CSR_MAX_PMKID_ALLOWED;
10645 }
10646 palCopyMemory( pMac->hHdd, pPmkidCache, pSession->PmkidCacheInfo,
10647 sizeof(tPmkidCacheInfo) * pSession->NumPmkidCache );
10648 *pNum = pSession->NumPmkidCache;
10649 status = eHAL_STATUS_SUCCESS;
10650 }
10651 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010652 return (status);
10653}
10654
Jeff Johnson295189b2012-06-20 16:38:30 -070010655eHalStatus csrRoamGetWpaRsnReqIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10656{
10657 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10658 tANI_U32 len;
10659 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010660
10661 if(!pSession)
10662 {
10663 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10664 return eHAL_STATUS_FAILURE;
10665 }
10666
Jeff Johnson295189b2012-06-20 16:38:30 -070010667 if(pLen)
10668 {
10669 len = *pLen;
10670 *pLen = pSession->nWpaRsnReqIeLength;
10671 if(pBuf)
10672 {
10673 if(len >= pSession->nWpaRsnReqIeLength)
10674 {
10675 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWpaRsnReqIE, pSession->nWpaRsnReqIeLength);
10676 }
10677 }
10678 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010679 return (status);
10680}
10681
Jeff Johnson295189b2012-06-20 16:38:30 -070010682eHalStatus csrRoamGetWpaRsnRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10683{
10684 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10685 tANI_U32 len;
10686 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010687
10688 if(!pSession)
10689 {
10690 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10691 return eHAL_STATUS_FAILURE;
10692 }
10693
Jeff Johnson295189b2012-06-20 16:38:30 -070010694 if(pLen)
10695 {
10696 len = *pLen;
10697 *pLen = pSession->nWpaRsnRspIeLength;
10698 if(pBuf)
10699 {
10700 if(len >= pSession->nWpaRsnRspIeLength)
10701 {
10702 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWpaRsnRspIE, pSession->nWpaRsnRspIeLength);
10703 }
10704 }
10705 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010706 return (status);
10707}
Jeff Johnson295189b2012-06-20 16:38:30 -070010708#ifdef FEATURE_WLAN_WAPI
10709eHalStatus csrRoamGetWapiReqIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10710{
10711 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10712 tANI_U32 len;
10713 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010714
10715 if(!pSession)
10716 {
10717 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10718 return eHAL_STATUS_FAILURE;
10719 }
10720
Jeff Johnson295189b2012-06-20 16:38:30 -070010721 if(pLen)
10722 {
10723 len = *pLen;
10724 *pLen = pSession->nWapiReqIeLength;
10725 if(pBuf)
10726 {
10727 if(len >= pSession->nWapiReqIeLength)
10728 {
10729 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWapiReqIE, pSession->nWapiReqIeLength);
10730 }
10731 }
10732 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010733 return (status);
10734}
Jeff Johnson295189b2012-06-20 16:38:30 -070010735eHalStatus csrRoamGetWapiRspIE(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 *pLen, tANI_U8 *pBuf)
10736{
10737 eHalStatus status = eHAL_STATUS_INVALID_PARAMETER;
10738 tANI_U32 len;
10739 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010740
10741 if(!pSession)
10742 {
10743 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10744 return eHAL_STATUS_FAILURE;
10745 }
10746
Jeff Johnson295189b2012-06-20 16:38:30 -070010747 if(pLen)
10748 {
10749 len = *pLen;
10750 *pLen = pSession->nWapiRspIeLength;
10751 if(pBuf)
10752 {
10753 if(len >= pSession->nWapiRspIeLength)
10754 {
10755 status = palCopyMemory(pMac->hHdd, pBuf, pSession->pWapiRspIE, pSession->nWapiRspIeLength);
10756 }
10757 }
10758 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010759 return (status);
10760}
10761#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070010762eRoamCmdStatus csrGetRoamCompleteStatus(tpAniSirGlobal pMac, tANI_U32 sessionId)
10763{
10764 eRoamCmdStatus retStatus = eCSR_ROAM_CONNECT_COMPLETION;
10765 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070010766
10767 if(!pSession)
10768 {
10769 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10770 return (retStatus);
10771 }
10772
Jeff Johnson295189b2012-06-20 16:38:30 -070010773 if(CSR_IS_ROAMING(pSession))
10774 {
10775 retStatus = eCSR_ROAM_ROAMING_COMPLETION;
10776 pSession->fRoaming = eANI_BOOLEAN_FALSE;
10777 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010778 return (retStatus);
10779}
10780
Jeff Johnson295189b2012-06-20 16:38:30 -070010781//This function remove the connected BSS from te cached scan result
10782eHalStatus csrRoamRemoveConnectedBssFromScanCache(tpAniSirGlobal pMac,
10783 tCsrRoamConnectedProfile *pConnProfile)
10784{
10785 eHalStatus status = eHAL_STATUS_FAILURE;
10786 tCsrScanResultFilter *pScanFilter = NULL;
10787 tListElem *pEntry;
10788 tCsrScanResult *pResult;
10789 tDot11fBeaconIEs *pIes;
10790 tANI_BOOLEAN fMatch;
Jeff Johnson295189b2012-06-20 16:38:30 -070010791 if(!(csrIsMacAddressZero(pMac, &pConnProfile->bssid) ||
10792 csrIsMacAddressBroadcast(pMac, &pConnProfile->bssid)))
10793 {
10794 do
10795 {
10796 //Prepare the filter. Only fill in the necessary fields. Not all fields are needed
10797 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter, sizeof(tCsrScanResultFilter));
10798 if(!HAL_STATUS_SUCCESS(status)) break;
10799 palZeroMemory(pMac->hHdd, pScanFilter, sizeof(tCsrScanResultFilter));
10800 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->BSSIDs.bssid, sizeof(tCsrBssid));
10801 if(!HAL_STATUS_SUCCESS(status)) break;
10802 palCopyMemory(pMac->hHdd, pScanFilter->BSSIDs.bssid, &pConnProfile->bssid, sizeof(tCsrBssid));
10803 pScanFilter->BSSIDs.numOfBSSIDs = 1;
10804 if(!csrIsNULLSSID(pConnProfile->SSID.ssId, pConnProfile->SSID.length))
10805 {
10806 status = palAllocateMemory(pMac->hHdd, (void **)&pScanFilter->SSIDs.SSIDList, sizeof(tCsrSSIDInfo));
10807 if(!HAL_STATUS_SUCCESS(status)) break;
10808 palCopyMemory(pMac->hHdd, &pScanFilter->SSIDs.SSIDList[0].SSID, &pConnProfile->SSID, sizeof(tSirMacSSid));
10809 }
10810 pScanFilter->authType.numEntries = 1;
10811 pScanFilter->authType.authType[0] = pConnProfile->AuthType;
10812 pScanFilter->BSSType = pConnProfile->BSSType;
10813 pScanFilter->EncryptionType.numEntries = 1;
10814 pScanFilter->EncryptionType.encryptionType[0] = pConnProfile->EncryptionType;
10815 pScanFilter->mcEncryptionType.numEntries = 1;
10816 pScanFilter->mcEncryptionType.encryptionType[0] = pConnProfile->mcEncryptionType;
10817 //We ignore the channel for now, BSSID should be enough
10818 pScanFilter->ChannelInfo.numOfChannels = 0;
10819 //Also ignore the following fields
10820 pScanFilter->uapsd_mask = 0;
10821 pScanFilter->bWPSAssociation = eANI_BOOLEAN_FALSE;
10822 pScanFilter->countryCode[0] = 0;
10823 pScanFilter->phyMode = eCSR_DOT11_MODE_TAURUS;
Jeff Johnson295189b2012-06-20 16:38:30 -070010824 csrLLLock(&pMac->scan.scanResultList);
10825 pEntry = csrLLPeekHead( &pMac->scan.scanResultList, LL_ACCESS_NOLOCK );
10826 while( pEntry )
10827 {
10828 pResult = GET_BASE_ADDR( pEntry, tCsrScanResult, Link );
10829 pIes = (tDot11fBeaconIEs *)( pResult->Result.pvIes );
10830 fMatch = csrMatchBSS(pMac, &pResult->Result.BssDescriptor,
10831 pScanFilter, NULL, NULL, NULL, &pIes);
10832 //Release the IEs allocated by csrMatchBSS is needed
10833 if( !pResult->Result.pvIes )
10834 {
10835 //need to free the IEs since it is allocated by csrMatchBSS
10836 palFreeMemory(pMac->hHdd, pIes);
10837 }
10838 if(fMatch)
10839 {
10840 //We found the one
10841 if( csrLLRemoveEntry(&pMac->scan.scanResultList, pEntry, LL_ACCESS_NOLOCK) )
10842 {
10843 //Free the memory
10844 csrFreeScanResultEntry( pMac, pResult );
10845 }
10846 break;
10847 }
10848 pEntry = csrLLNext(&pMac->scan.scanResultList, pEntry, LL_ACCESS_NOLOCK);
10849 }//while
10850 csrLLUnlock(&pMac->scan.scanResultList);
10851 }while(0);
10852 if(pScanFilter)
10853 {
10854 csrFreeScanFilter(pMac, pScanFilter);
10855 palFreeMemory(pMac->hHdd, pScanFilter);
10856 }
10857 }
10858 return (status);
10859}
10860
Jeff Johnson295189b2012-06-20 16:38:30 -070010861//BT-AMP
Jeff Johnson295189b2012-06-20 16:38:30 -070010862eHalStatus csrIsBTAMPAllowed( tpAniSirGlobal pMac, tANI_U32 chnId )
10863{
10864 eHalStatus status = eHAL_STATUS_SUCCESS;
10865 tANI_U32 sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070010866 for( sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++ )
10867 {
10868 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
10869 {
10870 if( csrIsConnStateIbss( pMac, sessionId ) || csrIsBTAMP( pMac, sessionId ) )
10871 {
10872 //co-exist with IBSS or BT-AMP is not supported
10873 smsLog( pMac, LOGW, " BTAMP is not allowed due to IBSS/BT-AMP exist in session %d\n", sessionId );
10874 status = eHAL_STATUS_CSR_WRONG_STATE;
10875 break;
10876 }
10877 if( csrIsConnStateInfra( pMac, sessionId ) )
10878 {
10879 if( chnId &&
10880 ( (tANI_U8)chnId != pMac->roam.roamSession[sessionId].connectedProfile.operationChannel ) )
10881 {
10882 smsLog( pMac, LOGW, " BTAMP is not allowed due to channel (%d) diff than infr channel (%d)\n",
10883 chnId, pMac->roam.roamSession[sessionId].connectedProfile.operationChannel );
10884 status = eHAL_STATUS_CSR_WRONG_STATE;
10885 break;
10886 }
10887 }
10888 }
10889 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010890 return ( status );
10891}
10892
Jeff Johnson295189b2012-06-20 16:38:30 -070010893static eHalStatus csrRoamStartWds( tpAniSirGlobal pMac, tANI_U32 sessionId, tCsrRoamProfile *pProfile, tSirBssDescription *pBssDesc )
10894{
10895 eHalStatus status = eHAL_STATUS_SUCCESS;
10896 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
10897 tBssConfigParam bssConfig;
Jeff Johnson32d95a32012-09-10 13:15:23 -070010898
10899 if(!pSession)
10900 {
10901 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
10902 return eHAL_STATUS_FAILURE;
10903 }
10904
Jeff Johnson295189b2012-06-20 16:38:30 -070010905 if ( csrIsConnStateIbss( pMac, sessionId ) )
10906 {
10907 status = csrRoamIssueStopBss( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING );
10908 }
10909 else if ( csrIsConnStateConnectedInfra( pMac, sessionId ) )
10910 {
10911 // Disassociate from the connected Infrastructure network...
10912 status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE );
10913 }
10914 else
10915 {
10916#if defined(VOSS_ENABLED)
10917 //We don't expect Bt-AMP HDD not to disconnect the last connection first at this time.
10918 //Otherwise we need to add code to handle the
10919 //situation just like IBSS. Though for WDS station, we need to send disassoc to PE first then
10920 //send stop_bss to PE, before we can continue.
10921 VOS_ASSERT( !csrIsConnStateWds( pMac, sessionId ) );
10922#endif
10923 palZeroMemory(pMac->hHdd, &bssConfig, sizeof(tBssConfigParam));
10924 /* Assume HDD provide bssid in profile */
10925 palCopyMemory( pMac->hHdd, &pSession->bssParams.bssid, pProfile->BSSIDs.bssid[0], sizeof(tCsrBssid) );
10926 // there is no Bss description before we start an WDS so we need
10927 // to adopt all Bss configuration parameters from the Profile.
10928 status = csrRoamPrepareBssConfigFromProfile(pMac, pProfile, &bssConfig, pBssDesc);
10929 if(HAL_STATUS_SUCCESS(status))
10930 {
10931 //Save profile for late use
10932 csrFreeRoamProfile( pMac, sessionId );
10933 if (HAL_STATUS_SUCCESS(palAllocateMemory(pMac->hHdd,
10934 (void **)&pSession->pCurRoamProfile,
10935 sizeof(tCsrRoamProfile))))
10936 {
10937 palZeroMemory(pMac->hHdd, pSession->pCurRoamProfile, sizeof(tCsrRoamProfile));
10938 csrRoamCopyProfile(pMac, pSession->pCurRoamProfile, pProfile);
10939 }
Jeff Johnson295189b2012-06-20 16:38:30 -070010940 //Prepare some more parameters for this WDS
Jeff Johnsone7245742012-09-05 17:12:55 -070010941 csrRoamPrepareBssParams(pMac, sessionId, pProfile, NULL, &bssConfig, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070010942 status = csrRoamSetBssConfigCfg(pMac, sessionId, pProfile, NULL, &bssConfig, NULL);
10943 }
10944 }
10945
10946 return( status );
10947}
10948
Jeff Johnson295189b2012-06-20 16:38:30 -070010949////////////////////Mail box
10950
Jeff Johnson295189b2012-06-20 16:38:30 -070010951//pBuf is caller allocated memory point to &(tSirSmeJoinReq->rsnIE.rsnIEdata[ 0 ]) + pMsg->rsnIE.length;
10952//or &(tSirSmeReassocReq->rsnIE.rsnIEdata[ 0 ]) + pMsg->rsnIE.length;
10953static void csrPrepareJoinReassocReqBuffer( tpAniSirGlobal pMac,
10954 tSirBssDescription *pBssDescription,
10955 tANI_U8 *pBuf, tANI_U8 uapsdMask)
10956{
10957 tCsrChannelSet channelGroup;
10958 tSirMacCapabilityInfo *pAP_capabilityInfo;
10959 tAniBool fTmp;
10960 tANI_BOOLEAN found = FALSE;
10961 tANI_U32 size = 0;
10962 tANI_U16 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070010963 // plug in neighborhood occupancy info (i.e. BSSes on primary or secondary channels)
10964 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundPri
10965 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundSecDown
10966 *pBuf++ = (tANI_U8)FALSE; //tAniTitanCBNeighborInfo->cbBssFoundSecUp
Jeff Johnson295189b2012-06-20 16:38:30 -070010967 // 802.11h
10968 //We can do this because it is in HOST CPU order for now.
10969 pAP_capabilityInfo = (tSirMacCapabilityInfo *)&pBssDescription->capabilityInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -070010970 //tell the target AP my 11H capability only if both AP and STA support 11H and the channel being used is 11a
10971 if ( csrIs11hSupported( pMac ) && pAP_capabilityInfo->spectrumMgt && eSIR_11A_NW_TYPE == pBssDescription->nwType )
10972 {
10973 fTmp = (tAniBool)pal_cpu_to_be32(1);
10974 }
10975 else
10976 fTmp = (tAniBool)0;
10977
10978 // corresponds to --- pMsg->spectrumMgtIndicator = ON;
10979 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&fTmp, sizeof(tAniBool) );
10980 pBuf += sizeof(tAniBool);
10981 *pBuf++ = MIN_STA_PWR_CAP_DBM; // it is for pMsg->powerCap.minTxPower = 0;
10982 found = csrSearchChannelListForTxPower(pMac, pBssDescription, &channelGroup);
Jeff Johnson295189b2012-06-20 16:38:30 -070010983 // This is required for 11k test VoWiFi Ent: Test 2.
10984 // We need the power capabilities for Assoc Req.
10985 // This macro is provided by the halPhyCfg.h. We pick our
10986 // max and min capability by the halPhy provided macros
10987 *pBuf++ = MAX_STA_PWR_CAP_DBM;
Jeff Johnson295189b2012-06-20 16:38:30 -070010988 size = sizeof(pMac->roam.validChannelList);
10989 if(HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac, (tANI_U8 *)pMac->roam.validChannelList, &size)))
10990 {
10991 *pBuf++ = (tANI_U8)size; //tSirSupChnl->numChnl
10992 for ( i = 0; i < size; i++)
10993 {
10994 *pBuf++ = pMac->roam.validChannelList[ i ]; //tSirSupChnl->channelList[ i ]
10995
10996 }
10997 }
10998 else
10999 {
11000 smsLog(pMac, LOGE, FL("can not find any valid channel\n"));
11001 *pBuf++ = 0; //tSirSupChnl->numChnl
11002 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011003 //Check whether it is ok to enter UAPSD
11004#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11005 if( btcIsReadyForUapsd(pMac) )
11006#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
11007 {
11008 *pBuf++ = uapsdMask;
11009 }
11010#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11011 else
11012 {
11013 smsLog(pMac, LOGE, FL(" BTC doesn't allow UAPSD for uapsd_mask(0x%X)\n"), uapsdMask);
11014 *pBuf++ = 0;
11015 }
11016#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
11017
Jeff Johnson295189b2012-06-20 16:38:30 -070011018 // move the entire BssDescription into the join request.
11019 palCopyMemory( pMac->hHdd, pBuf, pBssDescription,
11020 pBssDescription->length + sizeof( pBssDescription->length ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070011021 pBuf += pBssDescription->length + sizeof( pBssDescription->length ); // update to new location
11022}
11023
Jeff Johnson295189b2012-06-20 16:38:30 -070011024/*
11025 * The communication between HDD and LIM is thru mailbox (MB).
11026 * Both sides will access the data structure "tSirSmeJoinReq".
11027 * The rule is, while the components of "tSirSmeJoinReq" can be accessed in the regular way like tSirSmeJoinReq.assocType, this guideline
11028 * stops at component tSirRSNie; any acces to the components after tSirRSNie is forbidden because the space from tSirRSNie is quueezed
11029 * with the component "tSirBssDescription". And since the size of actual 'tSirBssDescription' varies, the receiving side (which is the routine
11030 * limJoinReqSerDes() of limSerDesUtils.cc) should keep in mind not to access the components DIRECTLY after tSirRSNie.
11031 */
11032eHalStatus csrSendJoinReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDescription,
11033 tCsrRoamProfile *pProfile, tDot11fBeaconIEs *pIes )
11034{
11035 eHalStatus status = eHAL_STATUS_SUCCESS;
11036 tSirSmeJoinReq *pMsg;
11037 tANI_U8 *pBuf;
11038 tANI_U16 msgLen, wTmp, ieLen;
11039 tSirMacRateSet OpRateSet;
11040 tSirMacRateSet ExRateSet;
11041 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11042 tANI_U32 dwTmp;
11043 tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN]; //RSN MAX is bigger than WPA MAX
Jeff Johnson32d95a32012-09-10 13:15:23 -070011044
11045 if(!pSession)
11046 {
11047 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
11048 return eHAL_STATUS_FAILURE;
11049 }
11050
Jeff Johnson295189b2012-06-20 16:38:30 -070011051 do {
11052 pSession->joinFailStatusCode.statusCode = eSIR_SME_SUCCESS;
11053 pSession->joinFailStatusCode.reasonCode = 0;
11054 // There are a number of variable length fields to consider. First, the tSirSmeJoinReq
11055 // includes a single bssDescription. bssDescription includes a single tANI_U32 for the
11056 // IE fields, but the length field in the bssDescription needs to be interpreted to
11057 // determine length of the IE fields.
11058 //
11059 // So, take the size of the JoinReq, subtract the size of the bssDescription and
11060 // add in the length from the bssDescription (then add the size of the 'length' field
11061 // itself because that is NOT included in the length field).
11062 msgLen = sizeof( tSirSmeJoinReq ) - sizeof( *pBssDescription ) +
11063 pBssDescription->length + sizeof( pBssDescription->length ) +
11064 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 -070011065 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
11066 if ( !HAL_STATUS_SUCCESS(status) ) break;
11067 palZeroMemory(pMac->hHdd, pMsg, msgLen);
11068 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_JOIN_REQ);
11069 pMsg->length = pal_cpu_to_be16(msgLen);
11070 pBuf = &pMsg->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070011071 // sessionId
11072 *pBuf = (tANI_U8)sessionId;
11073 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011074 // transactionId
11075 *pBuf = 0;
11076 *( pBuf + 1 ) = 0;
11077 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011078 // ssId
11079 if( pIes->SSID.present && pIes->SSID.num_ssid )
11080 {
11081 // ssId len
11082 *pBuf = pIes->SSID.num_ssid;
11083 pBuf++;
11084 palCopyMemory( pMac->hHdd, pBuf, pIes->SSID.ssid, pIes->SSID.num_ssid );
11085 pBuf += pIes->SSID.num_ssid;
11086 }
11087 else
11088 {
11089 *pBuf = 0;
11090 pBuf++;
11091 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011092 // selfMacAddr
11093 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
11094 pBuf += sizeof(tSirMacAddr);
11095 // bsstype
11096 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( pProfile->BSSType ) );
11097 if (dwTmp == eSIR_BTAMP_STA_MODE) dwTmp = eSIR_BTAMP_AP_MODE; // Override BssType for BTAMP
11098 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
11099 pBuf += sizeof(tSirBssType);
11100 // dot11mode
11101 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pSession->bssParams.uCfgDot11Mode );
11102 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011103 //Persona
11104 *pBuf = (tANI_U8)pProfile->csrPersona;
11105 pBuf++;
Jeff Johnsone7245742012-09-05 17:12:55 -070011106 //CBMode
11107 *pBuf = (tANI_U8)pSession->bssParams.cbMode;
11108 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011109
11110 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
Jeff Johnsone7245742012-09-05 17:12:55 -070011111 FL("CSR PERSONA=%d CSR CbMode %d"), pProfile->csrPersona, pSession->bssParams.cbMode);
11112
Jeff Johnson295189b2012-06-20 16:38:30 -070011113 // uapsdPerAcBitmask
11114 *pBuf = pProfile->uapsd_mask;
11115 pBuf++;
11116
Jeff Johnsone7245742012-09-05 17:12:55 -070011117
Jeff Johnson295189b2012-06-20 16:38:30 -070011118
11119#if (WNI_POLARIS_FW_PACKAGE == ADVANCED)
11120#endif /*(WNI_POLARIS_FW_PACKAGE == ADVANCED)*/
Jeff Johnson295189b2012-06-20 16:38:30 -070011121 status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode, pBssDescription, pIes, &OpRateSet, &ExRateSet);
11122 if (HAL_STATUS_SUCCESS(status) )
11123 {
11124 // OperationalRateSet
11125 if (OpRateSet.numRates) {
11126 *pBuf++ = OpRateSet.numRates;
11127 palCopyMemory(pMac->hHdd, pBuf, OpRateSet.rate, OpRateSet.numRates);
11128 pBuf += OpRateSet.numRates;
11129 } else *pBuf++ = 0;
11130 // ExtendedRateSet
11131 if (ExRateSet.numRates) {
11132 *pBuf++ = ExRateSet.numRates;
11133 palCopyMemory(pMac->hHdd, pBuf, ExRateSet.rate, ExRateSet.numRates);
11134 pBuf += ExRateSet.numRates;
11135 } else *pBuf++ = 0;
11136 }
11137 else
11138 {
11139 *pBuf++ = 0;
11140 *pBuf++ = 0;
11141 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011142 // rsnIE
11143 if ( csrIsProfileWpa( pProfile ) )
11144 {
11145 // Insert the Wpa IE into the join request
11146 ieLen = csrRetrieveWpaIe( pMac, pProfile, pBssDescription, pIes,
11147 (tCsrWpaIe *)( wpaRsnIE ) );
11148 }
11149 else if( csrIsProfileRSN( pProfile ) )
11150 {
11151 // Insert the RSN IE into the join request
11152 ieLen = csrRetrieveRsnIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11153 (tCsrRSNIe *)( wpaRsnIE ) );
11154 }
11155#ifdef FEATURE_WLAN_WAPI
11156 else if( csrIsProfileWapi( pProfile ) )
11157 {
11158 // Insert the WAPI IE into the join request
11159 ieLen = csrRetrieveWapiIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11160 (tCsrWapiIe *)( wpaRsnIE ) );
11161 }
11162#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070011163 else
11164 {
11165 ieLen = 0;
11166 }
11167 //remember the IE for future use
11168 if( ieLen )
11169 {
11170 if(ieLen > DOT11F_IE_RSN_MAX_LEN)
11171 {
11172 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);
11173 ieLen = DOT11F_IE_RSN_MAX_LEN;
11174 }
11175#ifdef FEATURE_WLAN_WAPI
11176 if( csrIsProfileWapi( pProfile ) )
11177 {
11178 //Check whether we need to allocate more memory
11179 if(ieLen > pSession->nWapiReqIeLength)
11180 {
11181 if(pSession->pWapiReqIE && pSession->nWapiReqIeLength)
11182 {
11183 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
11184 }
11185 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWapiReqIE, ieLen);
11186 if(!HAL_STATUS_SUCCESS(status)) break;
11187 }
11188 pSession->nWapiReqIeLength = ieLen;
11189 palCopyMemory(pMac->hHdd, pSession->pWapiReqIE, wpaRsnIE, ieLen);
11190 wTmp = pal_cpu_to_be16( ieLen );
11191 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11192 pBuf += sizeof(tANI_U16);
11193 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11194 pBuf += ieLen;
11195 }
11196 else//should be WPA/WPA2 otherwise
11197#endif /* FEATURE_WLAN_WAPI */
11198 {
11199 //Check whether we need to allocate more memory
11200 if(ieLen > pSession->nWpaRsnReqIeLength)
11201 {
11202 if(pSession->pWpaRsnReqIE && pSession->nWpaRsnReqIeLength)
11203 {
11204 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11205 }
11206 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnReqIE, ieLen);
11207 if(!HAL_STATUS_SUCCESS(status)) break;
11208 }
11209 pSession->nWpaRsnReqIeLength = ieLen;
11210 palCopyMemory(pMac->hHdd, pSession->pWpaRsnReqIE, wpaRsnIE, ieLen);
11211 wTmp = pal_cpu_to_be16( ieLen );
11212 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11213 pBuf += sizeof(tANI_U16);
11214 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11215 pBuf += ieLen;
11216 }
11217 }
11218 else
11219 {
11220 //free whatever old info
11221 pSession->nWpaRsnReqIeLength = 0;
11222 if(pSession->pWpaRsnReqIE)
11223 {
11224 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11225 pSession->pWpaRsnReqIE = NULL;
11226 }
11227#ifdef FEATURE_WLAN_WAPI
11228 pSession->nWapiReqIeLength = 0;
11229 if(pSession->pWapiReqIE)
11230 {
11231 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
11232 pSession->pWapiReqIE = NULL;
11233 }
11234#endif /* FEATURE_WLAN_WAPI */
11235 //length is two bytes
11236 *pBuf = 0;
11237 *(pBuf + 1) = 0;
11238 pBuf += 2;
11239 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011240#ifdef FEATURE_WLAN_CCX
11241 // Never include the cckmIE in an Join Request
11242 //length is two bytes
11243 *pBuf = 0;
11244 *(pBuf + 1) = 0;
11245 pBuf += 2;
11246#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011247 // addIEScan
11248 if(pProfile->nAddIEScanLength && pProfile->pAddIEScan)
11249 {
11250 ieLen = pProfile->nAddIEScanLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011251 if(ieLen > pSession->nAddIEScanLength)
11252 {
11253 if(pSession->pAddIEScan && pSession->nAddIEScanLength)
11254 {
11255 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11256 }
11257 status = palAllocateMemory(pMac->hHdd,
11258 (void **)&pSession->pAddIEScan, ieLen);
11259 if(!HAL_STATUS_SUCCESS(status)) break;
11260 }
11261 pSession->nAddIEScanLength = ieLen;
11262 palCopyMemory(pMac->hHdd, pSession->pAddIEScan,
11263 pProfile->pAddIEScan, ieLen);
11264 wTmp = pal_cpu_to_be16( ieLen );
11265 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11266 pBuf += sizeof(tANI_U16);
11267 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEScan, ieLen );
11268 pBuf += ieLen;
11269 }
11270 else
11271 {
11272 pSession->nAddIEScanLength = 0;
11273 if(pSession->pAddIEScan)
11274 {
11275 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11276 pSession->pAddIEScan = NULL;
11277 }
11278 *pBuf = 0;
11279 *(pBuf + 1) = 0;
11280 pBuf += 2;
11281 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011282 // addIEAssoc
11283 if(pProfile->nAddIEAssocLength && pProfile->pAddIEAssoc)
11284 {
11285 ieLen = pProfile->nAddIEAssocLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011286 if(ieLen > pSession->nAddIEAssocLength)
11287 {
11288 if(pSession->pAddIEAssoc && pSession->nAddIEAssocLength)
11289 {
11290 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11291 }
11292 status = palAllocateMemory(pMac->hHdd,
11293 (void **)&pSession->pAddIEAssoc, ieLen);
11294 if(!HAL_STATUS_SUCCESS(status)) break;
11295 }
11296 pSession->nAddIEAssocLength = ieLen;
11297 palCopyMemory(pMac->hHdd, pSession->pAddIEAssoc,
11298 pProfile->pAddIEAssoc, ieLen);
11299 wTmp = pal_cpu_to_be16( ieLen );
11300 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11301 pBuf += sizeof(tANI_U16);
11302 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEAssoc, ieLen );
11303 pBuf += ieLen;
11304 }
11305 else
11306 {
11307 pSession->nAddIEAssocLength = 0;
11308 if(pSession->pAddIEAssoc)
11309 {
11310 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11311 pSession->pAddIEAssoc = NULL;
11312 }
11313 *pBuf = 0;
11314 *(pBuf + 1) = 0;
11315 pBuf += 2;
11316 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011317 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedUCEncryptionType) );
11318 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11319 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011320 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
11321 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11322 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011323#ifdef WLAN_FEATURE_VOWIFI_11R
11324 if (csrIsProfile11r( pProfile ) )
11325 {
11326 // is11Rconnection;
11327 dwTmp = pal_cpu_to_be32(TRUE);
11328 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11329 pBuf += sizeof(tAniBool);
11330 }
11331 else
11332 {
11333 // is11Rconnection;
11334 dwTmp = pal_cpu_to_be32(FALSE);
11335 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11336 pBuf += sizeof(tAniBool);
11337 }
11338#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011339#ifdef FEATURE_WLAN_CCX
11340 /* A profile can not be both CCX and 11R. But an 802.11R AP
11341 * may be advertising support for CCX as well. So if we are
11342 * associating Open or explicitly CCX then we will get CCX.
11343 * If we are associating explictly 11R only then we will get
11344 * 11R.
11345 */
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011346 if ((csrIsProfileCCX(pProfile) ||
11347 ((pIes->CCXVersion.present)
11348 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11349 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11350 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11351 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11352 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11353 && (!(csrIsProfile11r( pProfile )))
11354 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -070011355 {
11356 // isCCXconnection;
11357 dwTmp = pal_cpu_to_be32(TRUE);
11358 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11359 pBuf += sizeof(tAniBool);
11360 }
11361 else
11362 {
11363 //isCCXconnection;
11364 dwTmp = pal_cpu_to_be32(FALSE);
11365 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11366 pBuf += sizeof(tAniBool);
11367 }
11368 {
11369 tCCXTspecInfo ccxTspec;
11370 // CCX-Tspec IEs in the ASSOC request is presently not supported
11371 // so nullify the TSPEC parameters
11372 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11373 palCopyMemory( pMac->hHdd, pBuf, &ccxTspec, sizeof(tCCXTspecInfo));
11374 pBuf += sizeof(tCCXTspecInfo);
11375 }
11376#endif
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011377#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -070011378 // Fill in isFastTransitionEnabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011379 if (pMac->roam.configParam.isFastTransitionEnabled
11380#ifdef FEATURE_WLAN_LFR
11381 || csrRoamIsFastRoamEnabled(pMac)
11382#endif
11383 )
Jeff Johnson295189b2012-06-20 16:38:30 -070011384 {
11385 dwTmp = pal_cpu_to_be32(TRUE);
11386 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11387 pBuf += sizeof(tAniBool);
11388 }
11389 else
11390 {
11391 dwTmp = pal_cpu_to_be32(FALSE);
11392 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11393 pBuf += sizeof(tAniBool);
11394 }
11395#endif
Jeff Johnson43971f52012-07-17 12:26:56 -070011396#ifdef FEATURE_WLAN_LFR
11397 if(csrRoamIsFastRoamEnabled(pMac))
11398 {
11399 //legacy fast roaming enabled
11400 dwTmp = pal_cpu_to_be32(TRUE);
11401 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11402 pBuf += sizeof(tAniBool);
11403 }
11404 else
11405 {
11406 dwTmp = pal_cpu_to_be32(FALSE);
11407 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11408 pBuf += sizeof(tAniBool);
11409 }
11410#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011411 //BssDesc
11412 csrPrepareJoinReassocReqBuffer( pMac, pBssDescription, pBuf,
11413 (tANI_U8)pProfile->uapsd_mask);
Jeff Johnson295189b2012-06-20 16:38:30 -070011414 status = palSendMBMessage(pMac->hHdd, pMsg );
11415 if(!HAL_STATUS_SUCCESS(status))
11416 {
11417 break;
11418 }
11419 //Tush-QoS: notify QoS module that join happening
11420 else
11421 {
11422#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11423 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_JOIN_REQ, NULL);
11424#endif
11425 }
11426 } while( 0 );
11427 return( status );
11428}
11429
Jeff Johnson295189b2012-06-20 16:38:30 -070011430eHalStatus csrSendSmeReassocReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDescription *pBssDescription,
11431 tDot11fBeaconIEs *pIes, tCsrRoamProfile *pProfile )
11432{
11433 eHalStatus status;
11434 tSirSmeReassocReq *pMsg;
11435 tANI_U8 *pBuf;
11436 v_U8_t acm_mask = 0, uapsd_mask;
11437 tANI_U16 msgLen, ieLen, wTmp;
11438 tANI_U32 dwTmp;
11439 tSirMacRateSet OpRateSet;
11440 tSirMacRateSet ExRateSet;
11441 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11442 tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN]; //RSN MAX is bigger than WPA MAX
Jeff Johnson32d95a32012-09-10 13:15:23 -070011443
11444 if(!pSession)
11445 {
11446 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
11447 return eHAL_STATUS_FAILURE;
11448 }
11449
Jeff Johnson295189b2012-06-20 16:38:30 -070011450 /* To satisfy klockworks */
11451 if (pBssDescription == NULL)
11452 {
11453 smsLog(pMac, LOGE, FL(" pBssDescription is NULL\n"));
11454 return eHAL_STATUS_FAILURE;
11455 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011456 do {
11457 // There are a number of variable length fields to consider. First, the tSirSmeJoinReq
11458 // includes a single bssDescription. bssDescription includes a single tANI_U32 for the
11459 // IE fields, but the length field in the bssDescription needs to be interpreted to
11460 // determine length of the IE fields.
11461 //
11462 // So, take the size of the JoinReq, subtract the size of the bssDescription and
11463 // add in the length from the bssDescription (then add the size of the 'length' field
11464 // itself because that is NOT included in the length field).
11465 msgLen = sizeof( tSirSmeReassocReq ) - sizeof( *pBssDescription ) +
11466 pBssDescription->length + sizeof( pBssDescription->length ) +
11467 sizeof( tCsrWpaIe ) + sizeof( tCsrWpaAuthIe ) + sizeof( tANI_U16 ); // add in the size of the WPA IE that we may build.
11468 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
11469 if ( !HAL_STATUS_SUCCESS(status) ) break;
11470 palZeroMemory(pMac->hHdd, pMsg, msgLen);
11471 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_REASSOC_REQ);
11472 pMsg->length = pal_cpu_to_be16(msgLen);
11473 pBuf = &pMsg->sessionId;
11474 // sessionId
11475 *pBuf++ = (tANI_U8)sessionId;
11476 // transactionId
11477 *pBuf = 0;
11478 *(pBuf + 1) = 0;
11479 pBuf += sizeof (tANI_U16);
11480 // ssId
11481 if( pIes->SSID.present && pIes->SSID.num_ssid )
11482 {
11483 // ssId len
11484 *pBuf++ = pIes->SSID.num_ssid;
11485 palCopyMemory( pMac->hHdd, pBuf, pIes->SSID.ssid, pIes->SSID.num_ssid );
11486 pBuf += pIes->SSID.num_ssid;
11487 }
11488 else
11489 {
11490 *pBuf++ = 0;
11491 }
11492 // selfMacAddr
11493 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
11494 pBuf += sizeof(tSirMacAddr);
11495 // bsstype
11496 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( pProfile->BSSType ) );
11497 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
11498 pBuf += sizeof(tSirBssType);
11499 // dot11mode
11500 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pSession->bssParams.uCfgDot11Mode );
11501 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011502 //Persona
11503 *pBuf = (tANI_U8)pProfile->csrPersona;
11504 pBuf++;
Jeff Johnsone7245742012-09-05 17:12:55 -070011505 //CBMode
11506 *pBuf = (tANI_U8)pSession->bssParams.cbMode;
11507 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070011508
Jeff Johnsone7245742012-09-05 17:12:55 -070011509 VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
11510 FL("CSR PERSONA=%d CSR CBMode=%u\n"), pProfile->csrPersona, pSession->bssParams.cbMode);
11511
Jeff Johnson295189b2012-06-20 16:38:30 -070011512 // uapsdPerAcBitmask
11513 *pBuf = pProfile->uapsd_mask;
11514 pBuf++;
11515
Jeff Johnson295189b2012-06-20 16:38:30 -070011516 status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode,
11517 pBssDescription, pIes, &OpRateSet, &ExRateSet);
11518 if (HAL_STATUS_SUCCESS(status) )
11519 {
11520 // OperationalRateSet
11521 if (OpRateSet.numRates)
11522 {
11523 *pBuf++ = OpRateSet.numRates;
11524 palCopyMemory(pMac->hHdd, pBuf, OpRateSet.rate, OpRateSet.numRates);
11525 pBuf += OpRateSet.numRates;
11526 }
11527 else *pBuf++ = 0;
11528 // ExtendedRateSet
11529 if (ExRateSet.numRates)
11530 {
11531 *pBuf++ = ExRateSet.numRates;
11532 palCopyMemory(pMac->hHdd, pBuf, ExRateSet.rate, ExRateSet.numRates);
11533 pBuf += ExRateSet.numRates;
11534 }
11535 else *pBuf++ = 0;
11536 }
11537 else
11538 {
11539 *pBuf++ = 0;
11540 *pBuf++ = 0;
11541 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011542 // rsnIE
11543 if ( csrIsProfileWpa( pProfile ) )
11544 {
11545 // Insert the Wpa IE into the join request
11546 ieLen = csrRetrieveWpaIe( pMac, pProfile, pBssDescription, pIes,
11547 (tCsrWpaIe *)( wpaRsnIE ) );
11548 }
11549 else if( csrIsProfileRSN( pProfile ) )
11550 {
11551 // Insert the RSN IE into the join request
11552 ieLen = csrRetrieveRsnIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11553 (tCsrRSNIe *)( wpaRsnIE ) );
11554 }
11555#ifdef FEATURE_WLAN_WAPI
11556 else if( csrIsProfileWapi( pProfile ) )
11557 {
11558 // Insert the WAPI IE into the join request
11559 ieLen = csrRetrieveWapiIe( pMac, sessionId, pProfile, pBssDescription, pIes,
11560 (tCsrWapiIe *)( wpaRsnIE) );
11561 }
11562#endif /* FEATURE_WLAN_WAPI */
11563 else
11564 {
11565 ieLen = 0;
11566 }
11567 //remember the IE for future use
11568 if( ieLen )
11569 {
11570 if(ieLen > DOT11F_IE_RSN_MAX_LEN)
11571 {
11572 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);
11573 ieLen = DOT11F_IE_RSN_MAX_LEN;
11574 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011575 //Check whether we need to allocate more memory
11576 if(ieLen > pSession->nWpaRsnReqIeLength)
11577 {
11578 if(pSession->pWpaRsnReqIE && pSession->nWpaRsnReqIeLength)
11579 {
11580 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11581 }
11582 status = palAllocateMemory(pMac->hHdd, (void **)&pSession->pWpaRsnReqIE, ieLen);
11583 if(!HAL_STATUS_SUCCESS(status)) break;
11584 }
11585 pSession->nWpaRsnReqIeLength = ieLen;
11586 palCopyMemory(pMac->hHdd, pSession->pWpaRsnReqIE, wpaRsnIE, ieLen);
11587 wTmp = pal_cpu_to_be16( ieLen );
11588 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11589 pBuf += sizeof(tANI_U16);
11590 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11591 pBuf += ieLen;
11592 }
11593 else
11594 {
11595 //free whatever old info
11596 pSession->nWpaRsnReqIeLength = 0;
11597 if(pSession->pWpaRsnReqIE)
11598 {
11599 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
11600 pSession->pWpaRsnReqIE = NULL;
11601 }
11602 //length is two bytes
11603 *pBuf = 0;
11604 *(pBuf + 1) = 0;
11605 pBuf += 2;
11606 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011607#ifdef FEATURE_WLAN_CCX
11608 // cckmIE
11609 if( csrIsProfileCCX( pProfile ) )
11610 {
11611 // Insert the CCKM IE into the join request
11612 ieLen = csrConstructCcxCckmIe( pMac,
11613 pSession,
11614 pProfile,
11615 pBssDescription,
11616 pSession->pWpaRsnReqIE,
11617 pSession->nWpaRsnReqIeLength,
11618 (void *)( wpaRsnIE ) );
11619 }
11620 else
11621 {
11622 ieLen = 0;
11623 }
11624 //If present, copy the IE into the eWNI_SME_REASSOC_REQ message buffer
11625 if( ieLen )
11626 {
11627 //Copy the CCKM IE over from the temp buffer (wpaRsnIE)
11628 wTmp = pal_cpu_to_be16( ieLen );
11629 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11630 pBuf += sizeof(tANI_U16);
11631 palCopyMemory( pMac->hHdd, pBuf, wpaRsnIE, ieLen );
11632 pBuf += ieLen;
11633 }
11634 else
11635 {
11636 //Indicate you have no CCKM IE
11637 //length is two bytes
11638 *pBuf = 0;
11639 *(pBuf + 1) = 0;
11640 pBuf += 2;
11641 }
11642#endif /* FEATURE_WLAN_CCX */
Jeff Johnson295189b2012-06-20 16:38:30 -070011643 // addIEScan
11644 if(pProfile->nAddIEScanLength && pProfile->pAddIEScan)
11645 {
11646 ieLen = pProfile->nAddIEScanLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011647 if(ieLen > pSession->nAddIEScanLength)
11648 {
11649 if(pSession->pAddIEScan && pSession->nAddIEScanLength)
11650 {
11651 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11652 }
11653 status = palAllocateMemory(pMac->hHdd,
11654 (void **)&pSession->pAddIEScan, ieLen);
11655 if(!HAL_STATUS_SUCCESS(status)) break;
11656 }
11657 pSession->nAddIEScanLength = ieLen;
11658 palCopyMemory(pMac->hHdd, pSession->pAddIEScan,
11659 pProfile->pAddIEScan, ieLen);
11660 wTmp = pal_cpu_to_be16( ieLen );
11661 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11662 pBuf += sizeof(tANI_U16);
11663 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEScan, ieLen );
11664 pBuf += ieLen;
11665 }
11666 else
11667 {
11668 pSession->nAddIEScanLength = 0;
11669 if(pSession->pAddIEScan)
11670 {
11671 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
11672 pSession->pAddIEScan = NULL;
11673 }
11674 *pBuf = 0;
11675 *(pBuf + 1) = 0;
11676 pBuf += 2;
11677 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011678 // addIEAssoc
11679 if(pProfile->nAddIEAssocLength && pProfile->pAddIEAssoc)
11680 {
11681 ieLen = pProfile->nAddIEAssocLength;
Jeff Johnson295189b2012-06-20 16:38:30 -070011682 if(ieLen > pSession->nAddIEAssocLength)
11683 {
11684 if(pSession->pAddIEAssoc && pSession->nAddIEAssocLength)
11685 {
11686 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11687 }
11688 status = palAllocateMemory(pMac->hHdd,
11689 (void **)&pSession->pAddIEAssoc, ieLen);
11690 if(!HAL_STATUS_SUCCESS(status)) break;
11691 }
11692 pSession->nAddIEAssocLength = ieLen;
11693 palCopyMemory(pMac->hHdd, pSession->pAddIEAssoc,
11694 pProfile->pAddIEAssoc, ieLen);
11695 wTmp = pal_cpu_to_be16( ieLen );
11696 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11697 pBuf += sizeof(tANI_U16);
11698 palCopyMemory( pMac->hHdd, pBuf, pProfile->pAddIEAssoc, ieLen );
11699 pBuf += ieLen;
11700 }
11701 else
11702 {
11703 pSession->nAddIEAssocLength = 0;
11704 if(pSession->pAddIEAssoc)
11705 {
11706 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
11707 pSession->pAddIEAssoc = NULL;
11708 }
11709 *pBuf = 0;
11710 *(pBuf + 1) = 0;
11711 pBuf += 2;
11712 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011713 //Unmask any AC in reassoc that is ACM-set
11714 uapsd_mask = (v_U8_t)pProfile->uapsd_mask;
11715 if( uapsd_mask && ( NULL != pBssDescription ) )
11716 {
11717 if( CSR_IS_QOS_BSS(pIes) && CSR_IS_UAPSD_BSS(pIes) )
11718 {
11719#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11720 acm_mask = sme_QosGetACMMask(pMac, pBssDescription, pIes);
11721#endif /* WLAN_MDM_CODE_REDUCTION_OPT*/
11722 uapsd_mask &= ~(acm_mask);
11723 }
11724 else
11725 {
11726 uapsd_mask = 0;
11727 }
11728 }
11729
11730 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedUCEncryptionType) );
11731 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11732 pBuf += sizeof(tANI_U32);
11733
11734 dwTmp = pal_cpu_to_be32( csrTranslateEncryptTypeToEdType( pProfile->negotiatedMCEncryptionType) );
11735 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tANI_U32) );
11736 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011737#ifdef WLAN_FEATURE_VOWIFI_11R
11738 // is11Rconnection;
11739 dwTmp = csrIsProfile11r( pProfile )? pal_cpu_to_be32(TRUE) : 0;
11740 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11741 pBuf += sizeof(tAniBool);
Jeff Johnson295189b2012-06-20 16:38:30 -070011742#ifdef FEATURE_WLAN_CCX
11743 //isCCXconnection;
11744 //CCKM profile, ccxversion ie present, not 11r and ini file has CCX enabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011745 dwTmp = ( ((csrIsProfileCCX(pProfile) ||
11746 ((pIes->CCXVersion.present)
11747 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11748 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11749 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11750 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11751 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11752 && (!(csrIsProfile11r( pProfile )))
11753 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
11754 ? pal_cpu_to_be32(TRUE) : 0);
Jeff Johnson295189b2012-06-20 16:38:30 -070011755 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11756 pBuf += sizeof(tAniBool);
11757#endif // FEATURE_WLAN_CCX
11758#endif // WLAN_FEATURE_VOWIFI_11R
Jeff Johnson295189b2012-06-20 16:38:30 -070011759#ifdef FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011760 if ((csrIsProfileCCX(pProfile) ||
11761 ((pIes->CCXVersion.present)
11762 && ((pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_OPEN_SYSTEM)
11763 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA)
11764 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_WPA_PSK)
11765 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN)
11766 || (pProfile->negotiatedAuthType == eCSR_AUTH_TYPE_RSN_PSK))))
11767 && (!(csrIsProfile11r( pProfile )))
11768 && (pMac->roam.configParam.isCcxIniFeatureEnabled))
Jeff Johnson295189b2012-06-20 16:38:30 -070011769 {
11770 tCCXTspecInfo ccxTspec;
Jeff Johnson295189b2012-06-20 16:38:30 -070011771 // CCX Tspec information
11772 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11773 ccxTspec.numTspecs = sme_QosCCxRetrieveTspecInfo(pMac, sessionId, (tTspecInfo *) &ccxTspec.tspec[0]);
11774 *pBuf = ccxTspec.numTspecs;
11775 pBuf += sizeof(tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070011776 // Copy the TSPEC information only if present
11777 if (ccxTspec.numTspecs) {
11778 palCopyMemory(pMac->hHdd, pBuf, (void*)&ccxTspec.tspec[0], (ccxTspec.numTspecs*sizeof(tTspecInfo)));
11779 }
11780 pBuf += sizeof(ccxTspec.tspec);
11781 }
11782 else
11783 {
11784 {
11785 tCCXTspecInfo ccxTspec;
11786 // CCX-Tspec IEs in the ASSOC request is presently not supported
11787 // so nullify the TSPEC parameters
11788 palZeroMemory(pMac->hHdd, &ccxTspec, sizeof(tCCXTspecInfo));
11789 palCopyMemory( pMac->hHdd, pBuf, &ccxTspec, sizeof(tCCXTspecInfo));
11790 pBuf += sizeof(tCCXTspecInfo);
11791 }
11792 }
11793#endif // FEATURE_WLAN_CCX
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011794#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
Jeff Johnson295189b2012-06-20 16:38:30 -070011795 // Fill in isFastTransitionEnabled
Jeff Johnson04dd8a82012-06-29 20:41:40 -070011796 if (pMac->roam.configParam.isFastTransitionEnabled
11797#ifdef FEATURE_WLAN_LFR
11798 || csrRoamIsFastRoamEnabled(pMac)
11799#endif
11800 )
Jeff Johnson295189b2012-06-20 16:38:30 -070011801 {
11802 dwTmp = pal_cpu_to_be32(TRUE);
11803 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11804 pBuf += sizeof(tAniBool);
11805 }
11806 else
11807 {
11808 dwTmp = pal_cpu_to_be32(FALSE);
11809 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11810 pBuf += sizeof(tAniBool);
11811 }
11812#endif
Jeff Johnson43971f52012-07-17 12:26:56 -070011813#ifdef FEATURE_WLAN_LFR
11814 if(csrRoamIsFastRoamEnabled(pMac))
11815 {
11816 //legacy fast roaming enabled
11817 dwTmp = pal_cpu_to_be32(TRUE);
11818 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11819 pBuf += sizeof(tAniBool);
11820 }
11821 else
11822 {
11823 dwTmp = pal_cpu_to_be32(FALSE);
11824 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tAniBool) );
11825 pBuf += sizeof(tAniBool);
11826 }
11827#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011828 csrPrepareJoinReassocReqBuffer( pMac, pBssDescription, pBuf, uapsd_mask);
11829
11830#ifndef WLAN_MDM_CODE_REDUCTION_OPT
11831 //Tush-QoS: notify QoS module that reassoc happening
11832 sme_QosCsrEventInd(pMac, (v_U8_t)sessionId, SME_QOS_CSR_REASSOC_REQ, NULL);
11833#endif
11834 status = palSendMBMessage( pMac->hHdd, pMsg );
11835 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011836 return( status );
Jeff Johnson295189b2012-06-20 16:38:30 -070011837}
11838
Jeff Johnson295189b2012-06-20 16:38:30 -070011839//
11840eHalStatus csrSendMBDisassocReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr bssId, tANI_U16 reasonCode )
11841{
11842 eHalStatus status = eHAL_STATUS_SUCCESS;
11843 tSirSmeDisassocReq *pMsg;
11844 tANI_U8 *pBuf;
11845 tANI_U16 wTmp;
11846#ifdef WLAN_SOFTAP_FEATURE
11847 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
11848 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
11849 return eHAL_STATUS_FAILURE;
11850#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070011851 do {
11852 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDisassocReq ));
11853 if ( !HAL_STATUS_SUCCESS(status) ) break;
11854 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDisassocReq ));
11855 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DISASSOC_REQ);
11856 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDisassocReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -070011857 pBuf = &pMsg->sessionId;
11858 // sessionId
11859 *pBuf++ = (tANI_U8)sessionId;
11860 // transactionId
11861 *pBuf = 0;
11862 *( pBuf + 1 ) = 0;
11863 pBuf += sizeof(tANI_U16);
11864
11865#ifdef WLAN_SOFTAP_FEATURE
11866 if ( (pSession->pCurRoamProfile != NULL ) &&
11867 ( reasonCode == eSIR_MAC_UNSPEC_FAILURE_REASON ) &&
11868 ((CSR_IS_INFRA_AP(pSession->pCurRoamProfile)) || (CSR_IS_WDS_AP(pSession->pCurRoamProfile))))
11869 {
11870 // Set the bssid address before sending the message to LIM
11871 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pSession->selfMacAddr, sizeof( tSirMacAddr ) );
11872 pBuf = pBuf + sizeof ( tSirMacAddr );
Jeff Johnson295189b2012-06-20 16:38:30 -070011873 // Set the peer MAC address before sending the message to LIM
11874 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( tSirMacAddr ) ); //perMacAddr is passed as bssId for softAP
11875 pBuf = pBuf + sizeof ( tSirMacAddr );
11876 }
11877 else
11878 {
11879#endif
11880 // Set the peer MAC address before sending the message to LIM
11881 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( tSirMacAddr ) );
11882 pBuf = pBuf + sizeof ( tSirMacAddr );
Jeff Johnson295189b2012-06-20 16:38:30 -070011883 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( pMsg->bssId ) );
11884 pBuf = pBuf + sizeof ( tSirMacAddr );
11885#ifdef WLAN_SOFTAP_FEATURE
11886 }
11887#endif
11888 if(!HAL_STATUS_SUCCESS(status))
11889 {
11890 palFreeMemory(pMac->hHdd, pMsg);
11891 break;
11892 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011893 // reasonCode
11894 wTmp = pal_cpu_to_be16(reasonCode);
11895 status = palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
11896 if(!HAL_STATUS_SUCCESS(status))
11897 {
11898 palFreeMemory(pMac->hHdd, pMsg);
11899 break;
11900 }
11901 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011902 /* The state will be DISASSOC_HANDOFF only when we are doing handoff.
11903 Here we should not send the disassoc over the air to the AP */
11904 if ( CSR_IS_ROAM_SUBSTATE_DISASSOC_HO(pMac, sessionId)
11905#ifdef WLAN_FEATURE_VOWIFI_11R
11906 && csrRoamIs11rAssoc(pMac)
11907#endif
11908 )
11909 {
11910 *pBuf = CSR_DONT_SEND_DISASSOC_OVER_THE_AIR; /* Set DoNotSendOverTheAir flag to 1 only for handoff case */
11911 }
11912 pBuf += sizeof(tANI_U8);
11913 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011914 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011915 return( status );
11916}
Jeff Johnson295189b2012-06-20 16:38:30 -070011917#ifdef WLAN_SOFTAP_FEATURE
11918eHalStatus csrSendMBTkipCounterMeasuresReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_BOOLEAN bEnable, tSirMacAddr bssId )
11919{
11920 eHalStatus status = eHAL_STATUS_SUCCESS;
11921 tSirSmeTkipCntrMeasReq *pMsg;
11922 tANI_U8 *pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011923 do
11924 {
11925 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeTkipCntrMeasReq ));
11926 if ( !HAL_STATUS_SUCCESS(status) ) break;
11927 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeTkipCntrMeasReq ));
11928 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_TKIP_CNTR_MEAS_REQ);
11929 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeTkipCntrMeasReq ));
Jeff Johnson295189b2012-06-20 16:38:30 -070011930 pBuf = &pMsg->sessionId;
11931 // sessionId
11932 *pBuf++ = (tANI_U8)sessionId;
11933 // transactionId
11934 *pBuf = 0;
11935 *( pBuf + 1 ) = 0;
11936 pBuf += sizeof(tANI_U16);
11937 // bssid
11938 status = palCopyMemory( pMac->hHdd, pMsg->bssId, bssId, sizeof( tSirMacAddr ) );
11939 pBuf = pBuf + sizeof ( tSirMacAddr );
11940 // bEnable
11941 *pBuf = (tANI_BOOLEAN)bEnable;
11942 if(!HAL_STATUS_SUCCESS(status))
11943 {
11944 palFreeMemory(pMac->hHdd, pMsg);
11945 break;
11946 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011947 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070011948 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011949 return( status );
11950}
Jeff Johnson295189b2012-06-20 16:38:30 -070011951eHalStatus
11952csrSendMBGetAssociatedStasReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId,
11953 VOS_MODULE_ID modId, tSirMacAddr bssId,
11954 void *pUsrContext, void *pfnSapEventCallback,
11955 tANI_U8 *pAssocStasBuf )
11956{
11957 eHalStatus status = eHAL_STATUS_SUCCESS;
11958 tSirSmeGetAssocSTAsReq *pMsg;
11959 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
11960 tANI_U32 dwTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070011961 do
11962 {
11963 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeGetAssocSTAsReq ) );
11964 if (!HAL_STATUS_SUCCESS(status)) break;
11965 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirSmeGetAssocSTAsReq ) );
11966 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_ASSOC_STAS_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070011967 pBuf = (tANI_U8 *)&pMsg->bssId;
11968 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070011969 // bssId
11970 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof(tSirMacAddr) );
11971 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070011972 // modId
11973 dwTmp = pal_cpu_to_be16((tANI_U16)modId);
11974 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U16));
11975 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070011976 // pUsrContext
11977 dwTmp = pal_cpu_to_be32((tANI_U32)pUsrContext);
11978 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11979 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011980 // pfnSapEventCallback
11981 dwTmp = pal_cpu_to_be32((tANI_U32)pfnSapEventCallback);
11982 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11983 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011984 // pAssocStasBuf
11985 dwTmp = pal_cpu_to_be32((tANI_U32)pAssocStasBuf);
11986 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
11987 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070011988 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)));//msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070011989 status = palSendMBMessage( pMac->hHdd, pMsg );
11990 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070011991 return( status );
11992 }
Jeff Johnson295189b2012-06-20 16:38:30 -070011993eHalStatus
11994csrSendMBGetWPSPBCSessions( tpAniSirGlobal pMac, tANI_U32 sessionId,
11995 tSirMacAddr bssId, void *pUsrContext, void *pfnSapEventCallback,v_MACADDR_t pRemoveMac)
11996 {
11997 eHalStatus status = eHAL_STATUS_SUCCESS;
11998 tSirSmeGetWPSPBCSessionsReq *pMsg;
11999 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
12000 tANI_U32 dwTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012001 do
12002 {
12003 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirSmeGetWPSPBCSessionsReq) );
12004 if (!HAL_STATUS_SUCCESS(status)) break;
12005 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirSmeGetWPSPBCSessionsReq ) );
12006 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_WPSPBC_SESSION_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012007 pBuf = (tANI_U8 *)&pMsg->pUsrContext;
12008 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012009 // pUsrContext
12010 dwTmp = pal_cpu_to_be32((tANI_U32)pUsrContext);
12011 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
12012 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012013 // pSapEventCallback
12014 dwTmp = pal_cpu_to_be32((tANI_U32)pfnSapEventCallback);
12015 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
12016 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012017 // bssId
12018 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof(tSirMacAddr) );
12019 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070012020 // MAC Address of STA in WPS session
12021 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pRemoveMac.bytes, sizeof(v_MACADDR_t));
12022 pBuf += sizeof(v_MACADDR_t);
Jeff Johnson295189b2012-06-20 16:38:30 -070012023 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)));//msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070012024 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012025 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012026 return( status );
12027}
12028#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070012029eHalStatus csrSendMBDeauthReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr bssId, tANI_U16 reasonCode )
12030{
12031 eHalStatus status = eHAL_STATUS_SUCCESS;
12032 tSirSmeDeauthReq *pMsg;
12033 tANI_U8 *pBuf;
12034 tANI_U16 wTmp;
12035 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
12036 if (!CSR_IS_SESSION_VALID( pMac, sessionId ))
12037 return eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012038 do {
12039 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDeauthReq ));
12040 if ( !HAL_STATUS_SUCCESS(status) ) break;
12041 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDeauthReq ));
12042 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEAUTH_REQ);
12043 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDeauthReq ));
12044 //sessionId
12045 pBuf = &pMsg->sessionId;
12046 *pBuf++ = (tANI_U8)sessionId;
12047
12048 //tansactionId
12049 *pBuf = 0;
12050 *(pBuf + 1 ) = 0;
12051 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012052 if ((pSession->pCurRoamProfile != NULL) && (
12053#ifdef WLAN_SOFTAP_FEATURE
12054 (CSR_IS_INFRA_AP(pSession->pCurRoamProfile)) ||
12055#endif
12056 (CSR_IS_WDS_AP(pSession->pCurRoamProfile)))){
12057 // Set the BSSID before sending the message to LIM
12058 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, pSession->selfMacAddr, sizeof( pMsg->peerMacAddr ) );
12059 pBuf = pBuf + sizeof(tSirMacAddr);
12060 }
12061 else
12062 {
12063 // Set the BSSID before sending the message to LIM
12064 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, bssId, sizeof( pMsg->peerMacAddr ) );
12065 pBuf = pBuf + sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070012066 }
12067 if(!HAL_STATUS_SUCCESS(status))
12068 {
12069 palFreeMemory(pMac->hHdd, pMsg);
12070 break;
12071 }
12072 // Set the peer MAC address before sending the message to LIM
12073 status = palCopyMemory( pMac->hHdd, (tSirMacAddr *) pBuf, bssId, sizeof( pMsg->peerMacAddr ) );
12074 pBuf = pBuf + sizeof(tSirMacAddr);
12075 if(!HAL_STATUS_SUCCESS(status))
12076 {
12077 palFreeMemory(pMac->hHdd, pMsg);
12078 break;
12079 }
12080 wTmp = pal_cpu_to_be16(reasonCode);
12081 status = palCopyMemory( pMac->hHdd, pBuf, &wTmp,sizeof( tANI_U16 ) );
12082 if(!HAL_STATUS_SUCCESS(status))
12083 {
12084 palFreeMemory(pMac->hHdd, pMsg);
12085 break;
12086 }
12087 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012088 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012089 return( status );
12090}
12091
Jeff Johnson295189b2012-06-20 16:38:30 -070012092eHalStatus csrSendMBDisassocCnfMsg( tpAniSirGlobal pMac, tpSirSmeDisassocInd pDisassocInd )
12093{
12094 eHalStatus status = eHAL_STATUS_SUCCESS;
12095 tSirSmeDisassocCnf *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -070012096 do {
12097 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDisassocCnf ));
12098 if ( !HAL_STATUS_SUCCESS(status) ) break;
12099 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDisassocCnf ));
12100 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DISASSOC_CNF);
12101 pMsg->statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12102 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDisassocCnf ));
12103 status = palCopyMemory(pMac->hHdd, pMsg->peerMacAddr, pDisassocInd->peerMacAddr, sizeof(pMsg->peerMacAddr));
12104 if(!HAL_STATUS_SUCCESS(status))
12105 {
12106 palFreeMemory(pMac->hHdd, pMsg);
12107 break;
12108 }
12109//To test reconn
12110 status = palCopyMemory(pMac->hHdd, pMsg->bssId, pDisassocInd->bssId, sizeof(pMsg->peerMacAddr));
12111 if(!HAL_STATUS_SUCCESS(status))
12112 {
12113 palFreeMemory(pMac->hHdd, pMsg);
12114 break;
12115 }
12116//To test reconn ends
Jeff Johnson295189b2012-06-20 16:38:30 -070012117 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012118 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012119 return( status );
12120}
12121
Jeff Johnson295189b2012-06-20 16:38:30 -070012122eHalStatus csrSendMBDeauthCnfMsg( tpAniSirGlobal pMac, tpSirSmeDeauthInd pDeauthInd )
12123{
12124 eHalStatus status = eHAL_STATUS_SUCCESS;
12125 tSirSmeDeauthCnf *pMsg;
Jeff Johnson295189b2012-06-20 16:38:30 -070012126 do {
12127 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeDeauthCnf ));
12128 if ( !HAL_STATUS_SUCCESS(status) ) break;
12129 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeDeauthCnf ));
12130 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEAUTH_CNF);
12131 pMsg->statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12132 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeDeauthCnf ));
12133 status = palCopyMemory(pMac->hHdd, pMsg->bssId, pDeauthInd->bssId, sizeof(pMsg->bssId));
12134 if(!HAL_STATUS_SUCCESS(status))
12135 {
12136 palFreeMemory(pMac->hHdd, pMsg);
12137 break;
12138 }
12139 status = palCopyMemory(pMac->hHdd, pMsg->peerMacAddr, pDeauthInd->peerMacAddr, sizeof(pMsg->peerMacAddr));
12140 if(!HAL_STATUS_SUCCESS(status))
12141 {
12142 palFreeMemory(pMac->hHdd, pMsg);
12143 break;
12144 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012145 status = palSendMBMessage( pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070012146 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012147 return( status );
12148}
Jeff Johnson295189b2012-06-20 16:38:30 -070012149eHalStatus csrSendAssocCnfMsg( tpAniSirGlobal pMac, tpSirSmeAssocInd pAssocInd, eHalStatus Halstatus )
12150{
12151 eHalStatus status = eHAL_STATUS_SUCCESS;
12152 tSirSmeAssocCnf *pMsg;
12153 tANI_U8 *pBuf;
12154 tSirResultCodes statusCode;
12155 tANI_U16 wTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012156 do {
12157 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeAssocCnf ));
12158 if ( !HAL_STATUS_SUCCESS(status) ) break;
12159 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeAssocCnf ));
12160 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_ASSOC_CNF);
12161 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeAssocCnf ));
Jeff Johnson295189b2012-06-20 16:38:30 -070012162 pBuf = (tANI_U8 *)&pMsg->statusCode;
12163 if(HAL_STATUS_SUCCESS(Halstatus))
12164 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12165 else
12166 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_ASSOC_REFUSED);
12167 palCopyMemory( pMac->hHdd, pBuf, &statusCode, sizeof(tSirResultCodes) );
12168 pBuf += sizeof(tSirResultCodes);
12169 // bssId
12170 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12171 pBuf += sizeof (tSirMacAddr);
12172 // peerMacAddr
12173 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
12174 pBuf += sizeof (tSirMacAddr);
12175 // aid
12176 wTmp = pal_cpu_to_be16(pAssocInd->aid);
12177 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12178 pBuf += sizeof (tANI_U16);
12179 // alternateBssId
12180 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12181 pBuf += sizeof (tSirMacAddr);
12182 // alternateChannelId
12183 *pBuf = 11;
Jeff Johnson295189b2012-06-20 16:38:30 -070012184 status = palSendMBMessage( pMac->hHdd, pMsg );
12185 if(!HAL_STATUS_SUCCESS(status))
12186 {
12187 //pMsg is freed by palSendMBMessage
12188 break;
12189 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012190 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012191 return( status );
12192}
Jeff Johnson295189b2012-06-20 16:38:30 -070012193#ifdef WLAN_SOFTAP_FEATURE
12194eHalStatus csrSendAssocIndToUpperLayerCnfMsg( tpAniSirGlobal pMac,
12195 tpSirSmeAssocInd pAssocInd,
12196 eHalStatus Halstatus,
12197 tANI_U8 sessionId)
12198{
12199 tSirMsgQ msgQ;
12200 eHalStatus status = eHAL_STATUS_SUCCESS;
12201 tSirSmeAssocIndToUpperLayerCnf *pMsg;
12202 tANI_U8 *pBuf;
12203 tSirResultCodes statusCode;
12204 tANI_U16 wTmp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012205 do {
12206 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof( tSirSmeAssocIndToUpperLayerCnf ));
12207 if ( !HAL_STATUS_SUCCESS(status) ) break;
12208 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeAssocIndToUpperLayerCnf ));
Jeff Johnsone7245742012-09-05 17:12:55 -070012209
Jeff Johnson295189b2012-06-20 16:38:30 -070012210 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_UPPER_LAYER_ASSOC_CNF);
12211 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeAssocIndToUpperLayerCnf ));
12212
12213 pMsg->sessionId = sessionId;
12214
12215 pBuf = (tANI_U8 *)&pMsg->statusCode;
12216 if(HAL_STATUS_SUCCESS(Halstatus))
12217 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_SUCCESS);
12218 else
12219 statusCode = (tSirResultCodes)pal_cpu_to_be32(eSIR_SME_ASSOC_REFUSED);
12220 palCopyMemory( pMac->hHdd, pBuf, &statusCode, sizeof(tSirResultCodes) );
12221 pBuf += sizeof(tSirResultCodes);
12222 // bssId
12223 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12224 pBuf += sizeof (tSirMacAddr);
12225 // peerMacAddr
12226 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->peerMacAddr, sizeof(tSirMacAddr));
12227 pBuf += sizeof (tSirMacAddr);
12228 // StaId
12229 wTmp = pal_cpu_to_be16(pAssocInd->staId);
12230 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12231 pBuf += sizeof (tANI_U16);
12232 // alternateBssId
12233 status = palCopyMemory(pMac->hHdd, (tSirMacAddr *)pBuf, pAssocInd->bssId, sizeof(tSirMacAddr));
12234 pBuf += sizeof (tSirMacAddr);
12235 // alternateChannelId
12236 *pBuf = 11;
12237 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012238 // Instead of copying roam Info, we just copy only WmmEnabled , RsnIE information
12239 //Wmm
12240 *pBuf = pAssocInd->wmmEnabledSta;
12241 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012242 //RSN IE
12243 status = palCopyMemory(pMac->hHdd, (tSirRSNie *)pBuf, &pAssocInd->rsnIE, sizeof(tSirRSNie));
12244 pBuf += sizeof (tSirRSNie);
Jeff Johnson295189b2012-06-20 16:38:30 -070012245 //Additional IE
12246 status = palCopyMemory(pMac->hHdd, (void *)pBuf, &pAssocInd->addIE, sizeof(tSirAddie));
12247 pBuf += sizeof (tSirAddie);
Jeff Johnson295189b2012-06-20 16:38:30 -070012248 //reassocReq
12249 *pBuf = pAssocInd->reassocReq;
12250 pBuf += sizeof (tANI_U8);
Jeff Johnson295189b2012-06-20 16:38:30 -070012251 msgQ.type = eWNI_SME_UPPER_LAYER_ASSOC_CNF;
12252 msgQ.bodyptr = pMsg;
12253 msgQ.bodyval = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070012254 SysProcessMmhMsg(pMac, &msgQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012255 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012256 return( status );
12257}
12258#endif
12259
Jeff Johnson295189b2012-06-20 16:38:30 -070012260eHalStatus csrSendMBSetContextReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId ,
12261 tSirMacAddr peerMacAddr, tANI_U8 numKeys, tAniEdType edType,
12262 tANI_BOOLEAN fUnicast, tAniKeyDirection aniKeyDirection,
12263 tANI_U8 keyId, tANI_U8 keyLength, tANI_U8 *pKey, tANI_U8 paeRole,
12264 tANI_U8 *pKeyRsc )
12265{
12266 tSirSmeSetContextReq *pMsg;
12267 tANI_U16 msgLen;
12268 eHalStatus status = eHAL_STATUS_FAILURE;
12269 tAniEdType tmpEdType;
12270 tAniKeyDirection tmpDirection;
12271 tANI_U8 *pBuf;
12272 tANI_U8 *p;
12273 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012274 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012275 if( ( 1 != numKeys ) && ( 0 != numKeys ) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012276 // all of these fields appear in every SET_CONTEXT message. Below we'll add in the size for each
12277 // key set. Since we only support upto one key, we always allocate memory for 1 key
12278 msgLen = sizeof( tANI_U16) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) +
12279 sizeof( tSirMacAddr ) + 1 + sizeof(tANI_U16) +
12280 sizeof( pMsg->keyMaterial.length ) + sizeof( pMsg->keyMaterial.edType ) + sizeof( pMsg->keyMaterial.numKeys ) +
12281 ( sizeof( pMsg->keyMaterial.key ) );
12282
12283 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12284 if ( !HAL_STATUS_SUCCESS(status) ) break;
12285 palZeroMemory(pMac->hHdd, pMsg, msgLen);
12286 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SETCONTEXT_REQ);
12287 pMsg->length = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012288 //sessionId
12289 pBuf = &pMsg->sessionId;
12290 *pBuf = (tANI_U8)sessionId;
12291 pBuf++;
12292 // transactionId
12293 *pBuf = 0;
12294 *(pBuf + 1) = 0;
12295 pBuf += sizeof(tANI_U16);
12296 // peerMacAddr
12297 palCopyMemory( pMac->hHdd, pBuf,
12298 (tANI_U8 *)peerMacAddr, sizeof(tSirMacAddr) );
12299
12300 pBuf += sizeof(tSirMacAddr);
12301
12302 // bssId
12303 palCopyMemory( pMac->hHdd, pBuf,
12304 (tANI_U8 *)&pSession->connectedProfile.bssid, sizeof(tSirMacAddr) );
12305
12306 pBuf += sizeof(tSirMacAddr);
12307
12308 p = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012309 // Set the pMsg->keyMaterial.length field (this length is defined as all data that follows the edType field
12310 // in the tSirKeyMaterial keyMaterial; field).
12311 //
12312 // !!NOTE: This keyMaterial.length contains the length of a MAX size key, though the keyLength can be
12313 // shorter than this max size. Is LIM interpreting this ok ?
12314 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 -070012315 // set pMsg->keyMaterial.edType
12316 tmpEdType = (tAniEdType)pal_cpu_to_be32(edType);
12317 palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpEdType, sizeof(tAniEdType) );
12318 p += sizeof( pMsg->keyMaterial.edType );
Jeff Johnson295189b2012-06-20 16:38:30 -070012319 // set the pMsg->keyMaterial.numKeys field
12320 *p = numKeys;
12321 p += sizeof( pMsg->keyMaterial.numKeys );
Jeff Johnson295189b2012-06-20 16:38:30 -070012322 // set pSirKey->keyId = keyId;
12323 *p = keyId;
12324 p += sizeof( pMsg->keyMaterial.key[ 0 ].keyId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012325 // set pSirKey->unicast = (tANI_U8)fUnicast;
12326 *p = (tANI_U8)fUnicast;
12327 p += sizeof( pMsg->keyMaterial.key[ 0 ].unicast );
Jeff Johnson295189b2012-06-20 16:38:30 -070012328 // set pSirKey->keyDirection = aniKeyDirection;
12329 tmpDirection = (tAniKeyDirection)pal_cpu_to_be32(aniKeyDirection);
12330 palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpDirection, sizeof(tAniKeyDirection) );
12331 p += sizeof(tAniKeyDirection);
12332 // pSirKey->keyRsc = ;;
12333 palCopyMemory( pMac->hHdd, p, pKeyRsc, CSR_MAX_RSC_LEN );
12334 p += sizeof( pMsg->keyMaterial.key[ 0 ].keyRsc );
Jeff Johnson295189b2012-06-20 16:38:30 -070012335 // set pSirKey->paeRole
12336 *p = paeRole; // 0 is Supplicant
12337 p++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012338 // set pSirKey->keyLength = keyLength;
12339 p = pal_set_U16( p, pal_cpu_to_be16(keyLength) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012340 if ( keyLength && pKey )
12341 {
12342 palCopyMemory( pMac->hHdd, p, pKey, keyLength );
12343 if(keyLength == 16)
12344 {
Madan Mohan Koyyalamudi8bdd3112012-09-24 13:55:14 -070012345 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 -070012346 keyId, edType, pKey[0], pKey[1], pKey[2], pKey[3], pKey[4],
12347 pKey[5], pKey[6], pKey[7], pKey[8],
12348 pKey[9], pKey[10], pKey[11], pKey[12], pKey[13], pKey[14], pKey[15]);
12349 }
12350 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012351 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012352 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012353 return( status );
12354}
12355
Jeff Johnson295189b2012-06-20 16:38:30 -070012356eHalStatus csrSendMBStartBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCsrRoamBssType bssType,
12357 tCsrRoamStartBssParams *pParam, tSirBssDescription *pBssDesc )
12358{
12359 eHalStatus status;
12360 tSirSmeStartBssReq *pMsg;
12361 tANI_U8 *pBuf = NULL;
12362 tANI_U8 *wTmpBuf = NULL;
12363 tANI_U16 msgLen, wTmp;
12364 tANI_U32 dwTmp;
12365 tSirNwType nwType;
Jeff Johnsone7245742012-09-05 17:12:55 -070012366 ePhyChanBondState cbMode;
Jeff Johnson295189b2012-06-20 16:38:30 -070012367#ifdef WLAN_SOFTAP_FEATURE
12368 tANI_U32 authType;
12369#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070012370 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070012371
12372 if(!pSession)
12373 {
12374 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12375 return eHAL_STATUS_FAILURE;
12376 }
12377
Jeff Johnson295189b2012-06-20 16:38:30 -070012378 do {
12379 pSession->joinFailStatusCode.statusCode = eSIR_SME_SUCCESS;
12380 pSession->joinFailStatusCode.reasonCode = 0;
12381 msgLen = sizeof(tSirSmeStartBssReq);
12382 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12383 if ( !HAL_STATUS_SUCCESS(status) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012384 palZeroMemory(pMac->hHdd, pMsg, msgLen);
12385 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_START_BSS_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070012386 pBuf = &pMsg->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070012387 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070012388 //sessionId
12389 *pBuf = (tANI_U8)sessionId;
12390 pBuf++;
12391 // transactionId
12392 *pBuf = 0;
12393 *(pBuf + 1) = 0;
12394 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012395 // bssid
12396 palCopyMemory( pMac->hHdd, pBuf, pParam->bssid, sizeof(tSirMacAddr) );
12397 pBuf += sizeof(tSirMacAddr);
12398 // selfMacAddr
12399 palCopyMemory( pMac->hHdd, pBuf, pSession->selfMacAddr, sizeof(tSirMacAddr) );
12400 pBuf += sizeof(tSirMacAddr);
12401 // beaconInterval
12402 if( pBssDesc && pBssDesc->beaconInterval )
12403 {
12404 wTmp = pal_cpu_to_be16( pBssDesc->beaconInterval );
12405 }
12406#ifdef WLAN_SOFTAP_FEATURE
12407 else if(pParam->beaconInterval)
12408 {
12409 wTmp = pal_cpu_to_be16( pParam->beaconInterval );
12410 }
12411#endif
12412 else
12413 {
12414 wTmp = pal_cpu_to_be16( WNI_CFG_BEACON_INTERVAL_STADEF );
12415 }
Jeff Johnsone7245742012-09-05 17:12:55 -070012416 if(csrIsconcurrentsessionValid (pMac, sessionId,
12417 pParam->bssPersona)
12418 == eHAL_STATUS_SUCCESS )
12419 {
12420 csrValidateBeaconInterval(pMac, pParam->operationChn, &wTmp, sessionId,
12421 pParam->bssPersona);
12422 //Update the beacon Interval
12423 pParam->beaconInterval = wTmp;
12424 }
12425 else
12426 {
12427 smsLog( pMac,LOGE, FL("****Start BSS failed persona already exists***\n"));
12428 status = eHAL_STATUS_FAILURE;
12429 return status;
12430 }
12431
Jeff Johnson295189b2012-06-20 16:38:30 -070012432 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof( tANI_U16 ) );
12433 pBuf += sizeof(tANI_U16);
12434 // dot11mode
12435 *pBuf = (tANI_U8)csrTranslateToWNICfgDot11Mode( pMac, pParam->uCfgDot11Mode );
12436 pBuf += 1;
12437 // bssType
12438 dwTmp = pal_cpu_to_be32( csrTranslateBsstypeToMacType( bssType ) );
12439 palCopyMemory( pMac->hHdd, pBuf, &dwTmp, sizeof(tSirBssType) );
12440 pBuf += sizeof(tSirBssType);
12441 // ssId
12442 if( pParam->ssId.length )
12443 {
12444 // ssId len
12445 *pBuf = pParam->ssId.length;
12446 pBuf++;
12447 palCopyMemory( pMac->hHdd, pBuf, pParam->ssId.ssId, pParam->ssId.length );
12448 pBuf += pParam->ssId.length;
12449 }
12450 else
12451 {
12452 *pBuf = 0;
12453 pBuf++;
12454 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012455 // set the channel Id
12456 *pBuf = pParam->operationChn;
12457 pBuf++;
12458 //What should we really do for the cbmode.
Jeff Johnsone7245742012-09-05 17:12:55 -070012459 cbMode = (ePhyChanBondState)pal_cpu_to_be32(pParam->cbMode);
12460 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&cbMode, sizeof(ePhyChanBondState) );
12461 pBuf += sizeof(ePhyChanBondState);
Jeff Johnson295189b2012-06-20 16:38:30 -070012462
12463#ifdef WLAN_SOFTAP_FEATURE
12464 // Set privacy
12465 *pBuf = pParam->privacy;
12466 pBuf++;
12467
12468 //Set Uapsd
12469 *pBuf = pParam->ApUapsdEnable;
12470 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012471 //Set SSID hidden
12472 *pBuf = pParam->ssidHidden;
12473 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012474 *pBuf = (tANI_U8)pParam->fwdWPSPBCProbeReq;
12475 pBuf++;
12476
12477 //Ht protection Enable/Disable
12478 *pBuf = (tANI_U8)pParam->protEnabled;
12479 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012480 //Enable Beacons to Receive for OBSS protection Enable/Disable
12481 *pBuf = (tANI_U8)pParam->obssProtEnabled;
12482 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012483 //set cfg related to protection
12484 wTmp = pal_cpu_to_be16( pParam->ht_protection );
12485 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof( tANI_U16 ) );
12486 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070012487 // Set Auth type
12488 authType = pal_cpu_to_be32(pParam->authType);
12489 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&authType, sizeof(tANI_U32));
12490 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012491 // Set DTIM
12492 dwTmp = pal_cpu_to_be32(pParam->dtimPeriod);
12493 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&dwTmp, sizeof(tANI_U32));
12494 pBuf += sizeof(tANI_U32);
Jeff Johnson295189b2012-06-20 16:38:30 -070012495 // Set wps_state
12496 *pBuf = pParam->wps_state;
12497 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012498#endif
12499 //Persona
12500 *pBuf = (tANI_U8)pParam->bssPersona;
12501 pBuf++;
12502
Jeff Johnsone7245742012-09-05 17:12:55 -070012503
Jeff Johnson295189b2012-06-20 16:38:30 -070012504
12505 // set RSN IE
12506 if( pParam->nRSNIELength > sizeof(pMsg->rsnIE.rsnIEdata) )
12507 {
12508 status = eHAL_STATUS_INVALID_PARAMETER;
12509 palFreeMemory( pMac->hHdd, pMsg );
12510 break;
12511 }
12512 wTmp = pal_cpu_to_be16( pParam->nRSNIELength );
12513 palCopyMemory( pMac->hHdd, pBuf, &wTmp, sizeof(tANI_U16) );
12514 pBuf += sizeof(tANI_U16);
12515 if( wTmp )
12516 {
12517 wTmp = pParam->nRSNIELength;
12518 palCopyMemory( pMac->hHdd, pBuf, pParam->pRSNIE, wTmp );
12519 pBuf += wTmp;
12520 }
12521 nwType = (tSirNwType)pal_cpu_to_be32(pParam->sirNwType);
12522 palCopyMemory( pMac->hHdd, pBuf, (tANI_U8 *)&nwType, sizeof(tSirNwType) );
12523 pBuf += sizeof(tSirNwType);
Jeff Johnson295189b2012-06-20 16:38:30 -070012524 *pBuf = pParam->operationalRateSet.numRates; //tSirMacRateSet->numRates
12525 pBuf++;
Jeff Johnson295189b2012-06-20 16:38:30 -070012526 palCopyMemory( pMac->hHdd, pBuf, pParam->operationalRateSet.rate, pParam->operationalRateSet.numRates );
12527 pBuf += pParam->operationalRateSet.numRates ;
12528 *pBuf++ = pParam->extendedRateSet.numRates;
12529 if(0 != pParam->extendedRateSet.numRates)
12530 {
12531 palCopyMemory( pMac->hHdd, pBuf, pParam->extendedRateSet.rate, pParam->extendedRateSet.numRates );
12532 pBuf += pParam->extendedRateSet.numRates;
12533 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012534 msgLen = (tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)); //msg_header + msg
12535 pMsg->length = pal_cpu_to_be16(msgLen);
12536
12537 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012538 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012539 return( status );
12540}
12541
Jeff Johnson295189b2012-06-20 16:38:30 -070012542eHalStatus csrSendMBStopBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId )
12543{
12544 eHalStatus status = eHAL_STATUS_FAILURE;
12545 tSirSmeStopBssReq *pMsg;
12546 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
12547 tANI_U8 *pBuf;
12548 tANI_U16 msgLen;
Jeff Johnson32d95a32012-09-10 13:15:23 -070012549
12550 if(!pSession)
12551 {
12552 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
12553 return eHAL_STATUS_FAILURE;
12554 }
12555
Jeff Johnson295189b2012-06-20 16:38:30 -070012556 do {
12557 status = palAllocateMemory(pMac, (void **)&pMsg, sizeof(tSirSmeStopBssReq));
12558 if ( !HAL_STATUS_SUCCESS(status) ) break;
12559 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeStopBssReq ));
12560 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_STOP_BSS_REQ);
12561 pBuf = &pMsg->sessionId;
12562 //sessionId
12563 *pBuf = (tANI_U8)sessionId;
12564 pBuf++;
12565 // transactionId
12566 *pBuf = 0;
12567 pBuf += sizeof(tANI_U16);
12568 //reason code
12569 *pBuf = 0;
12570 pBuf += sizeof(tSirResultCodes);
12571 // bssid
12572 // if BSSType is WDS sta, use selfmacAddr as bssid, else use bssid in connectedProfile
12573 if( CSR_IS_CONN_WDS_STA(&pSession->connectedProfile) )
12574 {
12575 palCopyMemory( pMac->hHdd, pBuf,(tANI_U8 *)&pSession->selfMacAddr, sizeof(tSirMacAddr) );
12576 }
12577 else
12578 {
12579 palCopyMemory( pMac->hHdd, pBuf,(tANI_U8 *)&pSession->connectedProfile.bssid, sizeof(tSirMacAddr) );
12580 }
12581 pBuf += sizeof(tSirMacAddr);
12582 msgLen = sizeof(tANI_U16) + sizeof(tANI_U16) + 1 + sizeof(tANI_U16) + sizeof(tSirResultCodes) + sizeof(tSirMacAddr);
12583 pMsg->length = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012584 status = palSendMBMessage( pMac->hHdd, pMsg );
12585#if 0
12586 status = palAllocateMemory(pMac, (void **)&pMsg, sizeof(tSirSmeStopBssReq));
12587 if ( !HAL_STATUS_SUCCESS(status) ) break;
12588 palZeroMemory(pMac->hHdd, pMsg, sizeof( tSirSmeStopBssReq ));
12589 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_STOP_BSS_REQ);
12590 pMsg->reasonCode = 0;
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 pbBssid = (tANI_U8 *)&pSession->selfMacAddr;
12596 }
12597 else
12598 {
12599 pbBssid = (tANI_U8 *)&pSession->connectedProfile.bssid;
12600 }
12601 palCopyMemory( pMac->hHdd, &pMsg->bssId, pbBssid, sizeof(tSirMacAddr) );
12602 pMsg->transactionId = 0;
12603 pMsg->sessionId = (tANI_U8)sessionId;
12604 pMsg->length = pal_cpu_to_be16((tANI_U16)sizeof( tSirSmeStopBssReq ));
12605 status = palSendMBMessage( pMac->hHdd, pMsg );
12606#endif
12607 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012608 return( status );
12609}
12610
Jeff Johnson295189b2012-06-20 16:38:30 -070012611eHalStatus csrReassoc(tpAniSirGlobal pMac, tANI_U32 sessionId,
12612 tCsrRoamModifyProfileFields *pModProfileFields,
12613 tANI_U32 *pRoamId, v_BOOL_t fForce)
12614{
Jeff Johnson295189b2012-06-20 16:38:30 -070012615 eHalStatus status = eHAL_STATUS_FAILURE;
12616 tANI_U32 roamId = 0;
12617 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012618 if((csrIsConnStateConnected(pMac, sessionId)) &&
12619 (fForce || (!palEqualMemory(pMac->hHdd, &pModProfileFields,
12620 &pSession->connectedProfile.modifyProfileFields,
12621 sizeof(tCsrRoamModifyProfileFields)))) )
12622 {
12623 roamId = GET_NEXT_ROAM_ID(&pMac->roam);
12624 if(pRoamId)
12625 {
12626 *pRoamId = roamId;
12627 }
12628
Jeff Johnson295189b2012-06-20 16:38:30 -070012629 status = csrRoamIssueReassoc(pMac, sessionId, NULL, pModProfileFields,
12630 eCsrSmeIssuedReassocToSameAP, roamId,
12631 eANI_BOOLEAN_FALSE);
Jeff Johnson295189b2012-06-20 16:38:30 -070012632 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012633 return status;
12634}
Jeff Johnson295189b2012-06-20 16:38:30 -070012635static eHalStatus csrRoamSessionOpened(tpAniSirGlobal pMac, tANI_U32 sessionId)
12636{
12637 eHalStatus status = eHAL_STATUS_SUCCESS;
12638 tCsrRoamInfo roamInfo;
Jeff Johnson295189b2012-06-20 16:38:30 -070012639 palZeroMemory(pMac->hHdd, &roamInfo, sizeof(tCsrRoamInfo));
12640 status = csrRoamCallCallback(pMac, sessionId, &roamInfo, 0,
12641 eCSR_ROAM_SESSION_OPENED, eCSR_ROAM_RESULT_NONE);
12642 return (status);
12643}
Jeff Johnson295189b2012-06-20 16:38:30 -070012644eHalStatus csrProcessAddStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg)
12645{
12646 eHalStatus status = eHAL_STATUS_SUCCESS;
12647 tListElem *pEntry = NULL;
12648 tSmeCmd *pCommand = NULL;
12649 tSirSmeAddStaSelfRsp *pRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012650 do
12651 {
12652 if(pMsg == NULL)
12653 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -070012654 smsLog(pMac, LOGE, "in %s msg ptr is NULL\n", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012655 status = eHAL_STATUS_FAILURE;
12656 break;
12657 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012658 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
12659 if(pEntry)
12660 {
12661 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12662 if(eSmeCommandAddStaSession == pCommand->command)
12663 {
12664 pRsp = (tSirSmeAddStaSelfRsp*)pMsg;
12665 smsLog( pMac, LOG1, "Add Sta rsp status = %d\n", pRsp->status );
12666 //Nothing to be done. May be indicate the self sta addition success by calling session callback (TODO).
Jeff Johnson295189b2012-06-20 16:38:30 -070012667 csrRoamSessionOpened(pMac, pCommand->sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -070012668 //Remove this command out of the active list
12669 if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK))
12670 {
12671 //Now put this command back on the avilable command list
12672 csrReleaseCommand(pMac, pCommand);
12673 }
12674 smeProcessPendingQueue( pMac );
12675 }
12676 else
12677 {
12678 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 -070012679 __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012680 status = eHAL_STATUS_FAILURE;
12681 break;
12682 }
12683 }
12684 else
12685 {
12686 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 -070012687 __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012688 status = eHAL_STATUS_FAILURE;
12689 break;
12690 }
12691 } while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -070012692 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -070012693}
Jeff Johnson295189b2012-06-20 16:38:30 -070012694eHalStatus csrSendMBAddSelfStaReqMsg( tpAniSirGlobal pMac, tSirMacAddr macAddr )
12695{
12696 tSirSmeAddStaSelfReq *pMsg;
12697 tANI_U16 msgLen;
12698 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012699 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012700 msgLen = sizeof( tANI_U16 ) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) /*+
12701 sizeof( tSirBssType )*/;
Jeff Johnson295189b2012-06-20 16:38:30 -070012702 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12703 if ( !HAL_STATUS_SUCCESS(status) ) break;
Jeff Johnson295189b2012-06-20 16:38:30 -070012704 palZeroMemory(pMac->hHdd, pMsg, msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012705 pMsg->mesgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_ADD_STA_SELF_REQ);
12706 pMsg->mesgLen = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012707 // self station address
12708 palCopyMemory( pMac->hHdd, (tANI_U8 *)pMsg->selfMacAddr, (tANI_U8 *)macAddr, sizeof(tSirMacAddr) );
Madan Mohan Koyyalamudi8bdd3112012-09-24 13:55:14 -070012709 smsLog( pMac, LOG1, FL("selfMac=%02x, %02x, %02x, %02x, %02x, %02x"),
Jeff Johnson295189b2012-06-20 16:38:30 -070012710 pMsg->selfMacAddr[0],
12711 pMsg->selfMacAddr[1],
12712 pMsg->selfMacAddr[2],
12713 pMsg->selfMacAddr[3],
12714 pMsg->selfMacAddr[4],
12715 pMsg->selfMacAddr[5]);
12716 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012717 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012718 return( status );
12719}
Jeff Johnson295189b2012-06-20 16:38:30 -070012720eHalStatus csrIssueAddStaForSessionReq(tpAniSirGlobal pMac, tANI_U32 sessionId, tSirMacAddr sessionMacAddr)
12721{
12722 eHalStatus status = eHAL_STATUS_SUCCESS;
12723 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -070012724 pCommand = csrGetCommandBuffer(pMac);
12725 if(NULL == pCommand)
12726 {
12727 status = eHAL_STATUS_RESOURCES;
12728 }
12729 else
12730 {
12731 pCommand->command = eSmeCommandAddStaSession;
12732 pCommand->sessionId = (tANI_U8)sessionId;
12733 palCopyMemory( pMac->hHdd, pCommand->u.addStaSessionCmd.selfMacAddr, sessionMacAddr, sizeof( tSirMacAddr ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012734 status = csrQueueSmeCommand(pMac, pCommand, TRUE);
12735 if( !HAL_STATUS_SUCCESS( status ) )
12736 {
12737 //Should be panic??
12738 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
12739 }
12740 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012741 return (status);
12742}
Jeff Johnson295189b2012-06-20 16:38:30 -070012743eHalStatus csrProcessAddStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
12744{
12745 return csrSendMBAddSelfStaReqMsg( pMac,
12746 pCommand->u.addStaSessionCmd.selfMacAddr );
12747}
Jeff Johnson295189b2012-06-20 16:38:30 -070012748eHalStatus csrRoamOpenSession( tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext,
12749 tANI_U8 *pSelfMacAddr, tANI_U8 *pbSessionId )
12750{
12751 eHalStatus status = eHAL_STATUS_SUCCESS;
12752 tANI_U32 i;
12753 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070012754 *pbSessionId = CSR_SESSION_ID_INVALID;
12755 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
12756 {
12757 if( !CSR_IS_SESSION_VALID( pMac, i ) )
12758 {
12759 pSession = CSR_GET_SESSION( pMac, i );
12760 status = eHAL_STATUS_SUCCESS;
12761 pSession->sessionActive = eANI_BOOLEAN_TRUE;
12762 pSession->sessionId = (tANI_U8)i;
12763 pSession->callback = callback;
12764 pSession->pContext = pContext;
12765 palCopyMemory( pMac->hHdd, &pSession->selfMacAddr, pSelfMacAddr, sizeof(tCsrBssid) );
12766 *pbSessionId = (tANI_U8)i;
Jeff Johnson295189b2012-06-20 16:38:30 -070012767 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerRoaming, csrRoamRoamingTimerHandler,
12768 &pSession->roamingTimerInfo);
12769 if(!HAL_STATUS_SUCCESS(status))
12770 {
12771 smsLog(pMac, LOGE, FL("cannot allocate memory for Roaming timer\n"));
12772 break;
12773 }
12774#ifdef FEATURE_WLAN_BTAMP_UT_RF
12775 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerJoinRetry, csrRoamJoinRetryTimerHandler,
12776 &pSession->joinRetryTimerInfo);
12777 if(!HAL_STATUS_SUCCESS(status))
12778 {
12779 smsLog(pMac, LOGE, FL("cannot allocate memory for joinretry timer\n"));
12780 break;
12781 }
12782#endif
12783 pSession->ibssJoinTimerInfo.pMac = pMac;
12784 pSession->ibssJoinTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
Jeff Johnson295189b2012-06-20 16:38:30 -070012785 status = palTimerAlloc(pMac->hHdd, &pSession->hTimerIbssJoining, csrRoamIbssJoinTimerHandler,
12786 &pSession->ibssJoinTimerInfo);
12787 if(!HAL_STATUS_SUCCESS(status))
12788 {
12789 smsLog(pMac, LOGE, FL("cannot allocate memory for IbssJoining timer\n"));
12790 break;
12791 }
12792 status = csrIssueAddStaForSessionReq ( pMac, i, pSelfMacAddr );
12793 break;
12794 }
12795 }
12796 if( CSR_ROAM_SESSION_MAX == i )
12797 {
12798 //No session is available
12799 status = eHAL_STATUS_RESOURCES;
12800 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012801 return ( status );
12802}
Jeff Johnson295189b2012-06-20 16:38:30 -070012803eHalStatus csrProcessDelStaSessionRsp( tpAniSirGlobal pMac, tANI_U8 *pMsg)
12804{
12805 eHalStatus status = eHAL_STATUS_SUCCESS;
12806 tListElem *pEntry = NULL;
12807 tSmeCmd *pCommand = NULL;
12808 tSirSmeDelStaSelfRsp *pRsp;
Jeff Johnson295189b2012-06-20 16:38:30 -070012809 do
12810 {
12811 if(pMsg == NULL)
12812 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -070012813 smsLog(pMac, LOGE, "in %s msg ptr is NULL\n", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012814 status = eHAL_STATUS_FAILURE;
12815 break;
12816 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012817 pEntry = csrLLPeekHead( &pMac->sme.smeCmdActiveList, LL_ACCESS_LOCK );
12818 if(pEntry)
12819 {
12820 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12821 if(eSmeCommandDelStaSession == pCommand->command)
12822 {
12823 tANI_U8 sessionId = pCommand->sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070012824 pRsp = (tSirSmeDelStaSelfRsp*)pMsg;
12825 smsLog( pMac, LOG1, "Del Sta rsp status = %d\n", pRsp->status );
Jeff Johnson295189b2012-06-20 16:38:30 -070012826 //This session is done.
12827 csrCleanupSession(pMac, sessionId);
Jeff Johnson295189b2012-06-20 16:38:30 -070012828 if(pCommand->u.delStaSessionCmd.callback)
12829 {
12830
12831 status = sme_ReleaseGlobalLock( &pMac->sme );
12832 if ( HAL_STATUS_SUCCESS( status ) )
12833 {
12834 pCommand->u.delStaSessionCmd.callback(
12835 pCommand->u.delStaSessionCmd.pContext);
12836 status = sme_AcquireGlobalLock( &pMac->sme );
12837 if (! HAL_STATUS_SUCCESS( status ) )
12838 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -070012839 smsLog(pMac, LOGP, "%s: Failed to Acquire Lock\n", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012840 return status;
12841 }
12842 }
12843 else {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -070012844 smsLog(pMac, LOGE, "%s: Failed to Release Lock\n", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012845 }
12846 }
12847
12848 //Remove this command out of the active list
12849 if(csrLLRemoveEntry(&pMac->sme.smeCmdActiveList, pEntry, LL_ACCESS_LOCK))
12850 {
12851 //Now put this command back on the avilable command list
12852 csrReleaseCommand(pMac, pCommand);
12853 }
12854 smeProcessPendingQueue( pMac );
12855 }
12856 else
12857 {
12858 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 -070012859 __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012860 status = eHAL_STATUS_FAILURE;
12861 break;
12862 }
12863 }
12864 else
12865 {
12866 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 -070012867 __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -070012868 status = eHAL_STATUS_FAILURE;
12869 break;
12870 }
12871 } while(0);
Jeff Johnson295189b2012-06-20 16:38:30 -070012872 return status;
Jeff Johnson295189b2012-06-20 16:38:30 -070012873}
Jeff Johnson295189b2012-06-20 16:38:30 -070012874eHalStatus csrSendMBDelSelfStaReqMsg( tpAniSirGlobal pMac, tSirMacAddr macAddr )
12875{
12876 tSirSmeDelStaSelfReq *pMsg;
12877 tANI_U16 msgLen;
12878 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070012879 do {
Jeff Johnson295189b2012-06-20 16:38:30 -070012880 msgLen = sizeof( tANI_U16 ) + sizeof( tANI_U16 ) + sizeof( tSirMacAddr ) /*+
12881 sizeof( tSirBssType )*/;
Jeff Johnson295189b2012-06-20 16:38:30 -070012882 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen);
12883 if ( !HAL_STATUS_SUCCESS(status) ) break;
12884
12885 palZeroMemory(pMac->hHdd, pMsg, msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012886 pMsg->mesgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_DEL_STA_SELF_REQ);
12887 pMsg->mesgLen = pal_cpu_to_be16(msgLen);
Jeff Johnson295189b2012-06-20 16:38:30 -070012888 // self station address
12889 palCopyMemory( pMac->hHdd, (tANI_U8 *)pMsg->selfMacAddr, (tANI_U8 *)macAddr, sizeof(tSirMacAddr) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012890 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070012891 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070012892 return( status );
12893}
Jeff Johnson295189b2012-06-20 16:38:30 -070012894eHalStatus csrIssueDelStaForSessionReq(tpAniSirGlobal pMac, tANI_U32 sessionId,
12895 tSirMacAddr sessionMacAddr,
12896 csrRoamSessionCloseCallback callback,
12897 void *pContext)
12898{
12899 eHalStatus status = eHAL_STATUS_SUCCESS;
12900 tSmeCmd *pCommand;
Jeff Johnson295189b2012-06-20 16:38:30 -070012901 pCommand = csrGetCommandBuffer(pMac);
12902 if(NULL == pCommand)
12903 {
12904 status = eHAL_STATUS_RESOURCES;
12905 }
12906 else
12907 {
12908 pCommand->command = eSmeCommandDelStaSession;
12909 pCommand->sessionId = (tANI_U8)sessionId;
12910 pCommand->u.delStaSessionCmd.callback = callback;
12911 pCommand->u.delStaSessionCmd.pContext = pContext;
12912 palCopyMemory( pMac->hHdd, pCommand->u.delStaSessionCmd.selfMacAddr, sessionMacAddr, sizeof( tSirMacAddr ) );
Jeff Johnson295189b2012-06-20 16:38:30 -070012913 status = csrQueueSmeCommand(pMac, pCommand, TRUE);
12914 if( !HAL_STATUS_SUCCESS( status ) )
12915 {
12916 //Should be panic??
12917 smsLog( pMac, LOGE, FL(" fail to send message status = %d\n"), status );
12918 }
12919 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012920 return (status);
12921}
Jeff Johnson295189b2012-06-20 16:38:30 -070012922eHalStatus csrProcessDelStaSessionCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand )
12923{
12924 return csrSendMBDelSelfStaReqMsg( pMac,
12925 pCommand->u.delStaSessionCmd.selfMacAddr );
12926}
Jeff Johnson295189b2012-06-20 16:38:30 -070012927static void purgeCsrSessionCmdList(tpAniSirGlobal pMac, tANI_U32 sessionId)
12928{
12929 tDblLinkList *pList = &pMac->roam.roamCmdPendingList;
12930 tListElem *pEntry, *pNext;
12931 tSmeCmd *pCommand;
12932 tDblLinkList localList;
12933
12934 vos_mem_zero(&localList, sizeof(tDblLinkList));
12935 if(!HAL_STATUS_SUCCESS(csrLLOpen(pMac->hHdd, &localList)))
12936 {
12937 smsLog(pMac, LOGE, FL(" failed to open list"));
12938 return;
12939 }
Jeff Johnson295189b2012-06-20 16:38:30 -070012940 csrLLLock(pList);
12941 pEntry = csrLLPeekHead(pList, LL_ACCESS_NOLOCK);
12942 while(pEntry != NULL)
12943 {
12944 pNext = csrLLNext(pList, pEntry, LL_ACCESS_NOLOCK);
12945 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12946 if(pCommand->sessionId == sessionId)
12947 {
12948 if(csrLLRemoveEntry(pList, pEntry, LL_ACCESS_NOLOCK))
12949 {
12950 csrLLInsertTail(&localList, pEntry, LL_ACCESS_NOLOCK);
12951 }
12952 }
12953 pEntry = pNext;
12954 }
12955 csrLLUnlock(pList);
12956
12957 while( (pEntry = csrLLRemoveHead(&localList, LL_ACCESS_NOLOCK)) )
12958 {
12959 pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
12960 csrAbortCommand(pMac, pCommand, eANI_BOOLEAN_TRUE);
12961 }
12962 csrLLClose(&localList);
12963}
12964
Jeff Johnson295189b2012-06-20 16:38:30 -070012965void csrCleanupSession(tpAniSirGlobal pMac, tANI_U32 sessionId)
12966{
12967 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
12968 {
12969 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070012970 csrRoamStop(pMac, sessionId);
12971 csrFreeConnectBssDesc(pMac, sessionId);
12972 csrRoamFreeConnectProfile( pMac, &pSession->connectedProfile );
12973 csrRoamFreeConnectedInfo ( pMac, &pSession->connectedInfo);
12974 palTimerFree(pMac->hHdd, pSession->hTimerRoaming);
12975#ifdef FEATURE_WLAN_BTAMP_UT_RF
12976 palTimerFree(pMac->hHdd, pSession->hTimerJoinRetry);
12977#endif
12978 palTimerFree(pMac->hHdd, pSession->hTimerIbssJoining);
12979 purgeSmeSessionCmdList(pMac, sessionId);
12980 purgeCsrSessionCmdList(pMac, sessionId);
12981 csrInitSession(pMac, sessionId);
12982 }
12983}
12984
Jeff Johnson295189b2012-06-20 16:38:30 -070012985eHalStatus csrRoamCloseSession( tpAniSirGlobal pMac, tANI_U32 sessionId,
12986 tANI_BOOLEAN fSync,
12987 csrRoamSessionCloseCallback callback,
12988 void *pContext )
12989{
12990 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson295189b2012-06-20 16:38:30 -070012991 if( CSR_IS_SESSION_VALID( pMac, sessionId ) )
12992 {
12993 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
12994 if(fSync)
12995 {
12996 csrCleanupSession(pMac, sessionId);
12997 }
12998 else
12999 {
13000 purgeSmeSessionCmdList(pMac, sessionId);
13001 purgeCsrSessionCmdList(pMac, sessionId);
13002 status = csrIssueDelStaForSessionReq( pMac, sessionId,
13003 pSession->selfMacAddr, callback, pContext);
13004 }
13005 }
13006 else
13007 {
13008 status = eHAL_STATUS_INVALID_PARAMETER;
13009 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013010 return ( status );
13011}
13012
Jeff Johnson295189b2012-06-20 16:38:30 -070013013static void csrInitSession( tpAniSirGlobal pMac, tANI_U32 sessionId )
13014{
13015 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070013016
13017 if(!pSession)
13018 {
13019 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
13020 return;
13021 }
13022
Jeff Johnson295189b2012-06-20 16:38:30 -070013023 pSession->sessionActive = eANI_BOOLEAN_FALSE;
13024 pSession->sessionId = CSR_SESSION_ID_INVALID;
13025 pSession->callback = NULL;
13026 pSession->pContext = NULL;
13027 pSession->ibss_join_pending = FALSE;
13028 pSession->connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED;
13029 // TODO : Confirm pMac->roam.fReadyForPowerSave = eANI_BOOLEAN_FALSE;
13030 csrFreeRoamProfile( pMac, sessionId );
13031 csrRoamFreeConnectProfile(pMac, &pSession->connectedProfile);
13032 csrRoamFreeConnectedInfo( pMac, &pSession->connectedInfo );
13033 csrFreeConnectBssDesc(pMac, sessionId);
13034 csrScanEnable(pMac);
13035 palZeroMemory( pMac->hHdd, &pSession->selfMacAddr, sizeof(tCsrBssid) );
13036 if(pSession->pWpaRsnReqIE)
13037 {
13038 palFreeMemory(pMac->hHdd, pSession->pWpaRsnReqIE);
13039 pSession->pWpaRsnReqIE = NULL;
13040 }
13041 pSession->nWpaRsnReqIeLength = 0;
13042 if(pSession->pWpaRsnRspIE)
13043 {
13044 palFreeMemory(pMac->hHdd, pSession->pWpaRsnRspIE);
13045 pSession->pWpaRsnRspIE = NULL;
13046 }
13047 pSession->nWpaRsnRspIeLength = 0;
13048#ifdef FEATURE_WLAN_WAPI
13049 if(pSession->pWapiReqIE)
13050 {
13051 palFreeMemory(pMac->hHdd, pSession->pWapiReqIE);
13052 pSession->pWapiReqIE = NULL;
13053 }
13054 pSession->nWapiReqIeLength = 0;
13055 if(pSession->pWapiRspIE)
13056 {
13057 palFreeMemory(pMac->hHdd, pSession->pWapiRspIE);
13058 pSession->pWapiRspIE = NULL;
13059 }
13060 pSession->nWapiRspIeLength = 0;
13061#endif /* FEATURE_WLAN_WAPI */
Jeff Johnson295189b2012-06-20 16:38:30 -070013062 if(pSession->pAddIEScan)
13063 {
13064 palFreeMemory(pMac->hHdd, pSession->pAddIEScan);
13065 pSession->pAddIEScan = NULL;
13066 }
13067 pSession->nAddIEScanLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013068 if(pSession->pAddIEAssoc)
13069 {
13070 palFreeMemory(pMac->hHdd, pSession->pAddIEAssoc);
13071 pSession->pAddIEAssoc = NULL;
13072}
13073 pSession->nAddIEAssocLength = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013074}
13075
Jeff Johnson295189b2012-06-20 16:38:30 -070013076eHalStatus csrRoamGetSessionIdFromBSSID( tpAniSirGlobal pMac, tCsrBssid *bssid, tANI_U32 *pSessionId )
13077{
13078 eHalStatus status = eHAL_STATUS_FAILURE;
13079 tANI_U32 i;
Jeff Johnson295189b2012-06-20 16:38:30 -070013080 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
13081 {
13082 if( CSR_IS_SESSION_VALID( pMac, i ) )
13083 {
13084 if( csrIsMacAddressEqual( pMac, bssid, &pMac->roam.roamSession[i].connectedProfile.bssid ) )
13085 {
13086 //Found it
13087 status = eHAL_STATUS_SUCCESS;
13088 *pSessionId = i;
13089 break;
13090 }
13091 }
13092 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013093 return( status );
13094}
13095
Jeff Johnson295189b2012-06-20 16:38:30 -070013096//This function assumes that we only support one IBSS session. We cannot use BSSID to identify
13097//session because for IBSS, the bssid changes.
13098static tANI_U32 csrFindIbssSession( tpAniSirGlobal pMac )
13099{
13100 tANI_U32 i, nRet = CSR_SESSION_ID_INVALID;
13101 tCsrRoamSession *pSession;
Jeff Johnson295189b2012-06-20 16:38:30 -070013102 for( i = 0; i < CSR_ROAM_SESSION_MAX; i++ )
13103 {
13104 if( CSR_IS_SESSION_VALID( pMac, i ) )
13105 {
13106 pSession = CSR_GET_SESSION( pMac, i );
13107 if( pSession->pCurRoamProfile && ( csrIsBssTypeIBSS( pSession->connectedProfile.BSSType ) ) )
13108 {
13109 //Found it
13110 nRet = i;
13111 break;
13112 }
13113 }
13114 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013115 return (nRet);
13116}
Jeff Johnson295189b2012-06-20 16:38:30 -070013117static void csrRoamLinkUp(tpAniSirGlobal pMac, tCsrBssid bssid)
13118{
13119 /* Update the current BSS info in ho control block based on connected
13120 profile info from pmac global structure */
13121
Jeff Johnson295189b2012-06-20 16:38:30 -070013122 smsLog(pMac, LOGW, " csrRoamLinkUp: WLAN link UP with AP= %02x-%02x-%02x-%02x-%02x-%02x\n",
13123 bssid[ 0 ], bssid[ 1 ], bssid[ 2 ],
13124 bssid[ 3 ], bssid[ 4 ], bssid[ 5 ] );
Jeff Johnson295189b2012-06-20 16:38:30 -070013125 /* Check for user misconfig of RSSI trigger threshold */
13126 pMac->roam.configParam.vccRssiThreshold =
13127 ( 0 == pMac->roam.configParam.vccRssiThreshold ) ?
13128 CSR_VCC_RSSI_THRESHOLD : pMac->roam.configParam.vccRssiThreshold;
13129 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
Jeff Johnson295189b2012-06-20 16:38:30 -070013130 /* Check for user misconfig of UL MAC Loss trigger threshold */
13131 pMac->roam.configParam.vccUlMacLossThreshold =
13132 ( 0 == pMac->roam.configParam.vccUlMacLossThreshold ) ?
13133 CSR_VCC_UL_MAC_LOSS_THRESHOLD : pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013134#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
13135 {
13136 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013137 /* Indicate the neighbor roal algorithm about the connect indication */
13138 csrRoamGetSessionIdFromBSSID(pMac, (tCsrBssid *)bssid, &sessionId);
13139 csrNeighborRoamIndicateConnect(pMac, sessionId, VOS_STATUS_SUCCESS);
13140 }
13141#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070013142}
13143
Jeff Johnson295189b2012-06-20 16:38:30 -070013144static void csrRoamLinkDown(tpAniSirGlobal pMac, tANI_U32 sessionId)
13145{
13146 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson32d95a32012-09-10 13:15:23 -070013147
13148 if(!pSession)
13149 {
13150 smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
13151 return;
13152 }
13153
Jeff Johnson295189b2012-06-20 16:38:30 -070013154 //Only to handle the case for Handover on infra link
13155 if( eCSR_BSS_TYPE_INFRASTRUCTURE != pSession->connectedProfile.BSSType )
13156 {
13157 return;
13158 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013159 /* deregister the clients requesting stats from PE/TL & also stop the corresponding timers*/
13160 csrRoamDeregStatisticsReq(pMac);
13161 pMac->roam.vccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13162#if defined WLAN_FEATURE_NEIGHBOR_ROAMING
13163 /* Indicate the neighbor roal algorithm about the disconnect indication */
13164 csrNeighborRoamIndicateDisconnect(pMac, sessionId);
13165#endif
Madan Mohan Koyyalamudi96dd30d2012-10-05 17:24:51 -070013166
13167 //Remove this code once SLM_Sessionization is supported
13168 //BMPS_WORKAROUND_NOT_NEEDED
13169 if(!IS_FEATURE_SUPPORTED_BY_FW(SLM_SESSIONIZATION) &&
Mohit Khanna349bc392012-09-11 17:24:52 -070013170 csrIsInfraApStarted( pMac ) &&
13171 pMac->roam.configParam.doBMPSWorkaround)
Jeff Johnsone7245742012-09-05 17:12:55 -070013172 {
13173 pMac->roam.configParam.doBMPSWorkaround = 0;
13174 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013175}
13176
Jeff Johnson295189b2012-06-20 16:38:30 -070013177void csrRoamTlStatsTimerHandler(void *pv)
13178{
13179 tpAniSirGlobal pMac = PMAC_STRUCT( pv );
13180 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013181 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
13182
Jeff Johnsone7245742012-09-05 17:12:55 -070013183 smsLog(pMac, LOG1, FL(" TL stat timer is no-op. It needs to support multiple stations"));
13184
Jeff Johnson295189b2012-06-20 16:38:30 -070013185#if 0
13186 // TODO Persession .???
13187 //req TL for stats
13188 if(WLANTL_GetStatistics(pMac->roam.gVosContext, &tlStats, pMac->roam.connectedInfo.staId))
13189 {
13190 smsLog(pMac, LOGE, FL("csrRoamTlStatsTimerHandler:couldn't get the stats from TL\n"));
13191 }
13192 else
13193 {
13194 //save in SME
13195 csrRoamSaveStatsFromTl(pMac, tlStats);
13196 }
13197#endif
13198 if(!pMac->roam.tlStatsReqInfo.timerRunning)
13199 {
13200 if(pMac->roam.tlStatsReqInfo.periodicity)
13201 {
13202 //start timer
13203 status = palTimerStart(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer,
13204 pMac->roam.tlStatsReqInfo.periodicity * PAL_TIMER_TO_MS_UNIT, eANI_BOOLEAN_FALSE);
13205 if(!HAL_STATUS_SUCCESS(status))
13206 {
13207 smsLog(pMac, LOGE, FL("csrRoamTlStatsTimerHandler:cannot start TlStatsTimer timer\n"));
13208 return;
13209 }
13210 pMac->roam.tlStatsReqInfo.timerRunning = TRUE;
13211 }
13212 }
13213}
Jeff Johnson295189b2012-06-20 16:38:30 -070013214void csrRoamPeStatsTimerHandler(void *pv)
13215{
13216 tCsrPeStatsReqInfo *pPeStatsReqListEntry = (tCsrPeStatsReqInfo *)pv;
13217 eHalStatus status;
13218 tpAniSirGlobal pMac = pPeStatsReqListEntry->pMac;
13219 VOS_STATUS vosStatus;
13220 tPmcPowerState powerState;
Jeff Johnson295189b2012-06-20 16:38:30 -070013221 pPeStatsReqListEntry->timerRunning = FALSE;
13222 if( pPeStatsReqListEntry->timerStopFailed == TRUE )
13223 {
13224 // If we entered here, meaning the timer could not be successfully
13225 // stopped in csrRoamRemoveEntryFromPeStatsReqList(). So do it here.
13226
13227 /* Destroy the timer */
13228 vosStatus = vos_timer_destroy( &pPeStatsReqListEntry->hPeStatsTimer );
13229 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13230 {
13231 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:failed to destroy hPeStatsTimer timer\n"));
13232 }
13233
13234 // Free the entry
13235 palFreeMemory(pMac->hHdd, pPeStatsReqListEntry);
13236 pPeStatsReqListEntry = NULL;
13237 }
13238 else
13239 {
13240 if(!pPeStatsReqListEntry->rspPending)
13241 {
13242 status = csrSendMBStatsReqMsg(pMac, pPeStatsReqListEntry->statsMask & ~(1 << eCsrGlobalClassDStats),
13243 pPeStatsReqListEntry->staId);
13244 if(!HAL_STATUS_SUCCESS(status))
13245 {
13246 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:failed to send down stats req to PE\n"));
13247 }
13248 else
13249 {
13250 pPeStatsReqListEntry->rspPending = TRUE;
13251 }
13252 }
13253
13254 //send down a req
13255 if(pPeStatsReqListEntry->periodicity &&
13256 (VOS_TIMER_STATE_STOPPED == vos_timer_getCurrentState(&pPeStatsReqListEntry->hPeStatsTimer)))
13257 {
13258 pmcQueryPowerState(pMac, &powerState, NULL, NULL);
13259 if(ePMC_FULL_POWER == powerState)
13260 {
13261 if(pPeStatsReqListEntry->periodicity < pMac->roam.configParam.statsReqPeriodicity)
13262 {
13263 pPeStatsReqListEntry->periodicity = pMac->roam.configParam.statsReqPeriodicity;
13264 }
13265 }
13266 else
13267 {
13268 if(pPeStatsReqListEntry->periodicity < pMac->roam.configParam.statsReqPeriodicityInPS)
13269 {
13270 pPeStatsReqListEntry->periodicity = pMac->roam.configParam.statsReqPeriodicityInPS;
13271 }
13272 }
13273 //start timer
13274 vosStatus = vos_timer_start( &pPeStatsReqListEntry->hPeStatsTimer, pPeStatsReqListEntry->periodicity );
13275 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13276 {
13277 smsLog(pMac, LOGE, FL("csrRoamPeStatsTimerHandler:cannot start hPeStatsTimer timer\n"));
13278 return;
13279 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013280 pPeStatsReqListEntry->timerRunning = TRUE;
13281
13282 }
13283
13284 }
13285}
Jeff Johnson295189b2012-06-20 16:38:30 -070013286void csrRoamStatsClientTimerHandler(void *pv)
13287{
13288 tCsrStatsClientReqInfo *pStaEntry = (tCsrStatsClientReqInfo *)pv;
Jeff Johnson295189b2012-06-20 16:38:30 -070013289 if(VOS_TIMER_STATE_STOPPED == vos_timer_getCurrentState(&pStaEntry->timer))
13290 {
13291#if 0
13292 // TODO Stats fix for multisession
13293 //start the timer
13294 vosStatus = vos_timer_start( &pStaEntry->timer, pStaEntry->periodicity );
13295
13296 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13297 {
13298 smsLog(pStaEntry->pMac, LOGE, FL("csrGetStatistics:cannot start StatsClient timer\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013299 }
13300#endif
13301 }
13302#if 0
13303 //send up the stats report
13304 csrRoamReportStatistics(pStaEntry->pMac, pStaEntry->statsMask, pStaEntry->callback,
13305 pStaEntry->staId, pStaEntry->pContext);
13306#endif
13307}
13308
13309
13310
Jeff Johnson295189b2012-06-20 16:38:30 -070013311eHalStatus csrSendMBStatsReqMsg( tpAniSirGlobal pMac, tANI_U32 statsMask, tANI_U8 staId)
13312{
13313 tAniGetPEStatsReq *pMsg;
13314 eHalStatus status = eHAL_STATUS_SUCCESS;
13315 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof(tAniGetPEStatsReq));
13316 if ( !HAL_STATUS_SUCCESS(status) )
13317 {
13318 smsLog(pMac, LOG1, " csrSendMBStatsReqMsg: failed to allocate mem for stats req \n");
13319 return status;
13320 }
13321 // need to initiate a stats request to PE
13322 pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_STATISTICS_REQ);
13323 pMsg->msgLen = (tANI_U16)sizeof(tAniGetPEStatsReq);
13324 pMsg->staId = staId;
13325 pMsg->statsMask = statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -070013326 status = palSendMBMessage(pMac->hHdd, pMsg );
Jeff Johnson295189b2012-06-20 16:38:30 -070013327 if(!HAL_STATUS_SUCCESS(status))
13328 {
13329 smsLog(pMac, LOG1, " csrSendMBStatsReqMsg: failed to send down the stats req \n");
13330 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013331 return status;
13332}
Jeff Johnson295189b2012-06-20 16:38:30 -070013333void csrRoamStatsRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg)
13334{
13335 tAniGetPEStatsRsp *pSmeStatsRsp;
13336 eHalStatus status = eHAL_STATUS_FAILURE;
13337 tListElem *pEntry = NULL;
13338 tCsrStatsClientReqInfo *pTempStaEntry = NULL;
13339 tCsrPeStatsReqInfo *pPeStaEntry = NULL;
13340 tANI_U32 tempMask = 0;
13341 tANI_U8 counter = 0;
13342 tANI_U8 *pStats = NULL;
13343 tANI_U32 length = 0;
13344 v_PVOID_t pvosGCtx;
13345 v_S7_t rssi = 0;
13346 tANI_U32 *pRssi = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013347 pSmeStatsRsp = (tAniGetPEStatsRsp *)pSirMsg;
13348 if(pSmeStatsRsp->rc)
13349 {
13350 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:stats rsp from PE shows failure\n"));
13351 goto post_update;
13352 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013353 tempMask = pSmeStatsRsp->statsMask;
13354 pStats = ((tANI_U8 *)&pSmeStatsRsp->statsMask) + sizeof(pSmeStatsRsp->statsMask);
Jeff Johnson295189b2012-06-20 16:38:30 -070013355 /* subtract all statistics from this length, and after processing the entire
13356 * 'stat' part of the message, if the length is not zero, then rssi is piggy packed
13357 * in this 'stats' message.
13358 */
13359 length = pSmeStatsRsp->msgLen - sizeof(tAniGetPEStatsRsp);
Jeff Johnson295189b2012-06-20 16:38:30 -070013360 //new stats info from PE, fill up the stats strucutres in PMAC
13361 while(tempMask)
13362 {
13363 if(tempMask & 1)
13364 {
13365 switch(counter)
13366 {
13367 case eCsrSummaryStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013368 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:summary stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013369 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.summaryStatsInfo,
13370 pStats, sizeof(tCsrSummaryStatsInfo));
13371 if(!HAL_STATUS_SUCCESS(status))
13372 {
13373 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy summary stats\n"));
13374 }
13375 pStats += sizeof(tCsrSummaryStatsInfo);
13376 length -= sizeof(tCsrSummaryStatsInfo);
13377 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013378 case eCsrGlobalClassAStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013379 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassA stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013380 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classAStatsInfo,
13381 pStats, sizeof(tCsrGlobalClassAStatsInfo));
13382 if(!HAL_STATUS_SUCCESS(status))
13383 {
13384 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassA stats\n"));
13385 }
13386 pStats += sizeof(tCsrGlobalClassAStatsInfo);
13387 length -= sizeof(tCsrGlobalClassAStatsInfo);
13388 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013389 case eCsrGlobalClassBStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013390 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassB stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013391 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classBStatsInfo,
13392 pStats, sizeof(tCsrGlobalClassBStatsInfo));
13393 if(!HAL_STATUS_SUCCESS(status))
13394 {
13395 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassB stats\n"));
13396 }
13397 pStats += sizeof(tCsrGlobalClassBStatsInfo);
13398 length -= sizeof(tCsrGlobalClassBStatsInfo);
13399 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013400 case eCsrGlobalClassCStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013401 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:ClassC stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013402 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.classCStatsInfo,
13403 pStats, sizeof(tCsrGlobalClassCStatsInfo));
13404 if(!HAL_STATUS_SUCCESS(status))
13405 {
13406 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy ClassC stats\n"));
13407 }
13408 pStats += sizeof(tCsrGlobalClassCStatsInfo);
13409 length -= sizeof(tCsrGlobalClassCStatsInfo);
13410 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013411 case eCsrPerStaStats:
Mohit Khanna23863762012-09-11 17:40:09 -070013412 smsLog( pMac, LOG2, FL("csrRoamStatsRspProcessor:PerSta stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013413 if( CSR_MAX_STA > pSmeStatsRsp->staId )
13414 {
13415 status = palCopyMemory(pMac->hHdd, (tANI_U8 *)&pMac->roam.perStaStatsInfo[pSmeStatsRsp->staId],
13416 pStats, sizeof(tCsrPerStaStatsInfo));
13417 }
13418 else
13419 {
13420 status = eHAL_STATUS_FAILURE;
13421 smsLog( pMac, LOGE, FL("csrRoamStatsRspProcessor:out bound staId:%d\n"), pSmeStatsRsp->staId);
13422 VOS_ASSERT( 0 );
13423 }
13424 if(!HAL_STATUS_SUCCESS(status))
13425 {
13426 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:failed to copy PerSta stats\n"));
13427 }
13428 pStats += sizeof(tCsrPerStaStatsInfo);
13429 length -= sizeof(tCsrPerStaStatsInfo);
13430 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013431 default:
13432 smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:unknown stats type\n"));
13433 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070013434 }
13435 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013436 tempMask >>=1;
13437 counter++;
13438 }
13439 pvosGCtx = vos_get_global_context(VOS_MODULE_ID_SME, pMac);
13440 if (length != 0)
13441 {
13442 pRssi = (tANI_U32*)pStats;
13443 rssi = (v_S7_t)*pRssi;
13444 }
13445 else
13446 {
13447 /* If riva is not sending rssi, continue to use the hack */
13448 rssi = RSSI_HACK_BMPS;
13449 }
13450 WDA_UpdateRssiBmps(pvosGCtx, pSmeStatsRsp->staId, rssi);
Jeff Johnson295189b2012-06-20 16:38:30 -070013451post_update:
13452 //make sure to update the pe stats req list
13453 pEntry = csrRoamFindInPeStatsReqList(pMac, pSmeStatsRsp->statsMask);
13454 if(pEntry)
13455 {
13456 pPeStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
13457 pPeStaEntry->rspPending = FALSE;
13458
13459 }
13460 //check the one timer cases
13461 pEntry = csrRoamCheckClientReqList(pMac, pSmeStatsRsp->statsMask);
13462 if(pEntry)
13463 {
Jeff Johnson295189b2012-06-20 16:38:30 -070013464 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013465 if(pTempStaEntry->timerExpired)
13466 {
13467 //send up the stats report
13468 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
13469 pTempStaEntry->staId, pTempStaEntry->pContext);
13470 //also remove from the client list
13471 csrRoamRemoveStatListEntry(pMac, pEntry);
13472 pTempStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013473 }
13474 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013475}
Jeff Johnson295189b2012-06-20 16:38:30 -070013476tListElem * csrRoamFindInPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask)
13477{
13478 tListElem *pEntry = NULL;
13479 tCsrPeStatsReqInfo *pTempStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013480 pEntry = csrLLPeekHead( &pMac->roam.peStatsReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013481 if(!pEntry)
13482 {
13483 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013484 smsLog(pMac, LOG2, "csrRoamFindInPeStatsReqList: List empty, no request to PE\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013485 return NULL;
13486 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013487 while( pEntry )
13488 {
13489 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013490 if(pTempStaEntry->statsMask == statsMask)
13491 {
Mohit Khanna23863762012-09-11 17:40:09 -070013492 smsLog(pMac, LOG3, "csrRoamFindInPeStatsReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013493 break;
13494 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013495 pEntry = csrLLNext( &pMac->roam.peStatsReqList, pEntry, LL_ACCESS_NOLOCK );
13496 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013497 return pEntry;
13498}
13499
Jeff Johnson295189b2012-06-20 16:38:30 -070013500tListElem * csrRoamChecknUpdateClientReqList(tpAniSirGlobal pMac, tCsrStatsClientReqInfo *pStaEntry,
13501 tANI_BOOLEAN update)
13502{
13503 tListElem *pEntry;
13504 tCsrStatsClientReqInfo *pTempStaEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070013505 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013506 if(!pEntry)
13507 {
13508 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013509 smsLog(pMac, LOG2, "csrRoamChecknUpdateClientReqList: List empty, no request from "
Jeff Johnson295189b2012-06-20 16:38:30 -070013510 "upper layer client(s)\n");
13511 return NULL;
13512 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013513 while( pEntry )
13514 {
13515 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013516 if((pTempStaEntry->requesterId == pStaEntry->requesterId) &&
13517 (pTempStaEntry->statsMask == pStaEntry->statsMask))
13518 {
Mohit Khanna23863762012-09-11 17:40:09 -070013519 smsLog(pMac, LOG3, "csrRoamChecknUpdateClientReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013520 if(update)
13521 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013522 pTempStaEntry->periodicity = pStaEntry->periodicity;
13523 pTempStaEntry->callback = pStaEntry->callback;
13524 pTempStaEntry->pContext = pStaEntry->pContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070013525 }
13526 break;
13527 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013528 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
13529 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013530 return pEntry;
13531}
Jeff Johnson295189b2012-06-20 16:38:30 -070013532tListElem * csrRoamCheckClientReqList(tpAniSirGlobal pMac, tANI_U32 statsMask)
13533{
13534 tListElem *pEntry;
13535 tCsrStatsClientReqInfo *pTempStaEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070013536 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013537 if(!pEntry)
13538 {
13539 //list empty
Mohit Khanna23863762012-09-11 17:40:09 -070013540 smsLog(pMac, LOG2, "csrRoamCheckClientReqList: List empty, no request from "
Jeff Johnson295189b2012-06-20 16:38:30 -070013541 "upper layer client(s)\n");
13542 return NULL;
13543 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013544 while( pEntry )
13545 {
13546 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070013547 if((pTempStaEntry->statsMask & ~(1 << eCsrGlobalClassDStats)) == statsMask)
13548 {
Mohit Khanna23863762012-09-11 17:40:09 -070013549 smsLog(pMac, LOG3, "csrRoamCheckClientReqList: match found\n");
Jeff Johnson295189b2012-06-20 16:38:30 -070013550 break;
13551 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013552 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
13553 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013554 return pEntry;
13555}
Jeff Johnson295189b2012-06-20 16:38:30 -070013556eHalStatus csrRoamRegisterLinkQualityIndCallback(tpAniSirGlobal pMac,
13557 csrRoamLinkQualityIndCallback callback,
13558 void *pContext)
13559{
13560 pMac->roam.linkQualityIndInfo.callback = callback;
13561 pMac->roam.linkQualityIndInfo.context = pContext;
13562 if( NULL == callback )
13563 {
13564 smsLog(pMac, LOGW, "csrRoamRegisterLinkQualityIndCallback: indication callback being deregistered");
13565 }
13566 else
13567 {
13568 smsLog(pMac, LOGW, "csrRoamRegisterLinkQualityIndCallback: indication callback being registered");
Jeff Johnson295189b2012-06-20 16:38:30 -070013569 /* do we need to invoke the callback to notify client of initial value ?? */
13570 }
13571 return eHAL_STATUS_SUCCESS;
13572}
Jeff Johnson295189b2012-06-20 16:38:30 -070013573void csrRoamVccTrigger(tpAniSirGlobal pMac)
13574{
13575 eCsrRoamLinkQualityInd newVccLinkQuality;
13576 tANI_U32 ul_mac_loss = 0;
13577 tANI_U32 ul_mac_loss_trigger_threshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013578 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
13579 /*-------------------------------------------------------------------------
13580 Link quality is currently binary based on OBIWAN recommended triggers
Jeff Johnson295189b2012-06-20 16:38:30 -070013581 Check for a change in link quality and notify client if necessary
13582 -------------------------------------------------------------------------*/
13583 ul_mac_loss_trigger_threshold =
13584 pMac->roam.configParam.vccUlMacLossThreshold;
Jeff Johnson295189b2012-06-20 16:38:30 -070013585 VOS_ASSERT( ul_mac_loss_trigger_threshold != 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070013586 smsLog(pMac, LOGW, "csrRoamVccTrigger: UL_MAC_LOSS_THRESHOLD is %d\n",
13587 ul_mac_loss_trigger_threshold );
Jeff Johnson295189b2012-06-20 16:38:30 -070013588 if(ul_mac_loss_trigger_threshold < ul_mac_loss)
13589 {
13590 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality is POOR \n");
13591 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13592 }
13593 else
13594 {
13595 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality is GOOD\n");
13596 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_GOOD_IND;
13597 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013598 smsLog(pMac, LOGW, "csrRoamVccTrigger: link qual : *** UL_MAC_LOSS %d *** ",
13599 ul_mac_loss);
Jeff Johnson295189b2012-06-20 16:38:30 -070013600 if(newVccLinkQuality != pMac->roam.vccLinkQuality)
13601 {
13602 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality changed: trigger necessary\n");
13603 if(NULL != pMac->roam.linkQualityIndInfo.callback)
13604 {
13605 smsLog(pMac, LOGW, "csrRoamVccTrigger: link quality indication %d\n",
13606 newVccLinkQuality );
13607
13608 /* we now invoke the callback once to notify client of initial value */
13609 pMac->roam.linkQualityIndInfo.callback( newVccLinkQuality,
13610 pMac->roam.linkQualityIndInfo.context );
13611 //event: EVENT_WLAN_VCC
13612 }
13613 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013614 pMac->roam.vccLinkQuality = newVccLinkQuality;
13615
Jeff Johnson295189b2012-06-20 16:38:30 -070013616}
Jeff Johnson295189b2012-06-20 16:38:30 -070013617VOS_STATUS csrRoamVccTriggerRssiIndCallback(tHalHandle hHal,
13618 v_U8_t rssiNotification,
13619 void * context)
13620{
13621 tpAniSirGlobal pMac = PMAC_STRUCT( context );
13622 eCsrRoamLinkQualityInd newVccLinkQuality;
13623 // TODO : Session info unavailable
13624 tANI_U32 sessionId = 0;
13625 VOS_STATUS status = VOS_STATUS_SUCCESS;
13626 /*-------------------------------------------------------------------------
13627 Link quality is currently binary based on OBIWAN recommended triggers
Jeff Johnson295189b2012-06-20 16:38:30 -070013628 Check for a change in link quality and notify client if necessary
13629 -------------------------------------------------------------------------*/
13630 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: RSSI trigger threshold is %d\n",
13631 pMac->roam.configParam.vccRssiThreshold);
13632 if(!csrIsConnStateConnectedInfra(pMac, sessionId))
13633 {
13634 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: ignoring the indication as we are not connected\n");
13635 return VOS_STATUS_SUCCESS;
13636 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013637 if(WLANTL_HO_THRESHOLD_DOWN == rssiNotification)
13638 {
13639 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality is POOR\n");
13640 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_POOR_IND;
13641 }
13642 else if(WLANTL_HO_THRESHOLD_UP == rssiNotification)
13643 {
13644 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality is GOOD \n");
13645 newVccLinkQuality = eCSR_ROAM_LINK_QUAL_GOOD_IND;
13646 }
13647 else
13648 {
13649 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: unknown rssi notification %d\n", rssiNotification);
13650 //Set to this so the code below won't do anything
13651 newVccLinkQuality = pMac->roam.vccLinkQuality;
Jeff Johnson295189b2012-06-20 16:38:30 -070013652 VOS_ASSERT(0);
13653 }
13654
Jeff Johnson295189b2012-06-20 16:38:30 -070013655 if(newVccLinkQuality != pMac->roam.vccLinkQuality)
13656 {
13657 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality changed: trigger necessary\n");
13658 if(NULL != pMac->roam.linkQualityIndInfo.callback)
13659 {
13660 smsLog(pMac, LOGW, "csrRoamVccTriggerRssiIndCallback: link quality indication %d\n",
13661 newVccLinkQuality);
Jeff Johnson295189b2012-06-20 16:38:30 -070013662 /* we now invoke the callback once to notify client of initial value */
13663 pMac->roam.linkQualityIndInfo.callback( newVccLinkQuality,
13664 pMac->roam.linkQualityIndInfo.context );
13665 //event: EVENT_WLAN_VCC
13666 }
13667 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013668 pMac->roam.vccLinkQuality = newVccLinkQuality;
Jeff Johnson295189b2012-06-20 16:38:30 -070013669 return status;
13670}
Jeff Johnson295189b2012-06-20 16:38:30 -070013671tCsrStatsClientReqInfo * csrRoamInsertEntryIntoList( tpAniSirGlobal pMac,
13672 tDblLinkList *pStaList,
13673 tCsrStatsClientReqInfo *pStaEntry)
13674{
13675 tCsrStatsClientReqInfo *pNewStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013676 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013677 //if same entity requested for same set of stats with different periodicity &
13678 // callback update it
13679 if(NULL == csrRoamChecknUpdateClientReqList(pMac, pStaEntry, TRUE))
13680 {
13681
13682 status = palAllocateMemory(pMac->hHdd, (void **)&pNewStaEntry, sizeof(tCsrStatsClientReqInfo));
13683 if (!HAL_STATUS_SUCCESS(status))
13684 {
13685 smsLog(pMac, LOGW, "csrRoamInsertEntryIntoList: couldn't allocate memory for the "
13686 "entry\n");
13687 return NULL;
13688 }
13689
Jeff Johnson295189b2012-06-20 16:38:30 -070013690 pNewStaEntry->callback = pStaEntry->callback;
13691 pNewStaEntry->pContext = pStaEntry->pContext;
13692 pNewStaEntry->periodicity = pStaEntry->periodicity;
13693 pNewStaEntry->requesterId = pStaEntry->requesterId;
13694 pNewStaEntry->statsMask = pStaEntry->statsMask;
13695 pNewStaEntry->pPeStaEntry = pStaEntry->pPeStaEntry;
13696 pNewStaEntry->pMac = pStaEntry->pMac;
13697 pNewStaEntry->staId = pStaEntry->staId;
13698 pNewStaEntry->timerExpired = pStaEntry->timerExpired;
13699
13700 csrLLInsertTail( pStaList, &pNewStaEntry->link, LL_ACCESS_LOCK );
13701 }
13702 return pNewStaEntry;
13703}
13704
Jeff Johnson295189b2012-06-20 16:38:30 -070013705tCsrPeStatsReqInfo * csrRoamInsertEntryIntoPeStatsReqList( tpAniSirGlobal pMac,
13706 tDblLinkList *pStaList,
13707 tCsrPeStatsReqInfo *pStaEntry)
13708{
13709 tCsrPeStatsReqInfo *pNewStaEntry = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013710 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070013711 status = palAllocateMemory(pMac->hHdd, (void **)&pNewStaEntry, sizeof(tCsrPeStatsReqInfo));
13712 if (!HAL_STATUS_SUCCESS(status))
13713 {
13714 smsLog(pMac, LOGW, "csrRoamInsertEntryIntoPeStatsReqList: couldn't allocate memory for the "
13715 "entry\n");
13716 return NULL;
13717 }
13718
Jeff Johnson295189b2012-06-20 16:38:30 -070013719 pNewStaEntry->hPeStatsTimer = pStaEntry->hPeStatsTimer;
13720 pNewStaEntry->numClient = pStaEntry->numClient;
13721 pNewStaEntry->periodicity = pStaEntry->periodicity;
13722 pNewStaEntry->statsMask = pStaEntry->statsMask;
13723 pNewStaEntry->pMac = pStaEntry->pMac;
13724 pNewStaEntry->staId = pStaEntry->staId;
13725 pNewStaEntry->timerRunning = pStaEntry->timerRunning;
13726 pNewStaEntry->rspPending = pStaEntry->rspPending;
13727
13728 csrLLInsertTail( pStaList, &pNewStaEntry->link, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070013729 return pNewStaEntry;
13730}
Jeff Johnson295189b2012-06-20 16:38:30 -070013731eHalStatus csrGetRssi(tpAniSirGlobal pMac,
13732 tCsrRssiCallback callback,
13733 tANI_U8 staId, tCsrBssid bssId, void *pContext, void* pVosContext)
13734{
13735 eHalStatus status = eHAL_STATUS_SUCCESS;
13736 vos_msg_t msg;
13737 tANI_U32 sessionId;
13738
13739 tAniGetRssiReq *pMsg;
13740 smsLog(pMac, LOG2, FL("called"));
13741 status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof(tAniGetRssiReq));
13742 if ( !HAL_STATUS_SUCCESS(status) )
13743 {
13744 smsLog(pMac, LOGE, " csrGetRssi: failed to allocate mem for req \n");
13745 return status;
13746 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013747 csrRoamGetSessionIdFromBSSID(pMac, (tCsrBssid *)bssId, &sessionId);
13748
13749 pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_RSSI_REQ);
13750 pMsg->msgLen = (tANI_U16)sizeof(tAniGetRssiReq);
13751 pMsg->sessionId = sessionId;
13752 pMsg->staId = staId;
13753 pMsg->rssiCallback = callback;
13754 pMsg->pDevContext = pContext;
13755 pMsg->pVosContext = pVosContext;
Jeff Johnson295189b2012-06-20 16:38:30 -070013756 msg.type = eWNI_SME_GET_RSSI_REQ;
13757 msg.bodyptr = pMsg;
13758 msg.reserved = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070013759 if(VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME, &msg))
13760 {
13761 smsLog(pMac, LOGE, " csrGetRssi failed to post msg to self \n");
13762 palFreeMemory(pMac->hHdd, (void *)pMsg);
13763 status = eHAL_STATUS_FAILURE;
13764 }
13765 smsLog(pMac, LOG2, FL("returned"));
13766 return status;
13767}
Jeff Johnson295189b2012-06-20 16:38:30 -070013768eHalStatus csrGetStatistics(tpAniSirGlobal pMac, eCsrStatsRequesterType requesterId,
13769 tANI_U32 statsMask,
13770 tCsrStatsCallback callback,
13771 tANI_U32 periodicity, tANI_BOOLEAN cache,
13772 tANI_U8 staId, void *pContext)
13773{
13774 tCsrStatsClientReqInfo staEntry;
13775 tCsrStatsClientReqInfo *pStaEntry = NULL;
13776 tCsrPeStatsReqInfo *pPeStaEntry = NULL;
13777 tListElem *pEntry = NULL;
13778 tANI_BOOLEAN found = FALSE;
13779 eHalStatus status = eHAL_STATUS_SUCCESS;
13780 tANI_BOOLEAN insertInClientList = FALSE;
13781 VOS_STATUS vosStatus;
Jeff Johnsone7245742012-09-05 17:12:55 -070013782 WLANTL_TRANSFER_STA_TYPE *pTlStats;
Jeff Johnson295189b2012-06-20 16:38:30 -070013783
13784 if( csrIsAllSessionDisconnected(pMac) )
13785 {
13786 //smsLog(pMac, LOGW, "csrGetStatistics: wrong state curState(%d) not connected\n", pMac->roam.curState);
13787 return eHAL_STATUS_FAILURE;
13788 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013789 if((!statsMask) && (!callback))
13790 {
13791 //msg
13792 smsLog(pMac, LOGW, "csrGetStatistics: statsMask & callback empty in the request\n");
13793 return eHAL_STATUS_FAILURE;
13794 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013795 //for the search list method for deregister
13796 staEntry.requesterId = requesterId;
13797 staEntry.statsMask = statsMask;
13798 //requester wants to deregister or just an error
13799 if((statsMask) && (!callback))
13800 {
13801 pEntry = csrRoamChecknUpdateClientReqList(pMac, &staEntry, FALSE);
13802 if(!pEntry)
13803 {
13804 //msg
13805 smsLog(pMac, LOGW, "csrGetStatistics: callback is empty in the request & couldn't "
13806 "find any existing request in statsClientReqList\n");
13807 return eHAL_STATUS_FAILURE;
13808 }
13809 else
13810 {
13811 //clean up & return
13812 pStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnsond13512a2012-07-17 11:42:19 -070013813 if(NULL != pStaEntry->pPeStaEntry)
Jeff Johnson295189b2012-06-20 16:38:30 -070013814 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013815 pStaEntry->pPeStaEntry->numClient--;
13816 //check if we need to delete the entry from peStatsReqList too
13817 if(!pStaEntry->pPeStaEntry->numClient)
13818 {
13819 csrRoamRemoveEntryFromPeStatsReqList(pMac, pStaEntry->pPeStaEntry);
13820 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013821 }
Jeff Johnsond13512a2012-07-17 11:42:19 -070013822
Jeff Johnson295189b2012-06-20 16:38:30 -070013823 //check if we need to stop the tl stats timer too
13824 pMac->roam.tlStatsReqInfo.numClient--;
13825 if(!pMac->roam.tlStatsReqInfo.numClient)
13826 {
13827 if(pMac->roam.tlStatsReqInfo.timerRunning)
13828 {
13829 status = palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
13830 if(!HAL_STATUS_SUCCESS(status))
13831 {
13832 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot stop TlStatsTimer timer\n"));
13833 return eHAL_STATUS_FAILURE;
13834 }
13835 }
13836 pMac->roam.tlStatsReqInfo.periodicity = 0;
13837 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
13838 }
13839 vos_timer_stop( &pStaEntry->timer );
Jeff Johnson295189b2012-06-20 16:38:30 -070013840 // Destroy the vos timer...
13841 vosStatus = vos_timer_destroy( &pStaEntry->timer );
13842 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
13843 {
13844 smsLog(pMac, LOGE, FL("csrGetStatistics:failed to destroy Client req timer\n"));
13845 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013846 csrRoamRemoveStatListEntry(pMac, pEntry);
13847 pStaEntry = NULL;
13848 return eHAL_STATUS_SUCCESS;
13849 }
13850 }
13851
13852 if(cache && !periodicity)
13853 {
13854 //return the cached stats
13855 csrRoamReportStatistics(pMac, statsMask, callback, staId, pContext);
13856 }
13857 else
13858 {
13859 //add the request in the client req list
13860 staEntry.callback = callback;
13861 staEntry.pContext = pContext;
13862 staEntry.periodicity = periodicity;
13863 staEntry.pPeStaEntry = NULL;
13864 staEntry.staId = staId;
13865 staEntry.pMac = pMac;
13866 staEntry.timerExpired = FALSE;
13867
13868
Jeff Johnson295189b2012-06-20 16:38:30 -070013869 //if periodic report requested with non cached result from PE/TL
13870 if(periodicity)
13871 {
13872
13873 //if looking for stats from PE
13874 if(statsMask & ~(1 << eCsrGlobalClassDStats))
13875 {
13876
13877 //check if same request made already & waiting for rsp
13878 pPeStaEntry = csrRoamCheckPeStatsReqList(pMac, statsMask & ~(1 << eCsrGlobalClassDStats),
13879 periodicity, &found, staId);
13880 if(!pPeStaEntry)
13881 {
13882 //bail out, maxed out on number of req for PE
13883 return eHAL_STATUS_FAILURE;
13884 }
13885 else
13886 {
13887 staEntry.pPeStaEntry = pPeStaEntry;
13888 }
13889
13890 }
13891 //request stats from TL rightaway if requested by client, update tlStatsReqInfo if needed
13892 if(statsMask & (1 << eCsrGlobalClassDStats))
13893 {
13894 if(cache && pMac->roam.tlStatsReqInfo.numClient)
13895 {
13896 smsLog(pMac, LOGE, FL("csrGetStatistics:Looking for cached stats from TL\n"));
13897 }
13898 else
13899 {
13900
13901 //update periodicity
13902 if(pMac->roam.tlStatsReqInfo.periodicity)
13903 {
13904 pMac->roam.tlStatsReqInfo.periodicity =
13905 CSR_ROAM_MIN(periodicity, pMac->roam.tlStatsReqInfo.periodicity);
13906 }
13907 else
13908 {
13909 pMac->roam.tlStatsReqInfo.periodicity = periodicity;
13910 }
13911 if(pMac->roam.tlStatsReqInfo.periodicity < CSR_MIN_TL_STAT_QUERY_PERIOD)
13912 {
13913 pMac->roam.tlStatsReqInfo.periodicity = CSR_MIN_TL_STAT_QUERY_PERIOD;
13914 }
13915
13916 if(!pMac->roam.tlStatsReqInfo.timerRunning)
13917 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013918 pTlStats = (WLANTL_TRANSFER_STA_TYPE *)vos_mem_malloc(sizeof(WLANTL_TRANSFER_STA_TYPE));
13919 if(NULL != pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070013920 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013921 //req TL for class D stats
13922 if(WLANTL_GetStatistics(pMac->roam.gVosContext, pTlStats, staId))
13923 {
13924 smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
13925 }
13926 else
13927 {
13928 //save in SME
13929 csrRoamSaveStatsFromTl(pMac, pTlStats);
13930 }
13931 vos_mem_free(pTlStats);
13932 pTlStats = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013933 }
13934 else
13935 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013936 smsLog(pMac, LOGE, FL("cannot allocate memory for TL stat"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013937 }
Jeff Johnsone7245742012-09-05 17:12:55 -070013938
Jeff Johnson295189b2012-06-20 16:38:30 -070013939 if(pMac->roam.tlStatsReqInfo.periodicity)
13940 {
13941 //start timer
13942 status = palTimerStart(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer,
13943 pMac->roam.tlStatsReqInfo.periodicity * PAL_TIMER_TO_MS_UNIT, eANI_BOOLEAN_FALSE);
13944 if(!HAL_STATUS_SUCCESS(status))
13945 {
13946 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot start TlStatsTimer timer\n"));
13947 return eHAL_STATUS_FAILURE;
13948 }
13949 pMac->roam.tlStatsReqInfo.timerRunning = TRUE;
13950 }
13951 }
13952 }
13953 pMac->roam.tlStatsReqInfo.numClient++;
13954 }
13955
13956 insertInClientList = TRUE;
13957 }
13958 //if one time report requested with non cached result from PE/TL
13959 else if(!cache && !periodicity)
13960 {
13961 if(statsMask & ~(1 << eCsrGlobalClassDStats))
13962 {
13963 //send down a req
13964 status = csrSendMBStatsReqMsg(pMac, statsMask & ~(1 << eCsrGlobalClassDStats), staId);
13965 if(!HAL_STATUS_SUCCESS(status))
13966 {
13967 smsLog(pMac, LOGE, FL("csrGetStatistics:failed to send down stats req to PE\n"));
13968 }
13969 //so that when the stats rsp comes back from PE we respond to upper layer
13970 //right away
13971 staEntry.timerExpired = TRUE;
13972 insertInClientList = TRUE;
Jeff Johnson295189b2012-06-20 16:38:30 -070013973 }
13974 if(statsMask & (1 << eCsrGlobalClassDStats))
13975 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013976 pTlStats = (WLANTL_TRANSFER_STA_TYPE *)vos_mem_malloc(sizeof(WLANTL_TRANSFER_STA_TYPE));
13977 if(NULL != pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070013978 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013979 //req TL for class D stats
13980 if(!VOS_IS_STATUS_SUCCESS(WLANTL_GetStatistics(pMac->roam.gVosContext, pTlStats, staId)))
13981 {
13982 smsLog(pMac, LOGE, FL("csrGetStatistics:couldn't get the stats from TL\n"));
13983 }
13984 else
13985 {
13986 //save in SME
13987 csrRoamSaveStatsFromTl(pMac, pTlStats);
13988 }
13989 vos_mem_free(pTlStats);
13990 pTlStats = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070013991 }
13992 else
13993 {
Jeff Johnsone7245742012-09-05 17:12:55 -070013994 smsLog(pMac, LOGE, FL("cannot allocate memory for TL stat"));
Jeff Johnson295189b2012-06-20 16:38:30 -070013995 }
Jeff Johnson295189b2012-06-20 16:38:30 -070013996
13997 }
13998 //if looking for stats from TL only
13999 if(!insertInClientList)
14000 {
14001 //return the stats
14002 csrRoamReportStatistics(pMac, statsMask, callback, staId, pContext);
14003 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014004 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014005 if(insertInClientList)
14006 {
14007 pStaEntry = csrRoamInsertEntryIntoList(pMac, &pMac->roam.statsClientReqList, &staEntry);
14008 if(!pStaEntry)
14009 {
14010 //msg
14011 smsLog(pMac, LOGW, "csrGetStatistics: Failed to insert req in statsClientReqList\n");
14012 return eHAL_STATUS_FAILURE;
14013 }
Jeff Johnsone7245742012-09-05 17:12:55 -070014014 pStaEntry->periodicity = periodicity;
Jeff Johnson295189b2012-06-20 16:38:30 -070014015 //Init & start timer if needed
14016 if(periodicity)
14017 {
14018 vosStatus = vos_timer_init( &pStaEntry->timer, VOS_TIMER_TYPE_SW,
14019 csrRoamStatsClientTimerHandler, pStaEntry );
14020 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14021 {
14022 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot init StatsClient timer\n"));
14023 return eHAL_STATUS_FAILURE;
14024 }
14025 vosStatus = vos_timer_start( &pStaEntry->timer, periodicity );
14026 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14027 {
14028 smsLog(pMac, LOGE, FL("csrGetStatistics:cannot start StatsClient timer\n"));
14029 return eHAL_STATUS_FAILURE;
14030 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014031 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014032 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014033 }
14034 return eHAL_STATUS_SUCCESS;
14035}
14036
Jeff Johnson295189b2012-06-20 16:38:30 -070014037tCsrPeStatsReqInfo * csrRoamCheckPeStatsReqList(tpAniSirGlobal pMac, tANI_U32 statsMask,
14038 tANI_U32 periodicity, tANI_BOOLEAN *pFound, tANI_U8 staId)
14039{
14040 tANI_BOOLEAN found = FALSE;
14041 eHalStatus status = eHAL_STATUS_SUCCESS;
14042 tCsrPeStatsReqInfo staEntry;
14043 tCsrPeStatsReqInfo *pTempStaEntry = NULL;
14044 tListElem *pStaEntry = NULL;
14045 VOS_STATUS vosStatus;
14046 tPmcPowerState powerState;
14047 *pFound = FALSE;
14048
14049 pStaEntry = csrRoamFindInPeStatsReqList(pMac, statsMask);
14050 if(pStaEntry)
14051 {
14052 pTempStaEntry = GET_BASE_ADDR( pStaEntry, tCsrPeStatsReqInfo, link );
14053 if(pTempStaEntry->periodicity)
14054 {
14055 pTempStaEntry->periodicity =
14056 CSR_ROAM_MIN(periodicity, pTempStaEntry->periodicity);
14057 }
14058 else
14059 {
14060 pTempStaEntry->periodicity = periodicity;
14061 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014062 pTempStaEntry->numClient++;
14063 found = TRUE;
14064 }
14065 else
14066 {
14067 palZeroMemory(pMac->hHdd, &staEntry, sizeof(tCsrPeStatsReqInfo));
14068 staEntry.numClient = 1;
14069 staEntry.periodicity = periodicity;
14070 staEntry.pMac = pMac;
14071 staEntry.rspPending = FALSE;
14072 staEntry.staId = staId;
14073 staEntry.statsMask = statsMask;
14074 staEntry.timerRunning = FALSE;
14075 pTempStaEntry = csrRoamInsertEntryIntoPeStatsReqList(pMac, &pMac->roam.peStatsReqList, &staEntry);
14076 if(!pTempStaEntry)
14077 {
14078 //msg
14079 smsLog(pMac, LOGW, "csrRoamCheckPeStatsReqList: Failed to insert req in peStatsReqList\n");
14080 return NULL;
14081 }
14082 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014083 pmcQueryPowerState(pMac, &powerState, NULL, NULL);
14084 if(ePMC_FULL_POWER == powerState)
14085 {
14086 if(pTempStaEntry->periodicity < pMac->roam.configParam.statsReqPeriodicity)
14087 {
14088 pTempStaEntry->periodicity = pMac->roam.configParam.statsReqPeriodicity;
14089 }
14090 }
14091 else
14092 {
14093 if(pTempStaEntry->periodicity < pMac->roam.configParam.statsReqPeriodicityInPS)
14094 {
14095 pTempStaEntry->periodicity = pMac->roam.configParam.statsReqPeriodicityInPS;
14096 }
14097 }
14098 if(!pTempStaEntry->timerRunning)
14099 {
14100 //send down a req in case of one time req, for periodic ones wait for timer to expire
14101 if(!pTempStaEntry->rspPending &&
14102 !pTempStaEntry->periodicity)
14103 {
14104 status = csrSendMBStatsReqMsg(pMac, statsMask & ~(1 << eCsrGlobalClassDStats), staId);
14105 if(!HAL_STATUS_SUCCESS(status))
14106 {
14107 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:failed to send down stats req to PE\n"));
14108 }
14109 else
14110 {
14111 pTempStaEntry->rspPending = TRUE;
14112 }
14113 }
14114 if(pTempStaEntry->periodicity)
14115 {
14116 if(!found)
14117 {
14118
14119 vosStatus = vos_timer_init( &pTempStaEntry->hPeStatsTimer, VOS_TIMER_TYPE_SW,
14120 csrRoamPeStatsTimerHandler, pTempStaEntry );
14121 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14122 {
14123 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:cannot init hPeStatsTimer timer\n"));
14124 return NULL;
14125 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014126 }
14127 //start timer
14128 smsLog(pMac, LOG1, "csrRoamCheckPeStatsReqList:peStatsTimer period %d\n", pTempStaEntry->periodicity);
Jeff Johnson295189b2012-06-20 16:38:30 -070014129 vosStatus = vos_timer_start( &pTempStaEntry->hPeStatsTimer, pTempStaEntry->periodicity );
14130 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14131 {
14132 smsLog(pMac, LOGE, FL("csrRoamCheckPeStatsReqList:cannot start hPeStatsTimer timer\n"));
14133 return NULL;
14134 }
14135 pTempStaEntry->timerRunning = TRUE;
14136 }
14137 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014138 *pFound = found;
14139 return pTempStaEntry;
14140}
14141
Jeff Johnson295189b2012-06-20 16:38:30 -070014142/*
14143 pStaEntry is no longer invalid upon the return of this function.
14144*/
14145static void csrRoamRemoveStatListEntry(tpAniSirGlobal pMac, tListElem *pEntry)
14146{
14147 if(pEntry)
14148 {
14149 if(csrLLRemoveEntry(&pMac->roam.statsClientReqList, pEntry, LL_ACCESS_LOCK))
14150 {
14151 palFreeMemory(pMac->hHdd, GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link ));
Jeff Johnsone7245742012-09-05 17:12:55 -070014152 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014153 }
14154 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014155
14156void csrRoamRemoveEntryFromPeStatsReqList(tpAniSirGlobal pMac, tCsrPeStatsReqInfo *pPeStaEntry)
14157{
14158 tListElem *pEntry;
14159 tCsrPeStatsReqInfo *pTempStaEntry;
14160 VOS_STATUS vosStatus;
14161 pEntry = csrLLPeekHead( &pMac->roam.peStatsReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070014162 if(!pEntry)
14163 {
14164 //list empty
14165 smsLog(pMac, LOGW, "csrRoamRemoveEntryFromPeStatsReqList: List empty, no stats req for PE\n");
14166 return;
14167 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014168 while( pEntry )
14169 {
14170 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrPeStatsReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070014171 if( pTempStaEntry && pTempStaEntry->statsMask == pPeStaEntry->statsMask)
14172 {
14173 smsLog(pMac, LOGW, "csrRoamRemoveEntryFromPeStatsReqList: match found\n");
14174 if(pTempStaEntry->timerRunning)
14175 {
14176 vosStatus = vos_timer_stop( &pTempStaEntry->hPeStatsTimer );
14177 /* If we are not able to stop the timer here, just remove
14178 * the entry from the linked list. Destroy the timer object
14179 * and free the memory in the timer CB
14180 */
14181 if( vosStatus == VOS_STATUS_SUCCESS )
14182 {
14183 /* the timer is successfully stopped */
14184 pTempStaEntry->timerRunning = FALSE;
14185
14186 /* Destroy the timer */
14187 vosStatus = vos_timer_destroy( &pTempStaEntry->hPeStatsTimer );
14188 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14189 {
14190 smsLog(pMac, LOGE, FL("csrRoamRemoveEntryFromPeStatsReqList:failed to destroy hPeStatsTimer timer\n"));
14191 }
14192 }
14193 else
14194 {
14195 // the timer could not be stopped. Hence destroy and free the
14196 // memory for the PE stat entry in the timer CB.
14197 pTempStaEntry->timerStopFailed = TRUE;
14198 }
Jeff Johnsone7245742012-09-05 17:12:55 -070014199 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014200
14201 if(csrLLRemoveEntry(&pMac->roam.peStatsReqList, pEntry, LL_ACCESS_LOCK))
14202 {
14203 // Only free the memory if we could stop the timer successfully
14204 if(!pTempStaEntry->timerStopFailed)
14205 {
14206 palFreeMemory(pMac->hHdd, pTempStaEntry);
14207 pTempStaEntry = NULL;
14208 }
14209 break;
14210 }
14211
14212 pEntry = csrLLNext( &pMac->roam.peStatsReqList, pEntry, LL_ACCESS_NOLOCK );
14213 }
14214 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014215 return;
14216}
14217
14218
Jeff Johnsone7245742012-09-05 17:12:55 -070014219void csrRoamSaveStatsFromTl(tpAniSirGlobal pMac, WLANTL_TRANSFER_STA_TYPE *pTlStats)
Jeff Johnson295189b2012-06-20 16:38:30 -070014220{
14221
Jeff Johnsone7245742012-09-05 17:12:55 -070014222 pMac->roam.classDStatsInfo.num_rx_bytes_crc_ok = pTlStats->rxBcntCRCok;
14223 pMac->roam.classDStatsInfo.rx_bc_byte_cnt = pTlStats->rxBCBcnt;
14224 pMac->roam.classDStatsInfo.rx_bc_frm_cnt = pTlStats->rxBCFcnt;
14225 pMac->roam.classDStatsInfo.rx_byte_cnt = pTlStats->rxBcnt;
14226 pMac->roam.classDStatsInfo.rx_mc_byte_cnt = pTlStats->rxMCBcnt;
14227 pMac->roam.classDStatsInfo.rx_mc_frm_cnt = pTlStats->rxMCFcnt;
14228 pMac->roam.classDStatsInfo.rx_rate = pTlStats->rxRate;
Jeff Johnson295189b2012-06-20 16:38:30 -070014229 //?? need per AC
Jeff Johnsone7245742012-09-05 17:12:55 -070014230 pMac->roam.classDStatsInfo.rx_uc_byte_cnt[0] = pTlStats->rxUCBcnt;
14231 pMac->roam.classDStatsInfo.rx_uc_frm_cnt = pTlStats->rxUCFcnt;
14232 pMac->roam.classDStatsInfo.tx_bc_byte_cnt = pTlStats->txBCBcnt;
14233 pMac->roam.classDStatsInfo.tx_bc_frm_cnt = pTlStats->txBCFcnt;
14234 pMac->roam.classDStatsInfo.tx_mc_byte_cnt = pTlStats->txMCBcnt;
14235 pMac->roam.classDStatsInfo.tx_mc_frm_cnt = pTlStats->txMCFcnt;
Jeff Johnson295189b2012-06-20 16:38:30 -070014236 //?? need per AC
Jeff Johnsone7245742012-09-05 17:12:55 -070014237 pMac->roam.classDStatsInfo.tx_uc_byte_cnt[0] = pTlStats->txUCBcnt;
14238 pMac->roam.classDStatsInfo.tx_uc_frm_cnt = pTlStats->txUCFcnt;
Jeff Johnson295189b2012-06-20 16:38:30 -070014239
14240}
14241
Jeff Johnson295189b2012-06-20 16:38:30 -070014242void csrRoamReportStatistics(tpAniSirGlobal pMac, tANI_U32 statsMask,
14243 tCsrStatsCallback callback, tANI_U8 staId, void *pContext)
14244{
14245 tANI_U8 stats[500];
14246 tANI_U8 *pStats = NULL;
14247 tANI_U32 tempMask = 0;
14248 tANI_U8 counter = 0;
14249 eHalStatus status = eHAL_STATUS_FAILURE;
Jeff Johnson295189b2012-06-20 16:38:30 -070014250 if(!callback)
14251 {
14252 smsLog(pMac, LOGE, FL("csrRoamReportStatistics:cannot report callback NULL\n"));
14253 return;
14254 }
14255 if(!statsMask)
14256 {
14257 smsLog(pMac, LOGE, FL("csrRoamReportStatistics:cannot report statsMask is 0\n"));
14258 return;
14259 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014260 pStats = stats;
Jeff Johnson295189b2012-06-20 16:38:30 -070014261 tempMask = statsMask;
Jeff Johnson295189b2012-06-20 16:38:30 -070014262 while(tempMask)
14263 {
14264 if(tempMask & 1)
14265 {
14266 //new stats info from PE, fill up the stats strucutres in PMAC
14267 switch(counter)
14268 {
14269 case eCsrSummaryStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014270 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:summary stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014271 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.summaryStatsInfo,
14272 sizeof(tCsrSummaryStatsInfo));
14273 if(!HAL_STATUS_SUCCESS(status))
14274 {
14275 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy summary stats\n"));
14276 }
14277 pStats += sizeof(tCsrSummaryStatsInfo);
14278 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014279 case eCsrGlobalClassAStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014280 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassA stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014281 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classAStatsInfo,
14282 sizeof(tCsrGlobalClassAStatsInfo));
14283 if(!HAL_STATUS_SUCCESS(status))
14284 {
14285 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassA stats\n"));
14286 }
14287 pStats += sizeof(tCsrGlobalClassAStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014288 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014289 case eCsrGlobalClassBStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014290 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassB stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014291 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classBStatsInfo,
14292 sizeof(tCsrGlobalClassBStatsInfo));
14293 if(!HAL_STATUS_SUCCESS(status))
14294 {
14295 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassB stats\n"));
14296 }
14297 pStats += sizeof(tCsrGlobalClassBStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014298 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014299 case eCsrGlobalClassCStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014300 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassC stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014301 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classCStatsInfo,
14302 sizeof(tCsrGlobalClassCStatsInfo));
14303 if(!HAL_STATUS_SUCCESS(status))
14304 {
14305 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassC stats\n"));
14306 }
14307 pStats += sizeof(tCsrGlobalClassCStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014308 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014309 case eCsrGlobalClassDStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014310 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:ClassD stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014311 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.classDStatsInfo,
14312 sizeof(tCsrGlobalClassDStatsInfo));
14313 if(!HAL_STATUS_SUCCESS(status))
14314 {
14315 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy ClassD stats\n"));
14316 }
14317 pStats += sizeof(tCsrGlobalClassDStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014318 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014319 case eCsrPerStaStats:
Mohit Khanna23863762012-09-11 17:40:09 -070014320 smsLog( pMac, LOG2, FL("csrRoamReportStatistics:PerSta stats\n"));
Jeff Johnson295189b2012-06-20 16:38:30 -070014321 status = palCopyMemory(pMac->hHdd, pStats, (tANI_U8 *)&pMac->roam.perStaStatsInfo[staId],
14322 sizeof(tCsrPerStaStatsInfo));
14323 if(!HAL_STATUS_SUCCESS(status))
14324 {
14325 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:failed to copy PerSta stats\n"));
14326 }
14327 pStats += sizeof(tCsrPerStaStatsInfo);
Jeff Johnson295189b2012-06-20 16:38:30 -070014328 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014329 default:
14330 smsLog( pMac, LOG1, FL("csrRoamReportStatistics:unknown stats type\n"));
14331 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014332 }
14333 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014334 tempMask >>=1;
14335 counter++;
14336 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014337 callback(stats, pContext );
Jeff Johnson295189b2012-06-20 16:38:30 -070014338}
14339
Jeff Johnson295189b2012-06-20 16:38:30 -070014340eHalStatus csrRoamDeregStatisticsReq(tpAniSirGlobal pMac)
14341{
14342 tListElem *pEntry = NULL;
14343 tListElem *pPrevEntry = NULL;
14344 tCsrStatsClientReqInfo *pTempStaEntry = NULL;
14345 eHalStatus status = eHAL_STATUS_SUCCESS;
14346 VOS_STATUS vosStatus;
14347 pEntry = csrLLPeekHead( &pMac->roam.statsClientReqList, LL_ACCESS_LOCK );
Jeff Johnson295189b2012-06-20 16:38:30 -070014348 if(!pEntry)
14349 {
14350 //list empty
14351 smsLog(pMac, LOGW, "csrRoamDeregStatisticsReq: List empty, no request from "
14352 "upper layer client(s)\n");
14353 return status;
14354 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014355 while( pEntry )
14356 {
14357 if(pPrevEntry)
14358 {
14359 pTempStaEntry = GET_BASE_ADDR( pPrevEntry, tCsrStatsClientReqInfo, link );
14360 //send up the stats report
14361 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
14362 pTempStaEntry->staId, pTempStaEntry->pContext);
14363 csrRoamRemoveStatListEntry(pMac, pPrevEntry);
14364 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014365 pTempStaEntry = GET_BASE_ADDR( pEntry, tCsrStatsClientReqInfo, link );
Jeff Johnson295189b2012-06-20 16:38:30 -070014366 if (pTempStaEntry->pPeStaEntry) //pPeStaEntry can be NULL
14367 {
Jeff Johnsone7245742012-09-05 17:12:55 -070014368 pTempStaEntry->pPeStaEntry->numClient--;
14369 //check if we need to delete the entry from peStatsReqList too
14370 if(!pTempStaEntry->pPeStaEntry->numClient)
14371 {
14372 csrRoamRemoveEntryFromPeStatsReqList(pMac, pTempStaEntry->pPeStaEntry);
14373 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014374 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014375 //check if we need to stop the tl stats timer too
14376 pMac->roam.tlStatsReqInfo.numClient--;
14377 if(!pMac->roam.tlStatsReqInfo.numClient)
14378 {
14379 if(pMac->roam.tlStatsReqInfo.timerRunning)
14380 {
14381 status = palTimerStop(pMac->hHdd, pMac->roam.tlStatsReqInfo.hTlStatsTimer);
14382 if(!HAL_STATUS_SUCCESS(status))
14383 {
14384 smsLog(pMac, LOGE, FL("csrRoamDeregStatisticsReq:cannot stop TlStatsTimer timer\n"));
14385 //we will continue
14386 }
14387 }
14388 pMac->roam.tlStatsReqInfo.periodicity = 0;
14389 pMac->roam.tlStatsReqInfo.timerRunning = FALSE;
14390 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014391 if (pTempStaEntry->periodicity)
14392 {
14393 //While creating StaEntry in csrGetStatistics,
14394 //Initializing and starting timer only when periodicity is set.
14395 //So Stop and Destroy timer only when periodicity is set.
14396
Jeff Johnsone7245742012-09-05 17:12:55 -070014397 vos_timer_stop( &pTempStaEntry->timer );
14398 // Destroy the vos timer...
14399 vosStatus = vos_timer_destroy( &pTempStaEntry->timer );
14400 if ( !VOS_IS_STATUS_SUCCESS( vosStatus ) )
14401 {
14402 smsLog(pMac, LOGE, FL("csrRoamDeregStatisticsReq:failed to destroy Client req timer\n"));
14403 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014404 }
Jeff Johnsone7245742012-09-05 17:12:55 -070014405
Jeff Johnson295189b2012-06-20 16:38:30 -070014406
14407 pPrevEntry = pEntry;
14408 pEntry = csrLLNext( &pMac->roam.statsClientReqList, pEntry, LL_ACCESS_NOLOCK );
14409 }
14410 //the last one
14411 if(pPrevEntry)
14412 {
14413 pTempStaEntry = GET_BASE_ADDR( pPrevEntry, tCsrStatsClientReqInfo, link );
14414 //send up the stats report
14415 csrRoamReportStatistics(pMac, pTempStaEntry->statsMask, pTempStaEntry->callback,
14416 pTempStaEntry->staId, pTempStaEntry->pContext);
14417 csrRoamRemoveStatListEntry(pMac, pPrevEntry);
14418 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014419 return status;
14420
14421}
14422
Jeff Johnson295189b2012-06-20 16:38:30 -070014423eHalStatus csrIsFullPowerNeeded( tpAniSirGlobal pMac, tSmeCmd *pCommand,
14424 tRequestFullPowerReason *pReason,
14425 tANI_BOOLEAN *pfNeedPower )
14426{
14427 tANI_BOOLEAN fNeedFullPower = eANI_BOOLEAN_FALSE;
14428 tRequestFullPowerReason reason = eSME_REASON_OTHER;
14429 tPmcState pmcState;
14430 eHalStatus status = eHAL_STATUS_SUCCESS;
14431 // TODO : Session info unavailable
14432 tANI_U32 sessionId = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -070014433 if( pfNeedPower )
14434 {
14435 *pfNeedPower = eANI_BOOLEAN_FALSE;
14436 }
14437 //We only handle CSR commands
14438 if( !(eSmeCsrCommandMask & pCommand->command) )
14439 {
14440 return eHAL_STATUS_SUCCESS;
14441 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014442 //Check PMC state first
14443 pmcState = pmcGetPmcState( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -070014444 switch( pmcState )
14445 {
14446 case REQUEST_IMPS:
14447 case IMPS:
14448 if( eSmeCommandScan == pCommand->command )
14449 {
14450 switch( pCommand->u.scanCmd.reason )
14451 {
14452 case eCsrScanGetResult:
14453 case eCsrScanBGScanAbort:
14454 case eCsrScanBGScanEnable:
14455 case eCsrScanGetScanChnInfo:
14456 //Internal process, no need for full power
14457 fNeedFullPower = eANI_BOOLEAN_FALSE;
14458 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014459 default:
14460 //Other scans are real scan, ask for power
14461 fNeedFullPower = eANI_BOOLEAN_TRUE;
14462 break;
14463 } //switch
14464 }
14465 else
14466 {
14467 //ask for power for roam and status change
14468 fNeedFullPower = eANI_BOOLEAN_TRUE;
14469 }
14470 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014471 case REQUEST_BMPS:
14472 case BMPS:
14473 case REQUEST_START_UAPSD:
14474 case UAPSD:
14475 //We treat WOWL same as BMPS
14476 case REQUEST_ENTER_WOWL:
14477 case WOWL:
14478 if( eSmeCommandRoam == pCommand->command )
14479 {
14480 tScanResultList *pBSSList = (tScanResultList *)pCommand->u.roamCmd.hBSSList;
14481 tCsrScanResult *pScanResult;
14482 tListElem *pEntry;
Jeff Johnson295189b2012-06-20 16:38:30 -070014483 switch ( pCommand->u.roamCmd.roamReason )
14484 {
14485 case eCsrForcedDisassoc:
14486 case eCsrForcedDisassocMICFailure:
14487 reason = eSME_LINK_DISCONNECTED_BY_HDD;
14488 fNeedFullPower = eANI_BOOLEAN_TRUE;
14489 break;
14490 case eCsrSmeIssuedDisassocForHandoff:
14491 case eCsrForcedDeauth:
14492 case eCsrHddIssuedReassocToSameAP:
14493 case eCsrSmeIssuedReassocToSameAP:
14494 fNeedFullPower = eANI_BOOLEAN_TRUE;
14495 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014496 case eCsrCapsChange:
14497 fNeedFullPower = eANI_BOOLEAN_TRUE;
14498 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014499 default:
14500 //Check whether the profile is already connected. If so, no need for full power
14501 //Note: IBSS is ignored for now because we don't support powersave in IBSS
14502 if ( csrIsConnStateConnectedInfra(pMac, sessionId) && pBSSList )
14503 {
14504 //Only need to check the first one
14505 pEntry = csrLLPeekHead(&pBSSList->List, LL_ACCESS_LOCK);
14506 if( pEntry )
14507 {
14508 pScanResult = GET_BASE_ADDR(pEntry, tCsrScanResult, Link);
14509#if 0
14510 // TODO : Session Specific info pConnectBssDesc
14511 if( csrIsBssIdEqual( pMac, &pScanResult->Result.BssDescriptor, pMac->roam.pConnectBssDesc ) &&
14512 csrIsSsidEqual( pMac, pMac->roam.pConnectBssDesc,
14513 &pScanResult->Result.BssDescriptor, (tDot11fBeaconIEs *)( pScanResult->Result.pvIes ) ) )
14514 {
14515 // Check to see if the Auth type has changed in the Profile. If so, we don't want to Reassociate
14516 // with Authenticating first. To force this, stop the current association (Disassociate) and
14517 // then re 'Join' the AP, wihch will force an Authentication (with the new Auth type) followed by
14518 // a new Association.
14519 if(csrIsSameProfile(pMac, &pMac->roam.connectedProfile, pProfile))
14520 {
14521 if(csrRoamIsSameProfileKeys(pMac, &pMac->roam.connectedProfile, pProfile))
14522 {
14523 //Done, eventually, the command reaches eCsrReassocToSelfNoCapChange;
14524 //No need for full power
14525 //Set the flag so the code later can avoid to do the above
14526 //check again.
14527 pCommand->u.roamCmd.fReassocToSelfNoCapChange = eANI_BOOLEAN_TRUE;
14528 break;
14529 }
14530 }
14531 }
14532#endif
14533 }
14534 }
14535 //If we are here, full power is needed
14536 fNeedFullPower = eANI_BOOLEAN_TRUE;
14537 break;
14538 }
14539 }
14540 else if( eSmeCommandWmStatusChange == pCommand->command )
14541 {
14542 //need full power for all
14543 fNeedFullPower = eANI_BOOLEAN_TRUE;
14544 reason = eSME_LINK_DISCONNECTED_BY_OTHER;
14545 }
14546 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014547 case REQUEST_STOP_UAPSD:
14548 case REQUEST_EXIT_WOWL:
14549 if( eSmeCommandRoam == pCommand->command )
14550 {
14551 fNeedFullPower = eANI_BOOLEAN_TRUE;
14552 switch ( pCommand->u.roamCmd.roamReason )
14553 {
14554 case eCsrForcedDisassoc:
14555 case eCsrForcedDisassocMICFailure:
14556 reason = eSME_LINK_DISCONNECTED_BY_HDD;
14557 break;
14558 default:
14559 break;
14560 }
14561 }
14562 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014563 case STOPPED:
14564 case REQUEST_STANDBY:
14565 case STANDBY:
14566 case LOW_POWER:
14567 //We are not supposed to do anything
14568 smsLog( pMac, LOGE, FL( " cannot process because PMC is in stopped/standby state %d\n" ), pmcState );
14569 status = eHAL_STATUS_FAILURE;
14570 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014571 case FULL_POWER:
14572 case REQUEST_FULL_POWER:
14573 default:
14574 //No need to ask for full power. This has to be FULL_POWER state
14575 break;
Jeff Johnson295189b2012-06-20 16:38:30 -070014576 } //switch
Jeff Johnson295189b2012-06-20 16:38:30 -070014577 if( pReason )
14578 {
14579 *pReason = reason;
14580 }
14581 if( pfNeedPower )
14582 {
14583 *pfNeedPower = fNeedFullPower;
14584 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014585 return ( status );
14586}
14587
Jeff Johnson295189b2012-06-20 16:38:30 -070014588static eHalStatus csrRequestFullPower( tpAniSirGlobal pMac, tSmeCmd *pCommand )
14589{
14590 eHalStatus status = eHAL_STATUS_SUCCESS;
14591 tANI_BOOLEAN fNeedFullPower = eANI_BOOLEAN_FALSE;
14592 tRequestFullPowerReason reason = eSME_REASON_OTHER;
Jeff Johnson295189b2012-06-20 16:38:30 -070014593 status = csrIsFullPowerNeeded( pMac, pCommand, &reason, &fNeedFullPower );
Jeff Johnson295189b2012-06-20 16:38:30 -070014594 if( fNeedFullPower && HAL_STATUS_SUCCESS( status ) )
14595 {
14596 status = pmcRequestFullPower(pMac, csrFullPowerCallback, pMac, reason);
14597 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014598 return ( status );
14599}
14600
Jeff Johnson295189b2012-06-20 16:38:30 -070014601tSmeCmd *csrGetCommandBuffer( tpAniSirGlobal pMac )
14602{
14603 tSmeCmd *pCmd = smeGetCommandBuffer( pMac );
Jeff Johnson295189b2012-06-20 16:38:30 -070014604 if( pCmd )
14605 {
14606 pMac->roam.sPendingCommands++;
14607 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014608 return ( pCmd );
14609}
14610
Jeff Johnson295189b2012-06-20 16:38:30 -070014611void csrReleaseCommand(tpAniSirGlobal pMac, tSmeCmd *pCommand)
14612{
14613 if (pMac->roam.sPendingCommands > 0)
14614 {
14615 //All command allocated through csrGetCommandBuffer need to
14616 //decrement the pending count when releasing.
14617 pMac->roam.sPendingCommands--;
14618 smeReleaseCommand( pMac, pCommand );
14619 }
14620 else
14621 {
14622 smsLog(pMac, LOGE, FL( "no pending commands"));
14623 VOS_ASSERT(0);
14624 }
14625}
14626
Jeff Johnson295189b2012-06-20 16:38:30 -070014627//Return SUCCESS is the command is queued, failed
14628eHalStatus csrQueueSmeCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand, tANI_BOOLEAN fHighPriority )
14629{
14630 eHalStatus status;
Jeff Johnson295189b2012-06-20 16:38:30 -070014631 if( (eSmeCommandScan == pCommand->command) && pMac->scan.fDropScanCmd )
14632 {
14633 smsLog(pMac, LOGW, FL(" drop scan (scan reason %d) command"),
14634 pCommand->u.scanCmd.reason);
14635 return eHAL_STATUS_CSR_WRONG_STATE;
14636 }
14637
14638 //We can call request full power first before putting the command into pending Q
14639 //because we are holding SME lock at this point.
14640 status = csrRequestFullPower( pMac, pCommand );
14641 if( HAL_STATUS_SUCCESS( status ) )
14642 {
14643 tANI_BOOLEAN fNoCmdPending;
Jeff Johnson295189b2012-06-20 16:38:30 -070014644 //make sure roamCmdPendingList is not empty first
14645 fNoCmdPending = csrLLIsListEmpty( &pMac->roam.roamCmdPendingList, eANI_BOOLEAN_FALSE );
14646 if( fNoCmdPending )
14647 {
14648 smePushCommand( pMac, pCommand, fHighPriority );
14649 }
14650 else
14651 {
14652 //Other commands are waiting for PMC callback, queue the new command to the pending Q
14653 //no list lock is needed since SME lock is held
14654 if( !fHighPriority )
14655 {
14656 csrLLInsertTail( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14657 }
14658 else {
14659 csrLLInsertHead( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14660 }
14661 }
14662 }
14663 else if( eHAL_STATUS_PMC_PENDING == status )
14664 {
14665 //no list lock is needed since SME lock is held
14666 if( !fHighPriority )
14667 {
14668 csrLLInsertTail( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14669 }
14670 else {
14671 csrLLInsertHead( &pMac->roam.roamCmdPendingList, &pCommand->Link, eANI_BOOLEAN_FALSE );
14672 }
14673 //Let caller know the command is queue
14674 status = eHAL_STATUS_SUCCESS;
14675 }
14676 else
14677 {
14678 //Not to decrease pMac->roam.sPendingCommands here. Caller will decrease it when it
14679 //release the command.
14680 smsLog( pMac, LOGE, FL( " cannot queue command %d\n" ), pCommand->command );
14681 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014682 return ( status );
Jeff Johnson295189b2012-06-20 16:38:30 -070014683}
Jeff Johnson295189b2012-06-20 16:38:30 -070014684#ifdef WLAN_SOFTAP_FEATURE
14685eHalStatus csrRoamUpdateAPWPSIE( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirAPWPSIEs* pAPWPSIES )
14686{
14687 eHalStatus status = eHAL_STATUS_SUCCESS;
14688 tSirUpdateAPWPSIEsReq *pMsg;
14689 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
14690
14691 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14692 if (NULL == pSession)
14693 {
14694 smsLog( pMac, LOGE, FL( " Session does not exist for session id %d" ), sessionId);
14695 return eHAL_STATUS_FAILURE;
14696 }
14697
Jeff Johnson295189b2012-06-20 16:38:30 -070014698 do
14699 {
14700 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirUpdateAPWPSIEsReq) );
14701 if (!HAL_STATUS_SUCCESS(status)) break;
14702 palZeroMemory( pMac->hHdd, pMsg, sizeof(tSirUpdateAPWPSIEsReq) );
14703 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_UPDATE_APWPSIE_REQ);
14704
14705 pBuf = (tANI_U8 *)&pMsg->transactionId;
14706 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070014707 // transactionId
14708 *pBuf = 0;
14709 *( pBuf + 1 ) = 0;
14710 pBuf += sizeof(tANI_U16);
Jeff Johnson295189b2012-06-20 16:38:30 -070014711 // bssId
14712 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
14713 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070014714 //sessionId
14715 *pBuf++ = (tANI_U8)sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070014716 // APWPSIEs
14717 palCopyMemory( pMac->hHdd, (tSirAPWPSIEs *)pBuf, pAPWPSIES, sizeof(tSirAPWPSIEs));
14718 pBuf += sizeof(tSirAPWPSIEs);
Jeff Johnson295189b2012-06-20 16:38:30 -070014719 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32) + (pBuf - wTmpBuf))); //msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070014720 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070014721 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070014722 return ( status );
14723}
Jeff Johnson295189b2012-06-20 16:38:30 -070014724eHalStatus csrRoamUpdateWPARSNIEs( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirRSNie * pAPSirRSNie)
14725{
14726 eHalStatus status = eHAL_STATUS_SUCCESS;
14727 tSirUpdateAPWPARSNIEsReq *pMsg;
14728 tANI_U8 *pBuf = NULL, *wTmpBuf = NULL;
Jeff Johnson295189b2012-06-20 16:38:30 -070014729 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14730 if (NULL == pSession)
14731 {
14732 smsLog( pMac, LOGE, FL( " Session does not exist for session id %d" ), sessionId);
14733 return eHAL_STATUS_FAILURE;
14734 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014735 do
14736 {
14737 status = palAllocateMemory( pMac->hHdd, (void **)&pMsg, sizeof(tSirUpdateAPWPARSNIEsReq) );
14738 if (!HAL_STATUS_SUCCESS(status)) break;
14739 palZeroMemory( pMac->hHdd, pMsg, sizeof( tSirUpdateAPWPARSNIEsReq ) );
14740 pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SET_APWPARSNIEs_REQ);
Jeff Johnson295189b2012-06-20 16:38:30 -070014741 pBuf = (tANI_U8 *)&pMsg->transactionId;
14742 wTmpBuf = pBuf;
Jeff Johnson295189b2012-06-20 16:38:30 -070014743 // transactionId
14744 *pBuf = 0;
14745 *( pBuf + 1 ) = 0;
14746 pBuf += sizeof(tANI_U16);
14747
14748 // bssId
14749 palCopyMemory( pMac->hHdd, (tSirMacAddr *)pBuf, &pSession->selfMacAddr, sizeof(tSirMacAddr) );
14750 pBuf += sizeof(tSirMacAddr);
Jeff Johnson295189b2012-06-20 16:38:30 -070014751 // sessionId
14752 *pBuf++ = (tANI_U8)sessionId;
14753
14754 // APWPARSNIEs
14755 palCopyMemory( pMac->hHdd, (tSirRSNie *)pBuf, pAPSirRSNie, sizeof(tSirRSNie));
14756 pBuf += sizeof(tSirRSNie);
Jeff Johnson295189b2012-06-20 16:38:30 -070014757 pMsg->length = pal_cpu_to_be16((tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf))); //msg_header + msg
Jeff Johnson295189b2012-06-20 16:38:30 -070014758 status = palSendMBMessage(pMac->hHdd, pMsg);
Jeff Johnson295189b2012-06-20 16:38:30 -070014759 } while( 0 );
Jeff Johnson295189b2012-06-20 16:38:30 -070014760 return ( status );
14761}
Jeff Johnson295189b2012-06-20 16:38:30 -070014762#endif //#ifdef WLAN_SOFTAP_FEATURE
14763
14764#ifdef WLAN_FEATURE_VOWIFI_11R
14765//eHalStatus csrRoamIssueFTPreauthReq(tHalHandle hHal, tANI_U32 sessionId, tCsrBssid preAuthBssid, tANI_U8 channelId)
14766eHalStatus csrRoamIssueFTPreauthReq(tHalHandle hHal, tANI_U32 sessionId, tpSirBssDescription pBssDescription)
14767{
14768 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
14769 tpSirFTPreAuthReq pftPreAuthReq;
14770 tANI_U16 auth_req_len = 0;
14771 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
Jeff Johnson295189b2012-06-20 16:38:30 -070014772 auth_req_len = sizeof(tSirFTPreAuthReq);
14773 pftPreAuthReq = (tpSirFTPreAuthReq)vos_mem_malloc(auth_req_len);
14774 if (pftPreAuthReq == NULL)
14775 {
14776 smsLog(pMac, LOGE, FL("Memory allocation for FT Preauth request failed"));
14777 return eHAL_STATUS_RESOURCES;
14778 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014779 // Save the SME Session ID here. We need it while processing the preauth response
14780 pMac->ft.ftSmeContext.smeSessionId = sessionId;
Jeff Johnson295189b2012-06-20 16:38:30 -070014781 vos_mem_zero(pftPreAuthReq, auth_req_len);
14782
14783 pftPreAuthReq->pbssDescription = (tpSirBssDescription)vos_mem_malloc(
14784 sizeof(pBssDescription->length) + pBssDescription->length);
14785
14786 pftPreAuthReq->messageType = pal_cpu_to_be16(eWNI_SME_FT_PRE_AUTH_REQ);
14787
14788 pftPreAuthReq->preAuthchannelNum = pBssDescription->channelId;
14789
Jeff Johnson295189b2012-06-20 16:38:30 -070014790 palCopyMemory(pMac->hHdd, (void *)&pftPreAuthReq->currbssId, (void *)pSession->connectedProfile.bssid, sizeof(tSirMacAddr));
Jeff Johnson295189b2012-06-20 16:38:30 -070014791 palCopyMemory(pMac->hHdd, (void *)&pftPreAuthReq->preAuthbssId, (void *)pBssDescription->bssId, sizeof(tSirMacAddr));
14792
Jeff Johnson295189b2012-06-20 16:38:30 -070014793#ifdef WLAN_FEATURE_VOWIFI_11R
14794 if (csrRoamIs11rAssoc(pMac))
14795 {
14796 pftPreAuthReq->ft_ies_length = (tANI_U16)pMac->ft.ftSmeContext.auth_ft_ies_length;
14797 palCopyMemory(pMac->hHdd, pftPreAuthReq->ft_ies, pMac->ft.ftSmeContext.auth_ft_ies,
14798 pMac->ft.ftSmeContext.auth_ft_ies_length);
14799 }
14800 else
14801#endif
14802 {
14803 pftPreAuthReq->ft_ies_length = 0;
14804 }
Madan Mohan Koyyalamudi613b0a42012-10-31 15:55:53 -070014805 vos_mem_copy(pftPreAuthReq->pbssDescription, pBssDescription,
14806 sizeof(pBssDescription->length) + pBssDescription->length);
14807 pftPreAuthReq->length = pal_cpu_to_be16(auth_req_len);
Jeff Johnson295189b2012-06-20 16:38:30 -070014808 return palSendMBMessage(pMac->hHdd, pftPreAuthReq);
14809}
Jeff Johnson295189b2012-06-20 16:38:30 -070014810/*--------------------------------------------------------------------------
14811 * This will receive and process the FT Pre Auth Rsp from the current
14812 * associated ap.
14813 *
14814 * This will invoke the hdd call back. This is so that hdd can now
14815 * send the FTIEs from the Auth Rsp (Auth Seq 2) to the supplicant.
14816 ------------------------------------------------------------------------*/
14817void csrRoamFTPreAuthRspProcessor( tHalHandle hHal, tpSirFTPreAuthRsp pFTPreAuthRsp )
14818{
14819 tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
14820 eHalStatus status = eHAL_STATUS_SUCCESS;
Jeff Johnson04dd8a82012-06-29 20:41:40 -070014821#ifdef FEATURE_WLAN_LFR
14822 tCsrRoamInfo roamInfo;
14823#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014824
14825#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
14826 smsLog( pMac, LOGE, FL("Preauth response status code %d"), pFTPreAuthRsp->status);
14827#endif
Madan Mohan Koyyalamudi7a579cc2012-10-21 11:25:39 -070014828#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
14829 status = csrNeighborRoamPreauthRspHandler(pMac, (VOS_STATUS)pFTPreAuthRsp->status);
14830 if (status != eHAL_STATUS_SUCCESS) {
14831 /*
14832 * Bail out if pre-auth was not even processed.
14833 */
14834 smsLog(pMac, LOGW, FL("Preauth was not processed: %d"), status);
14835 return;
14836 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014837#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014838 /* The below function calls/timers should be invoked only if the pre-auth is successful */
14839 if (VOS_STATUS_SUCCESS != (VOS_STATUS)pFTPreAuthRsp->status)
14840 return;
Jeff Johnson295189b2012-06-20 16:38:30 -070014841 // Implies a success
14842 pMac->ft.ftSmeContext.FTState = eFT_AUTH_COMPLETE;
Jeff Johnson295189b2012-06-20 16:38:30 -070014843 // Indicate SME QoS module the completion of Preauth success. This will trigger the creation of RIC IEs
14844 pMac->ft.ftSmeContext.psavedFTPreAuthRsp = pFTPreAuthRsp;
14845 sme_QosCsrEventInd(pMac, pMac->ft.ftSmeContext.smeSessionId, SME_QOS_CSR_PREAUTH_SUCCESS_IND, NULL);
Jeff Johnson295189b2012-06-20 16:38:30 -070014846 /* Start the pre-auth reassoc interval timer with a period of 400ms. When this expires,
14847 * actual transition from the current to handoff AP is triggered */
14848 status = palTimerStart(pMac->hHdd, pMac->ft.ftSmeContext.preAuthReassocIntvlTimer,
14849 60 * PAL_TIMER_TO_MS_UNIT,
14850 eANI_BOOLEAN_FALSE);
14851 if (eHAL_STATUS_SUCCESS != status)
14852 {
14853 smsLog(pMac, LOGE, FL("Preauth reassoc interval timer start failed to start with status %d\n"), status);
14854 return;
14855 }
Jeff Johnson295189b2012-06-20 16:38:30 -070014856 // Save the received response
14857 palCopyMemory(pMac->hHdd, (void *)&pMac->ft.ftSmeContext.preAuthbssId, (void *)pFTPreAuthRsp->preAuthbssId, sizeof(tCsrBssid));
14858 if (csrRoamIs11rAssoc(pMac))
14859 csrRoamCallCallback(pMac, pFTPreAuthRsp->smeSessionId, NULL, 0,
14860 eCSR_ROAM_FT_RESPONSE, eCSR_ROAM_RESULT_NONE);
14861
14862 // Currently we dont do anything special for CCX connection.
Jeff Johnson04dd8a82012-06-29 20:41:40 -070014863#ifdef FEATURE_WLAN_LFR
14864 // If Legacy Fast Roaming is enabled, signal the supplicant
14865 // So he can send us a PMK-ID for this candidate AP.
14866 if (csrRoamIsFastRoamEnabled(pMac))
14867 {
14868 // Save the bssid from the received response
14869 palCopyMemory(pMac->hHdd, (void *)&roamInfo.bssid, (void *)pFTPreAuthRsp->preAuthbssId, sizeof(tCsrBssid));
14870 csrRoamCallCallback(pMac, pFTPreAuthRsp->smeSessionId, &roamInfo, 0, eCSR_ROAM_PMK_NOTIFY, 0);
14871 }
14872
14873#endif
Jeff Johnson295189b2012-06-20 16:38:30 -070014874
14875 // Done with it, init it.
14876 pMac->ft.ftSmeContext.psavedFTPreAuthRsp = NULL;
14877}
14878#endif
14879#ifdef FEATURE_WLAN_BTAMP_UT_RF
14880void csrRoamJoinRetryTimerHandler(void *pv)
14881{
14882 tCsrTimerInfo *pInfo = (tCsrTimerInfo *)pv;
14883 tpAniSirGlobal pMac = pInfo->pMac;
14884 tANI_U32 sessionId = pInfo->sessionId;
14885 tCsrRoamSession *pSession;
14886
14887 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
14888 {
14889 smsLog( pMac, LOGE, FL( " retrying the last roam profile on session %d\n" ), sessionId );
14890 pSession = CSR_GET_SESSION( pMac, sessionId );
14891 if(pSession->pCurRoamProfile && csrIsConnStateDisconnected(pMac, sessionId))
14892 {
14893 if( !HAL_STATUS_SUCCESS(csrRoamJoinLastProfile(pMac, sessionId)) )
14894 {
14895 smsLog( pMac, LOGE, FL( " fail to retry the last roam profile\n" ) );
14896 }
14897 }
14898 }
14899}
Jeff Johnson295189b2012-06-20 16:38:30 -070014900eHalStatus csrRoamStartJoinRetryTimer(tpAniSirGlobal pMac, tANI_U32 sessionId, tANI_U32 interval)
14901{
14902 eHalStatus status = eHAL_STATUS_FAILURE;
14903 tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId );
14904
14905 if(pSession->pCurRoamProfile && pSession->maxRetryCount)
14906 {
14907 smsLog(pMac, LOGE, FL(" call sessionId %d retry count %d left\n "), sessionId, pSession->maxRetryCount);
14908 pSession->maxRetryCount--;
14909 pSession->joinRetryTimerInfo.pMac = pMac;
14910 pSession->joinRetryTimerInfo.sessionId = (tANI_U8)sessionId;
14911 status = palTimerStart(pMac->hHdd, pSession->hTimerJoinRetry, interval, eANI_BOOLEAN_FALSE);
14912 if(!HAL_STATUS_SUCCESS(status))
14913 {
14914 smsLog(pMac, LOGE, FL(" fail to start timer status %s \n "), status);
14915 }
14916 }
14917 else
14918 {
14919 smsLog(pMac, LOGE, FL(" not to start timer due to no profile or reach mac ret (%d)\n "),
14920 pSession->maxRetryCount);
14921 }
14922
14923 return (status);
14924}
Jeff Johnson295189b2012-06-20 16:38:30 -070014925eHalStatus csrRoamStopJoinRetryTimer(tpAniSirGlobal pMac, tANI_U32 sessionId)
14926{
14927 smsLog(pMac, LOGE, " csrRoamStopJoinRetryTimer \n ");
14928 if( CSR_IS_SESSION_VALID(pMac, sessionId) )
14929 {
14930 return (palTimerStop(pMac->hHdd, pMac->roam.roamSession[sessionId].hTimerJoinRetry));
14931 }
14932
14933 return eHAL_STATUS_SUCCESS;
14934}
14935#endif
14936
14937
14938/*
14939 pBuf points to the beginning of the message
14940 LIM packs disassoc rsp as below,
14941 messageType - 2 bytes
14942 messageLength - 2 bytes
14943 sessionId - 1 byte
14944 transactionId - 2 bytes (tANI_U16)
14945 reasonCode - 4 bytes (sizeof(tSirResultCodes))
14946 peerMacAddr - 6 bytes
14947 The rest is conditionally defined of (WNI_POLARIS_FW_PRODUCT == AP) and not used
14948*/
14949static void csrSerDesUnpackDiassocRsp(tANI_U8 *pBuf, tSirSmeDisassocRsp *pRsp)
14950{
14951 if(pBuf && pRsp)
14952 {
14953 pBuf += 4; //skip type and length
14954 pRsp->sessionId = *pBuf++;
14955 pal_get_U16( pBuf, (tANI_U16 *)&pRsp->transactionId );
14956 pBuf += 2;
14957 pal_get_U32( pBuf, (tANI_U32 *)&pRsp->statusCode );
14958 pBuf += 4;
14959 vos_mem_copy(pRsp->peerMacAddr, pBuf, 6);
14960 }
14961}
14962
Jeff Johnsond13512a2012-07-17 11:42:19 -070014963eHalStatus csrGetDefaultCountryCodeFrmNv(tpAniSirGlobal pMac, tANI_U8 *pCountry)
14964{
14965 static uNvTables nvTables;
14966 eHalStatus status = eHAL_STATUS_SUCCESS;
14967 VOS_STATUS vosStatus = vos_nv_readDefaultCountryTable( &nvTables );
14968
14969 /* read the country code from NV and use it */
14970 if ( VOS_IS_STATUS_SUCCESS(vosStatus) )
14971 {
14972 palCopyMemory( pMac->hHdd, pCountry,
14973 nvTables.defaultCountryTable.countryCode,
14974 WNI_CFG_COUNTRY_CODE_LEN );
14975 return status;
14976 }
14977 else
14978 {
14979 palCopyMemory( pMac->hHdd, pCountry,
14980 "XXX",
14981 WNI_CFG_COUNTRY_CODE_LEN );
14982 status = eHAL_STATUS_FAILURE;
14983 return status;
14984 }
14985}
14986
14987eHalStatus csrGetCurrentCountryCode(tpAniSirGlobal pMac, tANI_U8 *pCountry)
14988{
14989 palCopyMemory( pMac->hHdd, pCountry,
14990 pMac->scan.countryCode11d,
14991 WNI_CFG_COUNTRY_CODE_LEN );
14992 return eHAL_STATUS_SUCCESS;
14993}